public inbox for [email protected]
help / color / mirror / Atom feed[Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures
10+ messages / 4 participants
[nested] [flat]
* [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures
@ 2019-12-20 13:29 Akshay Joshi <[email protected]>
2019-12-27 11:56 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Aditya Toshniwal <[email protected]>
2020-01-02 06:34 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Khushboo Vashi <[email protected]>
0 siblings, 2 replies; 10+ messages in thread
From: Akshay Joshi @ 2019-12-20 13:29 UTC (permalink / raw)
To: pgadmin-hackers
Hi Hackers,
Attached is the implementation of the new feature Schema Diff Tool.
Initial work(backend code to compare the objects) has been done by me and
then most of the task has been completed by *Khushboo Vashi. *Sending the
patch on behalf of her*.*
Currently, this tool only supports Tables, Views, Materialized Views,
Functions and Procedures node.
Please review and test it thoroughly. Suggestions are welcome to improve
the tool.
--
*Thanks & Regards*
*Akshay Joshi*
*Sr. Software Architect*
*EnterpriseDB Software India Private Limited*
*Mobile: +91 976-788-8246*
Attachments:
[application/octet-stream] RM_3452.patch (435.2K, 3-RM_3452.patch)
download | inline diff:
diff --git a/web/pgadmin/browser/server_groups/servers/__init__.py b/web/pgadmin/browser/server_groups/servers/__init__.py
index a813f7a7c..28cab833e 100644
--- a/web/pgadmin/browser/server_groups/servers/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/__init__.py
@@ -28,6 +28,7 @@ from pgadmin.model import db, Server, ServerGroup, User
from pgadmin.utils.driver import get_driver
from pgadmin.utils.master_password import get_crypt_key
from pgadmin.utils.exception import CryptKeyMissing
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
from psycopg2 import Error as psycopg2_Error, OperationalError
@@ -1627,4 +1628,5 @@ class ServerNode(PGChildNodeView):
)
+SchemaDiffRegistry('server', ServerNode)
ServerNode.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/__init__.py
index c4cb71a11..4932a7971 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/__init__.py
@@ -30,6 +30,8 @@ from pgadmin.utils.ajax import make_json_response, \
make_response as ajax_response, internal_server_error, unauthorized
from pgadmin.utils.driver import get_driver
from pgadmin.tools.sqleditor.utils.query_history import QueryHistory
+
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
from pgadmin.model import Server
@@ -1111,4 +1113,5 @@ class DatabaseView(PGChildNodeView):
)
+SchemaDiffRegistry('database', DatabaseView)
DatabaseView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py
index 72c2df5a9..7d0b8960f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py
@@ -23,6 +23,7 @@ from pgadmin.browser.utils import PGChildNodeView
from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone, bad_request
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
"""
This module is responsible for generating two nodes
@@ -1023,5 +1024,6 @@ It may have been removed by another user.
return ajax_response(response=SQL.strip("\n"))
+SchemaDiffRegistry('schema', SchemaView)
SchemaView.register_node_view(schema_blueprint)
CatalogView.register_node_view(catalog_blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py
index dd6064573..fac184fd5 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py
@@ -25,6 +25,8 @@ from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.compile_template_name import compile_template_path
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -92,7 +94,7 @@ class CollationModule(SchemaChildModule):
blueprint = CollationModule(__name__)
-class CollationView(PGChildNodeView):
+class CollationView(PGChildNodeView, SchemaDiffObjectCompare):
"""
This class is responsible for generating routes for Collation node
@@ -144,6 +146,10 @@ class CollationView(PGChildNodeView):
* dependent(gid, sid, did, scid):
- This function will generate dependent list to show it in dependent
pane for the selected Collation node.
+
+ * compare(**kwargs):
+ - This function will compare the collation nodes from two different
+ schemas.
"""
node_type = blueprint.node_type
@@ -172,7 +178,8 @@ class CollationView(PGChildNodeView):
'dependency': [{'get': 'dependencies'}],
'dependent': [{'get': 'dependents'}],
'get_collations': [{'get': 'get_collation'},
- {'get': 'get_collation'}]
+ {'get': 'get_collation'}],
+ 'compare': [{'get': 'compare'}, {'get': 'compare'}]
})
def check_precondition(f):
@@ -318,23 +325,36 @@ class CollationView(PGChildNodeView):
JSON of selected collation node
"""
+ status, res = self._fetch_properties(scid, coid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, coid):
+ """
+ This function fetch the properties for the specified object.
+
+ :param scid: Schema ID
+ :param coid: Collation ID
+ """
+
SQL = render_template("/".join([self.template_path,
'properties.sql']),
scid=scid, coid=coid)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(
- gettext("Could not find the collation object in the database.")
- )
+ return False, gone(gettext("Could not find the collation "
+ "object in the database."))
- return ajax_response(
- response=res['rows'][0],
- status=200
- )
+ return True, res['rows'][0]
@check_precondition
def get_collation(self, gid, sid, did, scid, coid=None):
@@ -748,5 +768,30 @@ class CollationView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the collations for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
CollationView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py
index 20e477986..6fdcace84 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py
@@ -27,6 +27,8 @@ from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.compile_template_name import compile_template_path
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -79,7 +81,7 @@ class DomainModule(SchemaChildModule):
blueprint = DomainModule(__name__)
-class DomainView(PGChildNodeView, DataTypeReader):
+class DomainView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare):
"""
class DomainView
@@ -138,6 +140,10 @@ class DomainView(PGChildNodeView, DataTypeReader):
* types(gid, sid, did, scid, fnid=None):
- Returns Data Types.
+
+ * compare(**kwargs):
+ - This function will compare the domain nodes from two different
+ schemas.
"""
node_type = blueprint.node_type
@@ -169,7 +175,8 @@ class DomainView(PGChildNodeView, DataTypeReader):
'get_collations': [
{'get': 'get_collations'},
{'get': 'get_collations'}
- ]
+ ],
+ 'compare': [{'get': 'compare'}, {'get': 'compare'}]
})
def validate_request(f):
@@ -369,15 +376,31 @@ class DomainView(PGChildNodeView, DataTypeReader):
scid: Schema Id
doid: Domain Id
"""
+ status, res = self._fetch_properties(did, scid, doid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+ def _fetch_properties(self, did, scid, doid):
+ """
+ This function is used to fecth the properties of specified object.
+ :param did:
+ :param scid:
+ :param doid:
+ :return:
+ """
SQL = render_template("/".join([self.template_path, 'properties.sql']),
scid=scid, doid=doid)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(gettext("""
+ return False, gone(gettext("""
Could not find the domain in the database.
It may have been removed by another user or moved to another schema.
"""))
@@ -393,7 +416,7 @@ It may have been removed by another user or moved to another schema.
doid=doid)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
data['constraints'] = res['rows']
@@ -406,10 +429,7 @@ It may have been removed by another user or moved to another schema.
if doid <= self.manager.db_info[did]['datlastsysoid']:
data['sysdomain'] = True
- return ajax_response(
- response=data,
- status=200
- )
+ return True, data
def _parse_type(self, basetype):
"""
@@ -664,7 +684,7 @@ AND relkind != 'c'))"""
)
@check_precondition
- def sql(self, gid, sid, did, scid, doid=None):
+ def sql(self, gid, sid, did, scid, doid=None, return_ajax_response=True):
"""
Returns the SQL for the Domain object.
@@ -674,6 +694,7 @@ AND relkind != 'c'))"""
did: Database Id
scid: Schema Id
doid: Domain Id
+ return_ajax_response:
"""
SQL = render_template("/".join([self.template_path,
@@ -716,6 +737,9 @@ AND relkind != 'c'))"""
""".format(self.qtIdent(self.conn, data['basensp'], data['name']))
SQL = sql_header + SQL
+ if not return_ajax_response:
+ return SQL.strip('\n')
+
return ajax_response(response=SQL.strip('\n'))
@check_precondition
@@ -846,5 +870,40 @@ AND relkind != 'c'))"""
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the domains for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'node.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(did, scid, row['oid'])
+
+ if status:
+ if 'constraints' in data and len(data['constraints']) > 0:
+ for item in data['constraints']:
+ # Remove keys that should not be the part
+ # of comparision.
+ if 'conoid' in item:
+ item.pop('conoid')
+ if 'nspname' in item:
+ item.pop('nspname')
+
+ res[row['name']] = data
+
+ return res
+
DomainView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/9.2_plus/get_constraints.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/9.2_plus/get_constraints.sql
index df956bf9a..676c5a6e2 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/9.2_plus/get_constraints.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/9.2_plus/get_constraints.sql
@@ -8,7 +8,7 @@ JOIN
JOIN
pg_namespace nl ON nl.oid=typnamespace
LEFT OUTER JOIN
- pg_description des ON (des.objoid=t.oid AND des.classoid='pg_constraint'::regclass)
+ pg_description des ON (des.objoid=c.oid AND des.classoid='pg_constraint'::regclass)
WHERE
contype = 'c' AND contypid = {{doid}}::oid
ORDER BY
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/default/get_constraints.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/default/get_constraints.sql
index 897fb2477..b99f855a8 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/default/get_constraints.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/default/get_constraints.sql
@@ -8,7 +8,7 @@ JOIN
JOIN
pg_namespace nl ON nl.oid=typnamespace
LEFT OUTER JOIN
- pg_description des ON (des.objoid=t.oid AND des.classoid='pg_constraint'::regclass)
+ pg_description des ON (des.objoid=c.oid AND des.classoid='pg_constraint'::regclass)
WHERE
contype = 'c'
AND contypid = {{doid}}::oid
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py
index 75702a557..1be76c906 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py
@@ -32,6 +32,8 @@ from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.compile_template_name import compile_template_path
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -93,7 +95,8 @@ class ForeignTableModule(SchemaChildModule):
blueprint = ForeignTableModule(__name__)
-class ForeignTableView(PGChildNodeView, DataTypeReader):
+class ForeignTableView(PGChildNodeView, DataTypeReader,
+ SchemaDiffObjectCompare):
"""
class ForeignTableView(PGChildNodeView)
@@ -174,6 +177,9 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
* delete_sql(gid, sid, did, scid, foid):
- Returns sql for Script
+ * compare(**kwargs):
+ - This function will compare the foreign table nodes from two different
+ schemas.
"""
node_type = blueprint.node_type
@@ -213,7 +219,8 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
'select_sql': [{'get': 'select_sql'}],
'insert_sql': [{'get': 'insert_sql'}],
'update_sql': [{'get': 'update_sql'}],
- 'delete_sql': [{'get': 'delete_sql'}]
+ 'delete_sql': [{'get': 'delete_sql'}],
+ 'compare': [{'get': 'compare'}, {'get': 'compare'}]
})
def validate_request(f):
@@ -447,11 +454,9 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
scid: Schema Id
foid: Foreign Table Id
"""
- data = self._fetch_properties(gid, sid, did, scid, foid)
- if data is False:
- return gone(
- gettext("Could not find the foreign table on the server.")
- )
+ status, data = self._fetch_properties(gid, sid, did, scid, foid)
+ if not status:
+ return data
return ajax_response(
response=data,
@@ -814,11 +819,10 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
scid: Schema Id
foid: Foreign Table Id
"""
- data = self._fetch_properties(gid, sid, did, scid, foid, inherits=True)
- if data is False:
- return gone(
- gettext("Could not find the foreign table on the server.")
- )
+ status, data = self._fetch_properties(gid, sid, did, scid, foid,
+ inherits=True)
+ if not status:
+ return data
col_data = []
for c in data['columns']:
@@ -891,12 +895,10 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
foid: Foreign Table Id
"""
if foid is not None:
- old_data = self._fetch_properties(gid, sid, did, scid, foid,
- inherits=True)
- if old_data is False:
- return gone(
- gettext("Could not find the foreign table on the server.")
- )
+ status, old_data = self._fetch_properties(gid, sid, did, scid,
+ foid, inherits=True)
+ if not status:
+ return old_data
# Prepare dict of columns with key = column's attnum
# Will use this in the update template when any column is
@@ -1051,10 +1053,10 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
scid=scid, foid=foid)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return False
+ return False, False
data = res['rows'][0]
@@ -1064,7 +1066,7 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
foid=foid)
status, aclres = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=aclres)
+ return False, internal_server_error(errormsg=aclres)
# Get Formatted Privileges
data.update(self._format_proacl_from_db(aclres['rows']))
@@ -1082,7 +1084,7 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
'get_constraints.sql']), foid=foid)
status, cons = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=cons)
+ return False, internal_server_error(errormsg=cons)
if cons and 'rows' in cons:
data['constraints'] = cons['rows']
@@ -1091,7 +1093,7 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
'get_columns.sql']), foid=foid)
status, cols = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=cols)
+ return False, internal_server_error(errormsg=cols)
# The Length and the precision of the Datatype should be separated.
# The Format we getting from database is: numeric(1,1)
@@ -1128,12 +1130,12 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if 'inherits' in res['rows'][0]:
data['inherits'] = res['rows'][0]['inherits']
- return data
+ return True, data
@staticmethod
def convert_precision_to_int(typlen):
@@ -1222,11 +1224,9 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
Returns:
SELECT Script sql for the object
"""
- data = self._fetch_properties(gid, sid, did, scid, foid)
- if data is False:
- return gone(
- gettext("Could not find the foreign table on the server.")
- )
+ status, data = self._fetch_properties(gid, sid, did, scid, foid)
+ if not status:
+ return data
columns = []
for c in data['columns']:
@@ -1259,11 +1259,9 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
Returns:
INSERT Script sql for the object
"""
- data = self._fetch_properties(gid, sid, did, scid, foid)
- if data is False:
- return gone(
- gettext("Could not find the foreign table on the server.")
- )
+ status, data = self._fetch_properties(gid, sid, did, scid, foid)
+ if not status:
+ return data
columns = []
values = []
@@ -1301,11 +1299,9 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
Returns:
UPDATE Script sql for the object
"""
- data = self._fetch_properties(gid, sid, did, scid, foid)
- if data is False:
- return gone(
- gettext("Could not find the foreign table on the server.")
- )
+ status, data = self._fetch_properties(gid, sid, did, scid, foid)
+ if not status:
+ return data
columns = []
@@ -1346,11 +1342,9 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
Returns:
DELETE Script sql for the object
"""
- data = self._fetch_properties(gid, sid, did, scid, foid)
- if data is False:
- return gone(
- gettext("Could not find the foreign table on the server.")
- )
+ status, data = self._fetch_properties(gid, sid, did, scid, foid)
+ if not status:
+ return data
sql = u"DELETE FROM {0}\n\tWHERE <condition>;".format(
self.qtIdent(self.conn, data['basensp'], data['name'])
@@ -1358,5 +1352,37 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
return ajax_response(response=sql)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the foreign tables for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'node.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(0, sid, did, scid,
+ row['oid'])
+ if status:
+ if 'constraints' in data and data['constraints'] is not None \
+ and len(data['constraints']) > 0:
+ for item in data['constraints']:
+ if 'conoid' in item:
+ item.pop('conoid')
+
+ res[row['name']] = data
+
+ return res
+
ForeignTableView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py
index 4aa6cc2b4..4e65961de 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py
@@ -24,6 +24,8 @@ from pgadmin.utils import IS_PY2
from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -93,7 +95,7 @@ class FtsConfigurationModule(SchemaChildModule):
blueprint = FtsConfigurationModule(__name__)
-class FtsConfigurationView(PGChildNodeView):
+class FtsConfigurationView(PGChildNodeView, SchemaDiffObjectCompare):
"""
class FtsConfigurationView(PGChildNodeView)
@@ -167,6 +169,9 @@ class FtsConfigurationView(PGChildNodeView):
* dependencies(self, gid, sid, did, scid, cfgid):
- This function get the dependencies and return ajax response for node.
+ * compare(**kwargs):
+ - This function will compare the fts configuration nodes from two
+ different schemas.
"""
node_type = blueprint.node_type
@@ -202,6 +207,7 @@ class FtsConfigurationView(PGChildNodeView):
{'get': 'copyConfig'}],
'tokens': [{'get': 'tokens'}, {'get': 'tokens'}],
'dictionaries': [{}, {'get': 'dictionaries'}],
+ 'compare': [{'get': 'compare'}, {'get': 'compare'}]
})
def _init_(self, **kwargs):
@@ -343,7 +349,22 @@ class FtsConfigurationView(PGChildNodeView):
scid: Schema Id
cfgid: fts Configuration id
"""
+ status, res = self._fetch_properties(scid, cfgid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+ def _fetch_properties(self, scid, cfgid):
+ """
+ This function is used to fetch property of specified object.
+ :param scid:
+ :param cfgid:
+ :return:
+ """
sql = render_template(
"/".join([self.template_path, 'properties.sql']),
scid=scid,
@@ -352,10 +373,10 @@ class FtsConfigurationView(PGChildNodeView):
status, res = self.conn.execute_dict(sql)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(
+ return False, gone(
_(
"Could not find the FTS Configuration node in the "
"database node.")
@@ -370,14 +391,11 @@ class FtsConfigurationView(PGChildNodeView):
status, rset = self.conn.execute_dict(sql)
if not status:
- return internal_server_error(errormsg=rset)
+ return False, internal_server_error(errormsg=rset)
res['rows'][0]['tokens'] = rset['rows']
- return ajax_response(
- response=res['rows'][0],
- status=200
- )
+ return True, res['rows'][0]
@check_precondition
def create(self, gid, sid, did, scid):
@@ -927,5 +945,30 @@ class FtsConfigurationView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the fts configurations for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), scid=scid)
+ status, fts_cfg = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in fts_cfg['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
FtsConfigurationView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py
index f69f3af7f..358882cdb 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py
@@ -24,6 +24,8 @@ from pgadmin.utils import IS_PY2
from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -91,7 +93,7 @@ class FtsDictionaryModule(SchemaChildModule):
blueprint = FtsDictionaryModule(__name__)
-class FtsDictionaryView(PGChildNodeView):
+class FtsDictionaryView(PGChildNodeView, SchemaDiffObjectCompare):
"""
class FtsDictionaryView(PGChildNodeView)
@@ -159,6 +161,9 @@ class FtsDictionaryView(PGChildNodeView):
* dependencies(self, gid, sid, did, scid, dcid):
- This function get the dependencies and return ajax response for node.
+ * compare(**kwargs):
+ - This function will compare the fts dictionaries nodes from two
+ different schemas.
"""
node_type = blueprint.node_type
@@ -189,7 +194,7 @@ class FtsDictionaryView(PGChildNodeView):
'dependency': [{'get': 'dependencies'}],
'dependent': [{'get': 'dependents'}],
'fetch_templates': [{'get': 'fetch_templates'},
- {'get': 'fetch_templates'}],
+ {'get': 'fetch_templates'}]
})
def _init_(self, **kwargs):
@@ -353,7 +358,23 @@ class FtsDictionaryView(PGChildNodeView):
scid: Schema Id
dcid: fts dictionary id
"""
+ status, res = self._fetch_properties(scid, dcid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, dcid):
+ """
+ This function is used to fetch the properties of specified object.
+ :param scid:
+ :param dcid:
+ :return:
+ """
sql = render_template(
"/".join([self.template_path, 'properties.sql']),
scid=scid,
@@ -362,10 +383,10 @@ class FtsDictionaryView(PGChildNodeView):
status, res = self.conn.execute_dict(sql)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(_(
+ return False, gone(_(
"Could not find the FTS Dictionary node in the database node."
))
@@ -382,10 +403,7 @@ class FtsDictionaryView(PGChildNodeView):
res['rows'][0]['options']
)
- return ajax_response(
- response=res['rows'][0],
- status=200
- )
+ return True, res['rows'][0]
@check_precondition
def create(self, gid, sid, did, scid):
@@ -854,5 +872,30 @@ class FtsDictionaryView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the fts dictionaries for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
FtsDictionaryView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py
index 384ae62e8..09a445723 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py
@@ -24,6 +24,8 @@ from pgadmin.utils import IS_PY2
from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -84,7 +86,7 @@ class FtsParserModule(SchemaChildModule):
blueprint = FtsParserModule(__name__)
-class FtsParserView(PGChildNodeView):
+class FtsParserView(PGChildNodeView, SchemaDiffObjectCompare):
"""
class FtsParserView(PGChildNodeView)
@@ -161,6 +163,9 @@ class FtsParserView(PGChildNodeView):
- This function get the dependencies and return ajax response for
FTS Parser node.
+ * compare(**kwargs):
+ - This function will compare the fts parser nodes from two
+ different schemas.
"""
node_type = blueprint.node_type
@@ -198,7 +203,7 @@ class FtsParserView(PGChildNodeView):
'lextype_functions': [{'get': 'lextype_functions'},
{'get': 'lextype_functions'}],
'headline_functions': [{'get': 'headline_functions'},
- {'get': 'headline_functions'}],
+ {'get': 'headline_functions'}]
})
def _init_(self, **kwargs):
@@ -303,6 +308,32 @@ class FtsParserView(PGChildNodeView):
@check_precondition
def properties(self, gid, sid, did, scid, pid):
+ """
+
+ :param gid:
+ :param sid:
+ :param did:
+ :param scid:
+ :param pid:
+ :return:
+ """
+ status, res = self._fetch_properties(scid, pid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, pid):
+ """
+ This function is used to fetch the properties of specified object.
+
+ :param scid:
+ :param pid:
+ :return:
+ """
sql = render_template(
"/".join([self.template_path, 'properties.sql']),
scid=scid,
@@ -311,16 +342,13 @@ class FtsParserView(PGChildNodeView):
status, res = self.conn.execute_dict(sql)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(
+ return False, gone(
_("Could not find the FTS Parser node in the database node."))
- return ajax_response(
- response=res['rows'][0],
- status=200
- )
+ return True, res['rows'][0]
@check_precondition
def create(self, gid, sid, did, scid):
@@ -862,5 +890,30 @@ class FtsParserView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the fts parsers for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
FtsParserView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py
index 8e952d912..6b7627db0 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py
@@ -24,6 +24,8 @@ from pgadmin.utils import IS_PY2
from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -90,7 +92,7 @@ class FtsTemplateModule(SchemaChildModule):
blueprint = FtsTemplateModule(__name__)
-class FtsTemplateView(PGChildNodeView):
+class FtsTemplateView(PGChildNodeView, SchemaDiffObjectCompare):
"""
class FtsTemplateView(PGChildNodeView)
@@ -154,6 +156,9 @@ class FtsTemplateView(PGChildNodeView):
- This function get the dependencies and return ajax response for the
FTS Template node.
+ * compare(**kwargs):
+ - This function will compare the fts template nodes from two
+ different schemas.
"""
node_type = blueprint.node_type
@@ -184,7 +189,7 @@ class FtsTemplateView(PGChildNodeView):
'dependency': [{'get': 'dependencies'}],
'dependent': [{'get': 'dependents'}],
'get_lexize': [{'get': 'get_lexize'}, {'get': 'get_lexize'}],
- 'get_init': [{'get': 'get_init'}, {'get': 'get_init'}],
+ 'get_init': [{'get': 'get_init'}, {'get': 'get_init'}]
})
def _init_(self, **kwargs):
@@ -281,25 +286,47 @@ class FtsTemplateView(PGChildNodeView):
@check_precondition
def properties(self, gid, sid, did, scid, tid):
+ """
+
+ :param gid:
+ :param sid:
+ :param did:
+ :param scid:
+ :param tid:
+ :return:
+ """
+ status, res = self._fetch_properties(scid, tid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, tid):
+ """
+ This function is used to fetch the properties of specified object.
+
+ :param scid:
+ :param pid:
+ :return:
+ """
sql = render_template(
"/".join([self.template_path, 'properties.sql']),
scid=scid,
tid=tid
)
status, res = self.conn.execute_dict(sql)
-
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(
+ return False, gone(
gettext("Could not find the requested FTS template.")
)
- return ajax_response(
- response=res['rows'][0],
- status=200
- )
+ return True, res['rows'][0]
@check_precondition
def create(self, gid, sid, did, scid):
@@ -734,5 +761,30 @@ class FtsTemplateView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the fts templates for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
FtsTemplateView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py
index a66e2215d..ef2dda4f1 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py
@@ -21,7 +21,7 @@ from flask import render_template, make_response, request, jsonify, \
current_app
from flask_babelex import gettext
from pgadmin.browser.server_groups.servers.databases.schemas.utils import \
- SchemaChildModule, DataTypeReader
+ SchemaChildModule, DataTypeReader, get_schema
from pgadmin.browser.server_groups.servers.databases.utils import \
parse_sec_labels_from_db, parse_variables_from_db
from pgadmin.browser.server_groups.servers.utils import parse_priv_from_db, \
@@ -30,8 +30,10 @@ from pgadmin.browser.utils import PGChildNodeView
from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.driver import get_driver
-
from config import PG_DEFAULT_DRIVER
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.model import SchemaDiffModel
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
class FunctionModule(SchemaChildModule):
@@ -115,7 +117,7 @@ class FunctionModule(SchemaChildModule):
blueprint = FunctionModule(__name__)
-class FunctionView(PGChildNodeView, DataTypeReader):
+class FunctionView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare):
"""
class FunctionView(PGChildNodeView)
@@ -177,6 +179,10 @@ class FunctionView(PGChildNodeView, DataTypeReader):
* exec_sql(gid, sid, did, scid, fnid):
- Returns sql for Script
+
+ * compare(**kwargs):
+ - This function will compare the function nodes from two
+ different schemas.
"""
node_type = blueprint.node_type
@@ -213,6 +219,9 @@ class FunctionView(PGChildNodeView, DataTypeReader):
{'get': 'get_support_functions'}]
})
+ keys_to_ignore = ['oid', 'proowner', 'typnsp', 'xmin', 'prokind',
+ 'proisagg', 'pronamespace', 'proargdefaults']
+
@property
def required_args(self):
"""
@@ -789,7 +798,7 @@ class FunctionView(PGChildNodeView, DataTypeReader):
)
@check_precondition
- def delete(self, gid, sid, did, scid, fnid=None):
+ def delete(self, gid, sid, did, scid, fnid=None, only_sql=False):
"""
Drop the Function.
@@ -840,6 +849,8 @@ class FunctionView(PGChildNodeView, DataTypeReader):
func_args=res['rows'][0]['func_args'],
nspname=res['rows'][0]['nspname'],
cascade=cascade)
+ if only_sql:
+ return SQL
status, res = self.conn.execute_scalar(SQL)
if not status:
return internal_server_error(errormsg=res)
@@ -914,7 +925,8 @@ class FunctionView(PGChildNodeView, DataTypeReader):
)
@check_precondition
- def sql(self, gid, sid, did, scid, fnid=None):
+ def sql(self, gid, sid, did, scid, fnid=None, diff_schema=None,
+ json_resp=True):
"""
Returns the SQL for the Function object.
@@ -988,6 +1000,8 @@ class FunctionView(PGChildNodeView, DataTypeReader):
if not status:
return internal_server_error(errormsg=res)
+ if diff_schema:
+ res['rows'][0]['nspname'] = diff_schema
name_with_default_args = self.qtIdent(
self.conn,
res['rows'][0]['nspname'],
@@ -1039,6 +1053,10 @@ class FunctionView(PGChildNodeView, DataTypeReader):
if not status:
return internal_server_error(errormsg=res)
+ if diff_schema:
+ res['rows'][0]['nspname'] = diff_schema
+ resp_data['pronamespace'] = diff_schema
+
name_with_default_args = self.qtIdent(
self.conn,
res['rows'][0]['nspname'],
@@ -1070,6 +1088,9 @@ class FunctionView(PGChildNodeView, DataTypeReader):
resp_data['proname']),
resp_data['proargtypenames'].lstrip('(').rstrip(')'))
+ if not json_resp:
+ return re.sub('\n{2,}', '\n\n', func_def)
+
SQL = sql_header + func_def
SQL = re.sub('\n{2,}', '\n\n', SQL)
@@ -1596,7 +1617,66 @@ class FunctionView(PGChildNodeView, DataTypeReader):
status=200
)
+ def get_sql_from_diff(self, gid, sid, did, scid, oid, data=None,
+ diff_schema=None, drop_sql=False):
+ sql = ''
+ if data:
+ if diff_schema:
+ data['schema'] = diff_schema
+ status, sql = self._get_sql(gid, sid, did, scid, data, oid)
+ else:
+ if drop_sql:
+ sql = self.delete(gid=gid, sid=sid, did=did,
+ scid=scid, fnid=oid, only_sql=True)
+ elif diff_schema:
+ sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, fnid=oid,
+ diff_schema=diff_schema, json_resp=False)
+ else:
+ sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, fnid=oid,
+ json_resp=False)
+ return sql
+
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid, oid=None):
+ """
+ This function will fetch the list of all the functions for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ server_type = self.manager.server_type
+ server_version = self.manager.sversion
+
+ if server_type == 'pg' and self.blueprint.min_ver is not None and \
+ server_version < self.blueprint.min_ver:
+ return res
+ if server_type == 'ppas' and self.blueprint.min_ppasver is not None \
+ and server_version < self.blueprint.min_ppasver:
+ return res
+
+ if not oid:
+ SQL = render_template("/".join([self.sql_template_path,
+ 'node.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ data = self._fetch_properties(0, sid, did, scid, row['oid'])
+ if isinstance(data, dict):
+ res[row['name']] = data
+ else:
+ data = self._fetch_properties(0, sid, did, scid, oid)
+ res = data
+
+ return res
+
+SchemaDiffRegistry('function', FunctionView)
FunctionView.register_node_view(blueprint)
@@ -1697,6 +1777,7 @@ class ProcedureView(FunctionView):
'prosrc']
+SchemaDiffRegistry('procedure', ProcedureView)
ProcedureView.register_node_view(procedure_blueprint)
@@ -1795,4 +1876,5 @@ class TriggerFunctionView(FunctionView):
'prosrc']
+SchemaDiffRegistry('trigger_function', TriggerFunctionView)
TriggerFunctionView.register_node_view(trigger_function_blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py
index 70f99e91e..4c0a5a382 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py
@@ -27,6 +27,8 @@ from pgadmin.utils.ajax import make_json_response, \
make_response as ajax_response, internal_server_error, \
precondition_required, gone
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -83,7 +85,7 @@ class PackageModule(SchemaChildModule):
blueprint = PackageModule(__name__)
-class PackageView(PGChildNodeView):
+class PackageView(PGChildNodeView, SchemaDiffObjectCompare):
node_type = blueprint.node_type
parent_ids = [
@@ -111,6 +113,8 @@ class PackageView(PGChildNodeView):
'dependent': [{'get': 'dependents'}]
})
+ keys_to_ignore = ['oid', 'schema', 'xmin']
+
def check_precondition(action=None):
"""
This function will behave as a decorator which will checks
@@ -297,16 +301,32 @@ class PackageView(PGChildNodeView):
Returns:
+ """
+ status, res = self._fetch_properties(scid, pkgid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, pkgid):
+ """
+ This function is used to fetch the properties of specified object.
+ :param scid:
+ :param pkgid:
+ :return:
"""
SQL = render_template("/".join([self.template_path, 'properties.sql']),
scid=scid, pkgid=pkgid)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(
+ return False, gone(
errormsg=_("Could not find the package in the database.")
)
@@ -321,16 +341,13 @@ class PackageView(PGChildNodeView):
status, rset1 = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=rset1)
+ return False, internal_server_error(errormsg=rset1)
for row in rset1['rows']:
priv = parse_priv_from_db(row)
res['rows'][0].setdefault(row['deftype'], []).append(priv)
- return ajax_response(
- response=res['rows'][0],
- status=200
- )
+ return True, res['rows'][0]
@check_precondition(action="create")
def create(self, gid, sid, did, scid):
@@ -396,7 +413,7 @@ class PackageView(PGChildNodeView):
)
@check_precondition(action='delete')
- def delete(self, gid, sid, did, scid, pkgid=None):
+ def delete(self, gid, sid, did, scid, pkgid=None, only_sql=False):
"""
This function will drop the object
@@ -453,6 +470,9 @@ class PackageView(PGChildNodeView):
data=res['rows'][0],
cascade=cascade)
+ if only_sql:
+ return SQL
+
status, res = self.conn.execute_scalar(SQL)
if not status:
return internal_server_error(errormsg=res)
@@ -552,7 +572,8 @@ class PackageView(PGChildNodeView):
status=200
)
- def getSQL(self, gid, sid, did, data, scid, pkgid=None, sqltab=False):
+ def getSQL(self, gid, sid, did, data, scid, pkgid=None, sqltab=False,
+ diff_schema=None):
"""
This function will generate sql from model data.
@@ -621,6 +642,9 @@ class PackageView(PGChildNodeView):
if arg not in data:
data[arg] = old_data[arg]
+ if diff_schema:
+ data['schema'] = diff_schema
+
SQL = render_template("/".join([self.template_path, 'update.sql']),
data=data, o_data=old_data, conn=self.conn)
return SQL, data['name'] if 'name' in data else old_data['name']
@@ -635,7 +659,8 @@ class PackageView(PGChildNodeView):
return SQL, data['name']
@check_precondition(action="sql")
- def sql(self, gid, sid, did, scid, pkgid):
+ def sql(self, gid, sid, did, scid, pkgid, diff_schema=None,
+ json_resp=True):
"""
This function will generate sql for sql panel
@@ -645,6 +670,8 @@ class PackageView(PGChildNodeView):
did: Database ID
scid: Schema ID
pkgid: Package ID
+ diff_schema: Schema diff target schema name
+ json_resp: json response or plain text response
"""
try:
SQL = render_template(
@@ -676,13 +703,18 @@ class PackageView(PGChildNodeView):
res['rows'][0].setdefault(row['deftype'], []).append(priv)
result = res['rows'][0]
- sql, name = self.getSQL(gid, sid, did, result, scid, pkgid, True)
+ sql, name = self.getSQL(gid, sid, did, result, scid, pkgid, True,
+ diff_schema)
# Most probably this is due to error
if not isinstance(sql, (str, unicode)):
return sql
sql = sql.strip('\n').strip(' ')
+ # Return sql for schema diff
+ if not json_resp:
+ return sql
+
sql_header = u"-- Package: {}\n\n-- ".format(
self.qtIdent(self.conn, self.schema, result['name'])
)
@@ -756,5 +788,54 @@ class PackageView(PGChildNodeView):
return sql[start:end].strip("\n")
+ @check_precondition(action="fetch_objects_to_compare")
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the packages for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ if self.manager.server_type != 'ppas':
+ return res
+
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
+ def get_sql_from_diff(self, gid, sid, did, scid, oid, data=None,
+ diff_schema=None, drop_sql=False):
+ sql = ''
+ if data:
+ if diff_schema:
+ data['schema'] = diff_schema
+ status, sql = self.getSQL(gid, sid, did, data, scid, oid)
+ else:
+ if drop_sql:
+ sql = self.delete(gid=gid, sid=sid, did=did,
+ scid=scid, pkgid=oid, only_sql=True)
+
+ elif diff_schema:
+ sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, pkgid=oid,
+ diff_schema=diff_schema, json_resp=False)
+ else:
+ sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, pkgid=oid,
+ json_resp=False)
+ return sql
+
+SchemaDiffRegistry('package', PackageView)
PackageView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py
index 4809be85b..f97994468 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py
@@ -161,6 +161,8 @@ class EdbFuncView(PGChildNodeView, DataTypeReader):
* dependencies(gid, sid, did, scid, pkgid, edbfnid):
- Returns the dependencies for the Functions object.
+ * compare(**kwargs):
+ - This function will compare the nodes from two different schemas.
"""
node_type = blueprint.node_type
@@ -184,7 +186,8 @@ class EdbFuncView(PGChildNodeView, DataTypeReader):
'nodes': [{'get': 'nodes'}, {'get': 'nodes'}],
'sql': [{'get': 'sql'}],
'dependency': [{'get': 'dependencies'}],
- 'dependent': [{'get': 'dependents'}]
+ 'dependent': [{'get': 'dependents'}],
+ 'compare': [{'get': 'compare'}, {'get': 'compare'}]
})
def check_precondition(f):
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbvars/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbvars/__init__.py
index ddce19a65..e82660dde 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbvars/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbvars/__init__.py
@@ -137,6 +137,8 @@ class EdbVarView(PGChildNodeView, DataTypeReader):
* sql(gid, sid, did, scid, pkgid, varid):
- Returns the SQL for the Functions object.
+ * compare(**kwargs):
+ - This function will compare the nodes from two different schemas.
"""
node_type = blueprint.node_type
@@ -158,7 +160,8 @@ class EdbVarView(PGChildNodeView, DataTypeReader):
{'get': 'list'}
],
'nodes': [{'get': 'nodes'}, {'get': 'nodes'}],
- 'sql': [{'get': 'sql'}]
+ 'sql': [{'get': 'sql'}],
+ 'compare': [{'get': 'compare'}, {'get': 'compare'}]
})
def check_precondition(f):
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py
index eff3d9e85..3dbe7422e 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py
@@ -24,6 +24,9 @@ from pgadmin.utils.ajax import make_json_response, internal_server_error, \
from pgadmin.utils.driver import get_driver
from config import PG_DEFAULT_DRIVER
from pgadmin.utils import IS_PY2
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
+
# If we are in Python3
if not IS_PY2:
unicode = str
@@ -88,7 +91,7 @@ class SequenceModule(SchemaChildModule):
blueprint = SequenceModule(__name__)
-class SequenceView(PGChildNodeView):
+class SequenceView(PGChildNodeView, SchemaDiffObjectCompare):
node_type = blueprint.node_type
parent_ids = [
@@ -273,6 +276,23 @@ class SequenceView(PGChildNodeView):
Returns:
"""
+ status, res = self._fetch_properties(scid, seid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, seid):
+ """
+ This function is used to fetch the properties of the specified object.
+ :param scid:
+ :param seid:
+ :return:
+ """
+
SQL = render_template(
"/".join([self.template_path, 'properties.sql']),
scid=scid, seid=seid
@@ -280,10 +300,11 @@ class SequenceView(PGChildNodeView):
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(_("Could not find the sequence in the database."))
+ return False, gone(
+ _("Could not find the sequence in the database."))
for row in res['rows']:
SQL = render_template(
@@ -292,7 +313,7 @@ class SequenceView(PGChildNodeView):
)
status, rset1 = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=rset1)
+ return False, internal_server_error(errormsg=rset1)
row['current_value'] = rset1['rows'][0]['last_value']
row['minimum'] = rset1['rows'][0]['min_value']
@@ -319,7 +340,7 @@ class SequenceView(PGChildNodeView):
)
status, dataclres = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
for row in dataclres['rows']:
priv = parse_priv_from_db(row)
@@ -328,10 +349,7 @@ class SequenceView(PGChildNodeView):
else:
res['rows'][0][row['deftype']] = [priv]
- return ajax_response(
- response=res['rows'][0],
- status=200
- )
+ return True, res['rows'][0]
@check_precondition(action="create")
def create(self, gid, sid, did, scid):
@@ -869,5 +887,30 @@ class SequenceView(PGChildNodeView):
status=200
)
+ @check_precondition(action="fetch_objects_to_compare")
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the sequences for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
SequenceView.register_node_view(blueprint)
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 7f3c680d7..145ccf69b 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
@@ -24,6 +24,8 @@ from pgadmin.utils.ajax import precondition_required
from pgadmin.utils.driver import get_driver
from config import PG_DEFAULT_DRIVER
from pgadmin.utils import IS_PY2
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -91,7 +93,7 @@ class SynonymModule(SchemaChildModule):
blueprint = SynonymModule(__name__)
-class SynonymView(PGChildNodeView):
+class SynonymView(PGChildNodeView, SchemaDiffObjectCompare):
"""
This class is responsible for generating routes for Synonym node
@@ -143,6 +145,10 @@ class SynonymView(PGChildNodeView):
* dependent(gid, sid, did, scid):
- This function will generate dependent list to show it in dependent
pane for the selected Synonym node.
+
+ * compare(**kwargs):
+ - This function will compare the synonyms nodes from two
+ different schemas.
"""
node_type = blueprint.node_type
@@ -385,26 +391,36 @@ class SynonymView(PGChildNodeView):
Returns:
JSON of selected synonym node
"""
+ status, res = self._fetch_properties(scid, syid)
+ if not status:
+ return res
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, syid):
+ """
+ This function is used to fetch the properties of the specified object
+ :param scid:
+ :param syid:
+ :return:
+ """
try:
SQL = render_template("/".join([self.template_path,
'properties.sql']),
scid=scid, syid=syid)
status, res = self.conn.execute_dict(SQL)
-
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
- if len(res['rows']) > 0:
- return ajax_response(
- response=res['rows'][0],
- status=200
- )
- else:
- return gone(
+ if len(res['rows']) == 0:
+ return False, gone(
gettext('The specified synonym could not be found.')
)
+ return True, res['rows'][0]
except Exception as e:
return internal_server_error(errormsg=str(e))
@@ -707,5 +723,33 @@ class SynonymView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the synonyms for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ if self.manager.server_type != 'ppas':
+ return res
+
+ SQL = render_template("/".join([self.template_path,
+ 'properties.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(scid, row['name'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
SynonymView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
index 3fef6e025..14e13ed2d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
@@ -11,9 +11,11 @@
import simplejson as json
import re
+import copy
+import random
import pgadmin.browser.server_groups.servers.databases as database
-from flask import render_template, request, jsonify, url_for
+from flask import render_template, request, jsonify, url_for, current_app
from flask_babelex import gettext
from pgadmin.browser.server_groups.servers.databases.schemas.utils \
import SchemaChildModule, DataTypeReader, VacuumSettings
@@ -22,8 +24,15 @@ from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from .utils import BaseTableView
from pgadmin.utils.preferences import Preferences
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.directory_compare import compare_dictionaries,\
+ directory_diff
+from pgadmin.tools.schema_diff.model import SchemaDiffModel
+from pgadmin.utils.driver import get_driver
+from config import PG_DEFAULT_DRIVER
from pgadmin.browser.server_groups.servers.databases.schemas.tables.\
constraints.foreign_key import utils as fkey_utils
+from .schema_diff_utils import SchemaDiffTableCompare
from pgadmin.browser.server_groups.servers.databases.schemas.tables.\
columns import utils as column_utils
from pgadmin.browser.server_groups.servers.databases.schemas.tables.\
@@ -132,7 +141,8 @@ class TableModule(SchemaChildModule):
blueprint = TableModule(__name__)
-class TableView(BaseTableView, DataTypeReader, VacuumSettings):
+class TableView(BaseTableView, DataTypeReader, VacuumSettings,
+ SchemaDiffTableCompare):
"""
This class is responsible for generating routes for Table node
@@ -229,6 +239,10 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
* delete_sql(gid, sid, did, scid, foid):
- Returns sql for Script
+
+ * compare(**kwargs):
+ - This function will compare the table nodes from two
+ different schemas.
"""
node_type = blueprint.node_type
@@ -277,7 +291,8 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
'insert_sql': [{'get': 'insert_sql'}],
'update_sql': [{'get': 'update_sql'}],
'delete_sql': [{'get': 'delete_sql'}],
- 'count_rows': [{'get': 'count_rows'}]
+ 'count_rows': [{'get': 'count_rows'}],
+ 'compare': [{'get': 'compare'}, {'get': 'compare'}]
})
@BaseTableView.check_precondition
@@ -464,9 +479,9 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
- setting
values
"""
- res = self.get_vacuum_table_settings(self.conn)
+ res = self.get_vacuum_table_settings(self.conn, sid)
return ajax_response(
- response=res['rows'],
+ response=res,
status=200
)
@@ -480,9 +495,9 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
- setting
values
"""
- res = self.get_vacuum_toast_settings(self.conn)
+ res = self.get_vacuum_toast_settings(self.conn, sid)
return ajax_response(
- response=res['rows'],
+ response=res,
status=200
)
@@ -582,7 +597,22 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
Returns:
JSON of selected table node
"""
+ status, res = self._fetch_properties(did, scid, tid)
+ if not status:
+ return res
+ return super(TableView, self).properties(
+ gid, sid, did, scid, tid, res
+ )
+
+ def _fetch_properties(self, did, scid, tid):
+ """
+ This function is used to fetch the properties of the specified object
+ :param did:
+ :param scid:
+ :param tid:
+ :return:
+ """
SQL = render_template(
"/".join([self.table_template_path, 'properties.sql']),
did=did, scid=scid, tid=tid,
@@ -590,10 +620,11 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(gettext("The specified table could not be found."))
+ return False, gone(
+ gettext("The specified table could not be found."))
# We will check the threshold set by user before executing
# the query because that can cause performance issues
@@ -620,7 +651,7 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
status, count = self.conn.execute_scalar(SQL)
if not status:
- return internal_server_error(errormsg=count)
+ return False, internal_server_error(errormsg=count)
res['rows'][0]['rows_cnt'] = count
@@ -628,9 +659,7 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
elif not estimated_row_count:
res['rows'][0]['rows_cnt'] = estimated_row_count
- return super(TableView, self).properties(
- gid, sid, did, scid, tid, res
- )
+ return True, res
@BaseTableView.check_precondition
def types(self, gid, sid, did, scid, tid=None, clid=None):
@@ -1168,6 +1197,72 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
"""
return BaseTableView.reset_statistics(self, scid, tid)
+ @BaseTableView.check_precondition
+ def get_sql_from_table_diff(self, **kwargs):
+ """
+ This function will create sql on the basis the difference of 2 tables
+ """
+ data = dict()
+ res = None
+ sid = kwargs['sid']
+ did = kwargs['did']
+ scid = kwargs['scid']
+ tid = kwargs['tid']
+ diff_data = kwargs['diff_data'] if 'diff_data' in kwargs else None
+ json_resp = kwargs['json_resp'] if 'json_resp' in kwargs else True
+ diff_schema = kwargs['diff_schema'] if 'diff_schema' in kwargs else\
+ None
+ schema_diff_table = kwargs['schema_diff_table'] if\
+ 'schema_diff_table' in kwargs else None
+
+ if diff_data:
+ return self._fetch_sql(did, scid, tid, diff_data, json_resp)
+ else:
+ main_sql = []
+
+ SQL = render_template(
+ "/".join([self.table_template_path, 'properties.sql']),
+ did=did, scid=scid, tid=tid,
+ datlastsysoid=self.datlastsysoid
+ )
+ status, res = self.conn.execute_dict(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ if len(res['rows']) == 0:
+ return gone(gettext("The specified table could not be found."
+ ))
+
+ if status:
+ data = res['rows'][0]
+ # data = super(TableView, self).properties(
+ # 0, sid, did, scid, tid, res, False
+ # )
+
+ if diff_schema:
+ data['schema'] = diff_schema
+
+ if schema_diff_table:
+ data['orig_name'] = data['name']
+ data['name'] = 'schema_diff_temp_{0}'.format(
+ random.randint(1, 9999999))
+
+ sql, partition_sql = BaseTableView.get_reverse_engineered_sql(
+ self, did, scid, tid, main_sql, data, json_resp,
+ diff_partition_sql=True)
+ else:
+ sql, partition_sql = BaseTableView.get_reverse_engineered_sql(
+ self, did, scid, tid, main_sql, data, json_resp)
+
+ if schema_diff_table:
+ # If partition tables have different partitions
+ sql += render_template(
+ "/".join([self.table_template_path, 'schema_diff.sql']),
+ conn=self.conn, data=data, partition_sql=partition_sql
+ )
+
+ return sql
+
@BaseTableView.check_precondition
def msql(self, gid, sid, did, scid, tid=None):
"""
@@ -1181,7 +1276,7 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
tid: Table ID
"""
data = dict()
- res = None
+ SQL = ''
for k, v in request.args.items():
try:
# comments should be taken as is because if user enters a
@@ -1193,6 +1288,11 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
except (ValueError, TypeError, KeyError):
data[k] = v
+ return self._fetch_sql(did, scid, tid, data)
+
+ def _fetch_sql(self, did, scid, tid, data, json_resp=True):
+ res = None
+
if tid is not None:
SQL = render_template(
"/".join([self.table_template_path, 'properties.sql']),
@@ -1201,13 +1301,18 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return internal_server_error(errormsg=SQL)
SQL, name = self.get_sql(did, scid, tid, data, res)
SQL = re.sub('\n{2,}', '\n\n', SQL)
SQL = SQL.strip('\n')
+
+ if not json_resp:
+ return SQL
+
if SQL == '':
SQL = "--modified SQL"
+
return make_json_response(
data=SQL,
status=200
@@ -1419,7 +1524,7 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
return ajax_response(response=sql)
@BaseTableView.check_precondition
- def delete_sql(self, gid, sid, did, scid, tid):
+ def delete_sql(self, gid, sid, did, scid, tid, json_resp=True):
"""
DELETE script sql for the object
@@ -1448,6 +1553,9 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
self.qtIdent(self.conn, data['schema'], data['name'])
)
+ if not json_resp:
+ return sql
+
return ajax_response(response=sql)
@BaseTableView.check_precondition
@@ -1502,5 +1610,60 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
data={'total_rows': count}
)
+ def get_delete_sql(self, res):
+ self.cmd = 'delete'
+ sql = super(TableView, self).get_delete_sql(res)
+ self.cmd = None
+ return sql
+
+ @BaseTableView.check_precondition
+ def fetch_tables(self, sid, did, scid, tid=None, keys_to_remove=None):
+ """
+ This function will fetch the list of all the tables
+ and will be used by schema diff.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :param tid: Table Id
+ :param keys_to_remove: Table columns to be removed from the dataset
+ :return: Table dataset
+ """
+ if tid:
+ status, data = self._fetch_properties(did, scid, tid)
+
+ if not status:
+ current_app.logger.error(data)
+ return False
+
+ data = super(TableView, self).properties(
+ 0, sid, did, scid, tid, data, False
+ )
+ self.remove_keys_for_comparision(data, keys_to_remove)
+ return data
+
+ else:
+ res = dict()
+ SQL = render_template("/".join([self.table_template_path,
+ 'nodes.sql']), scid=scid)
+ status, tables = self.conn.execute_2darray(SQL)
+ if not status:
+ current_app.logger.error(tables)
+ return False
+
+ for row in tables['rows']:
+ status, data = self._fetch_properties(did, scid, row['oid'])
+
+ if status:
+ data = super(TableView, self).properties(
+ 0, sid, did, scid, row['oid'], data, False
+ )
+
+ self.remove_keys_for_comparision(data, keys_to_remove)
+ res[row['name']] = data
+
+ return res
+
+SchemaDiffRegistry('table', TableView)
TableView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py
index c0c40e417..3346af8d8 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py
@@ -29,6 +29,7 @@ from pgadmin.utils.driver import get_driver
from config import PG_DEFAULT_DRIVER
from pgadmin.utils import IS_PY2
from pgadmin.utils.ajax import ColParamsJSONDecoder
+
# If we are in Python3
if not IS_PY2:
unicode = str
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py
index 6119ff138..83d87bd5a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py
@@ -26,6 +26,10 @@ from pgadmin.browser.server_groups.servers.databases.schemas.utils \
from pgadmin.utils.driver import get_driver
from config import PG_DEFAULT_DRIVER
from pgadmin.utils import IS_PY2
+from pgadmin.utils.compile_template_name import compile_template_path
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
+
# If we are in Python3
if not IS_PY2:
unicode = str
@@ -155,7 +159,7 @@ class CompoundTriggerModule(CollectionNodeModule):
blueprint = CompoundTriggerModule(__name__)
-class CompoundTriggerView(PGChildNodeView):
+class CompoundTriggerView(PGChildNodeView, SchemaDiffObjectCompare):
"""
This class is responsible for generating routes for Compound Trigger node
@@ -245,6 +249,10 @@ class CompoundTriggerView(PGChildNodeView):
'enable': [{'put': 'enable_disable_trigger'}]
})
+ # Schema Diff: Keys to ignore while comparing
+ keys_to_ignore = ['oid', 'xmin', 'nspname', 'tfunction',
+ 'tgrelid', 'tgfoid']
+
def check_precondition(f):
"""
This function will behave as a decorator which will checks
@@ -267,6 +275,12 @@ class CompoundTriggerView(PGChildNodeView):
]['datlastsysoid'] if self.manager.db_info is not None and \
kwargs['did'] in self.manager.db_info else 0
+ self.table_template_path = compile_template_path(
+ 'tables/sql',
+ self.manager.server_type,
+ self.manager.version
+ )
+
# we will set template path for sql scripts
self.template_path = 'compound_triggers/sql/{0}/#{1}#'.format(
self.manager.server_type, self.manager.version)
@@ -417,6 +431,18 @@ class CompoundTriggerView(PGChildNodeView):
JSON of selected compound trigger node
"""
+ data = self._fetch_properties(tid, trid)
+
+ if not status:
+ return data
+
+ return ajax_response(
+ response=data,
+ status=200
+ )
+
+ def _fetch_properties(self, tid, trid):
+
SQL = render_template("/".join([self.template_path,
'properties.sql']),
tid=tid, trid=trid,
@@ -440,10 +466,7 @@ class CompoundTriggerView(PGChildNodeView):
data = trigger_definition(data)
- return ajax_response(
- response=data,
- status=200
- )
+ return True, data
@check_precondition
def create(self, gid, sid, did, scid, tid):
@@ -519,7 +542,7 @@ class CompoundTriggerView(PGChildNodeView):
return internal_server_error(errormsg=str(e))
@check_precondition
- def delete(self, gid, sid, did, scid, tid, trid=None):
+ def delete(self, gid, sid, did, scid, tid, trid=None, only_sql=False):
"""
This function will updates existing the compound trigger object
@@ -579,6 +602,9 @@ class CompoundTriggerView(PGChildNodeView):
conn=self.conn,
cascade=cascade
)
+ if only_sql:
+ return SQL
+
status, res = self.conn.execute_scalar(SQL)
if not status:
return internal_server_error(errormsg=res)
@@ -846,5 +872,109 @@ class CompoundTriggerView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def get_sql_from_diff(self, gid, sid, did, scid, tid, oid,
+ data=None, diff_schema=None, drop_sql=False):
+ if data:
+ sql, name = self.get_sql(scid, tid, oid, data)
+ if not isinstance(sql, (str, unicode)):
+ return sql
+ sql = sql.strip('\n').strip(' ')
+ else:
+ if drop_sql:
+ SQL = self.delete(gid=gid, sid=sid, did=did,
+ scid=scid, tid=tid,
+ trid=oid, only_sql=True)
+ else:
+ SQL = render_template("/".join([self.template_path,
+ 'properties.sql']),
+ tid=tid, trid=oid,
+ datlastsysoid=self.datlastsysoid)
+
+ status, res = self.conn.execute_dict(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+ if len(res['rows']) == 0:
+ return gone(gettext("""Could not find the compound
+ trigger in the table."""))
+
+ data = dict(res['rows'][0])
+ # Adding parent into data dict,
+ # will be using it while creating sql
+ data['schema'] = self.schema
+ data['table'] = self.table
+
+ if len(data['tgattr']) >= 1:
+ columns = ', '.join(data['tgattr'].split(' '))
+ data['columns'] = self._column_details(tid, columns)
+
+ data = self._trigger_definition(data)
+
+ if diff_schema:
+ data['schema'] = diff_schema
+
+ SQL, name = self.get_sql(scid, tid, None, data)
+
+ sql_header = u"-- Compound Trigger: {0}\n\n-- ".format(
+ data['name'])
+
+ sql_header += render_template("/".join([self.template_path,
+ 'delete.sql']),
+ data=data, conn=self.conn)
+
+ SQL = sql_header + '\n\n' + SQL.strip('\n')
+
+ # If compound trigger is disbaled then add sql
+ # code for the same
+ if not data['is_enable_trigger']:
+ SQL += '\n\n'
+ SQL += render_template("/".join([
+ self.template_path,
+ 'enable_disable_trigger.sql']),
+ data=data, conn=self.conn)
+
+ return SQL
+
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid, tid, oid=None,
+ ignore_keys=False):
+ """
+ This function will fetch the list of all the triggers for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :param tid: Table Id
+ :return:
+ """
+ res = dict()
+
+ if oid:
+ status, data = self._fetch_properties(tid, oid)
+ if not status:
+ current_app.logger.error(data)
+ return False
+ res = data
+ else:
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), tid=tid)
+ status, triggers = self.conn.execute_2darray(SQL)
+ if not status:
+ current_app.logger.error(triggers)
+ return False
+
+ for row in triggers['rows']:
+ status, data = self._fetch_properties(tid, row['oid'])
+ if status:
+ if ignore_keys:
+ for key in self.keys_to_ignore:
+ if key in data:
+ del data[key]
+ res[row['name']] = data
+
+ return res
+
+SchemaDiffRegistry('compound_trigger', CompoundTriggerView, 'table')
CompoundTriggerView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/utils.py
index 47baee9b3..04237d645 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/utils.py
@@ -152,7 +152,8 @@ def get_index_constraint_sql(conn, did, tid, data, template_path=None):
modified_sql, name = get_sql(conn, c, did, tid, ctype,
c['oid'])
- sql.append(modified_sql.strip('\n'))
+ if modified_sql:
+ sql.append(modified_sql.strip('\n'))
if 'added' in constraint:
for c in constraint['added']:
@@ -183,6 +184,7 @@ def get_sql(conn, data, did, tid, ctype, cid=None, template_path=None):
:return:
"""
name = data['name'] if 'name' in data else None
+ sql = None
if cid is not None:
sql = render_template("/".join([template_path, 'properties.sql']),
did=did, tid=tid, cid=cid,
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/__init__.py
index 7f19e953a..6cde60843 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/__init__.py
@@ -13,7 +13,7 @@ import simplejson as json
from functools import wraps
import pgadmin.browser.server_groups.servers.databases as database
-from flask import render_template, request, jsonify
+from flask import render_template, request, jsonify, current_app
from flask_babelex import gettext
from pgadmin.browser.collection import CollectionNodeModule
from pgadmin.browser.server_groups.servers.databases.schemas.tables.\
@@ -25,8 +25,14 @@ from pgadmin.utils.compile_template_name import compile_template_path
from pgadmin.utils.driver import get_driver
from config import PG_DEFAULT_DRIVER
from pgadmin.utils import IS_PY2
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.directory_compare import compare_dictionaries,\
+ directory_diff
+from pgadmin.tools.schema_diff.model import SchemaDiffModel
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
from pgadmin.browser.server_groups.servers.databases.schemas. \
tables.indexes import utils as index_utils
+
# If we are in Python3
if not IS_PY2:
unicode = str
@@ -135,7 +141,7 @@ class IndexesModule(CollectionNodeModule):
blueprint = IndexesModule(__name__)
-class IndexesView(PGChildNodeView):
+class IndexesView(PGChildNodeView, SchemaDiffObjectCompare):
"""
This class is responsible for generating routes for Index node
@@ -227,6 +233,11 @@ class IndexesView(PGChildNodeView):
{'get': 'get_op_class'}]
})
+ # Schema Diff: Keys to ignore while comparing
+ keys_to_ignore = ['oid', 'relowner', 'schema',
+ 'indrelid', 'nspname'
+ ]
+
def check_precondition(f):
"""
This function will behave as a decorator which will checks
@@ -248,6 +259,12 @@ class IndexesView(PGChildNodeView):
]['datlastsysoid'] if self.manager.db_info is not None and \
kwargs['did'] in self.manager.db_info else 0
+ self.table_template_path = compile_template_path(
+ 'tables/sql',
+ self.manager.server_type,
+ self.manager.version
+ )
+
# we will set template path for sql scripts
self.template_path = compile_template_path(
'indexes/sql/',
@@ -485,19 +502,35 @@ class IndexesView(PGChildNodeView):
Returns:
JSON of selected schema node
"""
+ status, data = self._fetch_properties(did, tid, idx)
+ if not status:
+ return data
+ return ajax_response(
+ response=data,
+ status=200
+ )
+
+ def _fetch_properties(self, did, tid, idx):
+ """
+ This function is used to fetch the properties of specified object.
+ :param did:
+ :param tid:
+ :param idx:
+ :return:
+ """
SQL = render_template(
"/".join([self.template_path, 'properties.sql']),
did=did, tid=tid, idx=idx, datlastsysoid=self.datlastsysoid
)
status, res = self.conn.execute_dict(SQL)
-
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(gettext("""Could not find the index in the table."""))
+ return False, gone(
+ gettext("""Could not find the index in the table."""))
# Making copy of output for future use
data = dict(res['rows'][0])
@@ -509,10 +542,7 @@ class IndexesView(PGChildNodeView):
if self.manager.version >= 110000:
data = index_utils.get_include_details(self.conn, idx, data)
- return ajax_response(
- response=data,
- status=200
- )
+ return True, data
@check_precondition
def create(self, gid, sid, did, scid, tid):
@@ -620,7 +650,8 @@ class IndexesView(PGChildNodeView):
return internal_server_error(errormsg=str(e))
@check_precondition
- def delete(self, gid, sid, did, scid, tid, idx=None):
+ def delete(self, gid, sid, did, scid, tid, idx=None,
+ only_sql=False):
"""
This function will updates existing the schema object
@@ -676,6 +707,9 @@ class IndexesView(PGChildNodeView):
"/".join([self.template_path, 'delete.sql']),
data=data, conn=self.conn, cascade=cascade
)
+
+ if only_sql:
+ return SQL
status, res = self.conn.execute_scalar(SQL)
if not status:
return internal_server_error(errormsg=res)
@@ -792,6 +826,32 @@ class IndexesView(PGChildNodeView):
return ajax_response(response=SQL)
+ @check_precondition
+ def get_sql_from_index_diff(self, sid, did, scid, tid, idx, data=None,
+ diff_schema=None, drop_req=False):
+
+ tmp_idx = idx
+ schema = ''
+ if data:
+ schema = self.schema
+ elif diff_schema:
+ schema = diff_schema
+
+ sql = index_utils.get_reverse_engineered_sql(
+ self.conn, schema,
+ self.table, did, tid, idx,
+ self.datlastsysoid,
+ template_path=None, with_header=False)
+
+ drop_sql = ''
+ if drop_req:
+ drop_sql = '\n' + render_template(
+ "/".join([self.template_path, 'delete.sql']),
+ data=data, conn=self.conn
+ )
+
+ return drop_sql + '\n\n' + sql
+
@check_precondition
def dependents(self, gid, sid, did, scid, tid, idx):
"""
@@ -914,5 +974,129 @@ class IndexesView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid, tid, oid=None,
+ ignore_keys=False):
+ """
+ This function will fetch the list of all the indexes for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+
+ res = dict()
+
+ if not oid:
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), tid=tid)
+ status, indexes = self.conn.execute_2darray(SQL)
+ if not status:
+ current_app.logger.error(indexes)
+ return False
+
+ for row in indexes['rows']:
+ status, data = self._fetch_properties(did, tid,
+ row['oid'])
+ if status:
+ if ignore_keys:
+ for key in self.keys_to_ignore:
+ if key in data:
+ del data[key]
+ res[row['name']] = data
+ else:
+ status, data = self._fetch_properties(did, tid,
+ oid)
+ if not status:
+ current_app.logger.error(data)
+ return False
+ res = data
+
+ return res
+
+ def ddl_compare(self, **kwargs):
+ """
+ This function will compare index properties and
+ return the difference of SQL
+ """
+
+ src_sid = kwargs.get('source_sid')
+ src_did = kwargs.get('source_did')
+ src_scid = kwargs.get('source_scid')
+ src_tid = kwargs.get('source_tid')
+ src_oid = kwargs.get('source_oid')
+ tar_sid = kwargs.get('target_sid')
+ tar_did = kwargs.get('target_did')
+ tar_scid = kwargs.get('target_scid')
+ tar_tid = kwargs.get('target_tid')
+ tar_oid = kwargs.get('target_oid')
+ comp_status = kwargs.get('comp_status')
+
+ source = ''
+ target = ''
+ diff = ''
+
+ status, target_schema = self.get_schema(tar_sid,
+ tar_did,
+ tar_scid
+ )
+ if not status:
+ return internal_server_error(errormsg=target_schema)
+
+ if comp_status == SchemaDiffModel.COMPARISON_STATUS['source_only']:
+ diff = self.get_sql_from_index_diff(sid=src_sid,
+ did=src_did, scid=src_scid,
+ tid=src_tid, idx=src_oid,
+ diff_schema=target_schema)
+
+ elif comp_status == SchemaDiffModel.COMPARISON_STATUS['target_only']:
+ diff = self.delete(gid=1, sid=tar_sid, did=tar_did,
+ scid=tar_scid, tid=tar_tid,
+ idx=tar_oid, only_sql=True)
+
+ else:
+ source = self.fetch_objects_to_compare(sid=src_sid, did=src_did,
+ scid=src_scid, tid=src_tid,
+ oid=src_oid)
+ target = self.fetch_objects_to_compare(sid=tar_sid, did=tar_did,
+ scid=tar_scid, tid=tar_tid,
+ oid=tar_oid)
+
+ if not (source or target):
+ return None
+
+ diff_dict = directory_diff(
+ source, target, ignore_keys=self.keys_to_ignore,
+ difference={}
+ )
+
+ required_create_keys = ['columns']
+ create_req = False
+
+ for key in required_create_keys:
+ if key in diff_dict:
+ create_req = True
+
+ if create_req:
+ diff = self.get_sql_from_index_diff(sid=src_sid,
+ did=src_did,
+ scid=src_scid,
+ tid=src_tid,
+ idx=src_oid,
+ diff_schema=target_schema,
+ drop_req=True)
+ else:
+ diff = self.get_sql_from_index_diff(sid=tar_sid,
+ did=tar_did,
+ scid=tar_scid,
+ tid=tar_tid,
+ idx=tar_oid,
+ data=diff_dict)
+
+ return diff
+
+SchemaDiffRegistry('index', IndexesView, 'table')
IndexesView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/utils.py
index 44534ac6e..eb9001f0a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/utils.py
@@ -26,7 +26,7 @@ def get_template_path(f):
def wrap(*args, **kwargs):
# Here args[0] will hold the connection object
conn_obj = args[0]
- if 'template_path' not in kwargs:
+ if 'template_path' not in kwargs or kwargs['template_path'] is None:
kwargs['template_path'] = \
'indexes/sql/#{0}#'.format(conn_obj.manager.version)
@@ -229,7 +229,7 @@ def get_sql(conn, data, did, tid, idx, datlastsysoid,
@get_template_path
def get_reverse_engineered_sql(conn, schema, table, did, tid, idx,
datlastsysoid,
- template_path=None):
+ template_path=None, with_header=True):
"""
This function will return reverse engineered sql for specified trigger.
@@ -240,6 +240,8 @@ def get_reverse_engineered_sql(conn, schema, table, did, tid, idx,
:param idx: Index ID
:param datlastsysoid:
:param template_path: Optional template path
+ :param with_header: Optional parameter to decide whether the SQL will be
+ returned with header or not
:return:
"""
SQL = render_template("/".join([template_path, 'properties.sql']),
@@ -267,11 +269,12 @@ def get_reverse_engineered_sql(conn, schema, table, did, tid, idx,
SQL, name = get_sql(conn, data, did, tid, None, datlastsysoid)
- sql_header = u"-- Index: {0}\n\n-- ".format(data['name'])
+ if with_header:
+ sql_header = u"-- Index: {0}\n\n-- ".format(data['name'])
- sql_header += render_template("/".join([template_path, 'delete.sql']),
- data=data, conn=conn)
+ sql_header += render_template("/".join([template_path, 'delete.sql']),
+ data=data, conn=conn)
- SQL = sql_header + '\n\n' + SQL
+ SQL = sql_header + '\n\n' + SQL
return SQL
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/__init__.py
index aa6694a39..4438c89df 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/__init__.py
@@ -24,6 +24,11 @@ from pgadmin.browser.collection import CollectionNodeModule
from pgadmin.utils.ajax import make_json_response, precondition_required
from config import PG_DEFAULT_DRIVER
from pgadmin.browser.utils import PGChildModule
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.directory_compare import compare_dictionaries,\
+ directory_diff
+from pgadmin.tools.schema_diff.model import SchemaDiffModel
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
def backend_supported(module, manager, **kwargs):
@@ -152,7 +157,8 @@ class PartitionsModule(CollectionNodeModule):
blueprint = PartitionsModule(__name__)
-class PartitionsView(BaseTableView, DataTypeReader, VacuumSettings):
+class PartitionsView(BaseTableView, DataTypeReader, VacuumSettings,
+ SchemaDiffObjectCompare):
"""
This class is responsible for generating routes for Partition node
@@ -200,6 +206,10 @@ class PartitionsView(BaseTableView, DataTypeReader, VacuumSettings):
})
+ # Schema Diff: Keys to ignore while comparing
+ keys_to_ignore = ['oid', 'schema', 'vacuum_table',
+ 'vacuum_toast', 'edit_types']
+
def children(self, **kwargs):
"""Build a list of treeview nodes from the child nodes."""
@@ -367,6 +377,63 @@ class PartitionsView(BaseTableView, DataTypeReader, VacuumSettings):
return super(PartitionsView, self).properties(
gid, sid, did, scid, ptid, res)
+ @BaseTableView.check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid, tid, ptid=None):
+ """
+ This function will fetch the list of all the tables for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :param tid: Table Id
+ :param ptif: Partition table Id
+ :return:
+ """
+ res = {}
+
+ if ptid:
+ SQL = render_template("/".join([self.partition_template_path,
+ 'properties.sql']),
+ did=did, scid=scid, tid=tid,
+ ptid=ptid, datlastsysoid=self.datlastsysoid)
+ status, result = self.conn.execute_dict(SQL)
+ if not status:
+ current_app.logger.error(result)
+ return False
+
+ res = super(PartitionsView, self).properties(
+ 0, sid, did, scid, ptid, result)
+
+ else:
+ SQL = render_template(
+ "/".join([self.partition_template_path, 'nodes.sql']),
+ scid=scid, tid=tid
+ )
+ status, partitions = self.conn.execute_2darray(SQL)
+ if not status:
+ current_app.logger.error(partitions)
+ return False
+
+ for row in partitions['rows']:
+ SQL = render_template("/".join([self.partition_template_path,
+ 'properties.sql']),
+ did=did, scid=scid, tid=tid,
+ ptid=row['oid'],
+ datlastsysoid=self.datlastsysoid)
+ status, result = self.conn.execute_dict(SQL)
+
+ if not status:
+ current_app.logger.error(result)
+ return False
+
+ data = super(PartitionsView, self).properties(
+ 0, sid, did, scid, row['oid'], result, False
+ )
+ res[row['name']] = data
+
+ return res
+
@BaseTableView.check_precondition
def sql(self, gid, sid, did, scid, tid, ptid):
"""
@@ -400,6 +467,62 @@ class PartitionsView(BaseTableView, DataTypeReader, VacuumSettings):
return BaseTableView.get_reverse_engineered_sql(self, did, scid, ptid,
main_sql, data)
+ @BaseTableView.check_precondition
+ def get_sql_from_diff(self, **kwargs):
+ """
+ This function will create sql on the basis the difference of 2 tables
+ """
+ data = dict()
+ res = None
+ sid = kwargs['sid']
+ did = kwargs['did']
+ scid = kwargs['scid']
+ tid = kwargs['tid']
+ ptid = kwargs['ptid']
+ diff_data = kwargs['diff_data'] if 'diff_data' in kwargs else None
+ json_resp = kwargs['json_resp'] if 'json_resp' in kwargs else True
+ diff_schema = kwargs['diff_schema'] if 'diff_schema' in kwargs else\
+ None
+
+ if diff_data:
+ SQL = render_template("/".join([self.partition_template_path,
+ 'properties.sql']),
+ did=did, scid=scid, tid=tid,
+ ptid=ptid, datlastsysoid=self.datlastsysoid)
+ status, res = self.conn.execute_dict(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ SQL, name = self.get_sql(did, scid, ptid, diff_data, res)
+ SQL = re.sub('\n{2,}', '\n\n', SQL)
+ SQL = SQL.strip('\n')
+ return SQL
+ else:
+ main_sql = []
+
+ SQL = render_template("/".join([self.partition_template_path,
+ 'properties.sql']),
+ did=did, scid=scid, tid=tid,
+ ptid=ptid, datlastsysoid=self.datlastsysoid)
+ status, res = self.conn.execute_dict(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ if len(res['rows']) == 0:
+ return gone(gettext(
+ "The specified partitioned table could not be found."))
+
+ data = res['rows'][0]
+
+ if diff_schema:
+ data['schema'] = diff_schema
+ data['parent_schema'] = diff_schema
+
+ return BaseTableView.get_reverse_engineered_sql(self, did,
+ scid, ptid,
+ main_sql, data,
+ False)
+
@BaseTableView.check_precondition
def detach(self, gid, sid, did, scid, tid, ptid):
"""
@@ -601,7 +724,7 @@ class PartitionsView(BaseTableView, DataTypeReader, VacuumSettings):
return internal_server_error(errormsg=str(e))
@BaseTableView.check_precondition
- def delete(self, gid, sid, did, scid, tid, ptid=None):
+ def delete(self, gid, sid, did, scid, tid, ptid=None, only_sql=False):
"""
This function will delete the table object
@@ -656,5 +779,61 @@ class PartitionsView(BaseTableView, DataTypeReader, VacuumSettings):
except Exception as e:
return internal_server_error(errormsg=str(e))
+ def ddl_compare(self, **kwargs):
+ """
+ This function will compare index properties and
+ return the difference of SQL
+ """
+
+ src_sid = kwargs.get('source_sid')
+ src_did = kwargs.get('source_did')
+ src_scid = kwargs.get('source_scid')
+ src_tid = kwargs.get('source_tid')
+ src_oid = kwargs.get('source_oid')
+ tar_sid = kwargs.get('target_sid')
+ tar_did = kwargs.get('target_did')
+ tar_scid = kwargs.get('target_scid')
+ tar_tid = kwargs.get('target_tid')
+ tar_oid = kwargs.get('target_oid')
+ comp_status = kwargs.get('comp_status')
+
+ source = ''
+ target = ''
+ diff = ''
+
+ status, target_schema = self.get_schema_for_schema_diff(tar_sid,
+ tar_did,
+ tar_scid
+ )
+ if not status:
+ return internal_server_error(errormsg=target_schema)
+
+ if comp_status == SchemaDiffModel.COMPARISON_STATUS['source_only']:
+ diff = self.get_sql_from_diff(sid=src_sid,
+ did=src_did, scid=src_scid,
+ tid=src_tid, ptid=src_oid,
+ diff_schema=target_schema)
+
+ elif comp_status == SchemaDiffModel.COMPARISON_STATUS['target_only']:
+ SQL = render_template("/".join([self.partition_template_path,
+ 'properties.sql']),
+ did=did, scid=scid, tid=tid,
+ ptid=ptid, datlastsysoid=self.datlastsysoid)
+ status, res = self.conn.execute_dict(SQL)
+
+ SQL = render_template(
+ "/".join([self.table_template_path, 'properties.sql']),
+ did=tar_did, scid=tar_scid, tid=tar_oid,
+ datlastsysoid=self.datlastsysoid
+ )
+ status, res = self.conn.execute_dict(SQL)
+ if status:
+ self.cmd = 'delete'
+ diff = super(PartitionsView, self).get_delete_sql(res)
+ self.cmd = None
+
+ return diff
+
+SchemaDiffRegistry('partition', PartitionsView, 'table')
PartitionsView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/__init__.py
index 070875e8f..479edf78e 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/__init__.py
@@ -13,7 +13,8 @@ import simplejson as json
from functools import wraps
import pgadmin.browser.server_groups.servers.databases.schemas as schemas
-from flask import render_template, make_response, request, jsonify
+from flask import render_template, make_response, request, jsonify,\
+ current_app
from flask_babelex import gettext
from pgadmin.browser.collection import CollectionNodeModule
from pgadmin.browser.server_groups.servers.databases.schemas.utils import \
@@ -23,7 +24,11 @@ from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.driver import get_driver
from config import PG_DEFAULT_DRIVER
+from pgadmin.utils.compile_template_name import compile_template_path
from pgadmin.utils import IS_PY2
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
+
# If we are in Python3
if not IS_PY2:
unicode = str
@@ -134,7 +139,7 @@ class RuleModule(CollectionNodeModule):
blueprint = RuleModule(__name__)
-class RuleView(PGChildNodeView):
+class RuleView(PGChildNodeView, SchemaDiffObjectCompare):
"""
This is a class for rule node which inherits the
properties and methods from PGChildNodeView class and define
@@ -178,6 +183,9 @@ class RuleView(PGChildNodeView):
'configs': [{'get': 'configs'}]
})
+ # Schema Diff: Keys to ignore while comparing
+ keys_to_ignore = ['oid', 'schema', 'definition']
+
def check_precondition(f):
"""
This function will behave as a decorator which will check the
@@ -197,6 +205,12 @@ class RuleView(PGChildNodeView):
]['datlastsysoid'] if self.manager.db_info is not None and \
kwargs['did'] in self.manager.db_info else 0
self.template_path = 'rules/sql'
+ self.table_template_path = compile_template_path(
+ 'tables/sql',
+ self.manager.server_type,
+ self.manager.version
+ )
+
return f(*args, **kwargs)
return wrap
@@ -278,6 +292,21 @@ class RuleView(PGChildNodeView):
"""
Fetch the properties of an individual rule and render in properties tab
+ """
+ status, data = self._fetch_properties(rid)
+ if not status:
+ return data
+
+ return ajax_response(
+ response=data,
+ status=200
+ )
+
+ def _fetch_properties(self, rid):
+ """
+ This function is used to fetch the properties of the specified object
+ :param rid:
+ :return:
"""
SQL = render_template("/".join(
[self.template_path, 'properties.sql']
@@ -285,15 +314,13 @@ class RuleView(PGChildNodeView):
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(gettext("""Could not find the rule in the table."""))
+ return False, gone(
+ gettext("""Could not find the rule in the table."""))
- return ajax_response(
- response=parse_rule_definition(res),
- status=200
- )
+ return True, parse_rule_definition(res)
@check_precondition
def create(self, gid, sid, did, scid, tid):
@@ -369,7 +396,7 @@ class RuleView(PGChildNodeView):
return internal_server_error(errormsg=str(e))
@check_precondition
- def delete(self, gid, sid, did, scid, tid, rid=None):
+ def delete(self, gid, sid, did, scid, tid, rid=None, only_sql=False):
"""
This function will drop a rule object
"""
@@ -412,6 +439,8 @@ class RuleView(PGChildNodeView):
nspname=rset['nspname'],
cascade=cascade
)
+ if only_sql:
+ return SQL
status, res = self.conn.execute_scalar(SQL)
if not status:
return internal_server_error(errormsg=res)
@@ -489,6 +518,44 @@ class RuleView(PGChildNodeView):
[self.template_path, 'create.sql']), data=data)
return SQL, data['name'] if 'name' in data else old_data['name']
+ @check_precondition
+ def get_sql_from_diff(self, gid, sid, did, scid, tid, oid, data=None,
+ diff_schema=None, drop_sql=False):
+
+ if drop_sql:
+ SQL = self.delete(gid=gid, sid=sid, did=did,
+ scid=scid, tid=tid,
+ rid=oid, only_sql=True)
+ else:
+ SQL = render_template("/".join(
+ [self.template_path, 'properties.sql']), rid=oid)
+ status, res = self.conn.execute_dict(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+ if len(res['rows']) == 0:
+ return gone(
+ gettext("""Could not find the rule in the table.""")
+ )
+ res_data = parse_rule_definition(res)
+
+ SQL = ''
+
+ if data:
+ old_data = res_data
+ SQL = render_template(
+ "/".join([self.template_path, 'update.sql']),
+ data=data, o_data=old_data
+ )
+ else:
+ if diff_schema:
+ res_data['schema'] = diff_schema
+
+ SQL = render_template("/".join(
+ [self.template_path, 'create.sql']),
+ data=res_data, display_comments=True)
+
+ return SQL
+
@check_precondition
def dependents(self, gid, sid, did, scid, tid, rid):
"""
@@ -527,5 +594,47 @@ class RuleView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid, tid, oid=None,
+ ignore_keys=False):
+ """
+ This function will fetch the list of all the rules for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :param tid: Table Id
+ :return:
+ """
+
+ res = {}
+ if oid:
+ status, data = self._fetch_properties(oid)
+ if not status:
+ current_app.logger.error(data)
+ return False
+
+ res = data
+ else:
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']),
+ tid=tid)
+ status, rules = self.conn.execute_2darray(SQL)
+ if not status:
+ current_app.logger.error(rules)
+ return False
+
+ for row in rules['rows']:
+ status, data = self._fetch_properties(row['oid'])
+ if status:
+ if ignore_keys:
+ for key in self.keys_to_ignore:
+ if key in data:
+ del data[key]
+ res[row['name']] = data
+ return res
+
+SchemaDiffRegistry('rule', RuleView, 'table')
RuleView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/schema_diff_utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/schema_diff_utils.py
new file mode 100644
index 000000000..7a9cff6fa
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/schema_diff_utils.py
@@ -0,0 +1,507 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+""" Implements Utility class for Table and Partitioned Table. """
+
+import copy
+
+from flask import render_template
+from pgadmin.utils.driver import get_driver
+from config import PG_DEFAULT_DRIVER
+from pgadmin.tools.schema_diff.directory_compare import compare_dictionaries,\
+ directory_diff
+from pgadmin.tools.schema_diff.model import SchemaDiffModel
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+
+
+class SchemaDiffTableCompare(SchemaDiffObjectCompare):
+
+ keys_to_ignore = ['oid', 'schema', 'vacuum_table',
+ 'vacuum_toast', 'edit_types', 'attnum', 'col_type',
+ 'references', 'reltuples', 'rows_cnt']
+
+ keys_to_ignore_ddl_comp = ['oid',
+ 'schema',
+ 'columns',
+ 'edit_types',
+ 'primary_key',
+ 'exclude_constraint',
+ 'check_constraint',
+ 'foreign_key',
+ 'reltuples',
+ 'rows_cnt'
+ ]
+
+ keys_to_remove = {
+ 'columns': ['relname', 'nspname', 'parent_tbl', 'attrelid', 'adrelid'],
+ 'primary_key': ['oid'],
+ 'unique_constraint': ['oid'],
+ 'check_constraint': ['oid', 'nspname'],
+ 'foreign_key': ['oid', 'fknsp', 'confrelid'],
+ 'exclude_constraint': ['oid'],
+ 'partitions': ['oid'],
+ }
+
+ keys_to_remove_ddl_comp = {
+ 'columns': ['relname', 'nspname', 'parent_tbl', 'attrelid', 'adrelid'],
+ 'check_constraint': ['nspname'],
+ 'foreign_key': ['fknsp', 'confrelid']
+ }
+
+ def compare(self, **kwargs):
+ """
+ This function is used to compare all the table objects
+ from two different schemas.
+
+ :return: Comparison Dictionary
+ """
+ src_sid = kwargs.get('source_sid')
+ src_did = kwargs.get('source_did')
+ src_scid = kwargs.get('source_scid')
+ tar_sid = kwargs.get('target_sid')
+ tar_did = kwargs.get('target_did')
+ tar_scid = kwargs.get('target_scid')
+ sub_modules = ['index', 'rule', 'trigger']
+
+ source_tables = self.fetch_tables(sid=src_sid, did=src_did,
+ scid=src_scid)
+
+ target_tables = self.fetch_tables(sid=tar_sid, did=tar_did,
+ scid=tar_scid)
+
+ if self.manager.version >= 120000:
+ sub_modules.append('compound_trigger')
+
+ # If both the dict have no items then return None.
+ if not (source_tables or target_tables) or (
+ len(source_tables) <= 0 and len(target_tables) <= 0):
+ return None
+
+ src_server_type, tar_server_type = self.get_server_type(src_sid,
+ tar_sid)
+ for module in sub_modules:
+
+ module_view = SchemaDiffRegistry.get_node_view(
+ module)
+
+ # Get sub module data for source tables
+ if module_view.blueprint.server_type is None or \
+ src_server_type in module_view.blueprint.server_type:
+ for key, val in source_tables.items():
+ source = module_view.fetch_objects_to_compare(
+ sid=src_sid,
+ did=src_did,
+ scid=src_scid,
+ tid=val['oid'],
+ oid=None,
+ ignore_keys=True
+ )
+ source_tables[key][module] = source
+
+ # Get sub module data for target tables
+ if module_view.blueprint.server_type is None or \
+ tar_server_type in module_view.blueprint.server_type:
+ for key, val in target_tables.items():
+ target = module_view.fetch_objects_to_compare(
+ sid=tar_sid,
+ did=tar_did,
+ scid=tar_scid,
+ tid=val['oid'],
+ oid=None,
+ ignore_keys=True
+ )
+ target_tables[key][module] = target
+
+ return compare_dictionaries(source_tables, target_tables,
+ self.node_type,
+ self.blueprint.COLLECTION_LABEL,
+ self.keys_to_ignore)
+
+ @staticmethod
+ def get_server_type(src_id, tar_id):
+ """Get server types of source and target servers."""
+ driver = get_driver(PG_DEFAULT_DRIVER)
+ src_manager = driver.connection_manager(src_id)
+ tar_manager = driver.connection_manager(tar_id)
+
+ return src_manager.server_type, tar_manager.server_type
+
+ def ddl_compare(self, **kwargs):
+ """
+ This function will compare properties of 2 tables and
+ return the source DDL, target DDL and Difference of them.
+ """
+
+ src_sid = kwargs.get('source_sid')
+ src_did = kwargs.get('source_did')
+ src_scid = kwargs.get('source_scid')
+ src_oid = kwargs.get('source_oid')
+ tar_sid = kwargs.get('target_sid')
+ tar_did = kwargs.get('target_did')
+ tar_scid = kwargs.get('target_scid')
+ tar_oid = kwargs.get('target_oid')
+ comp_status = kwargs.get('comp_status')
+ generate_script = False
+
+ if 'generate_script' in kwargs and kwargs['generate_script']:
+ generate_script = True
+
+ source = ''
+ target = ''
+ diff = ''
+ ignore_sub_modules = ['column', 'constraints']
+
+ src_server_type, tar_server_type = self.get_server_type(src_sid,
+ tar_sid)
+
+ status, target_schema = self.get_schema(tar_sid,
+ tar_did,
+ tar_scid
+ )
+
+ if not status:
+ return internal_server_error(errormsg=target_schema)
+
+ if comp_status == SchemaDiffModel.COMPARISON_STATUS['source_only']:
+ if not generate_script:
+ source = self.get_sql_from_table_diff(sid=src_sid,
+ did=src_did,
+ scid=src_scid,
+ tid=src_oid,
+ json_resp=False)
+ diff = self.get_sql_from_table_diff(sid=src_sid, did=src_did,
+ scid=src_scid, tid=src_oid,
+ diff_schema=target_schema,
+ json_resp=False)
+
+ elif comp_status == SchemaDiffModel.COMPARISON_STATUS['target_only']:
+ if not generate_script:
+ target = self.get_sql_from_table_diff(sid=tar_sid,
+ did=tar_did,
+ scid=tar_scid,
+ tid=tar_oid,
+ json_resp=False)
+ SQL = render_template(
+ "/".join([self.table_template_path, 'properties.sql']),
+ did=tar_did, scid=tar_scid, tid=tar_oid,
+ datlastsysoid=self.datlastsysoid
+ )
+ status, res = self.conn.execute_dict(SQL)
+
+ if status:
+ diff = self.get_delete_sql(res)
+
+ elif comp_status == SchemaDiffModel.COMPARISON_STATUS['different']:
+ source = self.fetch_tables(
+ sid=src_sid, did=src_did,
+ scid=src_scid, tid=src_oid,
+ keys_to_remove=self.keys_to_remove_ddl_comp
+ )
+ target = self.fetch_tables(
+ sid=tar_sid, did=tar_did,
+ scid=tar_scid, tid=tar_oid,
+ keys_to_remove=self.keys_to_remove_ddl_comp
+ )
+
+ if self.manager.version < 100000:
+ ignore_sub_modules.append('partition')
+
+ if self.manager.version < 120000:
+ ignore_sub_modules.append('compound_trigger')
+
+ # In case of error return None
+ if not (source or target):
+ return None
+
+ diff_dict = directory_diff(
+ source, target, ignore_keys=self.keys_to_ignore_ddl_comp,
+ difference={}
+ )
+
+ # Column comparison
+ col_diff = self.table_col_ddl_comp(source, target)
+ diff_dict.update(col_diff)
+
+ # Constraint comparison
+ pk_diff = self.constraint_ddl_comp(source, target)
+ diff_dict.update(pk_diff)
+
+ diff_dict['relacl'] = self.parce_acl(source, target)
+
+ if not generate_script:
+ source = self.get_sql_from_table_diff(sid=src_sid,
+ did=src_did,
+ scid=src_scid,
+ tid=src_oid,
+ json_resp=False)
+ target = self.get_sql_from_table_diff(sid=tar_sid,
+ did=tar_did,
+ scid=tar_scid,
+ tid=tar_oid,
+ json_resp=False)
+ diff = self.get_sql_from_table_diff(sid=tar_sid, did=tar_did,
+ scid=tar_scid, tid=tar_oid,
+ diff_data=diff_dict,
+ json_resp=False)
+
+ for module in self.blueprint.submodules:
+ if module.NODE_TYPE not in ignore_sub_modules:
+ module_view = SchemaDiffRegistry.get_node_view(
+ module.NODE_TYPE)
+
+ if module_view.blueprint.server_type and (
+ src_server_type not in
+ module_view.blueprint.server_type and
+ tar_server_type not in
+ module_view.blueprint.server_type
+ ):
+ continue
+
+ if module_view.blueprint.server_type and (
+ (src_server_type in
+ module_view.blueprint.server_type and
+ tar_server_type not in
+ module_view.blueprint.server_type) or (
+ src_server_type not in
+ module_view.blueprint.server_type and
+ tar_server_type in
+ module_view.blueprint.server_type)
+ ):
+ continue
+
+ result = module_view.compare(
+ source_sid=src_sid, source_did=src_did,
+ source_scid=src_scid, source_tid=src_oid,
+ target_sid=tar_sid, target_did=tar_did,
+ target_scid=tar_scid, target_tid=tar_oid
+ )
+ if result and module.NODE_TYPE != 'partition':
+ child_diff = ''
+ for res in result:
+ if res['status'] == \
+ SchemaDiffModel.COMPARISON_STATUS[
+ 'different']:
+ source_oid = res['source_oid']
+ target_oid = res['target_oid']
+ else:
+ source_oid = res['oid']
+ target_oid = res['oid']
+
+ if res['status'] != \
+ SchemaDiffModel.COMPARISON_STATUS[
+ 'identical']:
+ child_diff = module_view.ddl_compare(
+ source_sid=src_sid, source_did=src_did,
+ source_scid=src_scid,
+ source_oid=source_oid,
+ source_tid=src_oid, target_sid=tar_sid,
+ target_did=tar_did, target_scid=tar_scid,
+ target_tid=tar_oid, target_oid=target_oid,
+ comp_status=res['status']
+
+ )
+ if child_diff:
+ diff += child_diff
+ elif result:
+ # For partition module
+ identical = False
+ source_only = False
+ target_only = False
+ different = False
+ for res in result:
+ if res['status'] == \
+ SchemaDiffModel.COMPARISON_STATUS[
+ 'identical']:
+ identical = True
+ elif res['status'] == \
+ SchemaDiffModel.COMPARISON_STATUS[
+ 'source_only']:
+ source_only = True
+ elif res['status'] == \
+ SchemaDiffModel.COMPARISON_STATUS[
+ 'target_only']:
+ target_only = True
+ else:
+ different = True
+
+ if identical:
+ pass
+ elif (source_only or target_only) and not different:
+ for res in result:
+ source_oid = res['oid']
+ target_oid = res['oid']
+
+ child_diff = module_view.ddl_compare(
+ source_sid=src_sid, source_did=src_did,
+ source_scid=src_scid,
+ source_oid=source_oid,
+ source_tid=src_oid, target_sid=tar_sid,
+ target_did=tar_did, target_scid=tar_scid,
+ target_tid=tar_oid, target_oid=target_oid,
+ comp_status=res['status']
+
+ )
+ if ddl_compare:
+ diff += child_diff
+ else:
+ diff = self.get_sql_from_table_diff(
+ sid=src_sid,
+ did=src_did,
+ scid=src_scid,
+ tid=src_oid,
+ diff_schema=target_schema,
+ json_resp=False,
+ schema_diff_table=True
+ )
+ else:
+ source = self.get_sql_from_table_diff(sid=src_sid, did=src_did,
+ scid=src_scid, tid=src_oid,
+ json_resp=False)
+ target = self.get_sql_from_table_diff(sid=tar_sid, did=tar_did,
+ scid=tar_scid, tid=tar_oid,
+ json_resp=False)
+
+ return {'source_ddl': source,
+ 'target_ddl': target,
+ 'diff_ddl': diff
+ }
+
+ @staticmethod
+ def table_col_ddl_comp(source, target):
+ """
+ Table Column comparison
+ :param source: Source columns
+ :param target: Target columns
+ :return: Difference of the columns
+ """
+ source_cols = source['columns']
+ target_cols = copy.deepcopy(target['columns'])
+ added = []
+ updated = []
+ different = {'columns': {}}
+
+ for source in source_cols:
+ if 'name' in source:
+ if type(target_cols) is list and len(
+ target_cols) > 0:
+ tmp = None
+ for item in target_cols:
+ if item['name'] == source['name']:
+ tmp = copy.deepcopy(item)
+ if tmp and source != tmp:
+ tmp_updated = copy.deepcopy(source)
+ # Preserve the column number
+ tmp_updated['attnum'] = tmp['attnum']
+ if item['typname'] not in tmp_updated['edit_types']:
+ tmp_updated['col_type_conversion'] = False
+ updated.append(tmp_updated)
+ target_cols.remove(tmp)
+ elif tmp and source == tmp:
+ target_cols.remove(tmp)
+ elif tmp is None:
+ added.append(source)
+ else:
+ added.append(source)
+ different['columns']['added'] = added
+ different['columns']['changed'] = updated
+
+ if target_cols and len(target_cols) > 0:
+ different['columns']['deleted'] = target_cols
+
+ return different
+
+ @staticmethod
+ def constraint_ddl_comp(source_table, target_table):
+ """
+ Table Constraint DDL comparison
+ :param source: Source Table
+ :param target: Target Table
+ :return: Difference of constraints
+ """
+ different = {}
+ non_editable_keys = {}
+
+ non_editable_keys = {'primary_key': ['col_count',
+ 'condeferrable',
+ 'condeffered',
+ 'columns'],
+ 'check_constraint': ['consrc'],
+ 'exclude_constraint': ['amname',
+ 'indconstraint',
+ 'columns']
+ }
+
+ for constraint in ['primary_key', 'check_constraint',
+ 'exclude_constraint']:
+ source_cols = source_table[constraint] if \
+ constraint in source_table else []
+ target_cols = copy.deepcopy(target_table[constraint]) if\
+ constraint in target_table else []
+ added = []
+ updated = []
+ deleted = []
+
+ different[constraint] = {}
+ for source in source_cols:
+ if 'name' in source:
+ if type(target_cols) is list and len(
+ target_cols) > 0:
+ tmp_src = copy.deepcopy(source)
+ tmp_src.pop('oid')
+ tmp_tar = None
+ tmp = None
+ for item in target_cols:
+ if item['name'] == source['name']:
+ tmp_tar = copy.deepcopy(item)
+ tmp = copy.deepcopy(item)
+ tmp_tar.pop('oid')
+ if tmp_tar and tmp_src != tmp_tar:
+ tmp_updated = copy.deepcopy(source)
+ for key in non_editable_keys[constraint]:
+ if key in tmp_updated and \
+ tmp_updated[key] != tmp_tar[key]:
+ added.append(source)
+ deleted.append(tmp_updated)
+ tmp_updated = None
+ break
+ if tmp_updated:
+ tmp_updated['oid'] = tmp_tar['oid']
+ updated.append(tmp_updated)
+ target_cols.remove(tmp)
+ elif tmp_tar and tmp_src == tmp_tar:
+ target_cols.remove(tmp)
+ elif tmp_tar is None:
+ added.append(source)
+ else:
+ added.append(source)
+ different[constraint]['added'] = added
+ different[constraint]['changed'] = updated
+ different[constraint]['deleted'] = deleted
+
+ if target_cols and len(target_cols) > 0:
+ different[constraint]['deleted'] = target_cols
+
+ return different
+
+ def remove_keys_for_comparision(self, data, keys=None):
+ """
+ This function is used to remove specific keys from data
+ """
+
+ keys_to_remove = keys if keys else self.keys_to_remove
+
+ for p_key, p_val in keys_to_remove.items():
+ if p_key in data and data[p_key] is not None \
+ and len(data[p_key]) > 0:
+ for item in data[p_key]:
+ # Remove keys that should not be the part of comparision.
+ for key in p_val:
+ if key in item:
+ item.pop(key)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/create.sql
index 36eb7ff8e..c189a7488 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/create.sql
@@ -21,7 +21,7 @@ CACHE {{data.seqcache|int}} {% endif %}
{% endif %}{% endif %};
{### Add comments ###}
-{% if data and data.description %}
+{% if data and data.description and data.description != None %}
COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.table, data.name)}}
IS {{data.description|qtLiteral}};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/update.sql
index 4b943defb..4e8b982fd 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/update.sql
@@ -10,8 +10,14 @@ ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
{% endif %}
{### Alter column type and collation ###}
{% if (data.cltype and data.cltype != o_data.cltype) or (data.attlen is defined and data.attlen != o_data.attlen) or (data.attprecision is defined and data.attprecision != o_data.attprecision) or (data.collspcname and data.collspcname != o_data.collspcname)%}
-ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
- ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} TYPE {{ GET_TYPE.UPDATE_TYPE_SQL(conn, data, o_data) }}{% if data.collspcname and data.collspcname != o_data.collspcname %}
+{% if data.col_type_conversion is defined and data.col_type_conversion == False %}
+-- WARNING:
+-- The SQL statement below would normally be used to alter the datatype for the {{o_data.name}} column, however,
+-- the current datatype cannot be cast to the target datatype so this conversion cannot be made automatically.
+
+{% endif %}
+{% if data.col_type_conversion is defined and data.col_type_conversion == False %} -- {% endif %}ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
+{% if data.col_type_conversion is defined and data.col_type_conversion == False %} -- {% endif %} ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} TYPE {{ GET_TYPE.UPDATE_TYPE_SQL(conn, data, o_data) }}{% if data.collspcname and data.collspcname != o_data.collspcname %}
COLLATE {{data.collspcname}}{% elif o_data.collspcname %} COLLATE {{o_data.collspcname}}{% endif %};
{% endif %}
{### Alter column default value ###}
@@ -95,7 +101,7 @@ COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.table, o_data.name)}}
{% endif %}
{### Update column variables ###}
-{% if 'attoptions' in data and data.attoptions|length > 0 %}
+{% if 'attoptions' in data and data.attoptions and data.attoptions|length > 0 %}
{% set variables = data.attoptions %}
{% if 'deleted' in variables and variables.deleted|length > 0 %}
ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/12_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/12_plus/create.sql
index 71de43658..19e26f2c2 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/12_plus/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/12_plus/create.sql
@@ -21,7 +21,7 @@ CACHE {{data.seqcache|int}} {% endif %}
{% endif %}{% endif %}{% if data.colconstype == 'g' and data.genexpr and data.genexpr != '' %} GENERATED ALWAYS AS ({{data.genexpr}}) STORED{% endif %};
{### Add comments ###}
-{% if data and data.description %}
+{% if data and data.description and data.description != None %}
COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.table, data.name)}}
IS {{data.description|qtLiteral}};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/9.2_plus/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/9.2_plus/update.sql
index d27734401..dfb7555c1 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/9.2_plus/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/9.2_plus/update.sql
@@ -6,6 +6,12 @@
{% if data.name and data.name != o_data.name %}
ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
RENAME {{conn|qtIdent(o_data.name)}} TO {{conn|qtIdent(data.name)}};
+{% endif %}
+{% if data.col_type_conversion is defined and data.col_type_conversion == False %}
+-- WARNING:
+-- The SQL statement below would normally be used to alter the datatype for the {{o_data.name}} column, however,
+-- the current datatype cannot be cast to the target datatype so this conversion cannot be made automatically.
+
{% endif %}
{### Alter column type and collation ###}
{% if (data.cltype and data.cltype != o_data.cltype) or (data.attlen is defined and data.attlen != o_data.attlen) or (data.attprecision is defined and data.attprecision != o_data.attprecision) or (data.collspcname and data.collspcname != o_data.collspcname)%}
@@ -45,7 +51,7 @@ PLAIN{% elif data.attstorage == 'm'%}MAIN{% elif data.attstorage == 'e'%}
EXTERNAL{% elif data.attstorage == 'x'%}EXTENDED{% endif %};
{% endif %}
-{% if data.description is defined %}
+{% if data.description is defined and data.description != None %}
{% if data.name %}
COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.table, data.name)}}
{% else %}
@@ -55,7 +61,7 @@ COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.table, o_data.name)}}
{% endif %}
{### Update column variables ###}
-{% if 'attoptions' in data and data.attoptions|length > 0 %}
+{% if 'attoptions' in data and data.attoptions != None and data.attoptions|length > 0 %}
{% set variables = data.attoptions %}
{% if 'deleted' in variables and variables.deleted|length > 0 %}
ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/create.sql
index affd88906..ed7f5f1c6 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/create.sql
@@ -12,7 +12,7 @@ ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
{% endif %}
{### Add comments ###}
-{% if data and data.description %}
+{% if data and data.description and data.description != None %}
COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.table, data.name)}}
IS {{data.description|qtLiteral}};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/update.sql
index ac0afe8d1..3c6ae0a91 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/update.sql
@@ -9,9 +9,15 @@ ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
{% endif %}
{### Alter column type and collation ###}
-{% if (data.cltype and data.cltype != o_data.cltype) or (data.attlen is defined and data.attlen != o_data.attlen) or (data.attprecision is defined and data.attprecision != o_data.attprecision) or (data.collspcname and data.collspcname != o_data.collspcname) %}
-ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
- ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} TYPE {{ GET_TYPE.UPDATE_TYPE_SQL(conn, data, o_data) }}{% if data.collspcname and data.collspcname != o_data.collspcname %}
+{% if (data.cltype and data.cltype != o_data.cltype) or (data.attlen is defined and data.attlen != o_data.attlen) or (data.attprecision is defined and data.attprecision != o_data.attprecision) or (data.collspcname and data.collspcname != o_data.collspcname)%}
+{% if data.col_type_conversion is defined and data.col_type_conversion == False %}
+-- WARNING:
+-- The SQL statement below would normally be used to alter the datatype for the XXX column, however,
+-- the current datatype cannot be cast to the target datatype so this conversion cannot be made automatically.
+
+{% endif %}
+{% if data.col_type_conversion is defined and data.col_type_conversion == False %} -- {% endif %}ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
+{% if data.col_type_conversion is defined and data.col_type_conversion == False %} -- {% endif %} ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} TYPE {{ GET_TYPE.UPDATE_TYPE_SQL(conn, data, o_data) }}{% if data.collspcname and data.collspcname != o_data.collspcname %}
COLLATE {{data.collspcname}}{% elif o_data.collspcname %} COLLATE {{o_data.collspcname}}{% endif %};
{% endif %}
{### Alter column default value ###}
@@ -46,7 +52,7 @@ PLAIN{% elif data.attstorage == 'm'%}MAIN{% elif data.attstorage == 'e'%}
EXTERNAL{% elif data.attstorage == 'x'%}EXTENDED{% endif %};
{% endif %}
-{% if data.description is defined %}
+{% if data.description is defined and data.description != None %}
{% if data.name %}
COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.table, data.name)}}
{% else %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/partitions/sql/pg/10_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/partitions/sql/pg/10_plus/create.sql
index 6db5452b5..01f9bfbab 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/partitions/sql/pg/10_plus/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/partitions/sql/pg/10_plus/create.sql
@@ -3,6 +3,7 @@
{#====== MAIN TABLE TEMPLATE STARTS HERE ======#}
{#===========================================#}
{### CREATE TABLE STATEMENT FOR partitions ###}
+
CREATE {% if data.relpersistence %}UNLOGGED {% endif %}TABLE {{conn|qtIdent(data.schema, data.name)}}{% if data.relispartition is defined and data.relispartition %} PARTITION OF {{conn|qtIdent(data.parent_schema, data.partitioned_table_name)}}{% endif %}
{# Macro to render for constraints #}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/10_plus/schema_diff.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/10_plus/schema_diff.sql
new file mode 100644
index 000000000..ebd4ae6e5
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/10_plus/schema_diff.sql
@@ -0,0 +1,14 @@
+
+
+INSERT INTO {{conn|qtIdent(data.schema, data.name)}}(
+{% if data.columns and data.columns|length > 0 %}
+{% for c in data.columns %}{{c.name}}{% if not loop.last %},{% endif %}{% endfor %}{% endif %})
+SELECT {% if data.columns and data.columns|length > 0 %}{% for c in data.columns %}{{c.name}}{% if not loop.last %},{% endif %}{% endfor %}{% endif %}
+ FROM {{conn|qtIdent(data.schema, data.orig_name)}};
+
+DROP TABLE {{conn|qtIdent(data.schema, data.orig_name)}};
+
+{{partition_sql}}
+
+ALTER TABLE {{conn|qtIdent(data.schema, data.name)}}
+ RENAME TO {{conn|qtIdent(data.orig_name)}};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/__init__.py
index d6f6867e0..97dd00f07 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/__init__.py
@@ -13,7 +13,7 @@ import simplejson as json
from functools import wraps
import pgadmin.browser.server_groups.servers.databases as database
-from flask import render_template, request, jsonify
+from flask import render_template, request, jsonify, current_app
from flask_babelex import gettext
from pgadmin.browser.collection import CollectionNodeModule
from pgadmin.browser.utils import PGChildNodeView
@@ -25,7 +25,11 @@ from pgadmin.browser.server_groups.servers.databases.schemas.utils \
import trigger_definition
from pgadmin.utils.driver import get_driver
from config import PG_DEFAULT_DRIVER
+from pgadmin.utils.compile_template_name import compile_template_path
from pgadmin.utils import IS_PY2
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
+
# If we are in Python3
if not IS_PY2:
unicode = str
@@ -151,7 +155,7 @@ class TriggerModule(CollectionNodeModule):
blueprint = TriggerModule(__name__)
-class TriggerView(PGChildNodeView):
+class TriggerView(PGChildNodeView, SchemaDiffObjectCompare):
"""
This class is responsible for generating routes for Trigger node
@@ -244,6 +248,10 @@ class TriggerView(PGChildNodeView):
'enable': [{'put': 'enable_disable_trigger'}]
})
+ # Schema Diff: Keys to ignore while comparing
+ keys_to_ignore = ['oid', 'xmin', 'nspname', 'tfunction',
+ 'tgrelid', 'tgfoid', 'prosrc']
+
def check_precondition(f):
"""
This function will behave as a decorator which will checks
@@ -267,6 +275,11 @@ class TriggerView(PGChildNodeView):
kwargs['did'] in self.manager.db_info else 0
# we will set template path for sql scripts
+ self.table_template_path = compile_template_path(
+ 'tables/sql',
+ self.manager.server_type,
+ self.manager.version
+ )
self.template_path = 'triggers/sql/{0}/#{1}#'.format(
self.manager.server_type, self.manager.version)
# Store server type
@@ -450,7 +463,22 @@ class TriggerView(PGChildNodeView):
Returns:
JSON of selected trigger node
"""
+ status, data = self._fetch_properties(tid, trid)
+ if not status:
+ return data
+
+ return ajax_response(
+ response=data,
+ status=200
+ )
+ def _fetch_properties(self, tid, trid):
+ """
+ This function is used to fetch the properties of the specified object
+ :param tid:
+ :param trid:
+ :return:
+ """
SQL = render_template("/".join([self.template_path,
'properties.sql']),
tid=tid, trid=trid,
@@ -459,10 +487,10 @@ class TriggerView(PGChildNodeView):
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(
+ return False, gone(
gettext("""Could not find the trigger in the table."""))
# Making copy of output for future use
@@ -472,10 +500,7 @@ class TriggerView(PGChildNodeView):
data = trigger_definition(data)
- return ajax_response(
- response=data,
- status=200
- )
+ return True, data
@check_precondition
def create(self, gid, sid, did, scid, tid):
@@ -552,7 +577,7 @@ class TriggerView(PGChildNodeView):
return internal_server_error(errormsg=str(e))
@check_precondition
- def delete(self, gid, sid, did, scid, tid, trid=None):
+ def delete(self, gid, sid, did, scid, tid, trid=None, only_sql=False):
"""
This function will updates existing the trigger object
@@ -610,6 +635,8 @@ class TriggerView(PGChildNodeView):
conn=self.conn,
cascade=cascade
)
+ if only_sql:
+ return SQL
status, res = self.conn.execute_scalar(SQL)
if not status:
return internal_server_error(errormsg=res)
@@ -761,6 +788,35 @@ class TriggerView(PGChildNodeView):
return ajax_response(response=SQL)
+ @check_precondition
+ def get_sql_from_diff(self, gid, sid, did, scid, tid, oid,
+ data=None, diff_schema=None, drop_sql=False):
+ if data:
+ SQL, name = trigger_utils.get_sql(self.conn, data, tid, oid,
+ self.datlastsysoid,
+ self.blueprint.show_system_objects)
+
+ if not isinstance(SQL, (str, unicode)):
+ return SQL
+ SQL = SQL.strip('\n').strip(' ')
+ else:
+ if drop_sql:
+ SQL = self.delete(gid=gid, sid=sid, did=did,
+ scid=scid, tid=tid, trid=oid,
+ only_sql=True)
+ else:
+ schema = self.schema
+ if diff_schema:
+ schema = diff_schema
+ SQL = trigger_utils.get_reverse_engineered_sql(
+ self.conn, schema,
+ self.table, tid, oid,
+ self.datlastsysoid,
+ self.blueprint.show_system_objects,
+ template_path=None, with_header=False)
+
+ return SQL
+
@check_precondition
def enable_disable_trigger(self, gid, sid, did, scid, tid, trid):
"""
@@ -875,5 +931,46 @@ class TriggerView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid, tid, oid=None,
+ ignore_keys=False):
+ """
+ This function will fetch the list of all the triggers for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :param tid: Table Id
+ :return:
+ """
+ res = dict()
+
+ if oid:
+ status, data = self._fetch_properties(tid, oid)
+ if not status:
+ current_app.logger.error(data)
+ return False
+ res = data
+ else:
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), tid=tid)
+ status, triggers = self.conn.execute_2darray(SQL)
+ if not status:
+ current_app.logger.error(triggers)
+ return False
+
+ for row in triggers['rows']:
+ status, data = self._fetch_properties(tid, row['oid'])
+ if status:
+ if ignore_keys:
+ for key in self.keys_to_ignore:
+ if key in data:
+ del data[key]
+ res[row['name']] = data
+
+ return res
+
+SchemaDiffRegistry('trigger', TriggerView, 'table')
TriggerView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/utils.py
index 166d2a14c..221f48d52 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/utils.py
@@ -30,7 +30,7 @@ def get_template_path(f):
def wrap(*args, **kwargs):
# Here args[0] will hold the connection object
conn_obj = args[0]
- if 'template_path' not in kwargs:
+ if 'template_path' not in kwargs or kwargs['template_path'] is None:
kwargs['template_path'] = 'triggers/sql/{0}/#{1}#'.format(
conn_obj.manager.server_type, conn_obj.manager.version)
@@ -201,7 +201,7 @@ def get_sql(conn, data, tid, trid, datlastsysoid,
@get_template_path
def get_reverse_engineered_sql(conn, schema, table, tid, trid,
datlastsysoid, show_system_objects,
- template_path=None):
+ template_path=None, with_header=True):
"""
This function will return reverse engineered sql for specified trigger.
@@ -213,6 +213,8 @@ def get_reverse_engineered_sql(conn, schema, table, tid, trid,
:param datlastsysoid:
:param show_system_objects: Show System Object value True or False
:param template_path: Optional template path
+ :param with_header: Optional parameter to decide whether the SQL will be
+ returned with header or not
:return:
"""
SQL = render_template("/".join([template_path, 'properties.sql']),
@@ -240,12 +242,15 @@ def get_reverse_engineered_sql(conn, schema, table, tid, trid,
SQL, name = get_sql(conn, data, tid, None, datlastsysoid,
show_system_objects)
- sql_header = u"-- Trigger: {0}\n\n-- ".format(data['name'])
+ if with_header:
+ sql_header = u"-- Trigger: {0}\n\n-- ".format(data['name'])
- sql_header += render_template("/".join([template_path, 'delete.sql']),
- data=data, conn=conn)
+ sql_header += render_template("/".join([template_path, 'delete.sql']),
+ data=data, conn=conn)
- SQL = sql_header + '\n\n' + SQL.strip('\n')
+ SQL = sql_header + '\n\n' + SQL.strip('\n')
+ else:
+ SQL = SQL.strip('\n')
# If trigger is disabled then add sql code for the same
if data['is_enable_trigger'] != 'O':
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/utils.py
index 1599d35e2..3247d2fc7 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/utils.py
@@ -10,6 +10,7 @@
""" Implements Utility class for Table and Partitioned Table. """
import re
+import copy
from functools import wraps
import simplejson as json
from flask import render_template, jsonify, request
@@ -179,8 +180,10 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
data[row['deftype']] = [priv]
# We will add Auto vacuum defaults with out result for grid
- data['vacuum_table'] = self.parse_vacuum_data(self.conn, data, 'table')
- data['vacuum_toast'] = self.parse_vacuum_data(self.conn, data, 'toast')
+ data['vacuum_table'] = copy.deepcopy(
+ self.parse_vacuum_data(self.conn, data, 'table'))
+ data['vacuum_toast'] = copy.deepcopy(
+ self.parse_vacuum_data(self.conn, data, 'toast'))
# Fetch columns for the table logic
#
@@ -405,7 +408,8 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
status=200
)
- def get_reverse_engineered_sql(self, did, scid, tid, main_sql, data):
+ def get_reverse_engineered_sql(self, did, scid, tid, main_sql, data,
+ json_resp=True, diff_partition_sql=False):
"""
This function will creates reverse engineered sql for
the table object
@@ -416,6 +420,9 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
tid: Table ID
main_sql: List contains all the reversed engineered sql
data: Table's Data
+ json_resp: Json response or plain SQL
+ diff_partition_sql: In Schema diff, the Partition sql should be
+ return separately to perform further task
"""
"""
#####################################
@@ -427,6 +434,7 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
schema = data['schema']
table = data['name']
is_partitioned = 'is_partitioned' in data and data['is_partitioned']
+ sql_header = ''
data = self._formatter(did, scid, tid, data)
@@ -444,18 +452,20 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
c['cltype'], c['hasSqrBracket'] = \
column_utils.type_formatter(c['cltype'])
- sql_header = u"-- Table: {0}\n\n-- ".format(
- self.qtIdent(self.conn, data['schema'], data['name']))
+ if json_resp:
+ sql_header = u"-- Table: {0}\n\n-- ".format(
+ self.qtIdent(self.conn, data['schema'], data['name']))
- sql_header += render_template("/".join([self.table_template_path,
- 'delete.sql']),
- data=data, conn=self.conn)
+ sql_header += render_template("/".join([self.table_template_path,
+ 'delete.sql']),
+ data=data, conn=self.conn)
- sql_header = sql_header.strip('\n')
- sql_header += '\n'
+ sql_header = sql_header.strip('\n')
+ sql_header += '\n'
- # Add into main sql
- main_sql.append(sql_header)
+ # Add into main sql
+ main_sql.append(sql_header)
+ partition_main_sql = ""
# Parse privilege data
if 'relacl' in data:
@@ -493,12 +503,14 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
for row in rset['rows']:
index_sql = index_utils.get_reverse_engineered_sql(
self.conn, schema, table, did, tid, row['oid'],
- self.datlastsysoid)
+ self.datlastsysoid,
+ template_path=None, with_header=json_resp)
index_sql = u"\n" + index_sql
# Add into main sql
index_sql = re.sub('\n{2,}', '\n\n', index_sql)
- main_sql.append(index_sql)
+
+ main_sql.append(index_sql.strip('\n'))
"""
########################################
@@ -514,7 +526,8 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
for row in rset['rows']:
trigger_sql = trigger_utils.get_reverse_engineered_sql(
self.conn, schema, table, tid, row['oid'],
- self.datlastsysoid, self.blueprint.show_system_objects)
+ self.datlastsysoid, self.blueprint.show_system_objects,
+ template_path=None, with_header=json_resp)
trigger_sql = u"\n" + trigger_sql
# Add into main sql
@@ -571,10 +584,13 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
if not status:
return internal_server_error(errormsg=res)
+ display_comments = True
+ if not json_resp:
+ display_comments = False
res_data = parse_rule_definition(res)
rules_sql += render_template("/".join(
[self.rules_template_path, 'create.sql']),
- data=res_data, display_comments=True)
+ data=res_data, display_comments=display_comments)
# Add into main sql
rules_sql = re.sub('\n{2,}', '\n\n', rules_sql)
@@ -594,13 +610,17 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
return internal_server_error(errormsg=rset)
if len(rset['rows']):
- sql_header = u"\n-- Partitions SQL"
+ if json_resp:
+ sql_header = u"\n-- Partitions SQL"
partition_sql = ''
for row in rset['rows']:
part_data = dict()
- part_data['partitioned_table_name'] = table
- part_data['parent_schema'] = schema
- part_data['schema'] = row['schema_name']
+ part_data['partitioned_table_name'] = data['name']
+ part_data['parent_schema'] = data['schema']
+ if not json_resp:
+ part_data['schema'] = data['schema']
+ else:
+ part_data['schema'] = row['schema_name']
part_data['relispartition'] = True
part_data['name'] = row['name']
part_data['partition_value'] = row['partition_value']
@@ -612,13 +632,18 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
data=part_data, conn=self.conn)
# Add into main sql
- partition_sql = re.sub('\n{2,}', '\n\n', partition_sql)
- main_sql.append(
- sql_header + '\n\n' + partition_sql.strip('\n')
- )
+ partition_sql = re.sub('\n{2,}', '\n\n', partition_sql
+ ).strip('\n')
+ partition_main_sql = partition_sql.strip('\n')
+ if not diff_partition_sql:
+ main_sql.append(
+ sql_header + '\n\n' + partition_main_sql
+ )
sql = '\n'.join(main_sql)
+ if not json_resp:
+ return sql, partition_main_sql
return ajax_response(response=sql.strip('\n'))
def reset_statistics(self, scid, tid):
@@ -907,7 +932,8 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
conn=self.conn).strip('\n') + '\n\n'
# If partition(s) is/are added
- if 'added' in partitions:
+ if 'added' in partitions and 'partition_scheme' in old_data\
+ and old_data['partition_scheme'] != '':
temp_data = dict()
temp_data['schema'] = data['schema']
temp_data['name'] = data['name']
@@ -1133,7 +1159,8 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
except Exception as e:
return internal_server_error(errormsg=str(e))
- def properties(self, gid, sid, did, scid, tid, res):
+ def properties(self, gid, sid, did, scid, tid, res,
+ return_ajax_response=True):
"""
This function will show the properties of the selected table node.
@@ -1145,6 +1172,7 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
scid: Schema ID
tid: Table ID
res: Table/Partition table properties
+ return_ajax_response: If True then return the ajax response
Returns:
JSON of selected table node
@@ -1242,6 +1270,9 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
data['partitions'] = partitions
+ if not return_ajax_response:
+ return data
+
return ajax_response(
response=data,
status=200
@@ -1359,18 +1390,7 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
}
)
- def delete(self, gid, sid, did, scid, tid, res):
- """
- This function will delete the table object
-
- Args:
- gid: Server Group ID
- sid: Server ID
- did: Database ID
- scid: Schema ID
- tid: Table ID
- """
-
+ def get_delete_sql(self, res):
# Below will decide if it's simple drop or drop with cascade call
if self.cmd == 'delete':
# This is a cascade operation
@@ -1380,11 +1400,26 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
data = res['rows'][0]
- SQL = render_template(
+ return render_template(
"/".join([self.table_template_path, 'delete.sql']),
data=data, cascade=cascade,
conn=self.conn
)
+
+ def delete(self, gid, sid, did, scid, tid, res):
+ """
+ This function will delete the table object
+
+ Args:
+ gid: Server Group ID
+ sid: Server ID
+ did: Database ID
+ scid: Schema ID
+ tid: Table ID
+ """
+
+ SQL = self.get_delete_sql(res)
+
status, res = self.conn.execute_scalar(SQL)
if not status:
return status, res
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py
index b50e6d7d7..b173a4058 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py
@@ -26,6 +26,8 @@ from pgadmin.utils import IS_PY2
from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -94,7 +96,7 @@ class TypeModule(SchemaChildModule):
blueprint = TypeModule(__name__)
-class TypeView(PGChildNodeView, DataTypeReader):
+class TypeView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare):
"""
This class is responsible for generating routes for Type node
@@ -173,6 +175,10 @@ class TypeView(PGChildNodeView, DataTypeReader):
* get_external_functions_list(gid, sid, did, scid, tid):
- This function will return list of external functions
in ajax response
+
+ * compare(**kwargs):
+ - This function will compare the type nodes from two
+ different schemas.
"""
node_type = blueprint.node_type
@@ -559,6 +565,22 @@ class TypeView(PGChildNodeView, DataTypeReader):
Returns:
JSON of selected type node
"""
+ status, res = self._fetch_properties(scid, tid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, tid):
+ """
+ This function is used to fecth the properties of the specified object.
+ :param scid:
+ :param tid:
+ :return:
+ """
SQL = render_template(
"/".join([self.template_path,
@@ -569,10 +591,10 @@ class TypeView(PGChildNodeView, DataTypeReader):
)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(
+ return False, gone(
gettext("""Could not find the type in the database."""))
# Making copy of output for future use
@@ -583,7 +605,7 @@ class TypeView(PGChildNodeView, DataTypeReader):
scid=scid, tid=tid)
status, acl = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=acl)
+ return False, internal_server_error(errormsg=acl)
# We will set get privileges from acl sql so we don't need
# it from properties sql
@@ -599,10 +621,7 @@ class TypeView(PGChildNodeView, DataTypeReader):
# Calling function to check and additional properties if available
copy_dict.update(self.additional_properties(copy_dict, tid))
- return ajax_response(
- response=copy_dict,
- status=200
- )
+ return True, copy_dict
@check_precondition
def get_collations(self, gid, sid, did, scid, tid=None):
@@ -1428,5 +1447,31 @@ class TypeView(PGChildNodeView, DataTypeReader):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the types for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']),
+ scid=scid, datlastsysoid=self.datlastsysoid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
TypeView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py
index 13da66e35..ee87d9694 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py
@@ -15,6 +15,8 @@ from flask import render_template
from pgadmin.browser.collection import CollectionNodeModule
from pgadmin.utils.ajax import internal_server_error
+from pgadmin.utils.driver import get_driver
+from config import PG_DEFAULT_DRIVER
class SchemaChildModule(CollectionNodeModule):
@@ -485,44 +487,50 @@ class VacuumSettings:
* type - table/toast vacuum type
"""
+ vacuum_settings = dict()
def __init__(self):
pass
- def get_vacuum_table_settings(self, conn):
+ def fetch_default_vacuum_settings(self, conn, sid, setting_type):
"""
- Fetch the default values for autovacuum
- fields, return an array of
- - label
- - name
- - setting
- values
+ This function is used to fetch and cached the default vacuum settings
+ for specified server id.
+ :param conn: Connection Object
+ :param sid: Server ID
+ :param setting_type: Type (table or toast)
+ :return:
"""
+ if sid in VacuumSettings.vacuum_settings:
+ if setting_type in VacuumSettings.vacuum_settings[sid]:
+ return VacuumSettings.vacuum_settings[sid][setting_type]
+ else:
+ VacuumSettings.vacuum_settings[sid] = dict()
# returns an array of name & label values
vacuum_fields = render_template("vacuum_settings/vacuum_fields.json")
-
vacuum_fields = json.loads(vacuum_fields)
# returns an array of setting & name values
vacuum_fields_keys = "'" + "','".join(
- vacuum_fields['table'].keys()) + "'"
+ vacuum_fields[setting_type].keys()) + "'"
SQL = render_template('vacuum_settings/sql/vacuum_defaults.sql',
columns=vacuum_fields_keys)
- status, res = conn.execute_dict(SQL)
+ status, res = conn.execute_dict(SQL)
if not status:
return internal_server_error(errormsg=res)
for row in res['rows']:
row_name = row['name']
- row['name'] = vacuum_fields['table'][row_name][0]
- row['label'] = vacuum_fields['table'][row_name][1]
- row['column_type'] = vacuum_fields['table'][row_name][2]
+ row['name'] = vacuum_fields[setting_type][row_name][0]
+ row['label'] = vacuum_fields[setting_type][row_name][1]
+ row['column_type'] = vacuum_fields[setting_type][row_name][2]
- return res
+ VacuumSettings.vacuum_settings[sid][setting_type] = res['rows']
+ return VacuumSettings.vacuum_settings[sid][setting_type]
- def get_vacuum_toast_settings(self, conn):
+ def get_vacuum_table_settings(self, conn, sid):
"""
Fetch the default values for autovacuum
fields, return an array of
@@ -531,29 +539,18 @@ class VacuumSettings:
- setting
values
"""
+ return self.fetch_default_vacuum_settings(conn, sid, 'table')
- # returns an array of name & label values
- vacuum_fields = render_template("vacuum_settings/vacuum_fields.json")
-
- vacuum_fields = json.loads(vacuum_fields)
-
- # returns an array of setting & name values
- vacuum_fields_keys = "'" + "','".join(
- vacuum_fields['toast'].keys()) + "'"
- SQL = render_template('vacuum_settings/sql/vacuum_defaults.sql',
- columns=vacuum_fields_keys)
- status, res = conn.execute_dict(SQL)
-
- if not status:
- return internal_server_error(errormsg=res)
-
- for row in res['rows']:
- row_name = row['name']
- row['name'] = vacuum_fields['toast'][row_name][0]
- row['label'] = vacuum_fields['toast'][row_name][1]
- row['column_type'] = vacuum_fields['table'][row_name][2]
-
- return res
+ def get_vacuum_toast_settings(self, conn, sid):
+ """
+ Fetch the default values for autovacuum
+ fields, return an array of
+ - label
+ - name
+ - setting
+ values
+ """
+ return self.fetch_default_vacuum_settings(conn, sid, 'toast')
def parse_vacuum_data(self, conn, result, type):
"""
@@ -567,47 +564,46 @@ class VacuumSettings:
* type - table/toast vacuum type
"""
- # returns an array of name & label values
- vacuum_fields = render_template("vacuum_settings/vacuum_fields.json")
+ vacuum_settings_tmp = self.fetch_default_vacuum_settings(
+ conn, self.manager.sid, type)
- vacuum_fields = json.loads(vacuum_fields)
+ for row in vacuum_settings_tmp:
+ row_name = row['name']
+ if type is 'toast':
+ row_name = 'toast_{0}'.format(row['name'])
+ if row_name in result and result[row_name] is not None:
+ if row['column_type'] == 'number':
+ value = float(result[row_name])
+ else:
+ value = int(result[row_name])
+ row['value'] = value
+ else:
+ if 'value' in row:
+ row.pop('value')
- # returns an array of setting & name values
- vacuum_fields_keys = "'" + "','".join(
- vacuum_fields[type].keys()) + "'"
- SQL = render_template('vacuum_settings/sql/vacuum_defaults.sql',
- columns=vacuum_fields_keys)
- status, res = conn.execute_dict(SQL)
+ return vacuum_settings_tmp
- if not status:
- return internal_server_error(errormsg=res)
- if type is 'table':
- for row in res['rows']:
- row_name = row['name']
- row['name'] = vacuum_fields[type][row_name][0]
- row['label'] = vacuum_fields[type][row_name][1]
- row['column_type'] = vacuum_fields[type][row_name][2]
- if result[row['name']] is not None:
- if row['column_type'] == 'number':
- value = float(result[row['name']])
- else:
- value = int(result[row['name']])
- row['value'] = row['setting'] = value
-
- elif type is 'toast':
- for row in res['rows']:
- row_old_name = row['name']
- row_name = 'toast_{0}'.format(
- vacuum_fields[type][row_old_name][0])
- row['name'] = vacuum_fields[type][row_old_name][0]
- row['label'] = vacuum_fields[type][row_old_name][1]
- row['column_type'] = vacuum_fields[type][row_old_name][2]
- if result[row_name] and result[row_name] is not None:
- if row['column_type'] == 'number':
- value = float(result[row_name])
- else:
- value = int(result[row_name])
- row['value'] = row['setting'] = value
+def get_schema(sid, did, scid):
+ """
+ This function will return the schema name.
+ """
+
+ driver = get_driver(PG_DEFAULT_DRIVER)
+ manager = driver.connection_manager(sid)
+ conn = manager.connection(did=did)
+
+ ver = manager.version
+ server_type = manager.server_type
+
+ # Fetch schema name
+ status, schema_name = conn.execute_scalar(
+ render_template("/".join(['schemas',
+ '{0}/#{1}#'.format(server_type,
+ ver),
+ 'sql/get_name.sql']),
+ conn=conn, scid=scid
+ )
+ )
- return res['rows']
+ return status, schema_name
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 4bc357c83..387ee9660 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
@@ -9,6 +9,7 @@
"""Implements View and Materialized View Node"""
+import copy
from functools import wraps
import simplejson as json
@@ -18,13 +19,16 @@ from flask_babelex import gettext
import pgadmin.browser.server_groups.servers.databases as databases
from config import PG_DEFAULT_DRIVER
from pgadmin.browser.server_groups.servers.databases.schemas.utils import \
- SchemaChildModule, parse_rule_definition, VacuumSettings
+ SchemaChildModule, parse_rule_definition, VacuumSettings, get_schema
from pgadmin.browser.server_groups.servers.utils import parse_priv_from_db, \
parse_priv_to_db
from pgadmin.browser.utils import PGChildNodeView
from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
+
"""
This module is responsible for generating two nodes
@@ -197,7 +201,7 @@ def check_precondition(f):
return wrap
-class ViewNode(PGChildNodeView, VacuumSettings):
+class ViewNode(PGChildNodeView, VacuumSettings, SchemaDiffObjectCompare):
"""
This class is responsible for generating routes for view node.
@@ -250,6 +254,10 @@ class ViewNode(PGChildNodeView, VacuumSettings):
* dependent(gid, sid, did, scid):
- This function will generate dependent list to show it in dependent
pane for the selected view node.
+
+ * compare(**kwargs):
+ - This function will compare the view nodes from two
+ different schemas.
"""
node_type = view_blueprint.node_type
@@ -290,6 +298,8 @@ class ViewNode(PGChildNodeView, VacuumSettings):
{'get': 'get_toast_table_vacuum'}]
})
+ keys_to_ignore = ['oid', 'schema', 'xmin']
+
def __init__(self, *args, **kwargs):
"""
Initialize the variables used by methods of ViewNode.
@@ -400,21 +410,37 @@ class ViewNode(PGChildNodeView, VacuumSettings):
Fetches the properties of an individual view
and render in the properties tab
"""
+ status, res = self._fetch_properties(scid, vid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, vid):
+ """
+ This function is used to fetch the properties of the specified object
+ :param scid:
+ :param vid:
+ :return:
+ """
SQL = render_template("/".join(
[self.template_path, 'sql/properties.sql']
), vid=vid, datlastsysoid=self.datlastsysoid)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(gettext("""Could not find the view."""))
+ return False, gone(gettext("""Could not find the view."""))
SQL = render_template("/".join(
[self.template_path, 'sql/acl.sql']), vid=vid)
status, dataclres = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
for row in dataclres['rows']:
priv = parse_priv_from_db(row)
@@ -428,10 +454,7 @@ class ViewNode(PGChildNodeView, VacuumSettings):
# merging formated result with main result again
result.update(frmtd_reslt)
- return ajax_response(
- response=result,
- status=200
- )
+ return True, result
@staticmethod
def formatter(result):
@@ -556,7 +579,7 @@ class ViewNode(PGChildNodeView, VacuumSettings):
return internal_server_error(errormsg=str(e))
@check_precondition
- def delete(self, gid, sid, did, scid, vid=None):
+ def delete(self, gid, sid, did, scid, vid=None, only_sql=False):
"""
This function will drop a view object
"""
@@ -604,6 +627,10 @@ class ViewNode(PGChildNodeView, VacuumSettings):
nspname=res_data['rows'][0]['schema'],
name=res_data['rows'][0]['name'], cascade=cascade
)
+
+ if only_sql:
+ return SQL
+
status, res = self.conn.execute_scalar(SQL)
if not status:
return internal_server_error(errormsg=res)
@@ -840,7 +867,7 @@ class ViewNode(PGChildNodeView, VacuumSettings):
return columns
- def get_rule_sql(self, vid):
+ def get_rule_sql(self, vid, display_comments=True):
"""
Get all non system rules of view node,
generate their sql and render
@@ -869,12 +896,12 @@ class ViewNode(PGChildNodeView, VacuumSettings):
res = parse_rule_definition(res)
SQL = render_template("/".join(
[self.rule_temp_path, 'sql/create.sql']),
- data=res, display_comments=True)
+ data=res, display_comments=display_comments)
SQL_data += '\n'
SQL_data += SQL
return SQL_data
- def get_compound_trigger_sql(self, vid):
+ def get_compound_trigger_sql(self, vid, display_comments=True):
"""
Get all compound trigger nodes associated with view node,
generate their sql and render into sql tab
@@ -945,13 +972,13 @@ class ViewNode(PGChildNodeView, VacuumSettings):
[self.ct_trigger_temp_path,
'sql/{0}/#{1}#/create.sql'.format(
self.manager.server_type, self.manager.version)]),
- data=res_rows, display_comments=True)
+ data=res_rows, display_comments=display_comments)
SQL_data += '\n'
SQL_data += SQL
return SQL_data
- def get_trigger_sql(self, vid):
+ def get_trigger_sql(self, vid, display_comments=True):
"""
Get all trigger nodes associated with view node,
generate their sql and render
@@ -1038,13 +1065,13 @@ class ViewNode(PGChildNodeView, VacuumSettings):
[self.trigger_temp_path,
'sql/{0}/#{1}#/create.sql'.format(
self.manager.server_type, self.manager.version)]),
- data=res_rows, display_comments=True)
+ data=res_rows, display_comments=display_comments)
SQL_data += '\n'
SQL_data += SQL
return SQL_data
- def get_index_sql(self, did, vid):
+ def get_index_sql(self, did, vid, display_comments=True):
"""
Get all index associated with view node,
generate their sql and render
@@ -1084,17 +1111,23 @@ class ViewNode(PGChildNodeView, VacuumSettings):
SQL = render_template("/".join(
[self.index_temp_path,
'sql/#{0}#/create.sql'.format(self.manager.version)]),
- data=data, display_comments=True)
+ data=data, display_comments=display_comments)
SQL_data += '\n'
SQL_data += SQL
return SQL_data
@check_precondition
- def sql(self, gid, sid, did, scid, vid):
+ def sql(self, gid, sid, did, scid, vid, diff_schema=None,
+ json_resp=True):
"""
This function will generate sql to render into the sql panel
"""
+ display_comments = True
+
+ if not json_resp:
+ display_comments = False
+
SQL_data = ''
SQL = render_template("/".join(
[self.template_path, 'sql/properties.sql']),
@@ -1111,6 +1144,9 @@ class ViewNode(PGChildNodeView, VacuumSettings):
)
result = res['rows'][0]
+ if diff_schema:
+ result['schema'] = diff_schema
+
# sending result to formtter
frmtd_reslt = self.formatter(result)
@@ -1152,18 +1188,20 @@ class ViewNode(PGChildNodeView, VacuumSettings):
[self.template_path, 'sql/create.sql']),
data=result,
conn=self.conn,
- display_comments=True
+ display_comments=display_comments
)
SQL += "\n"
SQL += render_template("/".join(
[self.template_path, 'sql/grant.sql']), data=result)
SQL_data += SQL
- SQL_data += self.get_rule_sql(vid)
- SQL_data += self.get_trigger_sql(vid)
- SQL_data += self.get_compound_trigger_sql(vid)
- SQL_data += self.get_index_sql(did, vid)
+ SQL_data += self.get_rule_sql(vid, display_comments)
+ SQL_data += self.get_trigger_sql(vid, display_comments)
+ SQL_data += self.get_compound_trigger_sql(vid, display_comments)
+ SQL_data += self.get_index_sql(did, vid, display_comments)
+ if not json_resp:
+ return SQL_data
return ajax_response(response=SQL_data)
@check_precondition
@@ -1357,6 +1395,60 @@ class ViewNode(PGChildNodeView, VacuumSettings):
return ajax_response(response=sql)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid, oid=None):
+ """
+ This function will fetch the list of all the views for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+
+ if not oid:
+ SQL = render_template("/".join([self.template_path,
+ 'sql/nodes.sql']), did=did,
+ scid=scid, datlastsysoid=self.datlastsysoid)
+ status, views = self.conn.execute_2darray(SQL)
+ if not status:
+ current_app.logger.error(views)
+ return False
+
+ for row in views['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+ else:
+ status, data = self._fetch_properties(scid, oid)
+ if not status:
+ current_app.logger.error(data)
+ return False
+ res = data
+
+ return res
+
+ def get_sql_from_diff(self, gid, sid, did, scid, oid, data=None,
+ diff_schema=None, drop_sql=False):
+ sql = ''
+ if data:
+ if diff_schema:
+ data['schema'] = diff_schema
+ sql, nameOrError = self.getSQL(gid, sid, did, data, oid)
+ else:
+ if drop_sql:
+ sql = self.delete(gid=gid, sid=sid, did=did,
+ scid=scid, vid=oid, only_sql=True)
+ elif diff_schema:
+ sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, vid=oid,
+ diff_schema=diff_schema, json_resp=False)
+ else:
+ sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, vid=oid,
+ json_resp=False)
+ return sql
+
# Override the operations for materialized view
mview_operations = {
@@ -1631,11 +1723,17 @@ class MViewNode(ViewNode, VacuumSettings):
return SQL, data['name'] if 'name' in data else old_data['name']
@check_precondition
- def sql(self, gid, sid, did, scid, vid):
+ def sql(self, gid, sid, did, scid, vid, diff_schema=None,
+ json_resp=True):
"""
This function will generate sql to render into the sql panel
"""
+ display_comments = True
+
+ if not json_resp:
+ display_comments = False
+
SQL_data = ''
SQL = render_template("/".join(
[self.template_path, 'sql/properties.sql']),
@@ -1654,6 +1752,9 @@ class MViewNode(ViewNode, VacuumSettings):
result = res['rows'][0]
+ if diff_schema:
+ result['schema'] = diff_schema
+
# sending result to formtter
frmtd_reslt = self.formatter(result)
@@ -1732,17 +1833,20 @@ class MViewNode(ViewNode, VacuumSettings):
[self.template_path, 'sql/create.sql']),
data=result,
conn=self.conn,
- display_comments=True
+ display_comments=display_comments
)
SQL += "\n"
SQL += render_template("/".join(
[self.template_path, 'sql/grant.sql']), data=result)
SQL_data += SQL
- SQL_data += self.get_rule_sql(vid)
- SQL_data += self.get_trigger_sql(vid)
- SQL_data += self.get_index_sql(did, vid)
+ SQL_data += self.get_rule_sql(vid, display_comments)
+ SQL_data += self.get_trigger_sql(vid, display_comments)
+ SQL_data += self.get_index_sql(did, vid, display_comments)
SQL_data = SQL_data.strip('\n')
+
+ if not json_resp:
+ return SQL_data
return ajax_response(response=SQL_data)
@check_precondition
@@ -1756,9 +1860,9 @@ class MViewNode(ViewNode, VacuumSettings):
values
"""
- res = self.get_vacuum_table_settings(self.conn)
+ res = self.get_vacuum_table_settings(self.conn, sid)
return ajax_response(
- response=res['rows'],
+ response=res,
status=200
)
@@ -1772,10 +1876,10 @@ class MViewNode(ViewNode, VacuumSettings):
- setting
values
"""
- res = self.get_vacuum_toast_settings(self.conn)
+ res = self.get_vacuum_toast_settings(self.conn, sid)
return ajax_response(
- response=res['rows'],
+ response=res,
status=200
)
@@ -1785,21 +1889,39 @@ class MViewNode(ViewNode, VacuumSettings):
Fetches the properties of an individual view
and render in the properties tab
"""
+ status, res = self._fetch_properties(did, scid, vid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, did, scid, vid):
+ """
+ This function is used to fetch the properties of the specified object
+ :param did:
+ :param scid:
+ :param vid:
+ :return:
+ """
SQL = render_template("/".join(
[self.template_path, 'sql/properties.sql']
), did=did, vid=vid, datlastsysoid=self.datlastsysoid)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(gettext("""Could not find the materialized view."""))
+ return False, gone(
+ gettext("""Could not find the materialized view."""))
SQL = render_template("/".join(
[self.template_path, 'sql/acl.sql']), vid=vid)
status, dataclres = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
for row in dataclres['rows']:
priv = parse_priv_from_db(row)
@@ -1818,10 +1940,7 @@ class MViewNode(ViewNode, VacuumSettings):
result['vacuum_toast'] = self.parse_vacuum_data(
self.conn, result, 'toast')
- return ajax_response(
- response=result,
- status=200
- )
+ return True, result
@check_precondition
def refresh_data(self, gid, sid, did, scid, vid):
@@ -1873,6 +1992,34 @@ class MViewNode(ViewNode, VacuumSettings):
current_app.logger.exception(e)
return internal_server_error(errormsg=str(e))
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid, oid=None):
+ """
+ This function will fetch the list of all the mviews for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'sql/nodes.sql']), did=did,
+ scid=scid, datlastsysoid=self.datlastsysoid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(did, scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
+SchemaDiffRegistry('view', ViewNode)
ViewNode.register_node_view(view_blueprint)
+SchemaDiffRegistry('mview', MViewNode)
MViewNode.register_node_view(mview_blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.2_plus/sql/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.2_plus/sql/update.sql
index 38606cc0b..d49f7fb9f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.2_plus/sql/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.2_plus/sql/update.sql
@@ -19,7 +19,7 @@ ALTER TABLE {{ conn|qtIdent(view_schema, view_name) }}
{% endif %}
{% if def and def != o_data.definition.rstrip(';') %}
CREATE OR REPLACE VIEW {{ conn|qtIdent(view_schema, view_name) }}
- WITH (security_barrier={{ data.security_barrier|lower if data.security_barrier else o_data.security_barrier|default('false', 'true')|lower }})
+ WITH (security_barrier={{ data.security_barrier|lower if data.security_barrier is defined else o_data.security_barrier|default('false', 'true')|lower }})
AS
{{ def }};
{% else %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.3_plus/sql/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.3_plus/sql/update.sql
index 38606cc0b..d49f7fb9f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.3_plus/sql/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.3_plus/sql/update.sql
@@ -19,7 +19,7 @@ ALTER TABLE {{ conn|qtIdent(view_schema, view_name) }}
{% endif %}
{% if def and def != o_data.definition.rstrip(';') %}
CREATE OR REPLACE VIEW {{ conn|qtIdent(view_schema, view_name) }}
- WITH (security_barrier={{ data.security_barrier|lower if data.security_barrier else o_data.security_barrier|default('false', 'true')|lower }})
+ WITH (security_barrier={{ data.security_barrier|lower if data.security_barrier is defined else o_data.security_barrier|default('false', 'true')|lower }})
AS
{{ def }};
{% else %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.4_plus/sql/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.4_plus/sql/update.sql
index 4235f5c90..805c658d1 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.4_plus/sql/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.4_plus/sql/update.sql
@@ -19,7 +19,7 @@ ALTER TABLE {{ conn|qtIdent(view_schema, view_name) }}
{% endif %}
{% if def and def != o_data.definition.rstrip(';') %}
CREATE OR REPLACE VIEW {{ conn|qtIdent(view_schema, view_name) }}
- WITH ({% if (data.check_option or o_data.check_option) %}check_option={{ data.check_option if data.check_option else o_data.check_option }}{{', ' }}{% endif %}security_barrier={{ data.security_barrier|lower if data.security_barrier else o_data.security_barrier|default('false', 'true')|lower }})
+ WITH ({% if (data.check_option or o_data.check_option) %}check_option={{ data.check_option if data.check_option else o_data.check_option }}{{', ' }}{% endif %}security_barrier={{ data.security_barrier|lower if data.security_barrier is defined else o_data.security_barrier|default('false', 'true')|lower }})
AS
{{ def }};
{% else %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/css/database.css b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/css/database.css
index f0b12e306..0c9ae10dd 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/css/database.css
+++ b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/css/database.css
@@ -11,4 +11,9 @@
background-image: url('{{ url_for('NODE-database.static', filename='img/databasebad.svg') }}') !important;
border-radius: 10px;
background-size: 20px !important;
+ background-repeat: no-repeat;
+ vertical-align: middle;
+ align-content: center;
+ height: 1.3em;
+
}
diff --git a/web/pgadmin/static/bundle/slickgrid.js b/web/pgadmin/static/bundle/slickgrid.js
index 731b42026..20670b981 100644
--- a/web/pgadmin/static/bundle/slickgrid.js
+++ b/web/pgadmin/static/bundle/slickgrid.js
@@ -14,9 +14,12 @@ import 'slickgrid/slick.grid';
import 'slickgrid/slick.dataview';
import 'slickgrid/slick.editors';
import 'slickgrid/slick.formatters';
+import 'slickgrid/slick.groupitemmetadataprovider';
import 'slickgrid/plugins/slick.autotooltips';
import 'slickgrid/plugins/slick.cellrangedecorator';
import 'slickgrid/plugins/slick.cellrangeselector';
+import 'slickgrid/plugins/slick.checkboxselectcolumn';
+import 'slickgrid/plugins/slick.rowselectionmodel';
import 'sources/slickgrid/custom_header_buttons';
export default window.Slick;
diff --git a/web/pgadmin/static/js/backform.pgadmin.js b/web/pgadmin/static/js/backform.pgadmin.js
index eb0821284..d4dbbd9d9 100644
--- a/web/pgadmin/static/js/backform.pgadmin.js
+++ b/web/pgadmin/static/js/backform.pgadmin.js
@@ -817,7 +817,7 @@ define([
},
});
- Backform.Accordian = Backform.Dialog.extend({
+ Backform.Accordian = Backform.Dialog.extend({
className: function() {
return 'set-group pg-el-12';
},
@@ -2129,7 +2129,9 @@ define([
formatter: Select2Formatter,
template: _.template([
- '<label class="<%=Backform.controlLabelClassName%>" for="<%=cId%>"><%=label%></label>',
+ '<% if(label == false) {} else {%>',
+ ' <label class="<%=Backform.controlLabelClassName%>" for="<%=cId%>"><%=label%></label>',
+ '<% }%>',
'<div class="<%=Backform.controlsClassName%>">',
' <select id="<%=cId%>" class="<%=Backform.controlClassName%> <%=extraClasses.join(\' \')%>"',
' name="<%=name%>" value="<%-value%>" <%=disabled ? "disabled" : ""%>',
@@ -2161,7 +2163,6 @@ define([
'</div>',
].join('\n')),
render: function() {
-
if (this.$sel && this.$sel.select2 &&
this.$sel.select2.hasOwnProperty('destroy')) {
this.$sel.select2('destroy');
@@ -2465,7 +2466,7 @@ define([
self.sqlCtrl.setOption('autoCloseBrackets', sqlEditPreferences.insert_pair_brackets);
self.sqlCtrl.setOption('matchBrackets', sqlEditPreferences.brace_matching);
setTimeout(function() {
- self.sqlCtrl.refresh();
+ if (self.sqlCtrl) self.sqlCtrl.refresh();
}, 500);
}
},
diff --git a/web/pgadmin/static/scss/resources/_default.variables.scss b/web/pgadmin/static/scss/resources/_default.variables.scss
index f769e50b3..e13cf08ba 100644
--- a/web/pgadmin/static/scss/resources/_default.variables.scss
+++ b/web/pgadmin/static/scss/resources/_default.variables.scss
@@ -256,4 +256,11 @@ $loading-bg : rgba($black,0.6);
$loading-fg : $white;
$loader-icon : url("data:image/svg+xml;charset=UTF-8,%3c?xml version='1.0' encoding='utf-8'?%3e%3csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 38 38' style='enable-background:new 0 0 38 38;' xml:space='preserve'%3e%3cstyle type='text/css'%3e .st0%7bfill:none;stroke:%23ebeef3;stroke-width:2;%7d .st1%7bfill:none;stroke:%23326690;stroke-width:2;%7d %3c/style%3e%3cg%3e%3cg transform='translate(1 1)'%3e%3ccircle class='st0' cx='18' cy='18' r='18'/%3e%3cpath class='st1' d='M36,18c0-9.9-8.1-18-18-18 '%3e%3canimateTransform accumulate='none' additive='replace' attributeName='transform' calcMode='linear' dur='0.7s' fill='remove' from='0 18 18' repeatCount='indefinite' restart='always' to='360 18 18' type='rotate'%3e%3c/animateTransform%3e%3c/path%3e%3c/g%3e%3c/g%3e%3c/svg%3e ") !default;
+
$loader-icon-small: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='utf-8'%3F%3E%3C!-- Generator: Adobe Illustrator 23.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --%3E%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 38 38' style='enable-background:new 0 0 38 38;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:none;stroke:%23EBEEF3;stroke-width:5;%7D .st1%7Bfill:none;stroke:%23326690;stroke-width:5;%7D%0A%3C/style%3E%3Cg%3E%3Cg transform='translate(1 1)'%3E%3Ccircle class='st0' cx='18' cy='18' r='16'/%3E%3Cpath class='st1' d='M34,18c0-8.8-7.2-16-16-16 '%3E%3CanimateTransform accumulate='none' additive='replace' attributeName='transform' calcMode='linear' dur='0.7s' fill='remove' from='0 18 18' repeatCount='indefinite' restart='always' to='360 18 18' type='rotate'%3E%3C/animateTransform%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E%0A") !default;
+
+/***************/
+
+$schemadiff-diff-row-color: #fff9c4;
+$schemadiff-source-row-color: #ffebee;
+$schemadiff-target-row-color: #fbe3bf;
diff --git a/web/pgadmin/tools/datagrid/static/js/show_query_tool.js b/web/pgadmin/tools/datagrid/static/js/show_query_tool.js
index b7a8d0338..24b44f3e3 100644
--- a/web/pgadmin/tools/datagrid/static/js/show_query_tool.js
+++ b/web/pgadmin/tools/datagrid/static/js/show_query_tool.js
@@ -11,6 +11,7 @@ import gettext from '../../../../static/js/gettext';
import url_for from '../../../../static/js/url_for';
import {getTreeNodeHierarchyFromIdentifier} from '../../../../static/js/tree/pgadmin_tree_node';
import {getPanelTitle} from './datagrid_panel_title';
+import {getRandomInt} from 'sources/utils';
function hasDatabaseInformation(parentData) {
return parentData.database;
@@ -66,3 +67,21 @@ export function showQueryTool(datagrid, pgBrowser, alertify, url, aciTreeIdentif
datagrid.launch_grid(transId, gridUrl, true, queryToolTitle, sURL);
}
+
+export function generateScript(parentData, datagrid) {
+ const queryToolTitle = `${parentData.database}/${parentData.user}@${parentData.server}`;
+ const transId = getRandomInt(1, 9999999);
+
+ let url_endpoint = url_for('datagrid.panel', {
+ 'trans_id': transId,
+ });
+
+ url_endpoint += `?is_query_tool=${true}`
+ +`&sgid=${parentData.sgid}`
+ +`&sid=${parentData.sid}`
+ +`&server_type=${parentData.stype}`
+ +`&did=${parentData.did}`;
+
+ datagrid.launch_grid(transId, url_endpoint, true, queryToolTitle, '');
+
+}
diff --git a/web/pgadmin/tools/datagrid/templates/datagrid/index.html b/web/pgadmin/tools/datagrid/templates/datagrid/index.html
index 77f8f31f3..ba5f71fc3 100644
--- a/web/pgadmin/tools/datagrid/templates/datagrid/index.html
+++ b/web/pgadmin/tools/datagrid/templates/datagrid/index.html
@@ -443,6 +443,12 @@ require(['sources/generated/browser_nodes', 'sources/generated/codemirror', 'sou
{{ url_params|safe}},
'{{ layout|safe }}'
);
+
+ // If opening from schema diff, set the generated script to the SQL Editor
+ var schema_ddl_diff = (window.opener !== null) ? window.opener.pgAdmin.ddl_diff : window.top.pgAdmin.ddl_diff;
+ sqlEditorController.set_value_to_editor(schema_ddl_diff);
+ if (window.top !== null) window.top.pgAdmin.ddl_diff = '';
+ if (window.opener !== null) window.opener.pgAdmin.ddl_diff = '';
});
});
{% endblock %}
diff --git a/web/pgadmin/tools/schema_diff/__init__.py b/web/pgadmin/tools/schema_diff/__init__.py
new file mode 100644
index 000000000..acd06c3f0
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/__init__.py
@@ -0,0 +1,613 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+"""A blueprint module implementing the schema_diff frame."""
+MODULE_NAME = 'schema_diff'
+
+import simplejson as json
+import pickle
+import random
+
+from flask import Response, session, url_for, request
+from flask import render_template, current_app as app
+from flask_security import current_user, login_required
+from flask_babelex import gettext
+from pgadmin.utils import PgAdminModule
+from pgadmin.utils.ajax import make_json_response, bad_request, \
+ internal_server_error, gone, make_response as ajax_response, \
+ not_implemented
+from pgadmin.model import Server
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.model import SchemaDiffModel
+from config import PG_DEFAULT_DRIVER
+from pgadmin.utils.driver import get_driver
+
+
+class SchemaDiffModule(PgAdminModule):
+ """
+ class SchemaDiffModule(PgAdminModule)
+
+ A module class for Schema Diff derived from PgAdminModule.
+ """
+
+ LABEL = "Schema Diff"
+
+ def get_own_menuitems(self):
+ return {}
+
+ def get_own_javascripts(self):
+ return [{
+ 'name': 'pgadmin.schema_diff',
+ 'path': url_for('schema_diff.index') + "schema_diff",
+ 'when': None
+ }]
+
+ def get_panels(self):
+ return []
+
+ def get_exposed_url_endpoints(self):
+ """
+ Returns:
+ list: URL endpoints for Schema Diff module
+ """
+ return [
+ 'schema_diff.initialize',
+ 'schema_diff.panel',
+ 'schema_diff.servers',
+ 'schema_diff.databases',
+ 'schema_diff.schemas',
+ 'schema_diff.compare',
+ 'schema_diff.poll',
+ 'schema_diff.ddl_compare',
+ 'schema_diff.connect_server',
+ 'schema_diff.connect_database',
+ 'schema_diff.get_server',
+ 'schema_diff.generate_script'
+ ]
+
+ def register_preferences(self):
+ self.preference.register(
+ 'display', 'schema_diff_new_browser_tab',
+ gettext("Open in new browser tab"), 'boolean', False,
+ category_label=gettext('Display'),
+ help_str=gettext('If set to True, the Schema Diff '
+ 'will be opened in a new browser tab.')
+ )
+
+
+blueprint = SchemaDiffModule(MODULE_NAME, __name__, static_url_path='/static')
+
+
[email protected]("/")
+@login_required
+def index():
+ return bad_request(
+ errormsg=gettext('This URL cannot be requested directly.')
+ )
+
+
[email protected](
+ '/panel/<int:trans_id>/<path:editor_title>',
+ methods=["GET"],
+ endpoint='panel'
+)
+def panel(trans_id, editor_title):
+ """
+ This method calls index.html to render the schema diff.
+
+ Args:
+ editor_title: Title of the editor
+ """
+ # If title has slash(es) in it then replace it
+ if request.args and request.args['fslashes'] != '':
+ try:
+ fslashesList = request.args['fslashes'].split(',')
+ for idx in fslashesList:
+ idx = int(idx)
+ editor_title = editor_title[:idx] + '/' + editor_title[idx:]
+ except IndexError as e:
+ app.logger.exception(e)
+
+ return render_template(
+ "schema_diff/index.html",
+ _=gettext,
+ trans_id=trans_id,
+ editor_title=editor_title
+ )
+
+
[email protected]("/schema_diff.js")
+@login_required
+def script():
+ """render the required javascript"""
+ return Response(
+ response=render_template("schema_diff/js/schema_diff.js", _=gettext),
+ status=200,
+ mimetype="application/javascript"
+ )
+
+
+def check_transaction_status(trans_id):
+ """
+ This function is used to check the transaction id
+ is available in the session object.
+
+ Args:
+ trans_id:
+ """
+
+ if 'schemaDiff' not in session:
+ return False, gettext(
+ 'Transaction ID not found in the session.'
+ ), None, None
+
+ schema_diff_data = session['schemaDiff']
+
+ # Return from the function if transaction id not found
+ if str(trans_id) not in schema_diff_data:
+ return False, gettext(
+ 'Transaction ID not found in the session.'
+ ), None, None
+
+ # Fetch the object for the specified transaction id.
+ # Use pickle.loads function to get the model object
+ session_obj = schema_diff_data[str(trans_id)]
+ diff_model_obj = pickle.loads(session_obj['diff_model_obj'])
+
+ return True, None, diff_model_obj, session_obj
+
+
+def update_session_diff_transaction(trans_id, session_obj, diff_model_obj):
+ """
+ This function is used to update the diff model into the session.
+ :param trans_id:
+ :param session_obj:
+ :param diff_model_obj:
+ :return:
+ """
+ session_obj['diff_model_obj'] = pickle.dumps(diff_model_obj, -1)
+
+ if 'schemaDiff' in session:
+ schema_diff_data = session['schemaDiff']
+ schema_diff_data[str(trans_id)] = session_obj
+ session['schemaDiff'] = schema_diff_data
+
+
[email protected](
+ '/initialize',
+ methods=["GET"],
+ endpoint="initialize"
+)
+@login_required
+def initialize():
+ """
+ This function will initialize the schema diff and return the list
+ of all the server's.
+ """
+ trans_id = None
+ try:
+ # Create a unique id for the transaction
+ trans_id = str(random.randint(1, 9999999))
+
+ if 'schemaDiff' not in session:
+ schema_diff_data = dict()
+ else:
+ schema_diff_data = session['schemaDiff']
+
+ # Use pickle to store the Schema Diff Model which will be used
+ # later by the diff module.
+ schema_diff_data[trans_id] = {
+ 'diff_model_obj': pickle.dumps(SchemaDiffModel(), -1)
+ }
+
+ # Store the schema diff dictionary into the session variable
+ session['schemaDiff'] = schema_diff_data
+
+ except Exception as e:
+ app.logger.exception(e)
+
+ return make_json_response(
+ data={'schemaDiffTransId': trans_id})
+
+
[email protected](
+ '/servers',
+ methods=["GET"],
+ endpoint="servers"
+)
+@login_required
+def servers():
+ """
+ This function will return the list of servers for the specified
+ server id.
+ """
+ res = []
+ try:
+ """Return a JSON document listing the server groups for the user"""
+ driver = get_driver(PG_DEFAULT_DRIVER)
+
+ from pgadmin.browser.server_groups.servers import\
+ server_icon_and_background
+
+ for server in Server.query.filter_by(user_id=current_user.id):
+ manager = driver.connection_manager(server.id)
+ conn = manager.connection()
+ connected = conn.connected()
+
+ res.append({
+ "value": server.id,
+ "label": server.name,
+ "image": server_icon_and_background(connected, manager,
+ server),
+ "_id": server.id,
+ "connected": connected,
+ })
+
+ except Exception as e:
+ app.logger.exception(e)
+
+ return make_json_response(data=res)
+
+
[email protected](
+ '/get_server/<int:sid>/<int:did>',
+ methods=["GET"],
+ endpoint="get_server"
+)
+@login_required
+def get_server(sid, did):
+ """
+ This function will return the server details for the specified
+ server id.
+ """
+ try:
+ """Return a JSON document listing the server groups for the user"""
+ driver = get_driver(PG_DEFAULT_DRIVER)
+
+ server = Server.query.filter_by(id=sid).first()
+ manager = driver.connection_manager(sid)
+ conn = manager.connection(did=did)
+ connected = conn.connected()
+
+ res = {
+ "sid": sid,
+ "name": server.name,
+ "user": server.username,
+ "gid": server.servergroup_id,
+ "type": manager.server_type,
+ "connected": connected,
+ "database": conn.db
+ }
+
+ except Exception as e:
+ app.logger.exception(e)
+
+ return make_json_response(data=res)
+
+
[email protected](
+ '/server/connect/<int:sid>',
+ methods=["POST"],
+ endpoint="connect_server"
+)
+@login_required
+def connect_server(sid):
+ server = Server.query.filter_by(id=sid).first()
+ view = SchemaDiffRegistry.get_node_view('server')
+ return view.connect(server.servergroup_id, sid)
+
+
[email protected](
+ '/database/connect/<int:sid>/<int:did>',
+ methods=["POST"],
+ endpoint="connect_database"
+)
+@login_required
+def connect_database(sid, did):
+ server = Server.query.filter_by(id=sid).first()
+ view = SchemaDiffRegistry.get_node_view('database')
+ return view.connect(server.servergroup_id, sid, did)
+
+
[email protected](
+ '/databases/<int:sid>',
+ methods=["GET"],
+ endpoint="databases"
+)
+@login_required
+def databases(sid):
+ """
+ This function will return the list of databases for the specified
+ server id.
+ """
+ res = []
+ try:
+ view = SchemaDiffRegistry.get_node_view('database')
+
+ server = Server.query.filter_by(id=sid).first()
+ response = view.nodes(gid=server.servergroup_id, sid=sid)
+ databases = json.loads(response.data)['data']
+ for db in databases:
+ res.append({
+ "value": db['_id'],
+ "label": db['label'],
+ "_id": db['_id'],
+ "connected": db['connected'],
+ "allowConn": db['allowConn'],
+ "image": db['icon'],
+ "canDisconn": db['canDisconn']
+ })
+
+ except Exception as e:
+ app.logger.exception(e)
+
+ return make_json_response(data=res)
+
+
[email protected](
+ '/schemas/<int:sid>/<int:did>',
+ methods=["GET"],
+ endpoint="schemas"
+)
+@login_required
+def schemas(sid, did):
+ """
+ This function will return the list of schemas for the specified
+ server id and database id.
+ """
+ res = []
+ try:
+ view = SchemaDiffRegistry.get_node_view('schema')
+ server = Server.query.filter_by(id=sid).first()
+ response = view.nodes(gid=server.servergroup_id, sid=sid, did=did)
+ schemas = json.loads(response.data)['data']
+ for sch in schemas:
+ res.append({
+ "value": sch['_id'],
+ "label": sch['label'],
+ "_id": sch['_id'],
+ "image": sch['icon'],
+ })
+ except Exception as e:
+ app.logger.exception(e)
+
+ return make_json_response(data=res)
+
+
[email protected](
+ '/compare/<int:trans_id>/<int:source_sid>/<int:source_did>/'
+ '<int:source_scid>/<int:target_sid>/<int:target_did>/<int:target_scid>',
+ methods=["GET"],
+ endpoint="compare"
+)
+@login_required
+def compare(trans_id, source_sid, source_did, source_scid,
+ target_sid, target_did, target_scid):
+ """
+ This function will compare the two schemas.
+ """
+ # Check the transaction and connection status
+ status, error_msg, diff_model_obj, session_obj = \
+ check_transaction_status(trans_id)
+
+ if error_msg == gettext('Transaction ID not found in the session.'):
+ return make_json_response(success=0, errormsg=error_msg, status=404)
+
+ if not check_version_compatibility(source_sid, target_sid):
+ return not_implemented(errormsg=gettext("Version mismatch."))
+
+ comparison_result = []
+
+ diff_model_obj.set_comparison_info("Comparing objects...", 0)
+ update_session_diff_transaction(trans_id, session_obj,
+ diff_model_obj)
+
+ try:
+ all_registered_nodes = SchemaDiffRegistry.get_registered_nodes()
+ node_percent = round(100 / len(all_registered_nodes))
+ total_percent = 0
+
+ for node_name, node_view in all_registered_nodes.items():
+ view = SchemaDiffRegistry.get_node_view(node_name)
+ if hasattr(view, 'compare'):
+ msg = "Comparing " + view.blueprint.COLLECTION_LABEL + " ..."
+ diff_model_obj.set_comparison_info(msg, total_percent)
+ # Update the message and total percentage in session object
+ update_session_diff_transaction(trans_id, session_obj,
+ diff_model_obj)
+
+ res = view.compare(source_sid=source_sid,
+ source_did=source_did,
+ source_scid=source_scid,
+ target_sid=target_sid,
+ target_did=target_did,
+ target_scid=target_scid)
+
+ if res is not None:
+ comparison_result = comparison_result + res
+ total_percent = total_percent + node_percent
+
+ msg = "Successfully compare the specified schemas."
+ total_percent = 100
+ diff_model_obj.set_comparison_info(msg, total_percent)
+ # Update the message and total percentage done in session object
+ update_session_diff_transaction(trans_id, session_obj, diff_model_obj)
+
+ except Exception as e:
+ app.logger.exception(e)
+
+ return make_json_response(data=comparison_result)
+
+
[email protected](
+ '/poll/<int:trans_id>', methods=["GET"], endpoint="poll"
+)
+@login_required
+def poll(trans_id):
+ """
+ This function is used to check the schema comparison is completed or not.
+ :param trans_id:
+ :return:
+ """
+
+ # Check the transaction and connection status
+ status, error_msg, diff_model_obj, session_obj = \
+ check_transaction_status(trans_id)
+
+ if error_msg == gettext('Transaction ID not found in the session.'):
+ return make_json_response(success=0, errormsg=error_msg, status=404)
+
+ msg, diff_percentage = diff_model_obj.get_comparison_info()
+
+ if diff_percentage == 100:
+ diff_model_obj.set_comparison_info("Comparing objects...", 0)
+ update_session_diff_transaction(trans_id, session_obj,
+ diff_model_obj)
+
+ return make_json_response(data={'compare_msg': msg,
+ 'diff_percentage': diff_percentage})
+
+
[email protected](
+ '/generate_script/<int:trans_id>/',
+ methods=["POST"],
+ endpoint="generate_script"
+)
+def generate_script(trans_id):
+ """This function will generate the scripts for the selected objects."""
+ data = request.form if request.form else json.loads(
+ request.data, encoding='utf-8'
+ )
+
+ status, error_msg, diff_model_obj, session_obj = \
+ check_transaction_status(trans_id)
+
+ if error_msg == gettext('Transaction ID not found in the session.'):
+ return make_json_response(success=0, errormsg=error_msg, status=404)
+
+ source_sid = int(data['source_sid'])
+ source_did = int(data['source_did'])
+ source_scid = int(data['source_scid'])
+ target_sid = int(data['target_sid'])
+ target_did = int(data['target_did'])
+ target_scid = int(data['target_scid'])
+ diff_ddl = ''
+
+ for d in data['sel_rows']:
+ node_type = d['node_type']
+ source_oid = int(d['source_oid'])
+ target_oid = int(d['target_oid'])
+ comp_status = d['comp_status']
+
+ view = SchemaDiffRegistry.get_node_view(node_type)
+ if view and hasattr(view, 'ddl_compare') and \
+ comp_status != SchemaDiffModel.COMPARISON_STATUS['identical']:
+ sql = view.ddl_compare(source_sid=source_sid,
+ source_did=source_did,
+ source_scid=source_scid,
+ target_sid=target_sid,
+ target_did=target_did,
+ target_scid=target_scid,
+ source_oid=source_oid,
+ target_oid=target_oid,
+ comp_status=comp_status,
+ generate_script=True)
+
+ diff_ddl += sql['diff_ddl']
+
+ return ajax_response(
+ status=200,
+ response={'diff_ddl': diff_ddl}
+ )
+
+
[email protected](
+ '/ddl_compare/<int:trans_id>/<int:source_sid>/<int:source_did>/'
+ '<int:source_scid>/<int:target_sid>/<int:target_did>/<int:target_scid>/'
+ '<int:source_oid>/<int:target_oid>/<node_type>/<comp_status>/',
+ methods=["GET"],
+ endpoint="ddl_compare"
+)
+@login_required
+def ddl_compare(trans_id, source_sid, source_did, source_scid,
+ target_sid, target_did, target_scid, source_oid,
+ target_oid, node_type, comp_status):
+ """
+ This function is used to compare the specified object and return the
+ DDL comparison.
+ """
+ # Check the transaction and connection status
+ status, error_msg, diff_model_obj, session_obj = \
+ check_transaction_status(trans_id)
+
+ if error_msg == gettext('Transaction ID not found in the session.'):
+ return make_json_response(success=0, errormsg=error_msg, status=404)
+
+ source_ddl = ''
+ target_ddl = ''
+ diff_ddl = ''
+
+ view = SchemaDiffRegistry.get_node_view(node_type)
+ if view and hasattr(view, 'ddl_compare'):
+ sql = view.ddl_compare(source_sid=source_sid, source_did=source_did,
+ source_scid=source_scid, target_sid=target_sid,
+ target_did=target_did, target_scid=target_scid,
+ source_oid=source_oid, target_oid=target_oid,
+ comp_status=comp_status)
+ return ajax_response(
+ status=200,
+ response={'source_ddl': sql['source_ddl'],
+ 'target_ddl': sql['target_ddl'],
+ 'diff_ddl': sql['diff_ddl']}
+ )
+
+ msg = gettext('Selected object is not supported for DDL comparison.')
+
+ return ajax_response(
+ status=200,
+ response={'source_ddl': msg,
+ 'target_ddl': msg,
+ 'diff_ddl': msg
+ }
+ )
+
+
+def check_version_compatibility(sid, tid):
+ """Check the version compatibility of source and target servers."""
+
+ driver = get_driver(PG_DEFAULT_DRIVER)
+ src_server = Server.query.filter_by(id=sid).first()
+ src_manager = driver.connection_manager(src_server.id)
+
+ tar_server = Server.query.filter_by(id=tid).first()
+ tar_manager = driver.connection_manager(tar_server.id)
+
+ src_server_version = src_manager.version
+ tar_server_version = tar_manager.version
+
+ server_versions = [120000, 110000, 100000, 90600, 90500, 90400,
+ 90300, 90200, 90100, 90000]
+
+ for version in server_versions:
+ if version > src_server_version:
+ continue
+
+ src_server_version = version
+ break
+
+ for version in server_versions:
+ if version > tar_server_version:
+ continue
+
+ tar_server_version = version
+ break
+
+ if src_server_version == tar_server_version:
+ return True
+ return False
diff --git a/web/pgadmin/tools/schema_diff/compare.py b/web/pgadmin/tools/schema_diff/compare.py
new file mode 100644
index 000000000..424e229e8
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/compare.py
@@ -0,0 +1,212 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+""" Implements Utility class for Table and Partitioned Table. """
+
+import copy
+
+from flask import render_template
+from pgadmin.utils.compile_template_name import compile_template_path
+from pgadmin.utils.driver import get_driver
+from config import PG_DEFAULT_DRIVER
+from pgadmin.tools.schema_diff.directory_compare import compare_dictionaries,\
+ directory_diff
+from pgadmin.tools.schema_diff.model import SchemaDiffModel
+from abc import abstractmethod
+
+
+class SchemaDiffObjectCompare():
+
+ keys_to_ignore = ['oid', 'schema']
+
+ @staticmethod
+ def get_schema(sid, did, scid):
+ """
+ This function will return the schema name.
+ """
+
+ driver = get_driver(PG_DEFAULT_DRIVER)
+ manager = driver.connection_manager(sid)
+ conn = manager.connection(did=did)
+
+ ver = manager.version
+ server_type = manager.server_type
+
+ # Fetch schema name
+ status, schema_name = conn.execute_scalar(
+ render_template(
+ "/".join(['schemas',
+ '{0}/#{1}#'.format(server_type, ver),
+ 'sql/get_name.sql']),
+ conn=conn, scid=scid
+ )
+ )
+
+ return status, schema_name
+
+ def compare(self, **kwargs):
+ """
+ This function is used to compare all the objects
+ from two different schemas.
+
+ :param kwargs:
+ :return:
+ """
+
+ source_params = {'sid': kwargs.get('source_sid'),
+ 'did': kwargs.get('source_did'),
+ 'scid': kwargs.get('source_scid')
+ }
+
+ target_params = {'sid': kwargs.get('target_sid'),
+ 'did': kwargs.get('target_did'),
+ 'scid': kwargs.get('target_scid')
+ }
+
+ if 'source_tid' in kwargs:
+ source_params['tid'] = kwargs['source_tid']
+ if 'target_tid' in kwargs:
+ target_params['tid'] = kwargs['target_tid']
+
+ source = self.fetch_objects_to_compare(**source_params)
+
+ target = self.fetch_objects_to_compare(**target_params)
+
+ # If both the dict have no items then return None.
+ if not (source or target) or (
+ len(source) <= 0 and len(target) <= 0):
+ return None
+
+ return compare_dictionaries(source, target,
+ self.node_type,
+ self.blueprint.COLLECTION_LABEL,
+ self.keys_to_ignore)
+
+ def ddl_compare(self, **kwargs):
+ """
+ This function will compare index properties and
+ return the difference of SQL
+ """
+
+ source = ''
+ target = ''
+ diff = ''
+ comp_status = kwargs.get('comp_status')
+ only_diff = False
+ generate_script = False
+
+ source_params = {'gid': 1,
+ 'sid': kwargs.get('source_sid'),
+ 'did': kwargs.get('source_did'),
+ 'scid': kwargs.get('source_scid'),
+ 'oid': kwargs.get('source_oid')
+ }
+
+ target_params = {'gid': 1,
+ 'sid': kwargs.get('target_sid'),
+ 'did': kwargs.get('target_did'),
+ 'scid': kwargs.get('target_scid'),
+ 'oid': kwargs.get('target_oid')
+ }
+
+ if 'source_tid' in kwargs:
+ source_params['tid'] = kwargs['source_tid']
+ only_diff = True
+ if 'target_tid' in kwargs:
+ target_params['tid'] = kwargs['target_tid']
+ only_diff = True
+
+ if 'generate_script' in kwargs and kwargs['generate_script']:
+ generate_script = True
+
+ source_params_adv = copy.deepcopy(source_params)
+ target_params_adv = copy.deepcopy(target_params)
+
+ del source_params_adv['gid']
+ del target_params_adv['gid']
+
+ status, target_schema = self.get_schema(kwargs.get('target_sid'),
+ kwargs.get('target_did'),
+ kwargs.get('target_scid')
+ )
+ if not status:
+ return internal_server_error(errormsg=target_schema)
+
+ if comp_status == SchemaDiffModel.COMPARISON_STATUS['source_only']:
+ if not generate_script:
+ source = self.get_sql_from_diff(**source_params)
+ source_params.update({
+ 'diff_schema': target_schema
+ })
+ diff = self.get_sql_from_diff(**source_params)
+
+ elif comp_status == SchemaDiffModel.COMPARISON_STATUS['target_only']:
+ if not generate_script:
+ target = self.get_sql_from_diff(**target_params)
+ target_params.update(
+ {'drop_sql': True})
+ diff = self.get_sql_from_diff(**target_params)
+
+ elif comp_status == SchemaDiffModel.COMPARISON_STATUS['different']:
+ source = self.fetch_objects_to_compare(**source_params_adv)
+ target = self.fetch_objects_to_compare(**target_params_adv)
+
+ if not (source or target):
+ return None
+
+ diff_dict = directory_diff(source,
+ target,
+ ignore_keys=self.keys_to_ignore,
+ difference={}
+ )
+
+ diff_dict.update(self.parce_acl(source, target))
+
+ if not generate_script:
+ source = self.get_sql_from_diff(**source_params)
+ target = self.get_sql_from_diff(**target_params)
+
+ target_params.update(
+ {'data': diff_dict})
+ diff = self.get_sql_from_diff(**target_params)
+ else:
+ source = self.get_sql_from_diff(**source_params)
+ target = self.get_sql_from_diff(**target_params)
+
+ if only_diff:
+ return diff
+
+ return {'source_ddl': source,
+ 'target_ddl': target,
+ 'diff_ddl': diff
+ }
+
+ @staticmethod
+ def parce_acl(source, target):
+ key = 'acl'
+
+ if 'datacl' in source:
+ key = 'datacl'
+ elif 'relacl' in source:
+ key = 'relacl'
+
+ tmp_source = source[key] if\
+ key in source and source[key] is not None else []
+ tmp_target = copy.deepcopy(target[key]) if\
+ key in target and target[key] is not None else []
+
+ diff = {'added': [], 'deleted': []}
+ for acl in tmp_source:
+ if acl in tmp_target:
+ tmp_target.remove(acl)
+ elif acl not in tmp_target:
+ diff['added'].append(acl)
+ diff['deleted'] = tmp_target
+
+ return {key: diff}
diff --git a/web/pgadmin/tools/schema_diff/directory_compare.py b/web/pgadmin/tools/schema_diff/directory_compare.py
new file mode 100644
index 000000000..eeb495d36
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/directory_compare.py
@@ -0,0 +1,279 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+"""Directory comparison"""
+
+import copy
+from pgadmin.tools.schema_diff.model import SchemaDiffModel
+
+count = 1
+
+
+def compare_dictionaries(source_dict, target_dict, node, node_label,
+ ignore_keys=None):
+ """
+ This function will compare the two dictionaries.
+
+ :param source_dict: First Dictionary
+ :param target_dict: Second Dictionary
+ :param node: node type
+ :param ignore_keys: List of keys that will be ignored while comparing
+ :return:
+ """
+
+ dict1 = copy.deepcopy(source_dict)
+ dict2 = copy.deepcopy(target_dict)
+
+ # Find the duplicate keys in both the dictionaries
+ dict1_keys = set(dict1.keys())
+ dict2_keys = set(dict2.keys())
+ intersect_keys = dict1_keys.intersection(dict2_keys)
+
+ # Keys that are available in source and missing in target.
+ source_only = []
+ added = dict1_keys - dict2_keys
+ global count
+ for item in added:
+ source_only.append({
+ 'id': count,
+ 'type': node,
+ 'label': node_label,
+ 'title': item,
+ 'oid': source_dict[item]['oid'],
+ 'status': SchemaDiffModel.COMPARISON_STATUS['source_only']
+ })
+ count += 1
+
+ target_only = []
+ # Keys that are available in target and missing in source.
+ removed = dict2_keys - dict1_keys
+ for item in removed:
+ target_only.append({
+ 'id': count,
+ 'type': node,
+ 'label': node_label,
+ 'title': item,
+ 'oid': target_dict[item]['oid'],
+ 'status': SchemaDiffModel.COMPARISON_STATUS['target_only']
+ })
+ count += 1
+
+ # Compare the values of duplicates keys.
+ identical = []
+ different = []
+ for key in intersect_keys:
+ # ignore the keys if available.
+ for ig_key in ignore_keys:
+ if ig_key in dict1[key]:
+ dict1[key].pop(ig_key)
+ if ig_key in dict2[key]:
+ dict2[key].pop(ig_key)
+
+ # Recursively Compare the two dictionary
+ if are_dictionaries_identical(dict1[key], dict2[key], ignore_keys):
+ identical.append({
+ 'id': count,
+ 'type': node,
+ 'label': node_label,
+ 'title': key,
+ 'oid': source_dict[key]['oid'],
+ 'source_oid': source_dict[key]['oid'],
+ 'target_oid': target_dict[key]['oid'],
+ 'status': SchemaDiffModel.COMPARISON_STATUS['identical']
+ })
+ else:
+ different.append({
+ 'id': count,
+ 'type': node,
+ 'label': node_label,
+ 'title': key,
+ 'oid': source_dict[key]['oid'],
+ 'source_oid': source_dict[key]['oid'],
+ 'target_oid': target_dict[key]['oid'],
+ 'status': SchemaDiffModel.COMPARISON_STATUS['different']
+ })
+ count += 1
+
+ return source_only + target_only + different + identical
+
+
+def are_lists_identical(source_list, target_list, ignore_keys):
+ """
+ This function is used to compare two list.
+ :param source_list:
+ :param target_list:
+ :return:
+ """
+ if source_list is None or target_list is None or \
+ len(source_list) != len(target_list):
+ return False
+ else:
+ for index in range(len(source_list)):
+ # Check the type of the value if it is an dictionary then
+ # call are_dictionaries_identical() function.
+ if type(source_list[index]) is dict:
+ if not are_dictionaries_identical(source_list[index],
+ target_list[index],
+ ignore_keys):
+ return False
+ else:
+ if source_list[index] != target_list[index]:
+ return False
+ return True
+
+
+def are_dictionaries_identical(source_dict, target_dict, ignore_keys):
+ """
+ This function is used to recursively compare two dictionaries with
+ same keys.
+ :param source_dict:
+ :param target_dict:
+ :return:
+ """
+
+ src_keys = set(source_dict.keys())
+ tar_keys = set(target_dict.keys())
+
+ # ignore the keys if available.
+ for ig_key in ignore_keys:
+ if ig_key in src_keys:
+ source_dict.pop(ig_key)
+ if ig_key in target_dict:
+ target_dict.pop(ig_key)
+
+ # Keys that are available in source and missing in target.
+ src_only = src_keys - tar_keys
+ # Keys that are available in target and missing in source.
+ tar_only = tar_keys - src_keys
+
+ # If number of keys are different in source and target then
+ # return False
+ if len(src_only) != len(tar_only):
+ return False
+ else:
+ # If number of keys are same but key is not present in target then
+ # return False
+ for key in src_only:
+ if key not in tar_only:
+ return False
+
+ for key in source_dict.keys():
+ if type(source_dict[key]) is dict:
+ if not are_dictionaries_identical(source_dict[key],
+ target_dict[key], ignore_keys):
+ return False
+ elif type(source_dict[key]) is list:
+ if not are_lists_identical(source_dict[key], target_dict[key],
+ ignore_keys):
+ return False
+ else:
+ if source_dict[key] != target_dict[key]:
+ return False
+
+ return True
+
+
+def directory_diff(source_dict, target_dict, ignore_keys=[], difference={}):
+ """
+ This function is used to recursively compare two dictionaries and
+ return the difference.
+ The difference is from source to target
+ :param source_dict: source dict
+ :param target_dict: target dict
+ :param ignore_keys: ignore keys to compare
+ """
+
+ src_keys = set(source_dict.keys())
+ tar_keys = set(target_dict.keys())
+
+ # Keys that are available in source and missing in target.
+ src_only = src_keys - tar_keys
+ # Keys that are available in target and missing in source.
+ tar_only = tar_keys - src_keys
+
+ for key in source_dict.keys():
+ added = []
+ deleted = []
+ updated = []
+ source = None
+
+ # ignore the keys if available.
+ if key in ignore_keys:
+ pass
+ elif key in tar_only:
+ target_only[key] = target_dict[key]
+ # Target only values in deleted list
+ difference[key]['deleted'] = target_dict[key]
+ elif key in src_only:
+ # Source only values in the newly added list
+ if type(source_dict[key]) is list:
+ difference[key] = {}
+ difference[key]['added'] = source_dict[key]
+ elif type(source_dict[key]) is dict:
+ directory_diff(source_dict[key], target_dict[key],
+ ignore_keys, difference)
+ elif type(source_dict[key]) is list:
+ tmp_target = None
+ for index in range(len(source_dict[key])):
+ source = copy.deepcopy(source_dict[key][index])
+ if type(source) is list:
+ # TODO
+ pass
+ elif type(source) is dict:
+ if 'name' in source or 'colname' in source:
+ if type(target_dict[key]) is list and len(
+ target_dict[key]) > 0:
+ tmp = None
+ tmp_target = copy.deepcopy(target_dict[key])
+ for item in tmp_target:
+ if (
+ 'name' in item and
+ item['name'] == source['name']
+ ) or (
+ 'colname' in item and
+ item['colname'] == source['colname']
+ ):
+ tmp = copy.deepcopy(item)
+ if tmp and source != tmp:
+ updated.append(copy.deepcopy(source))
+ tmp_target.remove(tmp)
+ elif tmp and source == tmp:
+ tmp_target.remove(tmp)
+ elif tmp is None:
+ added.append(source)
+ else:
+ added.append(source)
+ difference[key] = {}
+ difference[key]['added'] = added
+ difference[key]['changed'] = updated
+ elif target_dict[key] is None or \
+ (type(target_dict[key]) is list and
+ len(target_dict[key]) < index and
+ source != target_dict[key][index]):
+ difference[key] = source
+ elif type(target_dict[key]) is list and\
+ len(target_dict[key]) > index:
+ difference[key] = source
+
+ if type(source) is dict and tmp_target and key in tmp_target and \
+ tmp_target[key] and len(tmp_target[key]) > 0:
+ if type(tmp_target[key]) is list and \
+ type(tmp_target[key][0]) is dict:
+ deleted = deleted + tmp_target[key]
+ else:
+ deleted.append({key: tmp_target[key]})
+ difference[key]['deleted'] = deleted
+ elif tmp_target and type(tmp_target) is list:
+ difference[key]['deleted'] = tmp_target
+
+ else:
+ if source_dict[key] != target_dict[key]:
+ difference[key] = source_dict[key]
+
+ return difference
diff --git a/web/pgadmin/tools/schema_diff/model.py b/web/pgadmin/tools/schema_diff/model.py
new file mode 100644
index 000000000..4fac21007
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/model.py
@@ -0,0 +1,76 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+
+class SchemaDiffModel(object):
+ """
+ SchemaDiffModel
+ """
+
+ COMPARISON_STATUS = {
+ 'source_only': 'Source Only',
+ 'target_only': 'Target Only',
+ 'different': 'Different',
+ 'identical': 'Identical'
+ }
+
+ def __init__(self, **kwargs):
+ """
+ This method is used to initialize the class and
+ create a proper object name which will be used
+ to fetch the data using namespace name and object name.
+
+ Args:
+ **kwargs : N number of parameters
+ """
+ self._comparison_result = dict()
+ self._comparison_msg = 'Comparision started...'
+ self._comparison_percentage = 0
+
+ def clear_data(self):
+ """
+ This function clear the model data.
+ """
+ self._comparison_result.clear()
+
+ def set_result(self, node_name, compare_result):
+ """
+ This method set the result of the comparision based on nodes.
+ """
+ self._comparison_result[node_name] = compare_result
+
+ def get_result(self, node_name=None):
+ """
+ This function will return the result for the node if specified
+ else return the complete result.
+ :param node_name: Name of the node ex: Database, Schema, etc..
+ :return:
+ """
+
+ if node_name is not None:
+ return self._comparison_result[node_name]
+
+ return self._comparison_result
+
+ def get_comparison_info(self):
+ """
+ This function is used to get the comparison information.
+ :return:
+ """
+ return self._comparison_msg, self._comparison_percentage
+
+ def set_comparison_info(self, msg, percentage):
+ """
+ This function is used to set the comparison information.
+ :param msg:
+ :param percentage:
+ :return:
+ """
+ self._comparison_msg = msg
+ self._comparison_percentage = percentage
diff --git a/web/pgadmin/tools/schema_diff/node_registry.py b/web/pgadmin/tools/schema_diff/node_registry.py
new file mode 100644
index 000000000..9e7e25533
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/node_registry.py
@@ -0,0 +1,61 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+
+class SchemaDiffRegistry(object):
+ """
+ SchemaDiffRegistry
+
+ It is more of a registry for different type of nodes for schema diff.
+ """
+ _registered_nodes = dict()
+
+ def __init__(self, node_name, node_view, parent_node='schema'):
+ if node_name not in SchemaDiffRegistry._registered_nodes:
+ SchemaDiffRegistry._registered_nodes[node_name] = {
+ 'view': node_view,
+ 'parent': parent_node
+ }
+
+ @classmethod
+ def get_registered_nodes(cls, node_name=None, parent_node='schema'):
+ """
+ This function will return the node's view object if node name
+ is specified or return the complete list of registered nodes.
+
+ :param node_name: Name of the node ex: Database, Schema, etc..
+ :return:
+ """
+ if node_name is not None:
+ if node_name in cls._registered_nodes:
+ return cls._registered_nodes[node_name]['view']
+ else:
+ return None
+
+ registered_nodes = {}
+ for key, value in cls._registered_nodes.items():
+ if value['parent'] == parent_node:
+ registered_nodes[key] = value['view']
+
+ return registered_nodes
+
+ @classmethod
+ def get_node_view(cls, node_name):
+ """
+ This function will return the view object for the "nodes"
+ command as per the specified node name.
+
+ :param node_name: Name of the node ex: Database, Schema, etc..
+ :return:
+ """
+ cmd = {"cmd": "nodes, compare, ddl_compare"}
+ module = SchemaDiffRegistry.get_registered_nodes(node_name)
+ if not module:
+ return None
+ return module(**cmd)
diff --git a/web/pgadmin/tools/schema_diff/static/css/schema_diff.css b/web/pgadmin/tools/schema_diff/static/css/schema_diff.css
new file mode 100644
index 000000000..af9ae3a7f
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/css/schema_diff.css
@@ -0,0 +1,189 @@
+.icon-schema-diff {
+ display: inline-block;
+ align-content: center;
+ vertical-align: middle;
+ height: 18px;
+ width: 18px;
+ background-size: 20px !important;
+ background-repeat: no-repeat;
+ background-position-x: center;
+ background-position-y: center;
+ background-image: url('../img/compare.svg') !important;
+}
+
+.icon-schema-diff-white {
+ display: inline-block;
+ align-content: center;
+ vertical-align: middle;
+ height: 18px;
+ width: 18px;
+ background-size: 20px !important;
+ background-repeat: no-repeat;
+ background-position-x: center;
+ background-position-y: center;
+ background-image: url('../img/compare-white.svg') !important;
+}
+
+.icon-script {
+ display: inline-block;
+ align-content: center;
+ vertical-align: middle;
+ height: 18px;
+ width: 18px;
+ background-size: 20px !important;
+ background-repeat: no-repeat;
+ background-position-x: center;
+ background-position-y: center;
+ background-image: url('../img/script.svg') !important;
+}
+
+.reallyHidden {
+ display: none !important;
+}
+
+#schema-diff-header {
+ margin-top: 2px;
+}
+
+#schema-diff-header .control-label {
+ width: 120px !important;
+ padding: 5px 5px !important;
+}
+
+#schema-diff-grid {
+ background: white;
+ outline: 0;
+ font-size: 9pt;
+ margin-top: 28px;
+}
+
+.slick-header-column.ui-state-default {
+ height: 32px !important;
+}
+
+#schema-diff-grid .grid-header label {
+ display: inline-block;
+ font-weight: bold;
+ margin: auto auto auto 6px;
+}
+
+.grid-header .ui-icon {
+ margin: 4px 4px auto 6px;
+ background-color: transparent;
+ border-color: transparent;
+}
+
+.slick-row .cell-actions {
+ text-align: left;
+}
+
+/* Slick.Editors.Text, Slick.Editors.Date */
+#schema-diff-grid .slick-header > input.editor-text {
+ width: 100%;
+ height: 100%;
+ border: 0;
+ margin: 0;
+ background: transparent;
+ outline: 0;
+ padding: 0;
+}
+
+/* Slick.Editors.Checkbox */
+#schema-diff-grid .slick-header > input.editor-checkbox {
+ margin: 0;
+ height: 100%;
+ padding: 0;
+ border: 0;
+}
+
+.slick-row.selected .cell-selection {
+ background-color: transparent; /* show default selected row background */
+}
+
+#schema-diff-grid .slick-header .ui-state-default,
+#schema-diff-grid .slick-header .ui-widget-content.ui-state-default,
+#schema-diff-grid .slick-header .ui-widget-header .ui-state-default {
+ background: none;
+}
+
+#schema-diff-grid .slick-header .slick-header-column {
+ font-weight: bold;
+ display: block;
+}
+
+
+.slick-group-toggle.collapsed {
+ width: 30px;
+ background: url(../../../../static/img/collapse_expand.svg) 10px 1px no-repeat !important;
+}
+
+.slick-group-toggle.expanded {
+ width: 30px;
+ background: url(../../../../static/img/collapse_expand.svg) -10px 1px no-repeat !important;
+}
+
+
+.slick-group-toggle {
+ margin-right: 0px !important;
+ height: 11px !important;
+}
+
+#schema-diff-ddl-comp .badge .caret {
+ display: inline-block;
+ margin-left: 2px;
+ margin-right: 4px;
+ width: 0.7rem;
+}
+
+#schema-diff-ddl-comp .badge .caret::before {
+ font-family: "FontAwesome";
+ content: "\f078";
+ font-size: 0.7rem;
+ margin-left: 0rem;
+}
+
+#schema-diff-ddl-comp .badge {
+ font-size: inherit;
+ padding: 7px;
+}
+
+#schema-diff-ddl-comp .accordian-group {
+ padding: 0px;
+}
+
+#ddl_comp_fetching_data.pg-sp-container {
+ min-height: 45%;
+ bottom: 10px;
+
+ .pg-sp-content {
+ position: absolute;
+ width: 100%;
+ }
+}
+
+.ddl-copy {
+ z-index: 10;
+ position: absolute;
+ right: 1px;
+ top: 1px;
+}
+
+#schema-diff-grid .pg-panel-message {
+ font-size: 0.875rem;
+}
+
+
+#schema-diff-ddl-comp .sql_field_layout {
+ overflow: auto !important;
+ height: 100%;
+}
+
+#schema-diff-ddl-comp .source_ddl, #schema-diff-ddl-comp .target_ddl, #schema-diff-ddl-comp .diff_ddl {
+ height: 300px;
+ overflow: hidden;
+}
+
+.target-buttons {
+ flex-wrap: wrap;
+ max-width: 40% !important;
+}
diff --git a/web/pgadmin/tools/schema_diff/static/img/compare-white.svg b/web/pgadmin/tools/schema_diff/static/img/compare-white.svg
new file mode 100644
index 000000000..47b95be03
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/img/compare-white.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Слой_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 26 26" style="enable-background:new 0 0 26 26;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#FFFFFF;}
+</style>
+<path class="st0" d="M21.5,2h-9c-1.1,0-2,0.9-2,2v3h-6c-1.1,0-2,0.9-2,2v13c0,1.1,0.9,2,2,2h8c1.1,0,2-0.9,2-2v-3h7c1.1,0,2-0.9,2-2
+ V4C23.5,2.9,22.6,2,21.5,2z M12.5,14.8H8.9l1-1c0.1-0.1,0.1-0.2,0.1-0.3s0-0.2-0.1-0.3l-0.3-0.3c-0.1-0.1-0.2-0.1-0.3-0.1
+ c-0.1,0-0.2,0-0.3,0.1l-2.3,2.3c-0.1,0.1-0.1,0.2-0.1,0.3c0,0.1,0,0.2,0.1,0.3L9,18.1c0.1,0.1,0.2,0.1,0.3,0.1c0.1,0,0.2,0,0.3-0.1
+ l0.3-0.3c0.1-0.1,0.1-0.2,0.1-0.3c0-0.1,0-0.2-0.1-0.3l-1-1h3.6l0,5.8h-8V9h8L12.5,14.8z M21.5,9.8h-3.6l1-1
+ c0.1-0.1,0.1-0.2,0.1-0.3s0-0.2-0.1-0.3l-0.3-0.3c-0.1-0.1-0.2-0.1-0.3-0.1c-0.1,0-0.2,0-0.3,0.1l-2.3,2.3c-0.1,0.1-0.1,0.2-0.1,0.3
+ c0,0.1,0,0.2,0.1,0.3l2.3,2.3c0.1,0.1,0.2,0.1,0.3,0.1c0.1,0,0.2,0,0.3-0.1l0.3-0.3c0.1-0.1,0.1-0.2,0.1-0.3c0-0.1,0-0.2-0.1-0.3
+ l-1-1h3.6l0,5.8h-7V9c0-1.1-0.9-2-2-2V4h9L21.5,9.8z"/>
+</svg>
diff --git a/web/pgadmin/tools/schema_diff/static/img/compare.svg b/web/pgadmin/tools/schema_diff/static/img/compare.svg
new file mode 100644
index 000000000..1366f50a5
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/img/compare.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Слой_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 26 26" style="enable-background:new 0 0 26 26;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#222222;}
+</style>
+<path class="st0" d="M21.5,2h-9c-1.1,0-2,0.9-2,2v3h-6c-1.1,0-2,0.9-2,2v13c0,1.1,0.9,2,2,2h8c1.1,0,2-0.9,2-2v-3h7c1.1,0,2-0.9,2-2
+ V4C23.5,2.9,22.6,2,21.5,2z M12.5,14.8H8.9l1-1c0.1-0.1,0.1-0.2,0.1-0.3s0-0.2-0.1-0.3l-0.3-0.3c-0.1-0.1-0.2-0.1-0.3-0.1
+ c-0.1,0-0.2,0-0.3,0.1l-2.3,2.3c-0.1,0.1-0.1,0.2-0.1,0.3c0,0.1,0,0.2,0.1,0.3L9,18.1c0.1,0.1,0.2,0.1,0.3,0.1c0.1,0,0.2,0,0.3-0.1
+ l0.3-0.3c0.1-0.1,0.1-0.2,0.1-0.3c0-0.1,0-0.2-0.1-0.3l-1-1h3.6l0,5.8h-8V9h8L12.5,14.8z M21.5,9.8h-3.6l1-1
+ c0.1-0.1,0.1-0.2,0.1-0.3s0-0.2-0.1-0.3l-0.3-0.3c-0.1-0.1-0.2-0.1-0.3-0.1c-0.1,0-0.2,0-0.3,0.1l-2.3,2.3c-0.1,0.1-0.1,0.2-0.1,0.3
+ c0,0.1,0,0.2,0.1,0.3l2.3,2.3c0.1,0.1,0.2,0.1,0.3,0.1c0.1,0,0.2,0,0.3-0.1l0.3-0.3c0.1-0.1,0.1-0.2,0.1-0.3c0-0.1,0-0.2-0.1-0.3
+ l-1-1h3.6l0,5.8h-7V9c0-1.1-0.9-2-2-2V4h9L21.5,9.8z"/>
+</svg>
diff --git a/web/pgadmin/tools/schema_diff/static/img/script.svg b/web/pgadmin/tools/schema_diff/static/img/script.svg
new file mode 100644
index 000000000..488b911c7
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/img/script.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 50 50" style="enable-background:new 0 0 50 50;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#222222;}
+</style>
+<g>
+ <path class="st0" d="M40,35V11c0-3.9-3.1-7-7-7H7c-3.9,0-7,3.1-7,7c0,3.1,2.1,5.8,5,6.7V39c0,3.9,3.1,7,7,7h31c3.9,0,7-3.1,7-7v-4
+ H40z M43,42c-0.8,0-1.8-1.4-2.5-3h5C44.9,40.5,43.8,42,43,42z M7,8h19.6C26.2,8.9,26,9.9,26,11c0,1,0.2,2,0.7,3H7c-1.7,0-3-1.3-3-3
+ S5.3,8,7,8z M36.7,42H12c-1.7,0-3-1.3-3-3V18h25v-4h-1c-1.7,0-3-1.3-3-3s1.3-3,3-3s3,1.3,3,3v28C36,40,36.2,41,36.7,42z"/>
+ <rect x="13" y="21" class="st0" width="4" height="4"/>
+ <rect x="19" y="21" class="st0" width="13" height="4"/>
+ <rect x="13" y="28" class="st0" width="4" height="4"/>
+ <rect x="19" y="28" class="st0" width="13" height="4"/>
+ <rect x="13" y="35" class="st0" width="4" height="4"/>
+ <rect x="19" y="35" class="st0" width="13" height="4"/>
+</g>
+</svg>
diff --git a/web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js b/web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js
new file mode 100644
index 000000000..ad23c4981
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js
@@ -0,0 +1,500 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+import $ from 'jquery';
+import Backbone from 'backbone';
+import Backform from 'pgadmin.backform';
+import gettext from 'sources/gettext';
+import clipboard from 'sources/selection/clipboard';
+
+var formatNode = function (opt) {
+ if (!opt.id) {
+ return opt.text;
+ }
+
+ var optimage = $(opt.element).data('image');
+
+ if (!optimage) {
+ return opt.text;
+ } else {
+ return $('<span></span>').append(
+ $('<span></span>', {
+ class: 'wcTabIcon ' + optimage,
+ })
+ ).append($('<span></span>').text(opt.text));
+ }
+};
+
+let SchemaDiffSqlControl =
+ Backform.SqlFieldControl.extend({
+ defaults: {
+ label: '',
+ extraClasses: [], // Add default control height
+ helpMessage: null,
+ maxlength: 4096,
+ rows: undefined,
+ copyRequired: false,
+ },
+
+ template: _.template([
+ '<% if (copyRequired) { %><button class="btn btn-secondary ddl-copy d-none">Copy</button> <% } %>',
+ '<div class="pgadmin-controls pg-el-9 pg-el-12 sql_field_layout <%=extraClasses.join(\' \')%>">',
+ ' <textarea ',
+ ' class="<%=Backform.controlClassName%> " name="<%=name%>"',
+ ' maxlength="<%=maxlength%>" placeholder="<%-placeholder%>" <%=disabled ? "disabled" : ""%>',
+ ' rows=<%=rows%>',
+ ' <%=required ? "required" : ""%>><%-value%></textarea>',
+ ' <% if (helpMessage && helpMessage.length) { %>',
+ ' <span class="<%=Backform.helpMessageClassName%>"><%=helpMessage%></span>',
+ ' <% } %>',
+ '</div>',
+ ].join('\n')),
+ initialize: function() {
+ Backform.TextareaControl.prototype.initialize.apply(this, arguments);
+ this.sqlCtrl = null;
+
+ _.bindAll(this, 'onFocus', 'onBlur', 'refreshTextArea', 'copyData',);
+ },
+ render: function() {
+ let obj = Backform.SqlFieldControl.prototype.render.apply(this, arguments);
+ if(this.$el.find('.ddl-copy')) this.$el.find('.ddl-copy').on('click', this.copyData);
+ return obj;
+ },
+ copyData() {
+ event.stopPropagation();
+ clipboard.copyTextToClipboard(this.model.get('diff_ddl'));
+ return false;
+ },
+ onFocus: function() {
+ let $ctrl = this.$el.find('.pgadmin-controls').first(),
+ $copy = this.$el.find('.ddl-copy');
+ if (!$ctrl.hasClass('focused')) $ctrl.addClass('focused');
+ if ($copy.hasClass('d-none')) $copy.removeClass('d-none');
+
+ },
+ onBlur: function() {
+ let $copy = this.$el.find('.ddl-copy');
+ if (!$(event.relatedTarget).hasClass('ddl-copy')) {
+ if (!$copy.hasClass('d-none')) $copy.addClass('d-none');
+ this.$el.find('.pgadmin-controls').first().removeClass('focused');
+ }
+ },
+
+ });
+
+let SchemaDiffSelect2Control =
+ Backform.Select2Control.extend({
+ defaults: _.extend(Backform.Select2Control.prototype.defaults, {
+ url: undefined,
+ transform: undefined,
+ url_with_id: false,
+ select2: {
+ allowClear: true,
+ placeholder: gettext('Select an item...'),
+ width: 'style',
+ templateResult: formatNode,
+ templateSelection: formatNode,
+ },
+ controlsClassName: 'pgadmin-controls pg-el-sm-11 pg-el-12',
+ }),
+ className: function() {
+ return 'pgadmin-controls pg-el-sm-4';
+ },
+ events: {
+ 'focus select': 'clearInvalid',
+ 'keydown :input': 'processTab',
+ 'select2:select': 'onSelect',
+ 'select2:selecting': 'beforeSelect',
+ 'select2:clear': 'onChange',
+ },
+ template: _.template([
+ '<% if(label == false) {} else {%>',
+ ' <label class="<%=Backform.controlLabelClassName%>"><%=label%></label>',
+ '<% }%>',
+ '<div class="<%=controlsClassName%>">',
+ ' <select class="<%=Backform.controlClassName%> <%=extraClasses.join(\' \')%>"',
+ ' name="<%=name%>" value="<%-value%>" <%=disabled ? "disabled" : ""%>',
+ ' <%=required ? "required" : ""%><%= select2.multiple ? " multiple>" : ">" %>',
+ ' <%=select2.first_empty ? " <option></option>" : ""%>',
+ ' <% for (var i=0; i < options.length; i++) {%>',
+ ' <% var option = options[i]; %>',
+ ' <option ',
+ ' <% if (option.image) { %> data-image=<%=option.image%> <%}%>',
+ ' <% if (option.connected) { %> data-connected=connected <%}%>',
+ ' value=<%- formatter.fromRaw(option.value) %>',
+ ' <% if (option.selected) {%>selected="selected"<%} else {%>',
+ ' <% if (!select2.multiple && option.value === rawValue) {%>selected="selected"<%}%>',
+ ' <% if (select2.multiple && rawValue && rawValue.indexOf(option.value) != -1){%>selected="selected" data-index="rawValue.indexOf(option.value)"<%}%>',
+ ' <%}%>',
+ ' <%= disabled ? "disabled" : ""%>><%-option.label%></option>',
+ ' <%}%>',
+ ' </select>',
+ ' <% if (helpMessage && helpMessage.length) { %>',
+ ' <span class="<%=Backform.helpMessageClassName%>"><%=helpMessage%></span>',
+ ' <% } %>',
+ '</div>',
+ ].join('\n')),
+ beforeSelect: function() {
+ var selVal = arguments[0].params.args.data.id;
+
+ if(this.field.get('connect') && this.$el.find('option[value="'+selVal+'"]').attr('data-connected') !== 'connected') {
+ this.field.get('connect').apply(this, [selVal, this.changeIcon.bind(this)]);
+ } else {
+ $(this.$sel).trigger('change');
+ setTimeout(function(){ this.onChange.apply(this); }.bind(this), 200);
+ }
+ },
+ changeIcon: function(data) {
+ let span = this.$el.find('.select2-selection .select2-selection__rendered span.wcTabIcon'),
+ selSpan = this.$el.find('option:selected');
+
+ if (span.hasClass('icon-server-not-connected')) {
+ let icon = (data.icon) ? data.icon : 'icon-pg';
+ span.removeClass('icon-server-not-connected');
+ span.addClass(icon);
+ span.attr('data-connected', 'connected');
+
+ selSpan.data().image = icon;
+ selSpan.attr('data-connected', 'connected');
+
+ this.onChange.apply(this);
+ }
+ else if (span.hasClass('icon-database-not-connected')) {
+ let icon = (data.icon) ? data.icon : 'pg-icon-database';
+
+ span.removeClass('icon-database-not-connected');
+ span.addClass(icon);
+ span.attr('data-connected', 'connected');
+
+ selSpan.removeClass('icon-database-not-connected');
+ selSpan.data().image = icon;
+ selSpan.attr('data-connected', 'connected');
+
+ this.onChange.apply(this);
+ }
+ },
+ onChange: function() {
+ var model = this.model,
+ attrArr = this.field.get('name').split('.'),
+ name = attrArr.shift(),
+ path = attrArr.join('.'),
+ value = this.getValueFromDOM(),
+ changes = {},
+ that = this;
+
+ if (this.model.errorModel instanceof Backbone.Model) {
+ if (_.isEmpty(path)) {
+ this.model.errorModel.unset(name);
+ } else {
+ var nestedError = this.model.errorModel.get(name);
+ if (nestedError) {
+ this.keyPathSetter(nestedError, path, null);
+ this.model.errorModel.set(name, nestedError);
+ }
+ }
+ }
+
+ changes[name] = _.isEmpty(path) ? value : _.clone(model.get(name)) || {};
+
+ if (!_.isEmpty(path)) that.keyPathSetter(changes[name], path, value);
+ that.stopListening(that.model, 'change:' + name, that.render);
+ model.set(changes);
+ that.listenTo(that.model, 'change:' + name, that.render);
+
+ },
+ render: function() {
+ /*
+ * Initialization from the original control.
+ */
+ this.fetchData();
+ return Backform.Select2Control.prototype.render.apply(this, arguments);
+
+ },
+ fetchData: function() {
+ /*
+ * We're about to fetch the options required for this control.
+ */
+ var self = this,
+ url = self.field.get('url'),
+ m = self.model;
+
+ url = _.isFunction(url) ? url.apply(m) : url;
+
+ if (url && self.field.get('deps')) {
+ url = url.replace('sid', m.get(self.field.get('deps')[0]));
+ }
+
+ // Hmm - we found the url option.
+ // That means - we needs to fetch the options from that node.
+ if (url) {
+ var data;
+
+ m.trigger('pgadmin:view:fetching', m, self.field);
+ $.ajax({
+ async: false,
+ url: url,
+ })
+ .done(function(res) {
+ /*
+ * We will cache this data for short period of time for avoiding
+ * same calls.
+ */
+ data = res.data;
+ })
+ .fail(function() {
+ m.trigger('pgadmin:view:fetch:error', m, self.field);
+ });
+
+ m.trigger('pgadmin:view:fetched', m, self.field);
+ // To fetch only options from cache, we do not need time from 'at'
+ // attribute but only options.
+ //
+
+ /*
+ * Transform the data
+ */
+ var transform = this.field.get('transform') || self.defaults.transform;
+ if (transform && _.isFunction(transform)) {
+ // We will transform the data later, when rendering.
+ // It will allow us to generate different data based on the
+ // dependencies.
+ self.field.set('options', transform.bind(self, data));
+ } else {
+ self.field.set('options', data);
+ }
+ }
+ },
+ });
+
+
+let SchemaDiffHeaderView = Backform.Form.extend({
+ label: '',
+ className: function() {
+ return 'pg-el-sm-12 pg-el-md-12 pg-el-lg-12 pg-el-12';
+ },
+ tabPanelClassName: function() {
+ return Backform.tabClassName;
+ },
+ tabIndex: 0,
+ initialize: function(opts) {
+ this.label = opts.label;
+ Backform.Form.prototype.initialize.apply(this, arguments);
+ },
+ template: _.template(`
+ <div class="row pgadmin-control-group">
+ <div class="control-label">Select Source</div>
+ <div class="col-6 source row"></div>
+ </div>
+ <div class="row pgadmin-control-group">
+ <div class="control-label">Select Target</div>
+ <div class="col-6 target row"></div>
+ <div class="col-5 target-buttons">
+ <div class="action-btns d-flex">
+ <button class="btn btn-primary mr-auto"><i class="icon-schema-diff-white"></i> Compare</button>
+ <button id="generate-script" class="btn btn-secondary mr-1" disabled><i class="icon-script"></i> Generate Script</button>
+ <div class="btn-group mr-1" role="group" aria-label="">
+ <button id="btn-filter" type="button" class="btn btn-sm btn-secondary"
+ title=""
+ accesskey=""
+ tabindex="0">
+ <i class="fa fa-filter sql-icon-lg" aria-hidden="true"></i> Filter
+ </button>
+ <button id="btn-filter-dropdown" type="button" class="btn btn-sm btn-secondary dropdown-toggle dropdown-toggle-split"
+ data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"
+ title=""
+ accesskey=""
+ tabindex="0">
+ </button>` +
+ [
+ '<ul class="dropdown-menu filter">',
+ '<li>',
+ '<a class="dropdown-item" id="btn-identical" href="#" tabindex="0">',
+ '<i class="identical fa fa-check" aria-hidden="true"></i>',
+ '<span> ' + gettext('Identical') + ' </span>',
+ '</a>',
+ '</li>',
+ '<li>',
+ '<a class="dropdown-item" id="btn-differentt" href="#" tabindex="0">',
+ '<i class="different fa fa-check" aria-hidden="true"></i>',
+ '<span> ' + gettext('Different') + ' </span>',
+ '</a>',
+ '</li>',
+ '<li>',
+ '<a class="dropdown-item" id="btn-source-only" href="#" tabindex="0">',
+ '<i class="source-only fa fa-check" aria-hidden="true"></i>',
+ '<span> ' + gettext('Source Only') + ' </span>',
+ '</a>',
+ '</li>',
+ '<li>',
+ '<a class="dropdown-item" id="btn-target-only" href="#" tabindex="0">',
+ '<i class="target-only fa fa-check" aria-hidden="true"></i>',
+ '<span> ' + gettext('Target Only') + ' </span>',
+ '</a>',
+ '</li>',
+ '</ul>',
+ '</div>',
+ '</div>',
+ '</div>',
+ '</div>',
+ ].join('\n')
+ ),
+ render: function() {
+ this.cleanup();
+
+ var controls = this.controls,
+ m = this.model,
+ self = this,
+ idx = (this.tabIndex * 100);
+
+ this.$el.empty();
+
+ $(this.template()).appendTo(this.$el);
+
+ this.fields.each(function(f) {
+ var cntr = new(f.get('control'))({
+ field: f,
+ model: m,
+ dialog: self,
+ tabIndex: idx,
+ });
+
+ if (f.get('group') && f.get('group') == 'source') {
+ self.$el.find('.source').append(cntr.render().$el);
+ }
+ else {
+ self.$el.find('.target').append(cntr.render().$el);
+ }
+
+ controls.push(cntr);
+ });
+
+ return this;
+ },
+ remove: function(opts) {
+ if (opts && opts.data) {
+ if (this.model) {
+ if (this.model.reset) {
+ this.model.reset({
+ validate: false,
+ silent: true,
+ stop: true,
+ });
+ }
+ this.model.clear({
+ validate: false,
+ silent: true,
+ stop: true,
+ });
+ delete(this.model);
+ }
+ if (this.errorModel) {
+ this.errorModel.clear({
+ validate: false,
+ silent: true,
+ stop: true,
+ });
+ delete(this.errorModel);
+ }
+ }
+ this.cleanup();
+ Backform.Form.prototype.remove.apply(this, arguments);
+ },
+});
+
+let SchemaDiffFooterView = Backform.Form.extend({
+ className: function() {
+ return 'set-group pg-el-12';
+ },
+ tabPanelClassName: function() {
+ return Backform.tabClassName;
+ },
+ legendClass: 'badge',
+ contentClass: Backform.accordianContentClassName,
+ template: {
+ 'content': _.template(`
+ <div class="pg-el-sm-12 row <%=contentClass%>">
+ <div class="pg-el-sm-4 ddl-source">Source</div>
+ <div class="pg-el-sm-4 ddl-target">Target</div>
+ <div class="pg-el-sm-4 ddl-diff">Difference
+ </div>
+ </div>
+ </div>
+ `),
+ },
+ initialize: function(opts) {
+ this.label = opts.label;
+ Backform.Form.prototype.initialize.apply(this, arguments);
+ },
+ render: function() {
+ this.cleanup();
+
+ let m = this.model,
+ $el = this.$el,
+ tmpl = this.template,
+ controls = this.controls,
+ data = {
+ 'className': _.result(this, 'className'),
+ 'legendClass': _.result(this, 'legendClass'),
+ 'contentClass': _.result(this, 'contentClass'),
+ 'collapse': _.result(this, 'collapse'),
+ },
+ idx = (this.tabIndex * 100);
+
+ this.$el.empty();
+
+ let el = $((tmpl['content'])(data)).appendTo($el);
+
+ this.fields.each(function(f) {
+ let cntr = new(f.get('control'))({
+ field: f,
+ model: m,
+ dialog: self,
+ tabIndex: idx,
+ name: f.get('name'),
+ });
+
+ if (f.get('group') && f.get('group') == 'ddl-source') {
+ el.find('.ddl-source').append(cntr.render().$el);
+ }
+ else if (f.get('group') && f.get('group') == 'ddl-target') {
+ el.find('.ddl-target').append(cntr.render().$el);
+ }
+ else {
+ el.find('.ddl-diff').append(cntr.render().$el);
+ }
+ controls.push(cntr);
+ });
+
+ let $diff_sc = this.$el.find('.source_ddl'),
+ $diff_tr = this.$el.find('.target_ddl'),
+ $diff = this.$el.find('.diff_ddl'),
+ footer_height = this.$el.parent().height() - 50;
+ $diff_sc.height(footer_height);
+ $diff_sc.css({
+ 'height': footer_height + 'px',
+ });
+ $diff_tr.height(footer_height);
+ $diff_tr.css({
+ 'height': footer_height + 'px',
+ });
+ $diff.height(footer_height);
+ $diff.css({
+ 'height': footer_height + 'px',
+ });
+
+
+ return this;
+ },
+});
+export {
+ SchemaDiffSelect2Control,
+ SchemaDiffHeaderView,
+ SchemaDiffFooterView,
+ SchemaDiffSqlControl,
+};
diff --git a/web/pgadmin/tools/schema_diff/static/js/schema_diff.js b/web/pgadmin/tools/schema_diff/static/js/schema_diff.js
new file mode 100644
index 000000000..a565019bc
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/js/schema_diff.js
@@ -0,0 +1,145 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+define('pgadmin.schemadiff', [
+ 'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
+ 'sources/pgadmin', 'sources/csrf', 'pgadmin.browser.node',
+], function(
+ gettext, url_for, $, _, pgAdmin, csrfToken
+) {
+
+ var wcDocker = window.wcDocker,
+ pgBrowser = pgAdmin.Browser;
+ /* Return back, this has been called more than once */
+ if (pgBrowser.SchemaDiff)
+ return pgBrowser.SchemaDiff;
+
+ // Create an Object Restore of pgBrowser class
+ pgBrowser.SchemaDiff = {
+ init: function() {
+ if (this.initialized)
+ return;
+
+ this.initialized = true;
+ csrfToken.setPGCSRFToken(pgAdmin.csrf_token_header, pgAdmin.csrf_token);
+
+
+ // Define the nodes on which the menus to be appear
+ var menus = [{
+ name: 'schema_diff',
+ module: this,
+ applies: ['tools'],
+ callback: 'show_schema_diff_tool',
+ priority: 1,
+ label: gettext('Schema Diff'),
+ enable: true,
+ }];
+
+ pgBrowser.add_menus(menus);
+
+ // Creating a new pgBrowser frame to show the data.
+ var schemaDiffFrameType = new pgBrowser.Frame({
+ name: 'frm_schemadiff',
+ showTitle: true,
+ isCloseable: true,
+ isPrivate: true,
+ url: 'about:blank',
+ });
+
+ let self = this;
+ /* Cache may take time to load for the first time
+ * Keep trying till available
+ */
+ let cacheIntervalId = setInterval(function() {
+ if(pgBrowser.preference_version() > 0) {
+ self.preferences = pgBrowser.get_preferences_for_module('schema_diff');
+ clearInterval(cacheIntervalId);
+ }
+ },0);
+
+ pgBrowser.onPreferencesChange('schema_diff', function() {
+ self.preferences = pgBrowser.get_preferences_for_module('schema_diff');
+ });
+
+ // Load the newly created frame
+ schemaDiffFrameType.load(pgBrowser.docker);
+ return this;
+ },
+
+ // Callback to draw schema diff for objects
+ show_schema_diff_tool: function() {
+ var self = this,
+ baseUrl = url_for('schema_diff.initialize', null);
+
+ $.ajax({
+ url: baseUrl,
+ method: 'GET',
+ dataType: 'json',
+ contentType: 'application/json',
+ })
+ .done(function(res) {
+ self.trans_id = res.data.schemaDiffTransId;
+ res.data.panel_title = 'Schema Diff'; //TODO: Set the panel title
+ // TODO: Following function is used to test the fetching of the
+ // databases this should be moved to server selection event later.
+ self.launch_schema_diff(res.data);
+ })
+ .fail(function(xhr) {
+ self.raise_error_on_fail(gettext('Schema Diff initialize error') , xhr);
+ });
+ },
+
+ launch_schema_diff: function(data) {
+ var panel_title = data.panel_title,
+ trans_id = data.schemaDiffTransId,
+ panel_tooltip = '';
+
+ var url_params = {
+ 'trans_id': trans_id,
+ 'editor_title': panel_title,
+ },
+ baseUrl = url_for('schema_diff.panel', url_params);
+
+ if (this.preferences.schema_diff_new_browser_tab) {
+ window.open(baseUrl, '_blank');
+ } else {
+
+ var propertiesPanel = pgBrowser.docker.findPanels('properties'),
+ schemaDiffPanel = pgBrowser.docker.addPanel('frm_schemadiff', wcDocker.DOCK.STACKED, propertiesPanel[0]);
+
+ // Set panel title and icon
+ schemaDiffPanel.title('<span title="'+panel_tooltip+'">'+panel_title+'</span>');
+ schemaDiffPanel.icon('icon-schema-diff');
+ schemaDiffPanel.focus();
+
+ var openSchemaDiffURL = function(j) {
+ // add spinner element
+ $(j).data('embeddedFrame').$container.append(pgBrowser.SchemaDiff.spinner_el);
+ setTimeout(function() {
+ var frameInitialized = $(j).data('frameInitialized');
+ if (frameInitialized) {
+ var frame = $(j).data('embeddedFrame');
+ if (frame) {
+ frame.openURL(baseUrl);
+ frame.$container.find('.pg-sp-container').delay(1000).hide(1);
+ }
+ } else {
+ openSchemaDiffURL(j);
+ }
+ }, 100);
+ };
+
+ openSchemaDiffURL(schemaDiffPanel);
+ }
+
+ },
+ };
+
+ return pgBrowser.SchemaDiff;
+});
diff --git a/web/pgadmin/tools/schema_diff/static/js/schema_diff_hook.js b/web/pgadmin/tools/schema_diff/static/js/schema_diff_hook.js
new file mode 100644
index 000000000..34616cf12
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/js/schema_diff_hook.js
@@ -0,0 +1,42 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+define([
+ 'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
+ 'alertify', 'sources/pgadmin', 'pgadmin.browser',
+ 'backbone', 'pgadmin.backgrid', 'codemirror', 'pgadmin.backform',
+ 'pgadmin.tools.schema_diff_ui','wcdocker', 'pgadmin.browser.frame',
+ 'pgadmin.datagrid',
+], function(
+ gettext, url_for, $, _, Alertify, pgAdmin, pgBrowser, Backbone, Backgrid,
+ CodeMirror, Backform, SchemaDiffUIModule
+) {
+ var pgTools = pgAdmin.Tools = pgAdmin.Tools || {};
+ var SchemaDiffUI = SchemaDiffUIModule.default;
+
+ /* Return back, this has been called more than once */
+ if (pgTools.SchemaDiffHook)
+ return pgTools.SchemaDiffHook;
+
+ pgTools.SchemaDiffHook = {
+ load: function(trans_id) {
+ window.onbeforeunload = function() {
+ $.ajax({
+ url: url_for('schemadiff.index') + 'close/'+trans_id,
+ method: 'DELETE',
+ });
+ };
+
+ let schemaUi = new SchemaDiffUI($('#schema-diff-container'), trans_id);
+ schemaUi.render();
+ },
+ };
+
+ return pgTools.SchemaDiffHook;
+});
diff --git a/web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js b/web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js
new file mode 100644
index 000000000..0e10ec063
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js
@@ -0,0 +1,836 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+import url_for from 'sources/url_for';
+import $ from 'jquery';
+import gettext from 'sources/gettext';
+import Alertify from 'pgadmin.alertifyjs';
+import Backbone from 'backbone';
+import Slick from 'sources/../bundle/slickgrid';
+import pgAdmin from 'sources/pgadmin';
+import {setPGCSRFToken} from 'sources/csrf';
+import {generateScript} from 'tools/datagrid/static/js/show_query_tool';
+import 'pgadmin.sqleditor';
+
+import {SchemaDiffSelect2Control, SchemaDiffHeaderView,
+ SchemaDiffFooterView, SchemaDiffSqlControl} from './schema_diff.backform';
+
+var wcDocker = window.wcDocker;
+
+export default class SchemaDiffUI {
+ constructor(container, trans_id) {
+ var self = this;
+ this.$container = container;
+ this.header = null;
+ this.trans_id = trans_id;
+ this.filters = ['Identical', 'Different', 'Source Only', 'Target Only'];
+ this.sel_filters = ['Identical', 'Different', 'Source Only', 'Target Only'];
+ this.dataView = null;
+ this.grid = null,
+ this.selection = {};
+
+ this.model = new Backbone.Model({
+ source_sid: undefined,
+ source_did: undefined,
+ source_scid: undefined,
+ target_sid: undefined,
+ target_did: undefined,
+ target_scid: undefined,
+ source_ddl: undefined,
+ target_ddl: undefined,
+ diff_ddl: undefined,
+ });
+
+ setPGCSRFToken(pgAdmin.csrf_token_header, pgAdmin.csrf_token);
+
+ this.docker = new wcDocker(
+ this.$container, {
+ allowContextMenu: false,
+ allowCollapse: false,
+ loadingClass: 'pg-sp-icon',
+ themePath: url_for('static', {
+ 'filename': 'css',
+ }),
+ theme: 'webcabin.overrides.css',
+ }
+ );
+
+ this.header_panel = new pgAdmin.Browser.Panel({
+ name: 'schema_diff_header_panel',
+ showTitle: false,
+ isCloseable: false,
+ isPrivate: true,
+ content: '<div id="schema-diff-header" class="pg-el-container" el="sm"></div><div id="schema-diff-grid" class="pg-el-container" el="sm"></div>',
+ elContainer: true,
+ });
+
+ this.footer_panel = new pgAdmin.Browser.Panel({
+ name: 'schema_diff_footer_panel',
+ title: gettext('DDL Comparison'),
+ isCloseable: false,
+ isPrivate: true,
+ height: '60',
+ content: '<div id="schema-diff-ddl-comp" class="pg-el-container" el="sm"></div>',
+ });
+
+ this.header_panel.load(this.docker);
+ this.footer_panel.load(this.docker);
+
+
+ this.panel_obj = this.docker.addPanel('schema_diff_header_panel', wcDocker.DOCK.TOP, {w:'95%', h:'50%'});
+ this.footer_panel_obj = this.docker.addPanel('schema_diff_footer_panel', wcDocker.DOCK.BOTTOM, this.panel_obj, {w:'95%', h:'50%'});
+
+ self.footer_panel_obj.on(wcDocker.EVENT.VISIBILITY_CHANGED, function() {
+ setTimeout(function() {
+ this.resize_grid();
+ }.bind(self), 200);
+ });
+
+ self.footer_panel_obj.on(wcDocker.EVENT.RESIZE_ENDED, function() {
+ setTimeout(function() {
+ this.resize_panels();
+ }.bind(self), 200);
+ });
+
+ }
+
+
+ raise_error_on_fail(alert_title, xhr) {
+ try {
+ var err = JSON.parse(xhr.responseText);
+ Alertify.alert(alert_title, err.errormsg);
+ } catch (e) {
+ Alertify.alert(alert_title, e.statusText);
+ }
+ }
+
+ resize_panels() {
+ let $src_ddl = $('#schema-diff-ddl-comp .source_ddl'),
+ $tar_ddl = $('#schema-diff-ddl-comp .target_ddl'),
+ $diff_ddl = $('#schema-diff-ddl-comp .diff_ddl'),
+ footer_height = $('#schema-diff-ddl-comp').height() - 50;
+
+ $src_ddl.height(footer_height);
+ $src_ddl.css({
+ 'height': footer_height + 'px',
+ });
+ $tar_ddl.height(footer_height);
+ $tar_ddl.css({
+ 'height': footer_height + 'px',
+ });
+ $diff_ddl.height(footer_height);
+ $diff_ddl.css({
+ 'height': footer_height + 'px',
+ });
+
+ this.resize_grid();
+ }
+
+ compare_schemas() {
+ var self = this,
+ url_params = self.model.toJSON();
+
+ if (url_params['source_sid'] == '' || _.isUndefined(url_params['source_sid']) ||
+ url_params['source_did'] == '' || _.isUndefined(url_params['source_did']) ||
+ url_params['source_scid'] == '' || _.isUndefined(url_params['source_scid']) ||
+ url_params['target_sid'] == '' || _.isUndefined(url_params['target_sid']) ||
+ url_params['target_did'] == '' || _.isUndefined(url_params['target_did']) ||
+ url_params['target_scid'] == '' || _.isUndefined(url_params['target_scid'])
+ ) {
+ Alertify.alert(gettext('Selection Error'), gettext('Please select source and target.'));
+ return false;
+ }
+
+ this.selection = JSON.parse(JSON.stringify(url_params));
+
+ url_params['trans_id'] = self.trans_id;
+
+ _.each(url_params, function(key, val) {
+ url_params[key] = parseInt(val, 10);
+ });
+
+ var baseUrl = url_for('schema_diff.compare', url_params);
+
+ self.model.set({
+ 'source_ddl': undefined,
+ 'target_ddl': undefined,
+ 'diff_ddl': undefined,
+ });
+
+ self.render_grid([]);
+ self.footer.render();
+ self.startDiffPoller();
+
+ return $.ajax({
+ url: baseUrl,
+ method: 'GET',
+ dataType: 'json',
+ contentType: 'application/json',
+ })
+ .done(function (res) {
+ self.stopDiffPoller();
+ self.render_grid(res.data);
+ })
+ .fail(function (xhr) {
+ self.raise_error_on_fail(gettext('Schema compare error'), xhr);
+ self.stopDiffPoller();
+ });
+ }
+
+ generate_script() {
+ var self = this,
+ baseServerUrl = url_for('schema_diff.get_server', {'sid': self.selection['target_sid'],
+ 'did': self.selection['target_did']}),
+ sel_rows = self.grid ? self.grid.getSelectedRows() : [],
+ sel_rows_data = [],
+ url_params = self.selection,
+ generated_script = undefined,
+ open_query_tool;
+
+ _.each(url_params, function(key, val) {
+ url_params[key] = parseInt(val, 10);
+ });
+
+ $('#diff_fetching_data').removeClass('d-none');
+ $('#diff_fetching_data').find('.schema-diff-busy-text').text('Generating script...');
+
+
+ open_query_tool = function get_server_details() {
+ $.ajax({
+ url: baseServerUrl,
+ method: 'GET',
+ dataType: 'json',
+ contentType: 'application/json',
+ })
+ .done(function (res) {
+ let data = res.data;
+ let server_data = {};
+ if (data) {
+ server_data['sgid'] = data.gid;
+ server_data['sid'] = data.sid;
+ server_data['stype'] = data.type;
+ server_data['server'] = data.name;
+ server_data['user'] = data.user;
+ server_data['did'] = self.model.get('target_did');
+ server_data['database'] = data.database;
+
+ if (_.isUndefined(generated_script))
+ generated_script = 'BEGIN;' + '\n' + self.model.get('diff_ddl') + '\n' + 'END;';
+
+ let preferences = (window.opener !== null) ? window.opener.pgAdmin.Browser.get_preferences_for_module('schema_diff') : window.top.pgAdmin.Browser.get_preferences_for_module('schema_diff');
+ if (preferences.schema_diff_new_browser_tab) {
+ window.opener.pgAdmin.ddl_diff = generated_script;
+ generateScript(server_data, window.opener.pgAdmin.DataGrid);
+ } else {
+ window.top.pgAdmin.ddl_diff = generated_script;
+ generateScript(server_data, window.top.pgAdmin.DataGrid);
+ }
+ }
+
+ $('#diff_fetching_data').find('.schema-diff-busy-text').text('');
+ $('#diff_fetching_data').addClass('d-none');
+
+ })
+ .fail(function (xhr) {
+ self.raise_error_on_fail(gettext('Generate script error'), xhr);
+ $('#diff_fetching_data').find('.schema-diff-busy-text').text('');
+ $('#diff_fetching_data').addClass('d-none');
+ });
+ };
+
+ if (sel_rows.length > 0) {
+ for (var row = 0; row < sel_rows.length; row++) {
+ let data = self.grid.getData().getItem(sel_rows[row]);
+
+ if (data.type) {
+ let tmp_data = {
+ 'node_type': data.type,
+ 'source_oid': parseInt(data.oid, 10),
+ 'target_oid': parseInt(data.oid, 10),
+ 'comp_status': data.status,
+ };
+
+ if(data.status && (data.status.toLowerCase() == 'different' || data.status.toLowerCase() == 'identical')) {
+ tmp_data['target_oid'] = data.target_oid;
+ }
+ sel_rows_data.push(tmp_data);
+ }
+ }
+
+ url_params['sel_rows'] = sel_rows_data;
+
+ let baseUrl = url_for('schema_diff.generate_script', {'trans_id': self.trans_id});
+
+ $.ajax({
+ url: baseUrl,
+ method: 'POST',
+ dataType: 'json',
+ contentType: 'application/json',
+ data: JSON.stringify(url_params),
+ })
+ .done(function (res) {
+ if (res) {
+ generated_script = 'BEGIN;' + '\n' + res.diff_ddl + '\n' + 'END;';
+ }
+ open_query_tool();
+ })
+ .fail(function (xhr) {
+ self.raise_error_on_fail(gettext('Generate script error'), xhr);
+ $('#diff_fetching_data').addClass('d-none');
+ });
+ } else if (!_.isUndefined(self.model.get('diff_ddl'))) {
+ open_query_tool();
+ }
+ return false;
+ }
+
+ render_grid(data) {
+
+ var self = this;
+ var grid;
+
+ if (self.grid) {
+ // Only render the data
+ self.render_grid_data(data);
+ return;
+ }
+ // Checkbox Column
+ var checkboxSelector = new Slick.CheckboxSelectColumn({
+ cssClass: 'slick-cell-checkboxsel',
+ minWidth: 30,
+ });
+
+ // Format Schema object title with appropriate icon
+ var formatColumnTitle = function (row, cell, value, columnDef, dataContext) {
+ let icon = 'icon-' + dataContext.type;
+ return '<i class="ml-5 wcTabIcon '+ icon +'"></i><span>' + value + '</span>';
+ };
+
+ // Grid Columns
+ var grid_width = (self.grid_width - 47) / 2 ;
+ var columns = [
+ checkboxSelector.getColumnDefinition(),
+ {id: 'title', name: 'Schema Objects', field: 'title', minWidth: grid_width, formatter: formatColumnTitle},
+ {id: 'status', name: 'Comparison Result', field: 'status', minWidth: grid_width},
+ {id: 'label', name: 'Schema Objects', field: 'label', width: 0, minWidth: 0, maxWidth: 0,
+ cssClass: 'reallyHidden', headerCssClass: 'reallyHidden'},
+ {id: 'type', name: 'Schema Objects', field: 'type', width: 0, minWidth: 0, maxWidth: 0,
+ cssClass: 'reallyHidden', headerCssClass: 'reallyHidden'},
+ {id: 'id', name: 'id', field: 'id', width: 0, minWidth: 0, maxWidth: 0,
+ cssClass: 'reallyHidden', headerCssClass: 'reallyHidden' },
+
+ ];
+
+ // Grid Options
+ var options = {
+ enableCellNavigation: true,
+ enableColumnReorder: false,
+ enableRowSelection: true,
+ };
+
+ // Grouping by Schema Object
+ self.groupBySchemaObject = function() {
+ self.dataView.setGrouping({
+ getter: 'type',
+ formatter: function (g) {
+ let icon = 'icon-coll-' + g.value;
+ return '<i class="wcTabIcon '+ icon +'"></i><span>' + g.rows[0].label + '</span>';
+ },
+ aggregateCollapsed: true,
+ lazyTotalsCalculation: true,
+ });
+ };
+
+ var groupItemMetadataProvider = new Slick.Data.GroupItemMetadataProvider({ checkboxSelect: true,
+ checkboxSelectPlugin: checkboxSelector });
+
+ // Dataview for grid
+ self.dataView = new Slick.Data.DataView({
+ groupItemMetadataProvider: groupItemMetadataProvider,
+ inlineFilters: false,
+ });
+
+ // Wire up model events to drive the grid
+ self.dataView.onRowCountChanged.subscribe(function () {
+ grid.updateRowCount();
+ grid.render();
+ });
+ self.dataView.onRowsChanged.subscribe(function (e, args) {
+ grid.invalidateRows(args.rows);
+ grid.render();
+ });
+
+ // Change Row css on the basis of item status
+ self.dataView.getItemMetadata = function(row) {
+ var item = self.dataView.getItem(row);
+ if (item.__group) {
+ return groupItemMetadataProvider.getGroupRowMetadata(item);
+ }
+
+ if(item.status === 'Different') {
+ return { cssClasses: 'different' };
+ } else if (item.status === 'Source Only') {
+ return { cssClasses: 'source' };
+ } else if (item.status === 'Target Only') {
+ return { cssClasses: 'target' };
+ }
+
+ return null;
+ };
+
+ // Grid filter
+ self.filter = function (item) {
+ let self = this;
+ if (self.sel_filters.indexOf(item.status) !== -1) return true;
+ return false;
+ };
+
+ let $data_grid = $('#schema-diff-grid');
+ grid = this.grid = new Slick.Grid($data_grid, self.dataView, columns, options);
+ grid.registerPlugin(groupItemMetadataProvider);
+ grid.setSelectionModel(new Slick.RowSelectionModel({selectActiveRow: false}));
+ grid.registerPlugin(checkboxSelector);
+
+ grid.onClick.subscribe(function(e, args) {
+ if (args.row) {
+ data = args.grid.getData().getItem(args.row);
+ if (data.status) this.ddlCompare(data);
+ }
+ }.bind(self));
+
+ grid.onSelectedRowsChanged.subscribe(self.handle_generate_button.bind(self));
+
+ self.model.on('change:diff_ddl', self.handle_generate_button.bind(self));
+
+ $('#schema-diff-grid').on('keyup', function() {
+ if ((event.keyCode == 38 || event.keyCode ==40) && this.grid.getActiveCell().row) {
+ data = this.grid.getData().getItem(this.grid.getActiveCell().row);
+ this.ddlCompare(data);
+ }
+ }.bind(self));
+
+ self.render_grid_data(data);
+ }
+
+
+
+ render_grid_data(data) {
+ var self = this;
+ self.dataView.beginUpdate();
+ self.dataView.setItems(data);
+ self.dataView.setFilter(self.filter.bind(self));
+ self.groupBySchemaObject();
+ self.dataView.endUpdate();
+
+ self.resize_grid();
+ }
+
+ handle_generate_button(){
+ if (this.grid.getSelectedRows().length > 0 || (this.model.get('diff_ddl') != '' && !_.isUndefined(this.model.get('diff_ddl')))) {
+ this.header.$el.find('button#generate-script').removeAttr('disabled');
+ } else {
+ this.header.$el.find('button#generate-script').attr('disabled', true);
+ }
+ }
+
+ resize_grid() {
+ let $data_grid = $('#schema-diff-grid'),
+ grid_height = (this.panel_obj.height() > 0) ? this.panel_obj.height() - 100 : this.grid_height - 100;
+
+ $data_grid.height(grid_height);
+ $data_grid.css({
+ 'height': grid_height + 'px',
+ });
+ if (this.grid) this.grid.resizeCanvas();
+ }
+
+ getCompareStatus() {
+ var self = this,
+ url_params = {'trans_id': self.trans_id},
+ baseUrl = url_for('schema_diff.poll', url_params);
+
+ $.ajax({
+ url: baseUrl,
+ method: 'GET',
+ dataType: 'json',
+ contentType: 'application/json',
+ })
+ .done(function (res) {
+ let msg = res.data.compare_msg + res.data.diff_percentage + '% completed';
+ $('#diff_fetching_data').find('.schema-diff-busy-text').text(msg);
+ })
+ .fail(function (xhr) {
+ self.raise_error_on_fail(gettext('Poll error'), xhr);
+ self.stopDiffPoller('fail');
+ });
+ }
+
+ startDiffPoller() {
+ $('#ddl_comp_fetching_data').addClass('d-none');
+ $('#diff_fetching_data').removeClass('d-none');
+ /* Execute once for the first time as setInterval will not do */
+ this.getCompareStatus();
+ this.diff_poller_int_id = setInterval(this.getCompareStatus.bind(this), 1000);
+ }
+
+ stopDiffPoller(status) {
+ clearInterval(this.diff_poller_int_id);
+ // The last polling for comparison
+ if (status !== 'fail') this.getCompareStatus();
+
+ $('#diff_fetching_data').find('.schema-diff-busy-text').text('');
+ $('#diff_fetching_data').addClass('d-none');
+
+ }
+
+ ddlCompare(data) {
+ var self = this,
+ node_type = data.type,
+ source_oid = data.oid,
+ target_oid = data.oid;
+
+ self.model.set({
+ 'source_ddl': undefined,
+ 'target_ddl': undefined,
+ 'diff_ddl': undefined,
+ });
+
+ var url_params = self.selection;
+
+ if(data.status && (data.status.toLowerCase() == 'different' || data.status.toLowerCase() == 'identical')) {
+ target_oid = data.target_oid;
+ }
+
+ url_params['trans_id'] = self.trans_id;
+ url_params['source_oid'] = source_oid;
+ url_params['target_oid'] = target_oid;
+ url_params['comp_status'] = data.status;
+ url_params['node_type'] = node_type;
+
+ _.each(url_params, function(key, val) {
+ url_params[key] = parseInt(val, 10);
+ });
+
+ $('#ddl_comp_fetching_data').removeClass('d-none');
+
+ var baseUrl = url_for('schema_diff.ddl_compare', url_params);
+ self.model.url = baseUrl;
+
+ self.model.fetch({
+ success: function() {
+ self.footer.render();
+ $('#ddl_comp_fetching_data').addClass('d-none');
+ },
+ error: function() {
+ self.footer.render();
+ $('#ddl_comp_fetching_data').addClass('d-none');
+ },
+ });
+ }
+
+ render() {
+ let self = this;
+ let panel = self.docker.findPanels('schema_diff_header_panel')[0];
+
+ var header = panel.$container.find('#schema-diff-header');
+
+ self.header = new SchemaDiffHeaderView({
+ el: header,
+ model: this.model,
+ fields: [{
+ name: 'source_sid', label: false,
+ control: SchemaDiffSelect2Control,
+ url: url_for('schema_diff.servers'),
+ select2: {
+ allowClear: true,
+ placeholder: gettext('Select server...'),
+ },
+ connect: function() {
+ self.connect_server(arguments[0], arguments[1]);
+ },
+ group: 'source',
+ disabled: function() {
+ return false;
+ },
+ }, {
+ name: 'source_did',
+ group: 'source',
+ deps: ['source_sid'],
+ control: SchemaDiffSelect2Control,
+ url: function() {
+ if (this.get('source_sid'))
+ return url_for('schema_diff.databases', {'sid': this.get('source_sid')});
+ return false;
+ },
+ select2: {
+ allowClear: true,
+ placeholder: gettext('Select database...'),
+ },
+ disabled: function(m) {
+ if (!_.isUndefined(m.get('source_sid')) && !_.isNull(m.get('source_sid')))
+ return false;
+ return true;
+ },
+ connect: function() {
+ self.connect_database(this.model.get('source_sid'), arguments[0], arguments[1]);
+ },
+ }, {
+ name: 'source_scid',
+ control: SchemaDiffSelect2Control,
+ group: 'source',
+ deps: ['source_sid', 'source_did'],
+ url: function() {
+ if (this.get('source_sid') && this.get('source_did'))
+ return url_for('schema_diff.schemas', {'sid': this.get('source_sid'), 'did': this.get('source_did')});
+ return false;
+ },
+ select2: {
+ allowClear: true,
+ placeholder: gettext('Select schema...'),
+ },
+ disabled: function(m) {
+ if (!_.isUndefined(m.get('source_did')) && !_.isNull(m.get('source_did')))
+ return false;
+ return true;
+ },
+ }, {
+ name: 'target_sid', label: false,
+ control: SchemaDiffSelect2Control,
+ group: 'target',
+ url: url_for('schema_diff.servers'),
+ select2: {
+ allowClear: true,
+ placeholder: gettext('Select server...'),
+ },
+ disabled: function() {
+ return false;
+ },
+ connect: function() {
+ self.connect_server(arguments[0], arguments[1]);
+ },
+ }, {
+ name: 'target_did',
+ control: SchemaDiffSelect2Control,
+ group: 'target',
+ deps: ['target_sid'],
+ url: function() {
+ if (this.get('target_sid'))
+ return url_for('schema_diff.databases', {'sid': this.get('target_sid')});
+ return false;
+ },
+ select2: {
+ allowClear: true,
+ placeholder: gettext('Select database...'),
+ },
+ disabled: function(m) {
+ if (!_.isUndefined(m.get('target_sid')) && !_.isNull(m.get('target_sid')))
+ return false;
+ return true;
+ },
+ connect: function() {
+ self.connect_database(this.model.get('target_sid'), arguments[0], arguments[1]);
+ },
+ }, {
+ name: 'target_scid',
+ control: SchemaDiffSelect2Control,
+ group: 'target',
+ deps: ['target_sid', 'target_did'],
+ url: function() {
+ if (this.get('target_sid') && this.get('target_did'))
+ return url_for('schema_diff.schemas', {'sid': this.get('target_sid'), 'did': this.get('target_did')});
+ return false;
+ },
+ select2: {
+ allowClear: true,
+ placeholder: gettext('Select schema...'),
+ },
+ disabled: function(m) {
+ if (!_.isUndefined(m.get('target_did')) && !_.isNull(m.get('target_did')))
+ return false;
+ return true;
+ },
+ }],
+ });
+
+ self.footer = new SchemaDiffFooterView({
+ model: this.model,
+ fields: [{
+ name: 'source_ddl', label: false,
+ control: SchemaDiffSqlControl,
+ group: 'ddl-source',
+ }, {
+ name: 'target_ddl', label: false,
+ control: SchemaDiffSqlControl,
+ group: 'ddl-target',
+ }, {
+ name: 'diff_ddl', label: false,
+ control: SchemaDiffSqlControl,
+ group: 'ddl-diff', copyRequired: true,
+ }],
+ });
+
+ self.header.render();
+
+ self.header.$el.find('button.btn-primary').on('click', self.compare_schemas.bind(self));
+ self.header.$el.find('button#generate-script').on('click', self.generate_script.bind(self));
+ self.header.$el.find('ul.filter a.dropdown-item').on('click', self.refresh_filters.bind(self));
+
+ let footer_panel = self.docker.findPanels('schema_diff_footer_panel')[0],
+ header_panel = self.docker.findPanels('schema_diff_header_panel')[0];
+
+ footer_panel.$container.find('#schema-diff-ddl-comp').append(self.footer.render().$el);
+ header_panel.$container.find('#schema-diff-grid').append(`<div class='obj_properties container-fluid'>
+ <div class='alert alert-info pg-panel-message'>` + gettext('Select the server, database and schema for the source and target and click <b>Compare</b> to compare them.') + '</div></div>');
+
+ self.grid_width = $('#schema-diff-grid').width();
+ self.grid_height = this.panel_obj.height();
+ }
+
+ refresh_filters(event) {
+ let self = this;
+ _.each(self.filters, function(filter) {
+ let index = self.sel_filters.indexOf(filter);
+ let filter_class = '.' + filter.replace(' ', '-').toLowerCase();
+ if ($(event.currentTarget).find(filter_class).length == 1) {
+ if ($(filter_class).hasClass('visibility-hidden') === true) {
+ $(filter_class).removeClass('visibility-hidden');
+ if (index === -1) self.sel_filters.push(filter);
+ } else {
+ $(filter_class).addClass('visibility-hidden');
+ if(index !== -1 ) delete self.sel_filters[index];
+ }
+ }
+ });
+ // Refresh the grid
+ self.dataView.refresh();
+ }
+
+ connect_database(server_id, db_id, callback) {
+ var url = url_for('schema_diff.connect_database', {'sid': server_id, 'did': db_id});
+ $.post(url)
+ .done(function(res) {
+ if (res.success && res.data) {
+ callback(res.data);
+ }
+ })
+ .fail(function() {
+ // Fail
+ });
+
+ }
+
+ connect_server(server_id, callback) {
+ var onFailure = function(
+ xhr, status, error, server_id, callback
+ ) {
+ Alertify.pgNotifier('error', xhr, error, function(msg) {
+ setTimeout(function() {
+ Alertify.dlgServerPass(
+ gettext('Connect to Server'),
+ msg,
+ server_id,
+ callback
+ ).resizeTo();
+ }, 100);
+ });
+ },
+ onSuccess = function(res, callback) {
+ if (res && res.data) {
+ // We're not reconnecting
+ callback(res.data);
+ }
+ };
+
+
+ // Ask Password and send it back to the connect server
+ if (!Alertify.dlgServerPass) {
+ Alertify.dialog('dlgServerPass', function factory() {
+ return {
+ main: function(
+ title, message, server_id, success_callback, _onSuccess, _onFailure, _onCancel
+ ) {
+ this.set('title', title);
+ this.message = message;
+ this.server_id = server_id;
+ this.success_callback = success_callback;
+ this.onSuccess = _onSuccess || onSuccess;
+ this.onFailure = _onFailure || onFailure;
+ this.onCancel = _onCancel || onCancel;
+ },
+ setup:function() {
+ return {
+ buttons:[{
+ text: gettext('Cancel'), className: 'btn btn-secondary fa fa-times pg-alertify-button',
+ key: 27,
+ },{
+ text: gettext('OK'), key: 13, className: 'btn btn-primary fa fa-check pg-alertify-button',
+ }],
+ focus: {element: '#password', select: true},
+ options: {
+ modal: 0, resizable: false, maximizable: false, pinnable: false,
+ },
+ };
+ },
+ build:function() {},
+ prepare:function() {
+ this.setContent(this.message);
+ },
+ callback: function(closeEvent) {
+ var _onFailure = this.onFailure,
+ _onSuccess = this.onSuccess,
+ _onCancel = this.onCancel,
+ _success_callback = this.success_callback;
+
+ if (closeEvent.button.text == gettext('OK')) {
+
+ var _url = url_for('schema_diff.connect_server', {'sid': this.server_id});
+
+ $.ajax({
+ type: 'POST',
+ timeout: 30000,
+ url: _url,
+ data: $('#frmPassword').serialize(),
+ })
+ .done(function(res) {
+ if (res.success == 1) {
+ return _onSuccess(res, _success_callback);
+ }
+ })
+ .fail(function(xhr, status, error) {
+ return _onFailure(
+ xhr, status, error, this.server_id, _success_callback
+ );
+ });
+ } else {
+ _onCancel && typeof(_onCancel) == 'function' &&
+ _onCancel();
+ }
+ },
+ };
+ });
+ }
+
+ var onCancel = function() {
+ return false;
+ };
+
+ var url = url_for('schema_diff.connect_server', {'sid': server_id});
+ $.post(url)
+ .done(function(res) {
+ if (res.success == 1) {
+ return onSuccess(res, callback);
+ }
+ })
+ .fail(function(xhr, status, error) {
+ return onFailure(
+ xhr, status, error, server_id, callback
+ );
+ });
+ }
+}
diff --git a/web/pgadmin/tools/schema_diff/static/scss/_schema_diff.scss b/web/pgadmin/tools/schema_diff/static/scss/_schema_diff.scss
new file mode 100644
index 000000000..f41f9f8b0
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/scss/_schema_diff.scss
@@ -0,0 +1,81 @@
+#schema-diff-container {
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ padding-top: 10px;
+ background-color: $color-gray-light;
+}
+
+#schema-diff-grid .slick-header .slick-header-columns {
+ background: $color-bg;
+ height: 40px;
+ border-bottom: $panel-border;
+}
+
+#schema-diff-grid .slick-header .slick-header-column.ui-state-default {
+ padding: 4px 0 3px 6px;
+ border-bottom: $panel-border;
+ border-right: $panel-border;
+}
+
+.slick-row:hover .slick-cell{
+ border-top: $table-hover-border;
+ border-bottom: $table-hover-border;
+ background-color: $table-hover-bg-color;
+}
+
+#schema-diff-grid .slick-header .slick-header-column.selected {
+ background-color: $color-primary;
+ color: $color-primary-fg;
+}
+.slick-row .slick-cell {
+ border-bottom: $panel-border;
+ border-right: $panel-border;
+ z-index: 0;
+}
+
+#schema-diff-grid {
+ background: none;
+ background-color: $color-gray-light;
+}
+
+#schema-diff-grid .slick-row .slick-cell.l0.r0.selected {
+ background-color: $color-primary;
+ color: $color-primary-fg;
+}
+
+#schema-diff-grid .slick-row > .slick-cell:not(.l0):not(.r0).selected {
+ background-color: $table-hover-bg-color;
+ border-top: $table-hover-border;
+ border-bottom: $table-hover-border;
+}
+
+#schema-diff-grid div.slick-header.ui-state-default {
+ background: $color-bg;
+ border-bottom: none;
+ border-right: none;
+ border-top: none;
+}
+
+#schema-diff-grid .different {
+ background-color: $schemadiff-diff-row-color !important;
+}
+#schema-diff-grid .source {
+ background-color: $schemadiff-source-row-color !important;
+}
+#schema-diff-grid .target {
+ background-color: $schemadiff-target-row-color !important;
+}
+
+#schema-diff-grid .slick-row.active {
+ background-color: $table-bg-selected !important;
+}
+
+#schema-diff-ddl-comp {
+ height: 100%;
+ bottom: 10px;
+ background-color: $color-bg !important;
+ overflow-y: hidden;
+}
diff --git a/web/pgadmin/tools/schema_diff/templates/schema_diff/index.html b/web/pgadmin/tools/schema_diff/templates/schema_diff/index.html
new file mode 100644
index 000000000..641bd86c7
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/templates/schema_diff/index.html
@@ -0,0 +1,39 @@
+{% extends "base.html" %}
+{% block init_script %}
+try {
+ require(
+ ['sources/generated/schema_diff', 'sources/generated/slickgrid', 'sources/generated/codemirror', 'sources/generated/browser_nodes'],
+ function(pgSchemaDiffHook) {
+ var pgSchemaDiffHook = pgSchemaDiffHook || pgAdmin.Tools.SchemaDiffHook;
+ pgSchemaDiffHook.load({{trans_id}});
+ },
+ function() {
+ console.log(arguments);
+ });
+} catch (err) {
+ console.log(err);
+}
+{% endblock %}
+{% block css_link %}
+<link type="text/css" rel="stylesheet" href="{{ url_for('browser.browser_css')}}"/>
+{% endblock %}
+{% block body %}
+<div id="schema-diff-container">
+ <div id="diff_fetching_data" class="pg-sp-container schema-diff-busy-fetching d-none">
+ <div class="pg-sp-content">
+ <div class="row">
+ <div class="col-12 pg-sp-icon"></div>
+ </div>
+ <div class="row"><div class="col-12 pg-sp-text schema-diff-busy-text"></div></div>
+ </div>
+ </div>
+ <div id="ddl_comp_fetching_data" class="pg-sp-container schema-diff-busy-fetching d-none">
+ <div class="pg-sp-content">
+ <div class="row">
+ <div class="col-12 pg-sp-icon"></div>
+ </div>
+ <div class="row"><div class="col-12 pg-sp-text">{{ _('Comparing objects...') }}</div></div>
+ </div>
+ </div>
+</div>
+{% endblock %}
diff --git a/web/pgadmin/tools/schema_diff/tests/__init__.py b/web/pgadmin/tools/schema_diff/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/web/pgadmin/tools/schema_diff/tests/pg/10_plus/source.sql b/web/pgadmin/tools/schema_diff/tests/pg/10_plus/source.sql
new file mode 100644
index 000000000..99757ceb2
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/pg/10_plus/source.sql
@@ -0,0 +1,440 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:54:15 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- TOC entry 17 (class 2615 OID 139770)
+-- Name: source; Type: SCHEMA; Schema: -; Owner: postgres
+--
+
+CREATE SCHEMA source;
+
+
+ALTER SCHEMA source OWNER TO postgres;
+
+SET default_tablespace = '';
+
+
+CREATE EXTENSION btree_gist
+ SCHEMA source;
+
+--
+-- TOC entry 12272 (class 1259 OID 149205)
+-- Name: table_for_partition; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_partition (
+ col1 bigint NOT NULL
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE source.table_for_partition OWNER TO postgres;
+
+--
+-- TOC entry 12273 (class 1259 OID 149208)
+-- Name: part1; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.part1 (
+ col1 bigint NOT NULL
+);
+ALTER TABLE ONLY source.table_for_partition ATTACH PARTITION source.part1 FOR VALUES FROM ('1') TO ('23');
+
+
+ALTER TABLE source.part1 OWNER TO postgres;
+
+--
+-- TOC entry 12274 (class 1259 OID 149213)
+-- Name: table_for_partition_1; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_partition_1 (
+ col1 bigint
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE source.table_for_partition_1 OWNER TO postgres;
+
+--
+-- TOC entry 12275 (class 1259 OID 149216)
+-- Name: part3; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.part3 (
+ col1 bigint
+);
+ALTER TABLE ONLY source.table_for_partition_1 ATTACH PARTITION source.part3 FOR VALUES FROM ('1') TO ('10');
+
+
+ALTER TABLE source.part3 OWNER TO postgres;
+
+--
+-- TOC entry 12276 (class 1259 OID 149219)
+-- Name: part4; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.part4 (
+ col1 bigint
+);
+ALTER TABLE ONLY source.table_for_partition_1 ATTACH PARTITION source.part4 FOR VALUES FROM ('11') TO ('20');
+
+
+ALTER TABLE source.part4 OWNER TO postgres;
+
+--
+-- TOC entry 12258 (class 1259 OID 148963)
+-- Name: table_for_column; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_column (
+ col1 bigint NOT NULL,
+ col2 text,
+ col3 text
+);
+
+
+ALTER TABLE source.table_for_column OWNER TO postgres;
+
+--
+-- TOC entry 12256 (class 1259 OID 148895)
+-- Name: table_for_constraints; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_constraints OWNER TO postgres;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12256
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON TABLE source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 12262 (class 1259 OID 149004)
+-- Name: table_for_identical; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_identical OWNER TO postgres;
+
+--
+-- TOC entry 12260 (class 1259 OID 148977)
+-- Name: table_for_index; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_index OWNER TO postgres;
+
+--
+-- TOC entry 12269 (class 1259 OID 149128)
+-- Name: table_for_primary_key; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE source.table_for_primary_key OWNER TO postgres;
+
+--
+-- TOC entry 12264 (class 1259 OID 149024)
+-- Name: table_for_rule; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_rule OWNER TO postgres;
+
+--
+-- TOC entry 12266 (class 1259 OID 149048)
+-- Name: table_for_trigger; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_trigger OWNER TO postgres;
+
+--
+-- TOC entry 56893 (class 2606 OID 148904)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='12') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 56893
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56891 (class 2606 OID 148911)
+-- Name: table_for_constraints check_con; Type: CHECK CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE source.table_for_constraints
+ ADD CONSTRAINT check_con CHECK ((col1 > 10)) NOT VALID;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56891
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT check_con ON source.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 56899 (class 2606 OID 148970)
+-- Name: table_for_column table_for_column_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_column
+ ADD CONSTRAINT table_for_column_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56895 (class 2606 OID 148902)
+-- Name: table_for_constraints table_for_constraints_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT table_for_constraints_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 148984)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56913 (class 2606 OID 149135)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1, col2);
+
+
+--
+-- TOC entry 56909 (class 2606 OID 149031)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56907 (class 2606 OID 149011)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56911 (class 2606 OID 149055)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148913)
+-- Name: table_for_constraints unique; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "unique" UNIQUE (col1);
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 56897
+-- Name: CONSTRAINT "unique" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "unique" ON source.table_for_constraints IS 'cmnt';
+
+
+--
+-- TOC entry 56900 (class 1259 OID 149023)
+-- Name: index1; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index1 ON source.table_for_index USING btree (col2 varchar_pattern_ops);
+
+
+--
+-- TOC entry 56905 (class 1259 OID 149012)
+-- Name: index_identical; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index_identical ON source.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56901 (class 1259 OID 149211)
+-- Name: index_same; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index_same ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56902 (class 1259 OID 149022)
+-- Name: index_source; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index_source ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 61044 (class 2618 OID 149032)
+-- Name: table_for_rule rule1; Type: RULE; Schema: source; Owner: postgres
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO source.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61070 (class 0 OID 0)
+-- Dependencies: 61044
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON RULE rule1 ON source.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149033)
+-- Name: table_for_rule rule2; Type: RULE; Schema: source; Owner: postgres
+--
+
+CREATE RULE rule2 AS
+ ON INSERT TO source.table_for_rule DO NOTHING;
+
+--
+-- TOC entry 12283 (class 1259 OID 347818)
+-- Name: test view; Type: VIEW; Schema: source; Owner: postgres
+--
+
+CREATE VIEW source."test view" AS
+ SELECT pg_class.relname,
+ pg_class.relnamespace,
+ pg_class.reltype,
+ pg_class.reloftype,
+ pg_class.relowner,
+ pg_class.relam,
+ pg_class.relfilenode,
+ pg_class.reltablespace,
+ pg_class.relpages,
+ pg_class.reltuples,
+ pg_class.relallvisible,
+ pg_class.reltoastrelid,
+ pg_class.relhasindex,
+ pg_class.relisshared,
+ pg_class.relpersistence,
+ pg_class.relkind,
+ pg_class.relnatts,
+ pg_class.relchecks,
+ pg_class.relhasoids,
+ pg_class.relhaspkey,
+ pg_class.relhasrules,
+ pg_class.relhastriggers,
+ pg_class.relhassubclass,
+ pg_class.relrowsecurity,
+ pg_class.relforcerowsecurity,
+ pg_class.relispopulated,
+ pg_class.relreplident,
+ pg_class.relispartition,
+ pg_class.relfrozenxid,
+ pg_class.relminmxid,
+ pg_class.relacl,
+ pg_class.reloptions,
+ pg_class.relpartbound
+ FROM pg_class
+ LIMIT 10;
+
+
+ALTER TABLE source."test view" OWNER TO postgres;
+
+--
+-- TOC entry 12286 (class 1259 OID 347832)
+-- Name: test view f; Type: VIEW; Schema: source; Owner: postgres
+--
+
+CREATE VIEW source."test view f" WITH (security_barrier='false') AS
+ SELECT 2;
+
+
+ALTER TABLE source."test view f" OWNER TO postgres;
+
+--
+-- TOC entry 61111 (class 0 OID 0)
+-- Dependencies: 12286
+-- Name: VIEW "test view f"; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON VIEW source."test view f" IS 'cmn';
diff --git a/web/pgadmin/tools/schema_diff/tests/pg/10_plus/target.sql b/web/pgadmin/tools/schema_diff/tests/pg/10_plus/target.sql
new file mode 100644
index 000000000..c3042ab60
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/pg/10_plus/target.sql
@@ -0,0 +1,429 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:55:22 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- TOC entry 18 (class 2615 OID 139771)
+-- Name: target; Type: SCHEMA; Schema: -; Owner: postgres
+--
+
+CREATE SCHEMA target;
+
+ALTER SCHEMA target OWNER TO postgres;
+
+SET default_tablespace = '';
+
+CREATE EXTENSION btree_gist
+ SCHEMA target;
+
+--
+-- TOC entry 12250 (class 1259 OID 139938)
+-- Name: MView; Type: MATERIALIZED VIEW; Schema: target; Owner: postgres
+--
+
+CREATE MATERIALIZED VIEW target."MView" AS
+ SELECT 'tekst'::text AS text
+ WITH NO DATA;
+
+
+ALTER TABLE target."MView" OWNER TO postgres;
+
+--
+-- TOC entry 12277 (class 1259 OID 149234)
+-- Name: table_for_partition_1; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_partition_1 (
+ col1 bigint
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE target.table_for_partition_1 OWNER TO postgres;
+
+--
+-- TOC entry 12278 (class 1259 OID 149237)
+-- Name: part3; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.part3 (
+ col1 bigint
+);
+ALTER TABLE ONLY target.table_for_partition_1 ATTACH PARTITION target.part3 FOR VALUES FROM ('13') TO ('56');
+
+
+ALTER TABLE target.part3 OWNER TO postgres;
+
+--
+-- TOC entry 12259 (class 1259 OID 148971)
+-- Name: table_for_column; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_column (
+ col1 bigint,
+ col2 bigint,
+ col4 text
+);
+
+
+ALTER TABLE target.table_for_column OWNER TO postgres;
+
+--
+-- TOC entry 12268 (class 1259 OID 149089)
+-- Name: table_for_constraints; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text,
+ CONSTRAINT check_con CHECK ((col1 > 30))
+);
+
+
+ALTER TABLE target.table_for_constraints OWNER TO postgres;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON TABLE target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT check_con ON target.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 12257 (class 1259 OID 148960)
+-- Name: table_for_del; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_del (
+);
+
+
+ALTER TABLE target.table_for_del OWNER TO postgres;
+
+--
+-- TOC entry 12271 (class 1259 OID 149172)
+-- Name: table_for_foreign_key; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_foreign_key (
+ col1 integer NOT NULL,
+ col2 "char",
+ col3 bigint
+);
+
+
+ALTER TABLE target.table_for_foreign_key OWNER TO postgres;
+
+--
+-- TOC entry 12263 (class 1259 OID 149013)
+-- Name: table_for_identical; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_identical OWNER TO postgres;
+
+--
+-- TOC entry 12261 (class 1259 OID 148986)
+-- Name: table_for_index; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_index OWNER TO postgres;
+
+--
+-- TOC entry 12270 (class 1259 OID 149144)
+-- Name: table_for_primary_key; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE target.table_for_primary_key OWNER TO postgres;
+
+--
+-- TOC entry 12265 (class 1259 OID 149034)
+-- Name: table_for_rule; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_rule OWNER TO postgres;
+
+--
+-- TOC entry 12267 (class 1259 OID 149066)
+-- Name: table_for_trigger; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_trigger OWNER TO postgres;
+
+
+--
+-- TOC entry 56906 (class 2606 OID 149097)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='15') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56906
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56910 (class 2606 OID 149176)
+-- Name: table_for_foreign_key table_for_foreign_key_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_foreign_key
+ ADD CONSTRAINT table_for_foreign_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148993)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56908 (class 2606 OID 149151)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56902 (class 2606 OID 149041)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56900 (class 2606 OID 149020)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 149073)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56893 (class 1259 OID 148994)
+-- Name: index1; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index1 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56894 (class 1259 OID 148995)
+-- Name: index2; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index2 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56898 (class 1259 OID 149021)
+-- Name: index_identical; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index_identical ON target.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56895 (class 1259 OID 149212)
+-- Name: index_same; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index_same ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56892 (class 1259 OID 139945)
+-- Name: mview_index; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX mview_index ON target."MView" USING btree (text text_pattern_ops);
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149042)
+-- Name: table_for_rule rule1; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO target.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 61045
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON RULE rule1 ON target.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61046 (class 2618 OID 149043)
+-- Name: table_for_rule rule2; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule2 AS
+ ON UPDATE TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61047 (class 2618 OID 149044)
+-- Name: table_for_rule rule3; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule3 AS
+ ON INSERT TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61050 (class 0 OID 139938)
+-- Dependencies: 12250 61062
+-- Name: MView; Type: MATERIALIZED VIEW DATA; Schema: target; Owner: postgres
+--
+
+REFRESH MATERIALIZED VIEW target."MView";
+
+
+--
+-- TOC entry 12284 (class 1259 OID 347823)
+-- Name: test view; Type: VIEW; Schema: target; Owner: postgres
+--
+
+CREATE VIEW target."test view" AS
+ SELECT pg_class.relname,
+ pg_class.relnamespace,
+ pg_class.reltype,
+ pg_class.reloftype,
+ pg_class.relowner,
+ pg_class.relam,
+ pg_class.relfilenode,
+ pg_class.reltablespace,
+ pg_class.relpages,
+ pg_class.reltuples,
+ pg_class.relallvisible,
+ pg_class.reltoastrelid,
+ pg_class.relhasindex,
+ pg_class.relisshared,
+ pg_class.relpersistence,
+ pg_class.relkind,
+ pg_class.relnatts,
+ pg_class.relchecks,
+ pg_class.relhasoids,
+ pg_class.relhaspkey,
+ pg_class.relhasrules,
+ pg_class.relhastriggers,
+ pg_class.relhassubclass,
+ pg_class.relrowsecurity,
+ pg_class.relforcerowsecurity,
+ pg_class.relispopulated,
+ pg_class.relreplident,
+ pg_class.relispartition,
+ pg_class.relfrozenxid,
+ pg_class.relminmxid,
+ pg_class.relacl,
+ pg_class.reloptions,
+ pg_class.relpartbound
+ FROM pg_class
+ LIMIT 10;
+
+
+ALTER TABLE target."test view" OWNER TO postgres;
+
+--
+-- TOC entry 12285 (class 1259 OID 347828)
+-- Name: test view f; Type: VIEW; Schema: target; Owner: postgres
+--
+
+CREATE VIEW target."test view f" WITH (security_barrier='true') AS
+ SELECT 2;
+
+
+ALTER TABLE target."test view f" OWNER TO postgres;
+
+--
+-- TOC entry 61105 (class 0 OID 0)
+-- Dependencies: 12285
+-- Name: VIEW "test view f"; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON VIEW target."test view f" IS 'cmn';
diff --git a/web/pgadmin/tools/schema_diff/tests/pg/12_plus/source.sql b/web/pgadmin/tools/schema_diff/tests/pg/12_plus/source.sql
new file mode 100644
index 000000000..8ef87e3bc
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/pg/12_plus/source.sql
@@ -0,0 +1,440 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:54:15 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- TOC entry 17 (class 2615 OID 139770)
+-- Name: source; Type: SCHEMA; Schema: -; Owner: postgres
+--
+
+CREATE SCHEMA source;
+
+
+ALTER SCHEMA source OWNER TO postgres;
+
+SET default_tablespace = '';
+
+
+CREATE EXTENSION btree_gist
+ SCHEMA source;
+
+--
+-- TOC entry 12272 (class 1259 OID 149205)
+-- Name: table_for_partition; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_partition (
+ col1 bigint NOT NULL
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE source.table_for_partition OWNER TO postgres;
+
+--
+-- TOC entry 12273 (class 1259 OID 149208)
+-- Name: part1; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.part1 (
+ col1 bigint NOT NULL
+);
+ALTER TABLE ONLY source.table_for_partition ATTACH PARTITION source.part1 FOR VALUES FROM ('1') TO ('23');
+
+
+ALTER TABLE source.part1 OWNER TO postgres;
+
+--
+-- TOC entry 12274 (class 1259 OID 149213)
+-- Name: table_for_partition_1; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_partition_1 (
+ col1 bigint
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE source.table_for_partition_1 OWNER TO postgres;
+
+--
+-- TOC entry 12275 (class 1259 OID 149216)
+-- Name: part3; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.part3 (
+ col1 bigint
+);
+ALTER TABLE ONLY source.table_for_partition_1 ATTACH PARTITION source.part3 FOR VALUES FROM ('1') TO ('10');
+
+
+ALTER TABLE source.part3 OWNER TO postgres;
+
+--
+-- TOC entry 12276 (class 1259 OID 149219)
+-- Name: part4; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.part4 (
+ col1 bigint
+);
+ALTER TABLE ONLY source.table_for_partition_1 ATTACH PARTITION source.part4 FOR VALUES FROM ('11') TO ('20');
+
+
+ALTER TABLE source.part4 OWNER TO postgres;
+
+--
+-- TOC entry 12258 (class 1259 OID 148963)
+-- Name: table_for_column; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_column (
+ col1 bigint NOT NULL,
+ col2 text,
+ col3 text
+);
+
+
+ALTER TABLE source.table_for_column OWNER TO postgres;
+
+--
+-- TOC entry 12256 (class 1259 OID 148895)
+-- Name: table_for_constraints; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_constraints OWNER TO postgres;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12256
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON TABLE source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 12262 (class 1259 OID 149004)
+-- Name: table_for_identical; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_identical OWNER TO postgres;
+
+--
+-- TOC entry 12260 (class 1259 OID 148977)
+-- Name: table_for_index; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_index OWNER TO postgres;
+
+--
+-- TOC entry 12269 (class 1259 OID 149128)
+-- Name: table_for_primary_key; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE source.table_for_primary_key OWNER TO postgres;
+
+--
+-- TOC entry 12264 (class 1259 OID 149024)
+-- Name: table_for_rule; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_rule OWNER TO postgres;
+
+--
+-- TOC entry 12266 (class 1259 OID 149048)
+-- Name: table_for_trigger; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_trigger OWNER TO postgres;
+
+--
+-- TOC entry 56893 (class 2606 OID 148904)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='12') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 56893
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56891 (class 2606 OID 148911)
+-- Name: table_for_constraints check_con; Type: CHECK CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE source.table_for_constraints
+ ADD CONSTRAINT check_con CHECK ((col1 > 10)) NOT VALID;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56891
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT check_con ON source.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 56899 (class 2606 OID 148970)
+-- Name: table_for_column table_for_column_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_column
+ ADD CONSTRAINT table_for_column_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56895 (class 2606 OID 148902)
+-- Name: table_for_constraints table_for_constraints_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT table_for_constraints_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 148984)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56913 (class 2606 OID 149135)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1, col2);
+
+
+--
+-- TOC entry 56909 (class 2606 OID 149031)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56907 (class 2606 OID 149011)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56911 (class 2606 OID 149055)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148913)
+-- Name: table_for_constraints unique; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "unique" UNIQUE (col1);
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 56897
+-- Name: CONSTRAINT "unique" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "unique" ON source.table_for_constraints IS 'cmnt';
+
+
+--
+-- TOC entry 56900 (class 1259 OID 149023)
+-- Name: index1; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index1 ON source.table_for_index USING btree (col2 varchar_pattern_ops);
+
+
+--
+-- TOC entry 56905 (class 1259 OID 149012)
+-- Name: index_identical; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index_identical ON source.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56901 (class 1259 OID 149211)
+-- Name: index_same; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index_same ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56902 (class 1259 OID 149022)
+-- Name: index_source; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index_source ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 61044 (class 2618 OID 149032)
+-- Name: table_for_rule rule1; Type: RULE; Schema: source; Owner: postgres
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO source.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61070 (class 0 OID 0)
+-- Dependencies: 61044
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON RULE rule1 ON source.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149033)
+-- Name: table_for_rule rule2; Type: RULE; Schema: source; Owner: postgres
+--
+
+CREATE RULE rule2 AS
+ ON INSERT TO source.table_for_rule DO NOTHING;
+
+--
+-- TOC entry 12283 (class 1259 OID 347818)
+-- Name: test view; Type: VIEW; Schema: source; Owner: postgres
+--
+
+CREATE VIEW source."test view" AS
+ SELECT pg_class.relname,
+ pg_class.relnamespace,
+ pg_class.reltype,
+ pg_class.reloftype,
+ pg_class.relowner,
+ pg_class.relam,
+ pg_class.relfilenode,
+ pg_class.reltablespace,
+ pg_class.relpages
+ FROM pg_class
+ LIMIT 10;
+
+
+ALTER TABLE source."test view" OWNER TO postgres;
+
+--
+-- TOC entry 12286 (class 1259 OID 347832)
+-- Name: test view f; Type: VIEW; Schema: source; Owner: postgres
+--
+
+CREATE VIEW source."test view f" WITH (security_barrier='false') AS
+ SELECT 2;
+
+
+ALTER TABLE source."test view f" OWNER TO postgres;
+
+--
+-- TOC entry 61111 (class 0 OID 0)
+-- Dependencies: 12286
+-- Name: VIEW "test view f"; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON VIEW source."test view f" IS 'cmn';
+
+--
+-- TOC entry 223 (class 1255 OID 67206)
+-- Name: dodaj_klijenta(character varying, character varying, character varying, character varying, integer, character varying, character varying, character varying, boolean, boolean, character varying, character varying, character varying, character varying, numeric, character varying); Type: PROCEDURE; Schema: public; Owner: postgres
+--
+
+CREATE PROCEDURE source.dodaj_klijenta(v_naziv character varying, v_oib character varying, v_pdv_id character varying, v_adresa character varying, v_mjesto integer, v_drzava character varying, v_tip_p_sub character varying, v_vlasnik character varying, v_pdv boolean, v_fisk boolean, v_iban character varying, v_k_osoba character varying, v_email character varying, v_br_tel character varying, v_radna_god numeric, v_schema character varying)
+ LANGUAGE sql
+ AS $$select 1;$$;
+
+
+ALTER PROCEDURE source.dodaj_klijenta(v_naziv character varying, v_oib character varying, v_pdv_id character varying, v_adresa character varying, v_mjesto integer, v_drzava character varying, v_tip_p_sub character varying, v_vlasnik character varying, v_pdv boolean, v_fisk boolean, v_iban character varying, v_k_osoba character varying, v_email character varying, v_br_tel character varying, v_radna_god numeric, v_schema character varying) OWNER TO postgres;
+
+--
+-- TOC entry 220 (class 1255 OID 67205)
+-- Name: proc1(bigint); Type: PROCEDURE; Schema: source; Owner: postgres
+--
+
+CREATE PROCEDURE source.proc1(arg1 bigint)
+ LANGUAGE sql
+ AS $$select 1;$$;
+
+
+ALTER PROCEDURE source.proc1(arg1 bigint) OWNER TO postgres;
diff --git a/web/pgadmin/tools/schema_diff/tests/pg/12_plus/target.sql b/web/pgadmin/tools/schema_diff/tests/pg/12_plus/target.sql
new file mode 100644
index 000000000..d57841744
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/pg/12_plus/target.sql
@@ -0,0 +1,417 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:55:22 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- TOC entry 18 (class 2615 OID 139771)
+-- Name: target; Type: SCHEMA; Schema: -; Owner: postgres
+--
+
+CREATE SCHEMA target;
+
+ALTER SCHEMA target OWNER TO postgres;
+
+SET default_tablespace = '';
+
+CREATE EXTENSION btree_gist
+ SCHEMA target;
+
+--
+-- TOC entry 12250 (class 1259 OID 139938)
+-- Name: MView; Type: MATERIALIZED VIEW; Schema: target; Owner: postgres
+--
+
+CREATE MATERIALIZED VIEW target."MView" AS
+ SELECT 'tekst'::text AS text
+ WITH NO DATA;
+
+
+ALTER TABLE target."MView" OWNER TO postgres;
+
+--
+-- TOC entry 12277 (class 1259 OID 149234)
+-- Name: table_for_partition_1; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_partition_1 (
+ col1 bigint
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE target.table_for_partition_1 OWNER TO postgres;
+
+--
+-- TOC entry 12278 (class 1259 OID 149237)
+-- Name: part3; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.part3 (
+ col1 bigint
+);
+ALTER TABLE ONLY target.table_for_partition_1 ATTACH PARTITION target.part3 FOR VALUES FROM ('13') TO ('56');
+
+
+ALTER TABLE target.part3 OWNER TO postgres;
+
+--
+-- TOC entry 12259 (class 1259 OID 148971)
+-- Name: table_for_column; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_column (
+ col1 bigint,
+ col2 bigint,
+ col4 text
+);
+
+
+ALTER TABLE target.table_for_column OWNER TO postgres;
+
+--
+-- TOC entry 12268 (class 1259 OID 149089)
+-- Name: table_for_constraints; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text,
+ CONSTRAINT check_con CHECK ((col1 > 30))
+);
+
+
+ALTER TABLE target.table_for_constraints OWNER TO postgres;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON TABLE target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT check_con ON target.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 12257 (class 1259 OID 148960)
+-- Name: table_for_del; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_del (
+);
+
+
+ALTER TABLE target.table_for_del OWNER TO postgres;
+
+--
+-- TOC entry 12271 (class 1259 OID 149172)
+-- Name: table_for_foreign_key; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_foreign_key (
+ col1 integer NOT NULL,
+ col2 "char",
+ col3 bigint
+);
+
+
+ALTER TABLE target.table_for_foreign_key OWNER TO postgres;
+
+--
+-- TOC entry 12263 (class 1259 OID 149013)
+-- Name: table_for_identical; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_identical OWNER TO postgres;
+
+--
+-- TOC entry 12261 (class 1259 OID 148986)
+-- Name: table_for_index; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_index OWNER TO postgres;
+
+--
+-- TOC entry 12270 (class 1259 OID 149144)
+-- Name: table_for_primary_key; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE target.table_for_primary_key OWNER TO postgres;
+
+--
+-- TOC entry 12265 (class 1259 OID 149034)
+-- Name: table_for_rule; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_rule OWNER TO postgres;
+
+--
+-- TOC entry 12267 (class 1259 OID 149066)
+-- Name: table_for_trigger; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_trigger OWNER TO postgres;
+
+
+--
+-- TOC entry 56906 (class 2606 OID 149097)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='15') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56906
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56910 (class 2606 OID 149176)
+-- Name: table_for_foreign_key table_for_foreign_key_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_foreign_key
+ ADD CONSTRAINT table_for_foreign_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148993)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56908 (class 2606 OID 149151)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56902 (class 2606 OID 149041)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56900 (class 2606 OID 149020)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 149073)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56893 (class 1259 OID 148994)
+-- Name: index1; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index1 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56894 (class 1259 OID 148995)
+-- Name: index2; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index2 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56898 (class 1259 OID 149021)
+-- Name: index_identical; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index_identical ON target.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56895 (class 1259 OID 149212)
+-- Name: index_same; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index_same ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56892 (class 1259 OID 139945)
+-- Name: mview_index; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX mview_index ON target."MView" USING btree (text text_pattern_ops);
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149042)
+-- Name: table_for_rule rule1; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO target.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 61045
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON RULE rule1 ON target.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61046 (class 2618 OID 149043)
+-- Name: table_for_rule rule2; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule2 AS
+ ON UPDATE TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61047 (class 2618 OID 149044)
+-- Name: table_for_rule rule3; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule3 AS
+ ON INSERT TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61050 (class 0 OID 139938)
+-- Dependencies: 12250 61062
+-- Name: MView; Type: MATERIALIZED VIEW DATA; Schema: target; Owner: postgres
+--
+
+REFRESH MATERIALIZED VIEW target."MView";
+
+--
+-- TOC entry 12284 (class 1259 OID 347823)
+-- Name: test view; Type: VIEW; Schema: target; Owner: postgres
+--
+
+CREATE VIEW target."test view" AS
+ SELECT pg_class.relname,
+ pg_class.relnamespace,
+ pg_class.reltype,
+ pg_class.reloftype,
+ pg_class.relowner,
+ pg_class.relam,
+ pg_class.relfilenode,
+ pg_class.reltablespace,
+ pg_class.relpages
+ FROM pg_class
+ LIMIT 10;
+
+
+ALTER TABLE target."test view" OWNER TO postgres;
+
+--
+-- TOC entry 12285 (class 1259 OID 347828)
+-- Name: test view f; Type: VIEW; Schema: target; Owner: postgres
+--
+
+CREATE VIEW target."test view f" WITH (security_barrier='true') AS
+ SELECT 2;
+
+
+ALTER TABLE target."test view f" OWNER TO postgres;
+
+--
+-- TOC entry 61105 (class 0 OID 0)
+-- Dependencies: 12285
+-- Name: VIEW "test view f"; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON VIEW target."test view f" IS 'cmn';
+
+
+--
+-- TOC entry 437 (class 1255 OID 112907)
+-- Name: dodaj_klijenta(character varying, character varying, character varying, character varying, integer, character varying, character varying, character varying, boolean, boolean, character varying, character varying, character varying, character varying, numeric, character varying); Type: PROCEDURE; Schema: target schema; Owner: postgres
+--
+
+CREATE PROCEDURE target.dodaj_klijenta(v_naziv character varying, v_oib character varying, v_pdv_id character varying, v_adresa character varying, v_mjesto integer, v_drzava character varying, v_tip_p_sub character varying, v_vlasnik character varying, v_pdv boolean, v_fisk boolean, v_iban character varying, v_k_osoba character varying, v_email character varying, v_br_tel character varying, v_radna_god numeric, v_schema character varying)
+ LANGUAGE sql
+ AS $$select 4;$$;
+
+
+ALTER PROCEDURE target.dodaj_klijenta(v_naziv character varying, v_oib character varying, v_pdv_id character varying, v_adresa character varying, v_mjesto integer, v_drzava character varying, v_tip_p_sub character varying, v_vlasnik character varying, v_pdv boolean, v_fisk boolean, v_iban character varying, v_k_osoba character varying, v_email character varying, v_br_tel character varying, v_radna_god numeric, v_schema character varying) OWNER TO postgres;
diff --git a/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/source.sql b/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/source.sql
new file mode 100644
index 000000000..af9054eeb
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/source.sql
@@ -0,0 +1,311 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:54:15 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+
+--
+-- TOC entry 17 (class 2615 OID 139770)
+-- Name: source; Type: SCHEMA; Schema: -; Owner: postgres
+--
+
+CREATE SCHEMA source;
+
+
+ALTER SCHEMA source OWNER TO postgres;
+
+SET default_tablespace = '';
+
+
+CREATE EXTENSION btree_gist
+ SCHEMA source;
+
+
+--
+-- TOC entry 12258 (class 1259 OID 148963)
+-- Name: table_for_column; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_column (
+ col1 bigint NOT NULL,
+ col2 text,
+ col3 text
+);
+
+
+ALTER TABLE source.table_for_column OWNER TO postgres;
+
+--
+-- TOC entry 12256 (class 1259 OID 148895)
+-- Name: table_for_constraints; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_constraints OWNER TO postgres;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12256
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON TABLE source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 12262 (class 1259 OID 149004)
+-- Name: table_for_identical; Type: TABLE; Schema: source; Owner: postgres;
+--
+
+CREATE TABLE source.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_identical OWNER TO postgres;;
+
+--
+-- TOC entry 12260 (class 1259 OID 148977)
+-- Name: table_for_index; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_index OWNER TO postgres;
+
+--
+-- TOC entry 12269 (class 1259 OID 149128)
+-- Name: table_for_primary_key; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE source.table_for_primary_key OWNER TO postgres;
+
+--
+-- TOC entry 12264 (class 1259 OID 149024)
+-- Name: table_for_rule; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_rule OWNER TO postgres;
+
+--
+-- TOC entry 12266 (class 1259 OID 149048)
+-- Name: table_for_trigger; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_trigger OWNER TO postgres;
+
+--
+-- TOC entry 56893 (class 2606 OID 148904)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='12') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 56893
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56891 (class 2606 OID 148911)
+-- Name: table_for_constraints check_con; Type: CHECK CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE source.table_for_constraints
+ ADD CONSTRAINT check_con CHECK ((col1 > 10)) NOT VALID;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56891
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT check_con ON source.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 56899 (class 2606 OID 148970)
+-- Name: table_for_column table_for_column_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_column
+ ADD CONSTRAINT table_for_column_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56895 (class 2606 OID 148902)
+-- Name: table_for_constraints table_for_constraints_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT table_for_constraints_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 148984)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56913 (class 2606 OID 149135)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1, col2);
+
+
+--
+-- TOC entry 56909 (class 2606 OID 149031)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56907 (class 2606 OID 149011)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres;
+--
+
+ALTER TABLE ONLY source.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56911 (class 2606 OID 149055)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148913)
+-- Name: table_for_constraints unique; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "unique" UNIQUE (col1);
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 56897
+-- Name: CONSTRAINT "unique" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "unique" ON source.table_for_constraints IS 'cmnt';
+
+
+--
+-- TOC entry 56900 (class 1259 OID 149023)
+-- Name: index1; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index1 ON source.table_for_index USING btree (col2 varchar_pattern_ops);
+
+
+--
+-- TOC entry 56905 (class 1259 OID 149012)
+-- Name: index_identical; Type: INDEX; Schema: source; Owner: postgres;
+--
+
+CREATE INDEX index_identical ON source.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56901 (class 1259 OID 149211)
+-- Name: index_same; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index_same ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56902 (class 1259 OID 149022)
+-- Name: index_source; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index_source ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 61044 (class 2618 OID 149032)
+-- Name: table_for_rule rule1; Type: RULE; Schema: source; Owner: postgres
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO source.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61070 (class 0 OID 0)
+-- Dependencies: 61044
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON RULE rule1 ON source.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149033)
+-- Name: table_for_rule rule2; Type: RULE; Schema: source; Owner: postgres
+--
+
+CREATE RULE rule2 AS
+ ON INSERT TO source.table_for_rule DO NOTHING;
+
diff --git a/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/target.sql b/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/target.sql
new file mode 100644
index 000000000..ddc4fda28
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/target.sql
@@ -0,0 +1,337 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:55:22 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+
+--
+-- TOC entry 18 (class 2615 OID 139771)
+-- Name: target; Type: SCHEMA; Schema: -; Owner: postgres
+--
+
+CREATE SCHEMA target;
+
+
+ALTER SCHEMA target OWNER TO postgres;
+
+SET default_tablespace = '';
+
+CREATE EXTENSION btree_gist
+ SCHEMA target;
+
+--
+-- TOC entry 12250 (class 1259 OID 139938)
+-- Name: MView; Type: MATERIALIZED VIEW; Schema: target; Owner: postgres
+--
+
+CREATE MATERIALIZED VIEW target."MView" AS
+ SELECT 'tekst'::text AS text
+ WITH NO DATA;
+
+
+ALTER TABLE target."MView" OWNER TO postgres;
+
+--
+-- TOC entry 12259 (class 1259 OID 148971)
+-- Name: table_for_column; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_column (
+ col1 bigint,
+ col2 bigint,
+ col4 text
+);
+
+
+ALTER TABLE target.table_for_column OWNER TO postgres;
+
+--
+-- TOC entry 12268 (class 1259 OID 149089)
+-- Name: table_for_constraints; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text,
+ CONSTRAINT check_con CHECK ((col1 > 30))
+);
+
+
+ALTER TABLE target.table_for_constraints OWNER TO postgres;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON TABLE target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT check_con ON target.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 12257 (class 1259 OID 148960)
+-- Name: table_for_del; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_del (
+);
+
+
+ALTER TABLE target.table_for_del OWNER TO postgres;
+
+--
+-- TOC entry 12271 (class 1259 OID 149172)
+-- Name: table_for_foreign_key; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_foreign_key (
+ col1 integer NOT NULL,
+ col2 "char",
+ col3 bigint
+);
+
+
+ALTER TABLE target.table_for_foreign_key OWNER TO postgres;
+
+--
+-- TOC entry 12263 (class 1259 OID 149013)
+-- Name: table_for_identical; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_identical OWNER TO postgres;
+
+--
+-- TOC entry 12261 (class 1259 OID 148986)
+-- Name: table_for_index; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_index OWNER TO postgres;
+
+--
+-- TOC entry 12270 (class 1259 OID 149144)
+-- Name: table_for_primary_key; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE target.table_for_primary_key OWNER TO postgres;
+
+--
+-- TOC entry 12265 (class 1259 OID 149034)
+-- Name: table_for_rule; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_rule OWNER TO postgres;
+
+--
+-- TOC entry 12267 (class 1259 OID 149066)
+-- Name: table_for_trigger; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_trigger OWNER TO postgres;
+
+
+--
+-- TOC entry 56906 (class 2606 OID 149097)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='15') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56906
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56910 (class 2606 OID 149176)
+-- Name: table_for_foreign_key table_for_foreign_key_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_foreign_key
+ ADD CONSTRAINT table_for_foreign_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148993)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56908 (class 2606 OID 149151)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56902 (class 2606 OID 149041)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56900 (class 2606 OID 149020)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 149073)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56893 (class 1259 OID 148994)
+-- Name: index1; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index1 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56894 (class 1259 OID 148995)
+-- Name: index2; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index2 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56898 (class 1259 OID 149021)
+-- Name: index_identical; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index_identical ON target.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56895 (class 1259 OID 149212)
+-- Name: index_same; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index_same ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56892 (class 1259 OID 139945)
+-- Name: mview_index; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX mview_index ON target."MView" USING btree (text text_pattern_ops);
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149042)
+-- Name: table_for_rule rule1; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO target.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 61045
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON RULE rule1 ON target.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61046 (class 2618 OID 149043)
+-- Name: table_for_rule rule2; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule2 AS
+ ON UPDATE TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61047 (class 2618 OID 149044)
+-- Name: table_for_rule rule3; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule3 AS
+ ON INSERT TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61050 (class 0 OID 139938)
+-- Dependencies: 12250 61062
+-- Name: MView; Type: MATERIALIZED VIEW DATA; Schema: target; Owner: postgres
+--
+
+REFRESH MATERIALIZED VIEW target."MView";
diff --git a/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/source.sql b/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/source.sql
new file mode 100644
index 000000000..b60dbcd55
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/source.sql
@@ -0,0 +1,376 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:54:15 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- TOC entry 17 (class 2615 OID 139770)
+-- Name: source; Type: SCHEMA; Schema: -; Owner: enterprisedb
+--
+
+CREATE SCHEMA source;
+
+
+ALTER SCHEMA source OWNER TO enterprisedb;
+
+SET default_tablespace = '';
+
+
+CREATE EXTENSION btree_gist
+ SCHEMA source;
+
+--
+-- TOC entry 12272 (class 1259 OID 149205)
+-- Name: table_for_partition; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_partition (
+ col1 bigint NOT NULL
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE source.table_for_partition OWNER TO enterprisedb;
+
+--
+-- TOC entry 12273 (class 1259 OID 149208)
+-- Name: part1; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.part1 (
+ col1 bigint NOT NULL
+);
+ALTER TABLE ONLY source.table_for_partition ATTACH PARTITION source.part1 FOR VALUES FROM ('1') TO ('23');
+
+
+ALTER TABLE source.part1 OWNER TO enterprisedb;
+
+--
+-- TOC entry 12274 (class 1259 OID 149213)
+-- Name: table_for_partition_1; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_partition_1 (
+ col1 bigint
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE source.table_for_partition_1 OWNER TO enterprisedb;
+
+--
+-- TOC entry 12275 (class 1259 OID 149216)
+-- Name: part3; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.part3 (
+ col1 bigint
+);
+ALTER TABLE ONLY source.table_for_partition_1 ATTACH PARTITION source.part3 FOR VALUES FROM ('1') TO ('10');
+
+
+ALTER TABLE source.part3 OWNER TO enterprisedb;
+
+--
+-- TOC entry 12276 (class 1259 OID 149219)
+-- Name: part4; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.part4 (
+ col1 bigint
+);
+ALTER TABLE ONLY source.table_for_partition_1 ATTACH PARTITION source.part4 FOR VALUES FROM ('11') TO ('20');
+
+
+ALTER TABLE source.part4 OWNER TO enterprisedb;
+
+--
+-- TOC entry 12258 (class 1259 OID 148963)
+-- Name: table_for_column; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_column (
+ col1 bigint NOT NULL,
+ col2 text,
+ col3 text
+);
+
+
+ALTER TABLE source.table_for_column OWNER TO enterprisedb;
+
+--
+-- TOC entry 12256 (class 1259 OID 148895)
+-- Name: table_for_constraints; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_constraints OWNER TO enterprisedb;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12256
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON TABLE source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 12262 (class 1259 OID 149004)
+-- Name: table_for_identical; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_identical OWNER TO enterprisedb;
+
+--
+-- TOC entry 12260 (class 1259 OID 148977)
+-- Name: table_for_index; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_index OWNER TO enterprisedb;
+
+--
+-- TOC entry 12269 (class 1259 OID 149128)
+-- Name: table_for_primary_key; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE source.table_for_primary_key OWNER TO enterprisedb;
+
+--
+-- TOC entry 12264 (class 1259 OID 149024)
+-- Name: table_for_rule; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_rule OWNER TO enterprisedb;
+
+--
+-- TOC entry 12266 (class 1259 OID 149048)
+-- Name: table_for_trigger; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_trigger OWNER TO enterprisedb;
+
+--
+-- TOC entry 56893 (class 2606 OID 148904)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='12') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 56893
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56891 (class 2606 OID 148911)
+-- Name: table_for_constraints check_con; Type: CHECK CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE source.table_for_constraints
+ ADD CONSTRAINT check_con CHECK ((col1 > 10)) NOT VALID;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56891
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT check_con ON source.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 56899 (class 2606 OID 148970)
+-- Name: table_for_column table_for_column_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_column
+ ADD CONSTRAINT table_for_column_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56895 (class 2606 OID 148902)
+-- Name: table_for_constraints table_for_constraints_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT table_for_constraints_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 148984)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56913 (class 2606 OID 149135)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1, col2);
+
+
+--
+-- TOC entry 56909 (class 2606 OID 149031)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56907 (class 2606 OID 149011)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56911 (class 2606 OID 149055)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148913)
+-- Name: table_for_constraints unique; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "unique" UNIQUE (col1);
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 56897
+-- Name: CONSTRAINT "unique" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT "unique" ON source.table_for_constraints IS 'cmnt';
+
+
+--
+-- TOC entry 56900 (class 1259 OID 149023)
+-- Name: index1; Type: INDEX; Schema: source; Owner: enterprisedb
+--
+
+CREATE INDEX index1 ON source.table_for_index USING btree (col2 varchar_pattern_ops);
+
+
+--
+-- TOC entry 56905 (class 1259 OID 149012)
+-- Name: index_identical; Type: INDEX; Schema: source; Owner: enterprisedb
+--
+
+CREATE INDEX index_identical ON source.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56901 (class 1259 OID 149211)
+-- Name: index_same; Type: INDEX; Schema: source; Owner: enterprisedb
+--
+
+CREATE INDEX index_same ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56902 (class 1259 OID 149022)
+-- Name: index_source; Type: INDEX; Schema: source; Owner: enterprisedb
+--
+
+CREATE INDEX index_source ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 61044 (class 2618 OID 149032)
+-- Name: table_for_rule rule1; Type: RULE; Schema: source; Owner: enterprisedb
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO source.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61070 (class 0 OID 0)
+-- Dependencies: 61044
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON RULE rule1 ON source.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149033)
+-- Name: table_for_rule rule2; Type: RULE; Schema: source; Owner: enterprisedb
+--
+
+CREATE RULE rule2 AS
+ ON INSERT TO source.table_for_rule DO NOTHING;
diff --git a/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/target.sql b/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/target.sql
new file mode 100644
index 000000000..57ef05d6a
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/target.sql
@@ -0,0 +1,364 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:55:22 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- TOC entry 18 (class 2615 OID 139771)
+-- Name: target; Type: SCHEMA; Schema: -; Owner: enterprisedb
+--
+
+CREATE SCHEMA target;
+
+ALTER SCHEMA target OWNER TO enterprisedb;
+
+SET default_tablespace = '';
+
+CREATE EXTENSION btree_gist
+ SCHEMA target;
+
+--
+-- TOC entry 12250 (class 1259 OID 139938)
+-- Name: MView; Type: MATERIALIZED VIEW; Schema: target; Owner: enterprisedb
+--
+
+CREATE MATERIALIZED VIEW target."MView" AS
+ SELECT 'tekst'::text AS text
+ WITH NO DATA;
+
+
+ALTER TABLE target."MView" OWNER TO enterprisedb;
+
+--
+-- TOC entry 12277 (class 1259 OID 149234)
+-- Name: table_for_partition_1; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_partition_1 (
+ col1 bigint
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE target.table_for_partition_1 OWNER TO enterprisedb;
+
+--
+-- TOC entry 12278 (class 1259 OID 149237)
+-- Name: part3; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.part3 (
+ col1 bigint
+);
+ALTER TABLE ONLY target.table_for_partition_1 ATTACH PARTITION target.part3 FOR VALUES FROM ('13') TO ('56');
+
+
+ALTER TABLE target.part3 OWNER TO enterprisedb;
+
+--
+-- TOC entry 12259 (class 1259 OID 148971)
+-- Name: table_for_column; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_column (
+ col1 bigint,
+ col2 bigint,
+ col4 text
+);
+
+
+ALTER TABLE target.table_for_column OWNER TO enterprisedb;
+
+--
+-- TOC entry 12268 (class 1259 OID 149089)
+-- Name: table_for_constraints; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text,
+ CONSTRAINT check_con CHECK ((col1 > 30))
+);
+
+
+ALTER TABLE target.table_for_constraints OWNER TO enterprisedb;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: target; Owner: enterprisedb
+--
+
+COMMENT ON TABLE target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: target; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT check_con ON target.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 12257 (class 1259 OID 148960)
+-- Name: table_for_del; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_del (
+);
+
+
+ALTER TABLE target.table_for_del OWNER TO enterprisedb;
+
+--
+-- TOC entry 12271 (class 1259 OID 149172)
+-- Name: table_for_foreign_key; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_foreign_key (
+ col1 integer NOT NULL,
+ col2 "char",
+ col3 bigint
+);
+
+
+ALTER TABLE target.table_for_foreign_key OWNER TO enterprisedb;
+
+--
+-- TOC entry 12263 (class 1259 OID 149013)
+-- Name: table_for_identical; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_identical OWNER TO enterprisedb;
+
+--
+-- TOC entry 12261 (class 1259 OID 148986)
+-- Name: table_for_index; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_index OWNER TO enterprisedb;
+
+--
+-- TOC entry 12270 (class 1259 OID 149144)
+-- Name: table_for_primary_key; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE target.table_for_primary_key OWNER TO enterprisedb;
+
+--
+-- TOC entry 12265 (class 1259 OID 149034)
+-- Name: table_for_rule; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_rule OWNER TO enterprisedb;
+
+--
+-- TOC entry 12267 (class 1259 OID 149066)
+-- Name: table_for_trigger; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_trigger OWNER TO enterprisedb;
+
+
+--
+-- TOC entry 56906 (class 2606 OID 149097)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='15') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56906
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: target; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56910 (class 2606 OID 149176)
+-- Name: table_for_foreign_key table_for_foreign_key_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_foreign_key
+ ADD CONSTRAINT table_for_foreign_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148993)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56908 (class 2606 OID 149151)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56902 (class 2606 OID 149041)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56900 (class 2606 OID 149020)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 149073)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56893 (class 1259 OID 148994)
+-- Name: index1; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX index1 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56894 (class 1259 OID 148995)
+-- Name: index2; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX index2 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56898 (class 1259 OID 149021)
+-- Name: index_identical; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX index_identical ON target.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56895 (class 1259 OID 149212)
+-- Name: index_same; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX index_same ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56892 (class 1259 OID 139945)
+-- Name: mview_index; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX mview_index ON target."MView" USING btree (text text_pattern_ops);
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149042)
+-- Name: table_for_rule rule1; Type: RULE; Schema: target; Owner: enterprisedb
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO target.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 61045
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: target; Owner: enterprisedb
+--
+
+COMMENT ON RULE rule1 ON target.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61046 (class 2618 OID 149043)
+-- Name: table_for_rule rule2; Type: RULE; Schema: target; Owner: enterprisedb
+--
+
+CREATE RULE rule2 AS
+ ON UPDATE TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61047 (class 2618 OID 149044)
+-- Name: table_for_rule rule3; Type: RULE; Schema: target; Owner: enterprisedb
+--
+
+CREATE RULE rule3 AS
+ ON INSERT TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61050 (class 0 OID 139938)
+-- Dependencies: 12250 61062
+-- Name: MView; Type: MATERIALIZED VIEW DATA; Schema: target; Owner: enterprisedb
+--
+
+REFRESH MATERIALIZED VIEW target."MView";
diff --git a/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/source.sql b/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/source.sql
new file mode 100644
index 000000000..67ec216d6
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/source.sql
@@ -0,0 +1,311 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:54:15 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+
+--
+-- TOC entry 17 (class 2615 OID 139770)
+-- Name: source; Type: SCHEMA; Schema: -; Owner: enterprisedb
+--
+
+CREATE SCHEMA source;
+
+
+ALTER SCHEMA source OWNER TO enterprisedb;
+
+SET default_tablespace = '';
+
+
+CREATE EXTENSION btree_gist
+ SCHEMA source;
+
+
+--
+-- TOC entry 12258 (class 1259 OID 148963)
+-- Name: table_for_column; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_column (
+ col1 bigint NOT NULL,
+ col2 text,
+ col3 text
+);
+
+
+ALTER TABLE source.table_for_column OWNER TO enterprisedb;
+
+--
+-- TOC entry 12256 (class 1259 OID 148895)
+-- Name: table_for_constraints; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_constraints OWNER TO enterprisedb;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12256
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON TABLE source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 12262 (class 1259 OID 149004)
+-- Name: table_for_identical; Type: TABLE; Schema: source; Owner: enterprisedb;
+--
+
+CREATE TABLE source.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_identical OWNER TO enterprisedb;;
+
+--
+-- TOC entry 12260 (class 1259 OID 148977)
+-- Name: table_for_index; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_index OWNER TO enterprisedb;
+
+--
+-- TOC entry 12269 (class 1259 OID 149128)
+-- Name: table_for_primary_key; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE source.table_for_primary_key OWNER TO enterprisedb;
+
+--
+-- TOC entry 12264 (class 1259 OID 149024)
+-- Name: table_for_rule; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_rule OWNER TO enterprisedb;
+
+--
+-- TOC entry 12266 (class 1259 OID 149048)
+-- Name: table_for_trigger; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_trigger OWNER TO enterprisedb;
+
+--
+-- TOC entry 56893 (class 2606 OID 148904)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='12') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 56893
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56891 (class 2606 OID 148911)
+-- Name: table_for_constraints check_con; Type: CHECK CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE source.table_for_constraints
+ ADD CONSTRAINT check_con CHECK ((col1 > 10)) NOT VALID;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56891
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT check_con ON source.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 56899 (class 2606 OID 148970)
+-- Name: table_for_column table_for_column_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_column
+ ADD CONSTRAINT table_for_column_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56895 (class 2606 OID 148902)
+-- Name: table_for_constraints table_for_constraints_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT table_for_constraints_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 148984)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56913 (class 2606 OID 149135)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1, col2);
+
+
+--
+-- TOC entry 56909 (class 2606 OID 149031)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56907 (class 2606 OID 149011)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb;
+--
+
+ALTER TABLE ONLY source.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56911 (class 2606 OID 149055)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148913)
+-- Name: table_for_constraints unique; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "unique" UNIQUE (col1);
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 56897
+-- Name: CONSTRAINT "unique" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT "unique" ON source.table_for_constraints IS 'cmnt';
+
+
+--
+-- TOC entry 56900 (class 1259 OID 149023)
+-- Name: index1; Type: INDEX; Schema: source; Owner: enterprisedb
+--
+
+CREATE INDEX index1 ON source.table_for_index USING btree (col2 varchar_pattern_ops);
+
+
+--
+-- TOC entry 56905 (class 1259 OID 149012)
+-- Name: index_identical; Type: INDEX; Schema: source; Owner: enterprisedb;
+--
+
+CREATE INDEX index_identical ON source.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56901 (class 1259 OID 149211)
+-- Name: index_same; Type: INDEX; Schema: source; Owner: enterprisedb
+--
+
+CREATE INDEX index_same ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56902 (class 1259 OID 149022)
+-- Name: index_source; Type: INDEX; Schema: source; Owner: enterprisedb
+--
+
+CREATE INDEX index_source ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 61044 (class 2618 OID 149032)
+-- Name: table_for_rule rule1; Type: RULE; Schema: source; Owner: enterprisedb
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO source.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61070 (class 0 OID 0)
+-- Dependencies: 61044
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON RULE rule1 ON source.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149033)
+-- Name: table_for_rule rule2; Type: RULE; Schema: source; Owner: enterprisedb
+--
+
+CREATE RULE rule2 AS
+ ON INSERT TO source.table_for_rule DO NOTHING;
+
diff --git a/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/target.sql b/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/target.sql
new file mode 100644
index 000000000..f64765224
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/target.sql
@@ -0,0 +1,337 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:55:22 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+
+--
+-- TOC entry 18 (class 2615 OID 139771)
+-- Name: target; Type: SCHEMA; Schema: -; Owner: enterprisedb
+--
+
+CREATE SCHEMA target;
+
+
+ALTER SCHEMA target OWNER TO enterprisedb;
+
+SET default_tablespace = '';
+
+CREATE EXTENSION btree_gist
+ SCHEMA target;
+
+--
+-- TOC entry 12250 (class 1259 OID 139938)
+-- Name: MView; Type: MATERIALIZED VIEW; Schema: target; Owner: enterprisedb
+--
+
+CREATE MATERIALIZED VIEW target."MView" AS
+ SELECT 'tekst'::text AS text
+ WITH NO DATA;
+
+
+ALTER TABLE target."MView" OWNER TO enterprisedb;
+
+--
+-- TOC entry 12259 (class 1259 OID 148971)
+-- Name: table_for_column; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_column (
+ col1 bigint,
+ col2 bigint,
+ col4 text
+);
+
+
+ALTER TABLE target.table_for_column OWNER TO enterprisedb;
+
+--
+-- TOC entry 12268 (class 1259 OID 149089)
+-- Name: table_for_constraints; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text,
+ CONSTRAINT check_con CHECK ((col1 > 30))
+);
+
+
+ALTER TABLE target.table_for_constraints OWNER TO enterprisedb;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: target; Owner: enterprisedb
+--
+
+COMMENT ON TABLE target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: target; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT check_con ON target.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 12257 (class 1259 OID 148960)
+-- Name: table_for_del; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_del (
+);
+
+
+ALTER TABLE target.table_for_del OWNER TO enterprisedb;
+
+--
+-- TOC entry 12271 (class 1259 OID 149172)
+-- Name: table_for_foreign_key; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_foreign_key (
+ col1 integer NOT NULL,
+ col2 "char",
+ col3 bigint
+);
+
+
+ALTER TABLE target.table_for_foreign_key OWNER TO enterprisedb;
+
+--
+-- TOC entry 12263 (class 1259 OID 149013)
+-- Name: table_for_identical; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_identical OWNER TO enterprisedb;
+
+--
+-- TOC entry 12261 (class 1259 OID 148986)
+-- Name: table_for_index; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_index OWNER TO enterprisedb;
+
+--
+-- TOC entry 12270 (class 1259 OID 149144)
+-- Name: table_for_primary_key; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE target.table_for_primary_key OWNER TO enterprisedb;
+
+--
+-- TOC entry 12265 (class 1259 OID 149034)
+-- Name: table_for_rule; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_rule OWNER TO enterprisedb;
+
+--
+-- TOC entry 12267 (class 1259 OID 149066)
+-- Name: table_for_trigger; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_trigger OWNER TO enterprisedb;
+
+
+--
+-- TOC entry 56906 (class 2606 OID 149097)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='15') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56906
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: target; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56910 (class 2606 OID 149176)
+-- Name: table_for_foreign_key table_for_foreign_key_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_foreign_key
+ ADD CONSTRAINT table_for_foreign_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148993)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56908 (class 2606 OID 149151)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56902 (class 2606 OID 149041)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56900 (class 2606 OID 149020)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 149073)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56893 (class 1259 OID 148994)
+-- Name: index1; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX index1 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56894 (class 1259 OID 148995)
+-- Name: index2; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX index2 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56898 (class 1259 OID 149021)
+-- Name: index_identical; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX index_identical ON target.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56895 (class 1259 OID 149212)
+-- Name: index_same; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX index_same ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56892 (class 1259 OID 139945)
+-- Name: mview_index; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX mview_index ON target."MView" USING btree (text text_pattern_ops);
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149042)
+-- Name: table_for_rule rule1; Type: RULE; Schema: target; Owner: enterprisedb
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO target.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 61045
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: target; Owner: enterprisedb
+--
+
+COMMENT ON RULE rule1 ON target.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61046 (class 2618 OID 149043)
+-- Name: table_for_rule rule2; Type: RULE; Schema: target; Owner: enterprisedb
+--
+
+CREATE RULE rule2 AS
+ ON UPDATE TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61047 (class 2618 OID 149044)
+-- Name: table_for_rule rule3; Type: RULE; Schema: target; Owner: enterprisedb
+--
+
+CREATE RULE rule3 AS
+ ON INSERT TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61050 (class 0 OID 139938)
+-- Dependencies: 12250 61062
+-- Name: MView; Type: MATERIALIZED VIEW DATA; Schema: target; Owner: enterprisedb
+--
+
+REFRESH MATERIALIZED VIEW target."MView";
diff --git a/web/pgadmin/tools/schema_diff/tests/test_schema_diff_comp.py b/web/pgadmin/tools/schema_diff/tests/test_schema_diff_comp.py
new file mode 100644
index 000000000..3e790bc06
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/test_schema_diff_comp.py
@@ -0,0 +1,204 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import uuid
+import json
+import os
+import random
+
+from pgadmin.utils import server_utils as server_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression import parent_node_dict
+from regression.python_test_utils import test_utils as utils
+from .utils import create_table, create_schema, restore_schema
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.versioned_template_loader import \
+ get_version_mapping_directories
+
+
+class SchemaDiffTestCase(BaseTestGenerator):
+ """ This class will test the schema diff. """
+ scenarios = [
+ # Fetching default URL for database node.
+ ('Schema diff comparison', dict(
+ url='schema_diff/compare/{0}/{1}/{2}/{3}/{4}/{5}/{6}'))
+ ]
+
+ def setUp(self):
+ self.src_database = "db_schema_diff_src_%s" % str(uuid.uuid4())[1:8]
+ self.tar_database = "db_schema_diff_tar_%s" % str(uuid.uuid4())[1:8]
+
+ self.src_db_id = utils.create_database(self.server, self.src_database)
+ self.tar_db_id = utils.create_database(self.server, self.tar_database)
+
+ self.server = parent_node_dict["server"][-1]["server"]
+ self.server_id = parent_node_dict["server"][-1]["server_id"]
+ self.nodes = ['table', 'function', 'procedure', 'view', 'mview']
+ self.restore_backup()
+
+ def restore_backup(self):
+ self.sql_folder = self.get_sql_folder()
+
+ if self.sql_folder is None:
+ raise FileNotFoundError('Schema diff folder does not exists')
+
+ src_sql_path = os.path.join(self.sql_folder, 'source.sql')
+ tar_sql_path = os.path.join(self.sql_folder, 'target.sql')
+
+ if not os.path.exists(src_sql_path):
+ raise FileNotFoundError(
+ '{} file does not exists'.format(src_sql_path))
+
+ if not os.path.exists(tar_sql_path):
+ raise FileNotFoundError(
+ '{} file does not exists'.format(tar_sql_path))
+
+ self.src_schema_id = restore_schema(self.server, self.src_database,
+ 'source', src_sql_path)
+ self.tar_schema_id = restore_schema(self.server, self.tar_database,
+ 'target', tar_sql_path)
+
+ def get_sql_folder(self):
+ """
+ This function will get the appropriate test folder based on
+ server version and their existence.
+
+ :param module_path: Path of the module to be tested.
+ :return:
+ """
+ # Join the application path, module path and tests folder
+ tests_folder_path = os.path.dirname(os.path.abspath(__file__))
+
+ # A folder name matching the Server Type (pg, ppas) takes priority so
+ # check whether that exists or not. If so, than check the version
+ # folder in it, else look directly in the 'tests' folder.
+ absolute_path = os.path.join(tests_folder_path, self.server['type'])
+ if not os.path.exists(absolute_path):
+ absolute_path = tests_folder_path
+
+ # Iterate the version mapping directories.
+ for version_mapping in get_version_mapping_directories(
+ self.server['type']):
+ if version_mapping['number'] > \
+ self.server_information['server_version']:
+ continue
+
+ complete_path = os.path.join(absolute_path,
+ version_mapping['name'])
+
+ if os.path.exists(complete_path):
+ return complete_path
+
+ return None
+
+ def compare(self):
+ comp_url = self.url.format(self.trans_id, self.server_id,
+ self.src_db_id,
+ self.src_schema_id,
+ self.server_id,
+ self.tar_db_id,
+ self.tar_schema_id
+ )
+
+ response = self.tester.get(comp_url)
+
+ self.assertEquals(response.status_code, 200)
+ return json.loads(response.data.decode('utf-8'))
+
+ def runTest(self):
+ """ This function will test the schema diff."""
+
+ response = self.tester.get("schema_diff/initialize")
+ self.assertEquals(response.status_code, 200)
+ response_data = json.loads(response.data.decode('utf-8'))
+ self.trans_id = response_data['data']['schemaDiffTransId']
+
+ url = 'schema_diff/server/connect/{}'.format(self.server_id)
+ data = {'password': self.server['db_password']}
+ response = self.tester.post(url,
+ data=json.dumps(data),
+ content_type='html/json'
+ )
+ response = self.tester.post(
+ 'schema_diff/database/connect/{0}/{1}'.format(
+ self.server_id,
+ self.src_db_id))
+ response = self.tester.post(
+ 'schema_diff/database/connect/{0}/{1}'.format(
+ self.server_id,
+ self.tar_db_id))
+
+ response_data = self.compare()
+
+ diff_file = os.path.join(self.sql_folder, 'diff_{0}.sql'.format(
+ str(random.randint(1, 99999))))
+ file_obj = open(diff_file, 'a')
+
+ for diff in response_data['data']:
+ if diff['type'] in self.nodes:
+ src_obj_oid = tar_obj_oid = None
+ if diff['status'] == 'Source Only' or\
+ diff['status'] == 'Target Only':
+ src_obj_oid = tar_obj_oid = diff['oid']
+ elif diff['status'] == 'Different':
+ src_obj_oid = diff['source_oid']
+ tar_obj_oid = diff['target_oid']
+
+ if src_obj_oid is not None:
+ url = 'schema_diff/ddl_compare/{0}/{1}/{2}/{3}/{4}/{5}/' \
+ '{6}/{7}/{8}/{9}/{10}/'.format(self.trans_id,
+ self.server_id,
+ self.src_db_id,
+ self.src_schema_id,
+ self.server_id,
+ self.tar_db_id,
+ self.tar_schema_id,
+ src_obj_oid,
+ tar_obj_oid,
+ diff['type'],
+ diff['status']
+ )
+
+ response = self.tester.get(url)
+
+ self.assertEquals(response.status_code, 200)
+ response_data = json.loads(response.data.decode('utf-8'))
+ file_obj.write(response_data['diff_ddl'])
+
+ file_obj.close()
+ try:
+ restore_schema(self.server, self.tar_database, 'target',
+ diff_file)
+
+ os.remove(diff_file)
+
+ response_data = self.compare()
+ for diff in response_data['data']:
+ if diff['type'] in self.nodes:
+ self.assertEquals(diff['status'], 'Identical')
+ except Exception as e:
+ os.remove(diff_file)
+
+ def tearDown(self):
+ """This function drop the added database"""
+ connection = utils.get_db_connection(self.server['db'],
+ self.server['username'],
+ self.server['db_password'],
+ self.server['host'],
+ self.server['port'],
+ self.server['sslmode'])
+ utils.drop_database(connection, self.src_database)
+ connection = utils.get_db_connection(self.server['db'],
+ self.server['username'],
+ self.server['db_password'],
+ self.server['host'],
+ self.server['port'],
+ self.server['sslmode'])
+ utils.drop_database(connection, self.tar_database)
diff --git a/web/pgadmin/tools/schema_diff/tests/utils.py b/web/pgadmin/tools/schema_diff/tests/utils.py
new file mode 100644
index 000000000..ee513e490
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/utils.py
@@ -0,0 +1,103 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import sys
+import traceback
+
+from regression.python_test_utils import test_utils as utils
+from pgadmin.browser.server_groups.servers.databases.schemas.tests import \
+ utils as schema_utils
+
+
+def restore_schema(server, db_name, schema_name, sql_path):
+ connection = utils.get_db_connection(db_name,
+ server['username'],
+ server['db_password'],
+ server['host'],
+ server['port'],
+ server['sslmode']
+ )
+
+ old_isolation_level = connection.isolation_level
+ connection.set_isolation_level(0)
+ pg_cursor = connection.cursor()
+
+ sql = ''
+ with open(sql_path, 'r') as content_file:
+ sql = content_file.read()
+ pg_cursor.execute(sql)
+ connection.set_isolation_level(old_isolation_level)
+ connection.commit()
+
+ SQL = """SELECT
+ nsp.oid
+FROM
+ pg_namespace nsp
+ WHERE nsp.nspname = '{0}'""".format(schema_name)
+
+ pg_cursor.execute(SQL)
+ schema = pg_cursor.fetchone()
+ schema_id = None
+ if schema:
+ schema_id = schema[0]
+ connection.close()
+ return schema_id
+
+
+def create_schema(server, db_name, schema_name):
+ connection = utils.get_db_connection(db_name,
+ server['username'],
+ server['db_password'],
+ server['host'],
+ server['port'],
+ server['sslmode']
+ )
+ return schema_utils.create_schema(connection, schema_name)
+
+
+def create_table(server, db_name, schema_id, table_name, query):
+ """
+ This function creates a table under provided schema.
+ :param server: server details
+ :type server: dict
+ :param db_name: database name
+ :type db_name: str
+ :param schema_id: schema oid
+ :type schema_name: int
+ :param table_name: table name
+ :type table_name: str
+ :return table_id: table id
+ :rtype: int
+ """
+ try:
+ connection = utils.get_db_connection(db_name,
+ server['username'],
+ server['db_password'],
+ server['host'],
+ server['port'],
+ server['sslmode'])
+ old_isolation_level = connection.isolation_level
+ connection.set_isolation_level(0)
+ pg_cursor = connection.cursor()
+ pg_cursor.execute(query)
+ connection.set_isolation_level(old_isolation_level)
+ connection.commit()
+ # Get 'oid' from newly created table
+ pg_cursor.execute("SELECT oid FROM pg_class WHERE relname='{0}'"
+ " AND relnamespace = {1}".format(table_name,
+ schema_id))
+ table = pg_cursor.fetchone()
+ table_id = ''
+ if table:
+ table_id = table[0]
+ connection.close()
+ return table_id
+ except Exception:
+ traceback.print_exc(file=sys.stderr)
+ raise
diff --git a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
index 3e3554e8d..b0b8e7f4b 100644
--- a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
+++ b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
@@ -84,6 +84,8 @@ define('tools.querytool', [
this.handler.preferences = this.preferences;
this.connIntervalId = null;
this.layout = opts.layout;
+ this.set_server_version(opts.server_ver);
+ this.trigger('pgadmin-sqleditor:view:initialised');
},
// Bind all the events
@@ -2312,6 +2314,12 @@ define('tools.querytool', [
}
},
+ set_value_to_editor: function(query) {
+ if (this.gridView && this.gridView.query_tool_obj && !_.isUndefined(query)) {
+ this.gridView.query_tool_obj.setValue(query);
+ }
+ },
+
init_events: function() {
var self = this;
// Listen to the file manager button events
diff --git a/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/primary_keys.sql b/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/primary_keys.sql
index a96c928f6..d1e398579 100644
--- a/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/primary_keys.sql
+++ b/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/primary_keys.sql
@@ -4,5 +4,5 @@ SELECT at.attname, at.attnum, ty.typname
FROM pg_attribute at LEFT JOIN pg_type ty ON (ty.oid = at.atttypid)
WHERE attrelid={{obj_id}}::oid AND attnum = ANY (
(SELECT con.conkey FROM pg_class rel LEFT OUTER JOIN pg_constraint con ON con.conrelid=rel.oid
- AND con.contype='p' WHERE rel.relkind IN ('r','s','t') AND rel.oid = {{obj_id}}::oid)::oid[])
+ AND con.contype='p' WHERE rel.relkind IN ('r','s','t') AND rel.oid = ({{obj_id}})::oid)::oid[])
{% endif %}
diff --git a/web/pgadmin/tools/sqleditor/utils/get_column_types.py b/web/pgadmin/tools/sqleditor/utils/get_column_types.py
index 99bcb9fa8..74b2e2f60 100644
--- a/web/pgadmin/tools/sqleditor/utils/get_column_types.py
+++ b/web/pgadmin/tools/sqleditor/utils/get_column_types.py
@@ -35,12 +35,13 @@ def get_columns_types(is_query_tool, columns_info, table_oid, conn, has_oids):
column_types[col['name']] = col_type
if not is_query_tool:
- col_type['not_null'] = col['not_null'] = \
- rset['rows'][key]['not_null']
+ if key in rset['rows']:
+ col_type['not_null'] = col['not_null'] = \
+ rset['rows'][key]['not_null']
- col_type['has_default_val'] = \
- col['has_default_val'] = \
- rset['rows'][key]['has_default_val']
+ col_type['has_default_val'] = \
+ col['has_default_val'] = \
+ rset['rows'][key]['has_default_val']
else:
for row in rset['rows']:
diff --git a/web/pgadmin/utils/csrf.py b/web/pgadmin/utils/csrf.py
index dfeb3a6a9..02c2dc00f 100644
--- a/web/pgadmin/utils/csrf.py
+++ b/web/pgadmin/utils/csrf.py
@@ -34,6 +34,8 @@ class _PGCSRFProtect(CSRFProtect):
'pgadmin.tools.datagrid.panel',
'pgadmin.tools.debugger.initialize_target',
'pgadmin.tools.debugger.direct_new',
+ 'pgadmin.tools.schema_diff.panel',
+ 'pgadmin.tools.schema_diff.ddl_compare',
]
for exempt in exempt_views:
diff --git a/web/webpack.config.js b/web/webpack.config.js
index a6749a5ed..230172cf0 100644
--- a/web/webpack.config.js
+++ b/web/webpack.config.js
@@ -356,6 +356,7 @@ module.exports = [{
slickgrid: sourceDir + '/bundle/slickgrid.js',
sqleditor: './pgadmin/tools/sqleditor/static/js/sqleditor.js',
debugger_direct: './pgadmin/tools/debugger/static/js/direct.js',
+ schema_diff: './pgadmin/tools/schema_diff/static/js/schema_diff_hook.js',
file_utils: './pgadmin/misc/file_manager/static/js/utility.js',
'pgadmin.style': pgadminCssStyles,
pgadmin: pgadminScssStyles,
@@ -492,7 +493,8 @@ module.exports = [{
',pgadmin.tools.import_export' +
',pgadmin.tools.debugger.controller' +
',pgadmin.tools.debugger.direct' +
- ',pgadmin.node.pga_job',
+ ',pgadmin.node.pga_job' +
+ ',pgadmin.tools.schema_diff',
},
}, {
test: require.resolve('snapsvg'),
diff --git a/web/webpack.shim.js b/web/webpack.shim.js
index 2e2b7ed41..daa4c8e99 100644
--- a/web/webpack.shim.js
+++ b/web/webpack.shim.js
@@ -278,6 +278,8 @@ var webpackShimConfig = {
'pgadmin.tools.import_export': path.join(__dirname, './pgadmin/tools/import_export/static/js/import_export'),
'pgadmin.tools.maintenance': path.join(__dirname, './pgadmin/tools/maintenance/static/js/maintenance'),
'pgadmin.tools.restore': path.join(__dirname, './pgadmin/tools/restore/static/js/restore'),
+ 'pgadmin.tools.schema_diff': path.join(__dirname, './pgadmin/tools/schema_diff/static/js/schema_diff'),
+ 'pgadmin.tools.schema_diff_ui': path.join(__dirname, './pgadmin/tools/schema_diff/static/js/schema_diff_ui'),
'pgadmin.tools.user_management': path.join(__dirname, './pgadmin/tools/user_management/static/js/user_management'),
'pgadmin.user_management.current_user': '/user_management/current_user',
'slick.pgadmin.editors': path.join(__dirname, './pgadmin/tools/../static/js/slickgrid/editors'),
^ permalink raw reply [nested|flat] 10+ messages in thread
* Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures
2019-12-20 13:29 [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Akshay Joshi <[email protected]>
@ 2019-12-27 11:56 ` Aditya Toshniwal <[email protected]>
1 sibling, 0 replies; 10+ messages in thread
From: Aditya Toshniwal @ 2019-12-27 11:56 UTC (permalink / raw)
To: Akshay Joshi <[email protected]>; Khushboo Vashi <[email protected]>; +Cc: pgadmin-hackers
Hi Akshay/Khushboo,
I have few suggestions/questions for the attached patch:
1. Code like SchemaDiffRegistry('server', ServerNode) should be replaced
with SSchemaDiffRegistry(ServerModule.NODE_TYPE, ServerNode)
2. The variables return_ajax_response, only_sql, json_resp as far as I
understood are similar. Can we have same var name everywhere ?
3. Remove commented code -
web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
-> get_sql_from_table_diff
4. In
web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
-> fetch_tables - keys_to_remove is passed. How is it different from
keys_to_ignore used at other places ?
5. web/pgadmin/tools/schema_diff/__init__.py
-> check_version_compatibility has hardcoded version numbers. Can we
use get_version_mapping_directories from
web/pgadmin/utils/versioned_template_loader.py ?
6. Rename .reallyHidden to .really-hidden
7. CSS class #schema-diff-grid -> background: white; - hardcoded color
can be changed to use $color-bg instead. Also use rem or px for -
font-size: 9pt.
8. .slick-group-toggle.collapsed, .slick-group-toggle.expanded - svgs
are not required. Font awesome has the icons. refer - .obj_properties
.collapsed .caret::before.
9. In web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js ->
formatNode - Appends can be avoided and formed in a single statement.
+ } else {
+ return $('<span></span>').append(
+ $('<span></span>', {
+ class: 'wcTabIcon ' + optimage,
+ })
+ ).append($('<span></span>').text(opt.text));
+ }
+};
10. In web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js
-> fetchData - We should not use async = false.
+ $.ajax({
+ async: false,
+ url: url,
+ })
11. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js -
Use 'sources/window' - pgWindow.
+ let preferences = (window.opener !== null) ?
window.opener.pgAdmin.Browser.get_preferences_for_module('schema_diff') :
window.top.pgAdmin.Browser.get_preferences_for_module('schema_diff');
12. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js - Use
map instead of for loop. It will also remove the sel_rows_data.push. will
be helpfull in large data.
+ for (var row = 0; row < sel_rows.length; row++) {
+ let data = self.grid.getData().getItem(sel_rows[row]);
+
+ if (data.type) {
+ let tmp_data = {
+ 'node_type': data.type,
+ 'source_oid': parseInt(data.oid, 10),
+ 'target_oid': parseInt(data.oid, 10),
+ 'comp_status': data.status,
+ };
+
+ if(data.status && (data.status.toLowerCase() == 'different'
|| data.status.toLowerCase() == 'identical')) {
+ tmp_data['target_oid'] = data.target_oid;
+ }
+ sel_rows_data.push(tmp_data);
+ }
+ }
+
+ url_params['sel_rows'] = sel_rows_data;
13. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js -Are we
doing anything to handle failure.
+ connect_database(server_id, db_id, callback) {
+ var url = url_for('schema_diff.connect_database', {'sid':
server_id, 'did': db_id});
+ $.post(url)
+ .done(function(res) {
+ if (res.success && res.data) {
+ callback(res.data);
+ }
+ })
+ .fail(function() {
+ // Fail
+ });
+
+ }
14. As you've added a completely different function for connect_server,
I would suggest to rename dlgServerPass to a different name to avoid
conflict with existing dlgServerPass in server.js
+ if (!Alertify.dlgServerPass) {
+ Alertify.dialog('dlgServerPass', function factory() {
15. Generate script does not work if pgAdmin opened in iframe. Iframes
are used by tools like Katacoda.
[image: Screenshot 2019-12-27 at 16.40.47.png]
16. Comparing objects loader is not attached to DDL Comparison panel.
[image: compare_overlay.png]
17. Filter icon and Generate script icon size are different. Also change
icons CSS to use font-icon. You can refer icons from sqleditor.
[image: Screenshot 2019-12-27 at 12.18.00.png]
*The fetch_objects_to_compare function used in each node uses loop to fetch
data. Although it is working for now, but I would suggest using bulk fetch
nodes instead of looping through all the nodes one by one.*
On Fri, Dec 27, 2019 at 4:55 PM Aditya Toshniwal <
[email protected]> wrote:
> Hi Akshay/Khushboo,
>
> I have few suggestions/questions for the attached patch:
>
> 1. Code like SchemaDiffRegistry('server', ServerNode) should be
> replaced with SSchemaDiffRegistry(ServerModule.NODE_TYPE, ServerNode)
> 2. The variables return_ajax_response, only_sql, json_resp as far as I
> understood are similar. Can we have same var name everywhere ?
> 3. Remove commented code -
> web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
> -> get_sql_from_table_diff
> 4. In
> web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
> -> fetch_tables - keys_to_remove is passed. How is it different from
> keys_to_ignore used at other places ?
> 5. web/pgadmin/tools/schema_diff/__init__.py
> -> check_version_compatibility has hardcoded version numbers. Can we
> use get_version_mapping_directories from
> web/pgadmin/utils/versioned_template_loader.py ?
> 6. Rename .reallyHidden to .really-hidden
> 7. CSS class #schema-diff-grid -> background: white; - hardcoded
> color can be changed to use $color-bg instead. Also use rem or px for -
> font-size: 9pt.
> 8. .slick-group-toggle.collapsed, .slick-group-toggle.expanded - svgs
> are not required. Font awesome has the icons. refer - .obj_properties
> .collapsed .caret::before.
> 9. In web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js
> -> formatNode - Appends can be avoided and formed in a single statement.
> + } else {
> + return $('<span></span>').append(
> + $('<span></span>', {
> + class: 'wcTabIcon ' + optimage,
> + })
> + ).append($('<span></span>').text(opt.text));
> + }
> +};
> 10. In web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js
> -> fetchData - We should not use async = false.
> + $.ajax({
> + async: false,
> + url: url,
> + })
> 11. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js -
> Use 'sources/window' - pgWindow.
> + let preferences = (window.opener !== null) ?
> window.opener.pgAdmin.Browser.get_preferences_for_module('schema_diff') :
> window.top.pgAdmin.Browser.get_preferences_for_module('schema_diff');
> 12. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js - Use
> map instead of for loop. It will also remove the sel_rows_data.push. will
> be helpfull in large data.
> + for (var row = 0; row < sel_rows.length; row++) {
> + let data = self.grid.getData().getItem(sel_rows[row]);
> +
> + if (data.type) {
> + let tmp_data = {
> + 'node_type': data.type,
> + 'source_oid': parseInt(data.oid, 10),
> + 'target_oid': parseInt(data.oid, 10),
> + 'comp_status': data.status,
> + };
> +
> + if(data.status && (data.status.toLowerCase() == 'different'
> || data.status.toLowerCase() == 'identical')) {
> + tmp_data['target_oid'] = data.target_oid;
> + }
> + sel_rows_data.push(tmp_data);
> + }
> + }
> +
> + url_params['sel_rows'] = sel_rows_data;
> 13. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js -Are
> we doing anything to handle failure.
> + connect_database(server_id, db_id, callback) {
> + var url = url_for('schema_diff.connect_database', {'sid':
> server_id, 'did': db_id});
> + $.post(url)
> + .done(function(res) {
> + if (res.success && res.data) {
> + callback(res.data);
> + }
> + })
> + .fail(function() {
> + // Fail
> + });
> +
> + }
> 14. As you've added a completely different function for
> connect_server, I would suggest to rename dlgServerPass to a different name
> to avoid conflict with existing dlgServerPass in server.js
> + if (!Alertify.dlgServerPass) {
> + Alertify.dialog('dlgServerPass', function factory() {
> 15. Generate script does not work if pgAdmin opened in iframe. Iframes
> are used by tools like Katacoda.
> [image: Screenshot 2019-12-27 at 16.40.47.png]
> 16. Comparing objects loader is not attached to DDL Comparison panel.
> [image: compare_overlay.png]
> 17. Filter icon and Generate script icon size are different. Also
> change icons CSS to use font-icon. You can refer icons from sqleditor.
> [image: Screenshot 2019-12-27 at 12.18.00.png]
>
> *The fetch_objects_to_compare function used in each node uses loop to
> fetch data. Although it is working for now, but I would suggest using bulk
> fetch nodes instead of looping through all the nodes one by one.*
>
> On Fri, Dec 20, 2019 at 6:59 PM Akshay Joshi <
> [email protected]> wrote:
>
>> Hi Hackers,
>>
>> Attached is the implementation of the new feature Schema Diff Tool.
>> Initial work(backend code to compare the objects) has been done by me and
>> then most of the task has been completed by *Khushboo Vashi. *Sending
>> the patch on behalf of her*.*
>>
>> Currently, this tool only supports Tables, Views, Materialized Views,
>> Functions and Procedures node.
>>
>> Please review and test it thoroughly. Suggestions are welcome to improve
>> the tool.
>>
>> --
>> *Thanks & Regards*
>> *Akshay Joshi*
>>
>> *Sr. Software Architect*
>> *EnterpriseDB Software India Private Limited*
>> *Mobile: +91 976-788-8246*
>>
>
>
> --
> Thanks and Regards,
> Aditya Toshniwal
> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune
> "Don't Complain about Heat, Plant a TREE"
>
--
Thanks and Regards,
Aditya Toshniwal
pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune
"Don't Complain about Heat, Plant a TREE"
Attachments:
[image/png] Screenshot 2019-12-27 at 12.18.00.png (47.9K, 3-Screenshot%202019-12-27%20at%2012.18.00.png)
download | view image
[image/png] Screenshot 2019-12-27 at 16.40.47.png (395.3K, 4-Screenshot%202019-12-27%20at%2016.40.47.png)
download | view image
[image/png] compare_overlay.png (411.6K, 5-compare_overlay.png)
download | view image
^ permalink raw reply [nested|flat] 10+ messages in thread
* Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures
2019-12-20 13:29 [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Akshay Joshi <[email protected]>
@ 2020-01-02 06:34 ` Khushboo Vashi <[email protected]>
2020-01-02 08:34 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Chethana Kumar <[email protected]>
2020-01-02 09:13 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Aditya Toshniwal <[email protected]>
1 sibling, 2 replies; 10+ messages in thread
From: Khushboo Vashi @ 2020-01-02 06:34 UTC (permalink / raw)
To: Aditya Toshniwal <[email protected]>; Chethana Kumar <[email protected]>; +Cc: Akshay Joshi <[email protected]>; pgadmin-hackers
Hi Aditya,
Thanks for the review. Please find the inline response.
Also, the updated patch attached.
On Fri, Dec 27, 2019 at 4:55 PM Aditya Toshniwal <
[email protected]> wrote:
> Hi Akshay/Khushboo,
>
> I have few suggestions/questions for the attached patch:
>
> 1. Code like SchemaDiffRegistry('server', ServerNode) should be
> replaced with SSchemaDiffRegistry(ServerModule.NODE_TYPE, ServerNode)
>
> Done
>
> 1. The variables return_ajax_response, only_sql, json_resp as far as I
> understood are similar. Can we have same var name everywhere ?
>
> only_sql is used when I need only SQL but not to be executed in the
backend. json_resp is used to have the plain text/json response.
>
> 1. Remove commented code -
> web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
> -> get_sql_from_table_diff
>
> Done
>
> 1. In
> web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
> -> fetch_tables - keys_to_remove is passed. How is it different from
> keys_to_ignore used at other places ?
>
> keys_to_remove used to remove the table properties before comparison as we
combine all child nodes of the table while comparing and keys_to_ignore is
to ignore the keys while comparing. We have also used the keys_to_ignore in
the table node itself.
>
> 1. web/pgadmin/tools/schema_diff/__init__.py
> -> check_version_compatibility has hardcoded version numbers. Can we
> use get_version_mapping_directories from
> web/pgadmin/utils/versioned_template_loader.py ?
>
> I have checked the possibilities before using it in the schema diff. The *
purpose and the return values * are different for both the files.
>
> 1. Rename .reallyHidden to .really-hidden
>
> Done
>
> 1. CSS class #schema-diff-grid -> background: white; - hardcoded
> color can be changed to use $color-bg instead. Also use rem or px for -
> font-size: 9pt.
>
> Done
>
> 1.
> 2. .slick-group-toggle.collapsed, .slick-group-toggle.expanded - svgs
> are not required. Font awesome has the icons. refer - .obj_properties
> .collapsed .caret::before.
>
> Done
>
> 1.
> 2. In web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js
> -> formatNode - Appends can be avoided and formed in a single statement.
> + } else {
> + return $('<span></span>').append(
> + $('<span></span>', {
> + class: 'wcTabIcon ' + optimage,
> + })
> + ).append($('<span></span>').text(opt.text));
> + }
> +};
>
> Any harm in this approach?
>
> 1.
> 2. In web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js
> -> fetchData - We should not use async = false.
> + $.ajax({
> + async: false,
> + url: url,
> + })
> 3. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js -
> Use 'sources/window' - pgWindow.
>
>
> 1. + let preferences = (window.opener !== null) ?
> window.opener.pgAdmin.Browser.get_preferences_for_module('schema_diff') :
> window.top.pgAdmin.Browser.get_preferences_for_module('schema_diff');
>
> Done
>
> 1. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js - Use
> map instead of for loop. It will also remove the sel_rows_data.push. will
> be helpfull in large data.
> + for (var row = 0; row < sel_rows.length; row++) {
> + let data = self.grid.getData().getItem(sel_rows[row]);
> +
> + if (data.type) {
> + let tmp_data = {
> + 'node_type': data.type,
> + 'source_oid': parseInt(data.oid, 10),
> + 'target_oid': parseInt(data.oid, 10),
> + 'comp_status': data.status,
> + };
> +
> + if(data.status && (data.status.toLowerCase() == 'different'
> || data.status.toLowerCase() == 'identical')) {
> + tmp_data['target_oid'] = data.target_oid;
> + }
> + sel_rows_data.push(tmp_data);
> + }
> + }
> +
> + url_params['sel_rows'] = sel_rows_data;
>
> This is a debatable topic as there are pros and cons of both map and for
loop. Like, it's more readable if we use map and in case of for loop,
chrome and firefox will be more happy in terms of performance.
>
> 1.
> 2. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js -Are
> we doing anything to handle failure.
> + connect_database(server_id, db_id, callback) {
> + var url = url_for('schema_diff.connect_database', {'sid':
> server_id, 'did': db_id});
> + $.post(url)
> + .done(function(res) {
> + if (res.success && res.data) {
> + callback(res.data);
> + }
> + })
> + .fail(function() {
> + // Fail
> + });
> +
> + }
>
> Forgot to handle, now added.
>
> 1.
> 2. As you've added a completely different function for connect_server,
> I would suggest to rename dlgServerPass to a different name to avoid
> conflict with existing dlgServerPass in server.js
> + if (!Alertify.dlgServerPass) {
> + Alertify.dialog('dlgServerPass', function factory() {
>
> As we open the schema diff in different frame, I think, this should not be
the issue.
>
> 1.
> 2. Generate script does not work if pgAdmin opened in iframe. Iframes
> are used by tools like Katacoda.
> [image: Screenshot 2019-12-27 at 16.40.47.png]
>
> Fixed, good catch.
>
> 1.
> 2. Comparing objects loader is not attached to DDL Comparison panel.
> [image: compare_overlay.png]
>
> Fixed.
>
> 1.
> 2. Filter icon and Generate script icon size are different. Also
> change icons CSS to use font-icon. You can refer icons from sqleditor.
> [image: Screenshot 2019-12-27 at 12.18.00.png]
>
> The problem is, for the generate script icon, I have used the svg (as no
similar icon in font-awesome) whereas for Filter, font-awesome is used. I
can replace the Generate Script icon from font-awesome (can search for some
similar icon) if Chetana agrees.
@Chethana Kumar <[email protected]> , please have a look.
https://fontawesome.com/v4.7.0/icon/file-code-o
https://fontawesome.com/v4.7.0/icon/file-text-o
>
> 1.
>
> *The fetch_objects_to_compare function used in each node uses loop to
> fetch data. Although it is working for now, but I would suggest using bulk
> fetch nodes instead of looping through all the nodes one by one.*
>
Can you please elaborate the approach which you are suggesting?
Thanks,
Khushboo
>
> On Fri, Dec 20, 2019 at 6:59 PM Akshay Joshi <
> [email protected]> wrote:
>
>> Hi Hackers,
>>
>> Attached is the implementation of the new feature Schema Diff Tool.
>> Initial work(backend code to compare the objects) has been done by me and
>> then most of the task has been completed by *Khushboo Vashi. *Sending
>> the patch on behalf of her*.*
>>
>> Currently, this tool only supports Tables, Views, Materialized Views,
>> Functions and Procedures node.
>>
>> Please review and test it thoroughly. Suggestions are welcome to improve
>> the tool.
>>
>> --
>> *Thanks & Regards*
>> *Akshay Joshi*
>>
>> *Sr. Software Architect*
>> *EnterpriseDB Software India Private Limited*
>> *Mobile: +91 976-788-8246*
>>
>
>
> --
> Thanks and Regards,
> Aditya Toshniwal
> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune
> "Don't Complain about Heat, Plant a TREE"
>
Attachments:
[image/png] Screenshot 2019-12-27 at 12.18.00.png (47.9K, 3-Screenshot%202019-12-27%20at%2012.18.00.png)
download | view image
[image/png] Screenshot 2019-12-27 at 16.40.47.png (395.3K, 4-Screenshot%202019-12-27%20at%2016.40.47.png)
download | view image
[image/png] compare_overlay.png (411.6K, 5-compare_overlay.png)
download | view image
[application/octet-stream] RM_3452_v1.patch (436.1K, 6-RM_3452_v1.patch)
download | inline diff:
diff --git a/docs/en_US/release_notes_4_17.rst b/docs/en_US/release_notes_4_17.rst
index 23db4c15c..74feab25b 100644
--- a/docs/en_US/release_notes_4_17.rst
+++ b/docs/en_US/release_notes_4_17.rst
@@ -31,4 +31,4 @@ Bug fixes
| `Issue #5004 <https://redmine.postgresql.org/issues/5004>`_ - Fix vulnerability issues reported by 'yarn audit'. Replace the deprecated uglifyjs-webpack-plugin with a terser-webpack-plugin.
| `Issue #5008 <https://redmine.postgresql.org/issues/5008>`_ - Ensure that the error message should not be displayed if Tablespace is not selected while creating the index.
| `Issue #5009 <https://redmine.postgresql.org/issues/5009>`_ - Fix an issue where operator, access method and operator class is not visible for exclusion constraints.
-| `Issue #5047 <https://redmine.postgresql.org/issues/5047>`_ - Added tab navigation for tabs under explain panel in query tool.
\ No newline at end of file
+| `Issue #5047 <https://redmine.postgresql.org/issues/5047>`_ - Added tab navigation for tabs under explain panel in query tool.
diff --git a/web/pgadmin/browser/server_groups/servers/__init__.py b/web/pgadmin/browser/server_groups/servers/__init__.py
index a813f7a7c..9117a4cc4 100644
--- a/web/pgadmin/browser/server_groups/servers/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/__init__.py
@@ -28,6 +28,7 @@ from pgadmin.model import db, Server, ServerGroup, User
from pgadmin.utils.driver import get_driver
from pgadmin.utils.master_password import get_crypt_key
from pgadmin.utils.exception import CryptKeyMissing
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
from psycopg2 import Error as psycopg2_Error, OperationalError
@@ -1627,4 +1628,5 @@ class ServerNode(PGChildNodeView):
)
+SchemaDiffRegistry(blueprint.node_type, ServerNode)
ServerNode.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/__init__.py
index c4cb71a11..ca046d08c 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/__init__.py
@@ -30,6 +30,8 @@ from pgadmin.utils.ajax import make_json_response, \
make_response as ajax_response, internal_server_error, unauthorized
from pgadmin.utils.driver import get_driver
from pgadmin.tools.sqleditor.utils.query_history import QueryHistory
+
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
from pgadmin.model import Server
@@ -1111,4 +1113,5 @@ class DatabaseView(PGChildNodeView):
)
+SchemaDiffRegistry(blueprint.node_type, DatabaseView)
DatabaseView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py
index 72c2df5a9..4ef560b61 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py
@@ -23,6 +23,7 @@ from pgadmin.browser.utils import PGChildNodeView
from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone, bad_request
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
"""
This module is responsible for generating two nodes
@@ -1023,5 +1024,6 @@ It may have been removed by another user.
return ajax_response(response=SQL.strip("\n"))
+SchemaDiffRegistry(schema_blueprint.node_type, SchemaView)
SchemaView.register_node_view(schema_blueprint)
CatalogView.register_node_view(catalog_blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py
index dd6064573..fac184fd5 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py
@@ -25,6 +25,8 @@ from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.compile_template_name import compile_template_path
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -92,7 +94,7 @@ class CollationModule(SchemaChildModule):
blueprint = CollationModule(__name__)
-class CollationView(PGChildNodeView):
+class CollationView(PGChildNodeView, SchemaDiffObjectCompare):
"""
This class is responsible for generating routes for Collation node
@@ -144,6 +146,10 @@ class CollationView(PGChildNodeView):
* dependent(gid, sid, did, scid):
- This function will generate dependent list to show it in dependent
pane for the selected Collation node.
+
+ * compare(**kwargs):
+ - This function will compare the collation nodes from two different
+ schemas.
"""
node_type = blueprint.node_type
@@ -172,7 +178,8 @@ class CollationView(PGChildNodeView):
'dependency': [{'get': 'dependencies'}],
'dependent': [{'get': 'dependents'}],
'get_collations': [{'get': 'get_collation'},
- {'get': 'get_collation'}]
+ {'get': 'get_collation'}],
+ 'compare': [{'get': 'compare'}, {'get': 'compare'}]
})
def check_precondition(f):
@@ -318,23 +325,36 @@ class CollationView(PGChildNodeView):
JSON of selected collation node
"""
+ status, res = self._fetch_properties(scid, coid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, coid):
+ """
+ This function fetch the properties for the specified object.
+
+ :param scid: Schema ID
+ :param coid: Collation ID
+ """
+
SQL = render_template("/".join([self.template_path,
'properties.sql']),
scid=scid, coid=coid)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(
- gettext("Could not find the collation object in the database.")
- )
+ return False, gone(gettext("Could not find the collation "
+ "object in the database."))
- return ajax_response(
- response=res['rows'][0],
- status=200
- )
+ return True, res['rows'][0]
@check_precondition
def get_collation(self, gid, sid, did, scid, coid=None):
@@ -748,5 +768,30 @@ class CollationView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the collations for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
CollationView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py
index 20e477986..6fdcace84 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py
@@ -27,6 +27,8 @@ from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.compile_template_name import compile_template_path
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -79,7 +81,7 @@ class DomainModule(SchemaChildModule):
blueprint = DomainModule(__name__)
-class DomainView(PGChildNodeView, DataTypeReader):
+class DomainView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare):
"""
class DomainView
@@ -138,6 +140,10 @@ class DomainView(PGChildNodeView, DataTypeReader):
* types(gid, sid, did, scid, fnid=None):
- Returns Data Types.
+
+ * compare(**kwargs):
+ - This function will compare the domain nodes from two different
+ schemas.
"""
node_type = blueprint.node_type
@@ -169,7 +175,8 @@ class DomainView(PGChildNodeView, DataTypeReader):
'get_collations': [
{'get': 'get_collations'},
{'get': 'get_collations'}
- ]
+ ],
+ 'compare': [{'get': 'compare'}, {'get': 'compare'}]
})
def validate_request(f):
@@ -369,15 +376,31 @@ class DomainView(PGChildNodeView, DataTypeReader):
scid: Schema Id
doid: Domain Id
"""
+ status, res = self._fetch_properties(did, scid, doid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+ def _fetch_properties(self, did, scid, doid):
+ """
+ This function is used to fecth the properties of specified object.
+ :param did:
+ :param scid:
+ :param doid:
+ :return:
+ """
SQL = render_template("/".join([self.template_path, 'properties.sql']),
scid=scid, doid=doid)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(gettext("""
+ return False, gone(gettext("""
Could not find the domain in the database.
It may have been removed by another user or moved to another schema.
"""))
@@ -393,7 +416,7 @@ It may have been removed by another user or moved to another schema.
doid=doid)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
data['constraints'] = res['rows']
@@ -406,10 +429,7 @@ It may have been removed by another user or moved to another schema.
if doid <= self.manager.db_info[did]['datlastsysoid']:
data['sysdomain'] = True
- return ajax_response(
- response=data,
- status=200
- )
+ return True, data
def _parse_type(self, basetype):
"""
@@ -664,7 +684,7 @@ AND relkind != 'c'))"""
)
@check_precondition
- def sql(self, gid, sid, did, scid, doid=None):
+ def sql(self, gid, sid, did, scid, doid=None, return_ajax_response=True):
"""
Returns the SQL for the Domain object.
@@ -674,6 +694,7 @@ AND relkind != 'c'))"""
did: Database Id
scid: Schema Id
doid: Domain Id
+ return_ajax_response:
"""
SQL = render_template("/".join([self.template_path,
@@ -716,6 +737,9 @@ AND relkind != 'c'))"""
""".format(self.qtIdent(self.conn, data['basensp'], data['name']))
SQL = sql_header + SQL
+ if not return_ajax_response:
+ return SQL.strip('\n')
+
return ajax_response(response=SQL.strip('\n'))
@check_precondition
@@ -846,5 +870,40 @@ AND relkind != 'c'))"""
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the domains for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'node.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(did, scid, row['oid'])
+
+ if status:
+ if 'constraints' in data and len(data['constraints']) > 0:
+ for item in data['constraints']:
+ # Remove keys that should not be the part
+ # of comparision.
+ if 'conoid' in item:
+ item.pop('conoid')
+ if 'nspname' in item:
+ item.pop('nspname')
+
+ res[row['name']] = data
+
+ return res
+
DomainView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/9.2_plus/get_constraints.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/9.2_plus/get_constraints.sql
index df956bf9a..676c5a6e2 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/9.2_plus/get_constraints.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/9.2_plus/get_constraints.sql
@@ -8,7 +8,7 @@ JOIN
JOIN
pg_namespace nl ON nl.oid=typnamespace
LEFT OUTER JOIN
- pg_description des ON (des.objoid=t.oid AND des.classoid='pg_constraint'::regclass)
+ pg_description des ON (des.objoid=c.oid AND des.classoid='pg_constraint'::regclass)
WHERE
contype = 'c' AND contypid = {{doid}}::oid
ORDER BY
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/default/get_constraints.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/default/get_constraints.sql
index 897fb2477..b99f855a8 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/default/get_constraints.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/default/get_constraints.sql
@@ -8,7 +8,7 @@ JOIN
JOIN
pg_namespace nl ON nl.oid=typnamespace
LEFT OUTER JOIN
- pg_description des ON (des.objoid=t.oid AND des.classoid='pg_constraint'::regclass)
+ pg_description des ON (des.objoid=c.oid AND des.classoid='pg_constraint'::regclass)
WHERE
contype = 'c'
AND contypid = {{doid}}::oid
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py
index 75702a557..1be76c906 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py
@@ -32,6 +32,8 @@ from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.compile_template_name import compile_template_path
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -93,7 +95,8 @@ class ForeignTableModule(SchemaChildModule):
blueprint = ForeignTableModule(__name__)
-class ForeignTableView(PGChildNodeView, DataTypeReader):
+class ForeignTableView(PGChildNodeView, DataTypeReader,
+ SchemaDiffObjectCompare):
"""
class ForeignTableView(PGChildNodeView)
@@ -174,6 +177,9 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
* delete_sql(gid, sid, did, scid, foid):
- Returns sql for Script
+ * compare(**kwargs):
+ - This function will compare the foreign table nodes from two different
+ schemas.
"""
node_type = blueprint.node_type
@@ -213,7 +219,8 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
'select_sql': [{'get': 'select_sql'}],
'insert_sql': [{'get': 'insert_sql'}],
'update_sql': [{'get': 'update_sql'}],
- 'delete_sql': [{'get': 'delete_sql'}]
+ 'delete_sql': [{'get': 'delete_sql'}],
+ 'compare': [{'get': 'compare'}, {'get': 'compare'}]
})
def validate_request(f):
@@ -447,11 +454,9 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
scid: Schema Id
foid: Foreign Table Id
"""
- data = self._fetch_properties(gid, sid, did, scid, foid)
- if data is False:
- return gone(
- gettext("Could not find the foreign table on the server.")
- )
+ status, data = self._fetch_properties(gid, sid, did, scid, foid)
+ if not status:
+ return data
return ajax_response(
response=data,
@@ -814,11 +819,10 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
scid: Schema Id
foid: Foreign Table Id
"""
- data = self._fetch_properties(gid, sid, did, scid, foid, inherits=True)
- if data is False:
- return gone(
- gettext("Could not find the foreign table on the server.")
- )
+ status, data = self._fetch_properties(gid, sid, did, scid, foid,
+ inherits=True)
+ if not status:
+ return data
col_data = []
for c in data['columns']:
@@ -891,12 +895,10 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
foid: Foreign Table Id
"""
if foid is not None:
- old_data = self._fetch_properties(gid, sid, did, scid, foid,
- inherits=True)
- if old_data is False:
- return gone(
- gettext("Could not find the foreign table on the server.")
- )
+ status, old_data = self._fetch_properties(gid, sid, did, scid,
+ foid, inherits=True)
+ if not status:
+ return old_data
# Prepare dict of columns with key = column's attnum
# Will use this in the update template when any column is
@@ -1051,10 +1053,10 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
scid=scid, foid=foid)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return False
+ return False, False
data = res['rows'][0]
@@ -1064,7 +1066,7 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
foid=foid)
status, aclres = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=aclres)
+ return False, internal_server_error(errormsg=aclres)
# Get Formatted Privileges
data.update(self._format_proacl_from_db(aclres['rows']))
@@ -1082,7 +1084,7 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
'get_constraints.sql']), foid=foid)
status, cons = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=cons)
+ return False, internal_server_error(errormsg=cons)
if cons and 'rows' in cons:
data['constraints'] = cons['rows']
@@ -1091,7 +1093,7 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
'get_columns.sql']), foid=foid)
status, cols = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=cols)
+ return False, internal_server_error(errormsg=cols)
# The Length and the precision of the Datatype should be separated.
# The Format we getting from database is: numeric(1,1)
@@ -1128,12 +1130,12 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if 'inherits' in res['rows'][0]:
data['inherits'] = res['rows'][0]['inherits']
- return data
+ return True, data
@staticmethod
def convert_precision_to_int(typlen):
@@ -1222,11 +1224,9 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
Returns:
SELECT Script sql for the object
"""
- data = self._fetch_properties(gid, sid, did, scid, foid)
- if data is False:
- return gone(
- gettext("Could not find the foreign table on the server.")
- )
+ status, data = self._fetch_properties(gid, sid, did, scid, foid)
+ if not status:
+ return data
columns = []
for c in data['columns']:
@@ -1259,11 +1259,9 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
Returns:
INSERT Script sql for the object
"""
- data = self._fetch_properties(gid, sid, did, scid, foid)
- if data is False:
- return gone(
- gettext("Could not find the foreign table on the server.")
- )
+ status, data = self._fetch_properties(gid, sid, did, scid, foid)
+ if not status:
+ return data
columns = []
values = []
@@ -1301,11 +1299,9 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
Returns:
UPDATE Script sql for the object
"""
- data = self._fetch_properties(gid, sid, did, scid, foid)
- if data is False:
- return gone(
- gettext("Could not find the foreign table on the server.")
- )
+ status, data = self._fetch_properties(gid, sid, did, scid, foid)
+ if not status:
+ return data
columns = []
@@ -1346,11 +1342,9 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
Returns:
DELETE Script sql for the object
"""
- data = self._fetch_properties(gid, sid, did, scid, foid)
- if data is False:
- return gone(
- gettext("Could not find the foreign table on the server.")
- )
+ status, data = self._fetch_properties(gid, sid, did, scid, foid)
+ if not status:
+ return data
sql = u"DELETE FROM {0}\n\tWHERE <condition>;".format(
self.qtIdent(self.conn, data['basensp'], data['name'])
@@ -1358,5 +1352,37 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
return ajax_response(response=sql)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the foreign tables for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'node.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(0, sid, did, scid,
+ row['oid'])
+ if status:
+ if 'constraints' in data and data['constraints'] is not None \
+ and len(data['constraints']) > 0:
+ for item in data['constraints']:
+ if 'conoid' in item:
+ item.pop('conoid')
+
+ res[row['name']] = data
+
+ return res
+
ForeignTableView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py
index 4aa6cc2b4..4e65961de 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py
@@ -24,6 +24,8 @@ from pgadmin.utils import IS_PY2
from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -93,7 +95,7 @@ class FtsConfigurationModule(SchemaChildModule):
blueprint = FtsConfigurationModule(__name__)
-class FtsConfigurationView(PGChildNodeView):
+class FtsConfigurationView(PGChildNodeView, SchemaDiffObjectCompare):
"""
class FtsConfigurationView(PGChildNodeView)
@@ -167,6 +169,9 @@ class FtsConfigurationView(PGChildNodeView):
* dependencies(self, gid, sid, did, scid, cfgid):
- This function get the dependencies and return ajax response for node.
+ * compare(**kwargs):
+ - This function will compare the fts configuration nodes from two
+ different schemas.
"""
node_type = blueprint.node_type
@@ -202,6 +207,7 @@ class FtsConfigurationView(PGChildNodeView):
{'get': 'copyConfig'}],
'tokens': [{'get': 'tokens'}, {'get': 'tokens'}],
'dictionaries': [{}, {'get': 'dictionaries'}],
+ 'compare': [{'get': 'compare'}, {'get': 'compare'}]
})
def _init_(self, **kwargs):
@@ -343,7 +349,22 @@ class FtsConfigurationView(PGChildNodeView):
scid: Schema Id
cfgid: fts Configuration id
"""
+ status, res = self._fetch_properties(scid, cfgid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+ def _fetch_properties(self, scid, cfgid):
+ """
+ This function is used to fetch property of specified object.
+ :param scid:
+ :param cfgid:
+ :return:
+ """
sql = render_template(
"/".join([self.template_path, 'properties.sql']),
scid=scid,
@@ -352,10 +373,10 @@ class FtsConfigurationView(PGChildNodeView):
status, res = self.conn.execute_dict(sql)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(
+ return False, gone(
_(
"Could not find the FTS Configuration node in the "
"database node.")
@@ -370,14 +391,11 @@ class FtsConfigurationView(PGChildNodeView):
status, rset = self.conn.execute_dict(sql)
if not status:
- return internal_server_error(errormsg=rset)
+ return False, internal_server_error(errormsg=rset)
res['rows'][0]['tokens'] = rset['rows']
- return ajax_response(
- response=res['rows'][0],
- status=200
- )
+ return True, res['rows'][0]
@check_precondition
def create(self, gid, sid, did, scid):
@@ -927,5 +945,30 @@ class FtsConfigurationView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the fts configurations for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), scid=scid)
+ status, fts_cfg = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in fts_cfg['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
FtsConfigurationView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py
index f69f3af7f..358882cdb 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py
@@ -24,6 +24,8 @@ from pgadmin.utils import IS_PY2
from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -91,7 +93,7 @@ class FtsDictionaryModule(SchemaChildModule):
blueprint = FtsDictionaryModule(__name__)
-class FtsDictionaryView(PGChildNodeView):
+class FtsDictionaryView(PGChildNodeView, SchemaDiffObjectCompare):
"""
class FtsDictionaryView(PGChildNodeView)
@@ -159,6 +161,9 @@ class FtsDictionaryView(PGChildNodeView):
* dependencies(self, gid, sid, did, scid, dcid):
- This function get the dependencies and return ajax response for node.
+ * compare(**kwargs):
+ - This function will compare the fts dictionaries nodes from two
+ different schemas.
"""
node_type = blueprint.node_type
@@ -189,7 +194,7 @@ class FtsDictionaryView(PGChildNodeView):
'dependency': [{'get': 'dependencies'}],
'dependent': [{'get': 'dependents'}],
'fetch_templates': [{'get': 'fetch_templates'},
- {'get': 'fetch_templates'}],
+ {'get': 'fetch_templates'}]
})
def _init_(self, **kwargs):
@@ -353,7 +358,23 @@ class FtsDictionaryView(PGChildNodeView):
scid: Schema Id
dcid: fts dictionary id
"""
+ status, res = self._fetch_properties(scid, dcid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, dcid):
+ """
+ This function is used to fetch the properties of specified object.
+ :param scid:
+ :param dcid:
+ :return:
+ """
sql = render_template(
"/".join([self.template_path, 'properties.sql']),
scid=scid,
@@ -362,10 +383,10 @@ class FtsDictionaryView(PGChildNodeView):
status, res = self.conn.execute_dict(sql)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(_(
+ return False, gone(_(
"Could not find the FTS Dictionary node in the database node."
))
@@ -382,10 +403,7 @@ class FtsDictionaryView(PGChildNodeView):
res['rows'][0]['options']
)
- return ajax_response(
- response=res['rows'][0],
- status=200
- )
+ return True, res['rows'][0]
@check_precondition
def create(self, gid, sid, did, scid):
@@ -854,5 +872,30 @@ class FtsDictionaryView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the fts dictionaries for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
FtsDictionaryView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py
index 384ae62e8..09a445723 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py
@@ -24,6 +24,8 @@ from pgadmin.utils import IS_PY2
from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -84,7 +86,7 @@ class FtsParserModule(SchemaChildModule):
blueprint = FtsParserModule(__name__)
-class FtsParserView(PGChildNodeView):
+class FtsParserView(PGChildNodeView, SchemaDiffObjectCompare):
"""
class FtsParserView(PGChildNodeView)
@@ -161,6 +163,9 @@ class FtsParserView(PGChildNodeView):
- This function get the dependencies and return ajax response for
FTS Parser node.
+ * compare(**kwargs):
+ - This function will compare the fts parser nodes from two
+ different schemas.
"""
node_type = blueprint.node_type
@@ -198,7 +203,7 @@ class FtsParserView(PGChildNodeView):
'lextype_functions': [{'get': 'lextype_functions'},
{'get': 'lextype_functions'}],
'headline_functions': [{'get': 'headline_functions'},
- {'get': 'headline_functions'}],
+ {'get': 'headline_functions'}]
})
def _init_(self, **kwargs):
@@ -303,6 +308,32 @@ class FtsParserView(PGChildNodeView):
@check_precondition
def properties(self, gid, sid, did, scid, pid):
+ """
+
+ :param gid:
+ :param sid:
+ :param did:
+ :param scid:
+ :param pid:
+ :return:
+ """
+ status, res = self._fetch_properties(scid, pid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, pid):
+ """
+ This function is used to fetch the properties of specified object.
+
+ :param scid:
+ :param pid:
+ :return:
+ """
sql = render_template(
"/".join([self.template_path, 'properties.sql']),
scid=scid,
@@ -311,16 +342,13 @@ class FtsParserView(PGChildNodeView):
status, res = self.conn.execute_dict(sql)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(
+ return False, gone(
_("Could not find the FTS Parser node in the database node."))
- return ajax_response(
- response=res['rows'][0],
- status=200
- )
+ return True, res['rows'][0]
@check_precondition
def create(self, gid, sid, did, scid):
@@ -862,5 +890,30 @@ class FtsParserView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the fts parsers for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
FtsParserView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py
index 8e952d912..6b7627db0 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py
@@ -24,6 +24,8 @@ from pgadmin.utils import IS_PY2
from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -90,7 +92,7 @@ class FtsTemplateModule(SchemaChildModule):
blueprint = FtsTemplateModule(__name__)
-class FtsTemplateView(PGChildNodeView):
+class FtsTemplateView(PGChildNodeView, SchemaDiffObjectCompare):
"""
class FtsTemplateView(PGChildNodeView)
@@ -154,6 +156,9 @@ class FtsTemplateView(PGChildNodeView):
- This function get the dependencies and return ajax response for the
FTS Template node.
+ * compare(**kwargs):
+ - This function will compare the fts template nodes from two
+ different schemas.
"""
node_type = blueprint.node_type
@@ -184,7 +189,7 @@ class FtsTemplateView(PGChildNodeView):
'dependency': [{'get': 'dependencies'}],
'dependent': [{'get': 'dependents'}],
'get_lexize': [{'get': 'get_lexize'}, {'get': 'get_lexize'}],
- 'get_init': [{'get': 'get_init'}, {'get': 'get_init'}],
+ 'get_init': [{'get': 'get_init'}, {'get': 'get_init'}]
})
def _init_(self, **kwargs):
@@ -281,25 +286,47 @@ class FtsTemplateView(PGChildNodeView):
@check_precondition
def properties(self, gid, sid, did, scid, tid):
+ """
+
+ :param gid:
+ :param sid:
+ :param did:
+ :param scid:
+ :param tid:
+ :return:
+ """
+ status, res = self._fetch_properties(scid, tid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, tid):
+ """
+ This function is used to fetch the properties of specified object.
+
+ :param scid:
+ :param pid:
+ :return:
+ """
sql = render_template(
"/".join([self.template_path, 'properties.sql']),
scid=scid,
tid=tid
)
status, res = self.conn.execute_dict(sql)
-
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(
+ return False, gone(
gettext("Could not find the requested FTS template.")
)
- return ajax_response(
- response=res['rows'][0],
- status=200
- )
+ return True, res['rows'][0]
@check_precondition
def create(self, gid, sid, did, scid):
@@ -734,5 +761,30 @@ class FtsTemplateView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the fts templates for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
FtsTemplateView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py
index 40d5000b4..ca8d50c8d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py
@@ -21,7 +21,7 @@ from flask import render_template, make_response, request, jsonify, \
current_app
from flask_babelex import gettext
from pgadmin.browser.server_groups.servers.databases.schemas.utils import \
- SchemaChildModule, DataTypeReader
+ SchemaChildModule, DataTypeReader, get_schema
from pgadmin.browser.server_groups.servers.databases.utils import \
parse_sec_labels_from_db, parse_variables_from_db
from pgadmin.browser.server_groups.servers.utils import parse_priv_from_db, \
@@ -30,8 +30,10 @@ from pgadmin.browser.utils import PGChildNodeView
from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.driver import get_driver
-
from config import PG_DEFAULT_DRIVER
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.model import SchemaDiffModel
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
class FunctionModule(SchemaChildModule):
@@ -115,7 +117,7 @@ class FunctionModule(SchemaChildModule):
blueprint = FunctionModule(__name__)
-class FunctionView(PGChildNodeView, DataTypeReader):
+class FunctionView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare):
"""
class FunctionView(PGChildNodeView)
@@ -177,6 +179,10 @@ class FunctionView(PGChildNodeView, DataTypeReader):
* exec_sql(gid, sid, did, scid, fnid):
- Returns sql for Script
+
+ * compare(**kwargs):
+ - This function will compare the function nodes from two
+ different schemas.
"""
node_type = blueprint.node_type
@@ -213,6 +219,9 @@ class FunctionView(PGChildNodeView, DataTypeReader):
{'get': 'get_support_functions'}]
})
+ keys_to_ignore = ['oid', 'proowner', 'typnsp', 'xmin', 'prokind',
+ 'proisagg', 'pronamespace', 'proargdefaults']
+
@property
def required_args(self):
"""
@@ -790,7 +799,7 @@ class FunctionView(PGChildNodeView, DataTypeReader):
)
@check_precondition
- def delete(self, gid, sid, did, scid, fnid=None):
+ def delete(self, gid, sid, did, scid, fnid=None, only_sql=False):
"""
Drop the Function.
@@ -841,6 +850,8 @@ class FunctionView(PGChildNodeView, DataTypeReader):
func_args=res['rows'][0]['func_args'],
nspname=res['rows'][0]['nspname'],
cascade=cascade)
+ if only_sql:
+ return SQL
status, res = self.conn.execute_scalar(SQL)
if not status:
return internal_server_error(errormsg=res)
@@ -915,7 +926,8 @@ class FunctionView(PGChildNodeView, DataTypeReader):
)
@check_precondition
- def sql(self, gid, sid, did, scid, fnid=None):
+ def sql(self, gid, sid, did, scid, fnid=None, diff_schema=None,
+ json_resp=True):
"""
Returns the SQL for the Function object.
@@ -989,6 +1001,8 @@ class FunctionView(PGChildNodeView, DataTypeReader):
if not status:
return internal_server_error(errormsg=res)
+ if diff_schema:
+ res['rows'][0]['nspname'] = diff_schema
name_with_default_args = self.qtIdent(
self.conn,
res['rows'][0]['nspname'],
@@ -1040,6 +1054,10 @@ class FunctionView(PGChildNodeView, DataTypeReader):
if not status:
return internal_server_error(errormsg=res)
+ if diff_schema:
+ res['rows'][0]['nspname'] = diff_schema
+ resp_data['pronamespace'] = diff_schema
+
name_with_default_args = self.qtIdent(
self.conn,
res['rows'][0]['nspname'],
@@ -1071,6 +1089,9 @@ class FunctionView(PGChildNodeView, DataTypeReader):
resp_data['proname']),
resp_data['proargtypenames'].lstrip('(').rstrip(')'))
+ if not json_resp:
+ return re.sub('\n{2,}', '\n\n', func_def)
+
SQL = sql_header + func_def
SQL = re.sub('\n{2,}', '\n\n', SQL)
@@ -1597,7 +1618,66 @@ class FunctionView(PGChildNodeView, DataTypeReader):
status=200
)
+ def get_sql_from_diff(self, gid, sid, did, scid, oid, data=None,
+ diff_schema=None, drop_sql=False):
+ sql = ''
+ if data:
+ if diff_schema:
+ data['schema'] = diff_schema
+ status, sql = self._get_sql(gid, sid, did, scid, data, oid)
+ else:
+ if drop_sql:
+ sql = self.delete(gid=gid, sid=sid, did=did,
+ scid=scid, fnid=oid, only_sql=True)
+ elif diff_schema:
+ sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, fnid=oid,
+ diff_schema=diff_schema, json_resp=False)
+ else:
+ sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, fnid=oid,
+ json_resp=False)
+ return sql
+
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid, oid=None):
+ """
+ This function will fetch the list of all the functions for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ server_type = self.manager.server_type
+ server_version = self.manager.sversion
+
+ if server_type == 'pg' and self.blueprint.min_ver is not None and \
+ server_version < self.blueprint.min_ver:
+ return res
+ if server_type == 'ppas' and self.blueprint.min_ppasver is not None \
+ and server_version < self.blueprint.min_ppasver:
+ return res
+
+ if not oid:
+ SQL = render_template("/".join([self.sql_template_path,
+ 'node.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ data = self._fetch_properties(0, sid, did, scid, row['oid'])
+ if isinstance(data, dict):
+ res[row['name']] = data
+ else:
+ data = self._fetch_properties(0, sid, did, scid, oid)
+ res = data
+
+ return res
+
+SchemaDiffRegistry(blueprint.node_type, FunctionView)
FunctionView.register_node_view(blueprint)
@@ -1698,6 +1778,7 @@ class ProcedureView(FunctionView):
'prosrc']
+SchemaDiffRegistry(procedure_blueprint.node_type, ProcedureView)
ProcedureView.register_node_view(procedure_blueprint)
@@ -1796,4 +1877,5 @@ class TriggerFunctionView(FunctionView):
'prosrc']
+SchemaDiffRegistry(trigger_function_blueprint.node_type, TriggerFunctionView)
TriggerFunctionView.register_node_view(trigger_function_blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py
index 70f99e91e..05bcbceb1 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py
@@ -27,6 +27,8 @@ from pgadmin.utils.ajax import make_json_response, \
make_response as ajax_response, internal_server_error, \
precondition_required, gone
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -83,7 +85,7 @@ class PackageModule(SchemaChildModule):
blueprint = PackageModule(__name__)
-class PackageView(PGChildNodeView):
+class PackageView(PGChildNodeView, SchemaDiffObjectCompare):
node_type = blueprint.node_type
parent_ids = [
@@ -111,6 +113,8 @@ class PackageView(PGChildNodeView):
'dependent': [{'get': 'dependents'}]
})
+ keys_to_ignore = ['oid', 'schema', 'xmin']
+
def check_precondition(action=None):
"""
This function will behave as a decorator which will checks
@@ -297,16 +301,32 @@ class PackageView(PGChildNodeView):
Returns:
+ """
+ status, res = self._fetch_properties(scid, pkgid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, pkgid):
+ """
+ This function is used to fetch the properties of specified object.
+ :param scid:
+ :param pkgid:
+ :return:
"""
SQL = render_template("/".join([self.template_path, 'properties.sql']),
scid=scid, pkgid=pkgid)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(
+ return False, gone(
errormsg=_("Could not find the package in the database.")
)
@@ -321,16 +341,13 @@ class PackageView(PGChildNodeView):
status, rset1 = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=rset1)
+ return False, internal_server_error(errormsg=rset1)
for row in rset1['rows']:
priv = parse_priv_from_db(row)
res['rows'][0].setdefault(row['deftype'], []).append(priv)
- return ajax_response(
- response=res['rows'][0],
- status=200
- )
+ return True, res['rows'][0]
@check_precondition(action="create")
def create(self, gid, sid, did, scid):
@@ -396,7 +413,7 @@ class PackageView(PGChildNodeView):
)
@check_precondition(action='delete')
- def delete(self, gid, sid, did, scid, pkgid=None):
+ def delete(self, gid, sid, did, scid, pkgid=None, only_sql=False):
"""
This function will drop the object
@@ -453,6 +470,9 @@ class PackageView(PGChildNodeView):
data=res['rows'][0],
cascade=cascade)
+ if only_sql:
+ return SQL
+
status, res = self.conn.execute_scalar(SQL)
if not status:
return internal_server_error(errormsg=res)
@@ -552,7 +572,8 @@ class PackageView(PGChildNodeView):
status=200
)
- def getSQL(self, gid, sid, did, data, scid, pkgid=None, sqltab=False):
+ def getSQL(self, gid, sid, did, data, scid, pkgid=None, sqltab=False,
+ diff_schema=None):
"""
This function will generate sql from model data.
@@ -621,6 +642,9 @@ class PackageView(PGChildNodeView):
if arg not in data:
data[arg] = old_data[arg]
+ if diff_schema:
+ data['schema'] = diff_schema
+
SQL = render_template("/".join([self.template_path, 'update.sql']),
data=data, o_data=old_data, conn=self.conn)
return SQL, data['name'] if 'name' in data else old_data['name']
@@ -635,7 +659,8 @@ class PackageView(PGChildNodeView):
return SQL, data['name']
@check_precondition(action="sql")
- def sql(self, gid, sid, did, scid, pkgid):
+ def sql(self, gid, sid, did, scid, pkgid, diff_schema=None,
+ json_resp=True):
"""
This function will generate sql for sql panel
@@ -645,6 +670,8 @@ class PackageView(PGChildNodeView):
did: Database ID
scid: Schema ID
pkgid: Package ID
+ diff_schema: Schema diff target schema name
+ json_resp: json response or plain text response
"""
try:
SQL = render_template(
@@ -676,13 +703,18 @@ class PackageView(PGChildNodeView):
res['rows'][0].setdefault(row['deftype'], []).append(priv)
result = res['rows'][0]
- sql, name = self.getSQL(gid, sid, did, result, scid, pkgid, True)
+ sql, name = self.getSQL(gid, sid, did, result, scid, pkgid, True,
+ diff_schema)
# Most probably this is due to error
if not isinstance(sql, (str, unicode)):
return sql
sql = sql.strip('\n').strip(' ')
+ # Return sql for schema diff
+ if not json_resp:
+ return sql
+
sql_header = u"-- Package: {}\n\n-- ".format(
self.qtIdent(self.conn, self.schema, result['name'])
)
@@ -756,5 +788,54 @@ class PackageView(PGChildNodeView):
return sql[start:end].strip("\n")
+ @check_precondition(action="fetch_objects_to_compare")
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the packages for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ if self.manager.server_type != 'ppas':
+ return res
+
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
+ def get_sql_from_diff(self, gid, sid, did, scid, oid, data=None,
+ diff_schema=None, drop_sql=False):
+ sql = ''
+ if data:
+ if diff_schema:
+ data['schema'] = diff_schema
+ status, sql = self.getSQL(gid, sid, did, data, scid, oid)
+ else:
+ if drop_sql:
+ sql = self.delete(gid=gid, sid=sid, did=did,
+ scid=scid, pkgid=oid, only_sql=True)
+
+ elif diff_schema:
+ sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, pkgid=oid,
+ diff_schema=diff_schema, json_resp=False)
+ else:
+ sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, pkgid=oid,
+ json_resp=False)
+ return sql
+
+SchemaDiffRegistry(blueprint.node_type, PackageView)
PackageView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py
index 4809be85b..f97994468 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py
@@ -161,6 +161,8 @@ class EdbFuncView(PGChildNodeView, DataTypeReader):
* dependencies(gid, sid, did, scid, pkgid, edbfnid):
- Returns the dependencies for the Functions object.
+ * compare(**kwargs):
+ - This function will compare the nodes from two different schemas.
"""
node_type = blueprint.node_type
@@ -184,7 +186,8 @@ class EdbFuncView(PGChildNodeView, DataTypeReader):
'nodes': [{'get': 'nodes'}, {'get': 'nodes'}],
'sql': [{'get': 'sql'}],
'dependency': [{'get': 'dependencies'}],
- 'dependent': [{'get': 'dependents'}]
+ 'dependent': [{'get': 'dependents'}],
+ 'compare': [{'get': 'compare'}, {'get': 'compare'}]
})
def check_precondition(f):
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbvars/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbvars/__init__.py
index ddce19a65..e82660dde 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbvars/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbvars/__init__.py
@@ -137,6 +137,8 @@ class EdbVarView(PGChildNodeView, DataTypeReader):
* sql(gid, sid, did, scid, pkgid, varid):
- Returns the SQL for the Functions object.
+ * compare(**kwargs):
+ - This function will compare the nodes from two different schemas.
"""
node_type = blueprint.node_type
@@ -158,7 +160,8 @@ class EdbVarView(PGChildNodeView, DataTypeReader):
{'get': 'list'}
],
'nodes': [{'get': 'nodes'}, {'get': 'nodes'}],
- 'sql': [{'get': 'sql'}]
+ 'sql': [{'get': 'sql'}],
+ 'compare': [{'get': 'compare'}, {'get': 'compare'}]
})
def check_precondition(f):
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py
index eff3d9e85..3dbe7422e 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py
@@ -24,6 +24,9 @@ from pgadmin.utils.ajax import make_json_response, internal_server_error, \
from pgadmin.utils.driver import get_driver
from config import PG_DEFAULT_DRIVER
from pgadmin.utils import IS_PY2
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
+
# If we are in Python3
if not IS_PY2:
unicode = str
@@ -88,7 +91,7 @@ class SequenceModule(SchemaChildModule):
blueprint = SequenceModule(__name__)
-class SequenceView(PGChildNodeView):
+class SequenceView(PGChildNodeView, SchemaDiffObjectCompare):
node_type = blueprint.node_type
parent_ids = [
@@ -273,6 +276,23 @@ class SequenceView(PGChildNodeView):
Returns:
"""
+ status, res = self._fetch_properties(scid, seid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, seid):
+ """
+ This function is used to fetch the properties of the specified object.
+ :param scid:
+ :param seid:
+ :return:
+ """
+
SQL = render_template(
"/".join([self.template_path, 'properties.sql']),
scid=scid, seid=seid
@@ -280,10 +300,11 @@ class SequenceView(PGChildNodeView):
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(_("Could not find the sequence in the database."))
+ return False, gone(
+ _("Could not find the sequence in the database."))
for row in res['rows']:
SQL = render_template(
@@ -292,7 +313,7 @@ class SequenceView(PGChildNodeView):
)
status, rset1 = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=rset1)
+ return False, internal_server_error(errormsg=rset1)
row['current_value'] = rset1['rows'][0]['last_value']
row['minimum'] = rset1['rows'][0]['min_value']
@@ -319,7 +340,7 @@ class SequenceView(PGChildNodeView):
)
status, dataclres = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
for row in dataclres['rows']:
priv = parse_priv_from_db(row)
@@ -328,10 +349,7 @@ class SequenceView(PGChildNodeView):
else:
res['rows'][0][row['deftype']] = [priv]
- return ajax_response(
- response=res['rows'][0],
- status=200
- )
+ return True, res['rows'][0]
@check_precondition(action="create")
def create(self, gid, sid, did, scid):
@@ -869,5 +887,30 @@ class SequenceView(PGChildNodeView):
status=200
)
+ @check_precondition(action="fetch_objects_to_compare")
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the sequences for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
SequenceView.register_node_view(blueprint)
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 7f3c680d7..145ccf69b 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
@@ -24,6 +24,8 @@ from pgadmin.utils.ajax import precondition_required
from pgadmin.utils.driver import get_driver
from config import PG_DEFAULT_DRIVER
from pgadmin.utils import IS_PY2
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -91,7 +93,7 @@ class SynonymModule(SchemaChildModule):
blueprint = SynonymModule(__name__)
-class SynonymView(PGChildNodeView):
+class SynonymView(PGChildNodeView, SchemaDiffObjectCompare):
"""
This class is responsible for generating routes for Synonym node
@@ -143,6 +145,10 @@ class SynonymView(PGChildNodeView):
* dependent(gid, sid, did, scid):
- This function will generate dependent list to show it in dependent
pane for the selected Synonym node.
+
+ * compare(**kwargs):
+ - This function will compare the synonyms nodes from two
+ different schemas.
"""
node_type = blueprint.node_type
@@ -385,26 +391,36 @@ class SynonymView(PGChildNodeView):
Returns:
JSON of selected synonym node
"""
+ status, res = self._fetch_properties(scid, syid)
+ if not status:
+ return res
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, syid):
+ """
+ This function is used to fetch the properties of the specified object
+ :param scid:
+ :param syid:
+ :return:
+ """
try:
SQL = render_template("/".join([self.template_path,
'properties.sql']),
scid=scid, syid=syid)
status, res = self.conn.execute_dict(SQL)
-
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
- if len(res['rows']) > 0:
- return ajax_response(
- response=res['rows'][0],
- status=200
- )
- else:
- return gone(
+ if len(res['rows']) == 0:
+ return False, gone(
gettext('The specified synonym could not be found.')
)
+ return True, res['rows'][0]
except Exception as e:
return internal_server_error(errormsg=str(e))
@@ -707,5 +723,33 @@ class SynonymView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the synonyms for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ if self.manager.server_type != 'ppas':
+ return res
+
+ SQL = render_template("/".join([self.template_path,
+ 'properties.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(scid, row['name'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
SynonymView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
index 3fef6e025..4337dc44a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
@@ -11,9 +11,11 @@
import simplejson as json
import re
+import copy
+import random
import pgadmin.browser.server_groups.servers.databases as database
-from flask import render_template, request, jsonify, url_for
+from flask import render_template, request, jsonify, url_for, current_app
from flask_babelex import gettext
from pgadmin.browser.server_groups.servers.databases.schemas.utils \
import SchemaChildModule, DataTypeReader, VacuumSettings
@@ -22,8 +24,15 @@ from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from .utils import BaseTableView
from pgadmin.utils.preferences import Preferences
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.directory_compare import compare_dictionaries,\
+ directory_diff
+from pgadmin.tools.schema_diff.model import SchemaDiffModel
+from pgadmin.utils.driver import get_driver
+from config import PG_DEFAULT_DRIVER
from pgadmin.browser.server_groups.servers.databases.schemas.tables.\
constraints.foreign_key import utils as fkey_utils
+from .schema_diff_utils import SchemaDiffTableCompare
from pgadmin.browser.server_groups.servers.databases.schemas.tables.\
columns import utils as column_utils
from pgadmin.browser.server_groups.servers.databases.schemas.tables.\
@@ -132,7 +141,8 @@ class TableModule(SchemaChildModule):
blueprint = TableModule(__name__)
-class TableView(BaseTableView, DataTypeReader, VacuumSettings):
+class TableView(BaseTableView, DataTypeReader, VacuumSettings,
+ SchemaDiffTableCompare):
"""
This class is responsible for generating routes for Table node
@@ -229,6 +239,10 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
* delete_sql(gid, sid, did, scid, foid):
- Returns sql for Script
+
+ * compare(**kwargs):
+ - This function will compare the table nodes from two
+ different schemas.
"""
node_type = blueprint.node_type
@@ -277,7 +291,8 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
'insert_sql': [{'get': 'insert_sql'}],
'update_sql': [{'get': 'update_sql'}],
'delete_sql': [{'get': 'delete_sql'}],
- 'count_rows': [{'get': 'count_rows'}]
+ 'count_rows': [{'get': 'count_rows'}],
+ 'compare': [{'get': 'compare'}, {'get': 'compare'}]
})
@BaseTableView.check_precondition
@@ -464,9 +479,9 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
- setting
values
"""
- res = self.get_vacuum_table_settings(self.conn)
+ res = self.get_vacuum_table_settings(self.conn, sid)
return ajax_response(
- response=res['rows'],
+ response=res,
status=200
)
@@ -480,9 +495,9 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
- setting
values
"""
- res = self.get_vacuum_toast_settings(self.conn)
+ res = self.get_vacuum_toast_settings(self.conn, sid)
return ajax_response(
- response=res['rows'],
+ response=res,
status=200
)
@@ -582,7 +597,22 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
Returns:
JSON of selected table node
"""
+ status, res = self._fetch_properties(did, scid, tid)
+ if not status:
+ return res
+ return super(TableView, self).properties(
+ gid, sid, did, scid, tid, res
+ )
+
+ def _fetch_properties(self, did, scid, tid):
+ """
+ This function is used to fetch the properties of the specified object
+ :param did:
+ :param scid:
+ :param tid:
+ :return:
+ """
SQL = render_template(
"/".join([self.table_template_path, 'properties.sql']),
did=did, scid=scid, tid=tid,
@@ -590,10 +620,11 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(gettext("The specified table could not be found."))
+ return False, gone(
+ gettext("The specified table could not be found."))
# We will check the threshold set by user before executing
# the query because that can cause performance issues
@@ -620,7 +651,7 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
status, count = self.conn.execute_scalar(SQL)
if not status:
- return internal_server_error(errormsg=count)
+ return False, internal_server_error(errormsg=count)
res['rows'][0]['rows_cnt'] = count
@@ -628,9 +659,7 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
elif not estimated_row_count:
res['rows'][0]['rows_cnt'] = estimated_row_count
- return super(TableView, self).properties(
- gid, sid, did, scid, tid, res
- )
+ return True, res
@BaseTableView.check_precondition
def types(self, gid, sid, did, scid, tid=None, clid=None):
@@ -1168,6 +1197,69 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
"""
return BaseTableView.reset_statistics(self, scid, tid)
+ @BaseTableView.check_precondition
+ def get_sql_from_table_diff(self, **kwargs):
+ """
+ This function will create sql on the basis the difference of 2 tables
+ """
+ data = dict()
+ res = None
+ sid = kwargs['sid']
+ did = kwargs['did']
+ scid = kwargs['scid']
+ tid = kwargs['tid']
+ diff_data = kwargs['diff_data'] if 'diff_data' in kwargs else None
+ json_resp = kwargs['json_resp'] if 'json_resp' in kwargs else True
+ diff_schema = kwargs['diff_schema'] if 'diff_schema' in kwargs else\
+ None
+ schema_diff_table = kwargs['schema_diff_table'] if\
+ 'schema_diff_table' in kwargs else None
+
+ if diff_data:
+ return self._fetch_sql(did, scid, tid, diff_data, json_resp)
+ else:
+ main_sql = []
+
+ SQL = render_template(
+ "/".join([self.table_template_path, 'properties.sql']),
+ did=did, scid=scid, tid=tid,
+ datlastsysoid=self.datlastsysoid
+ )
+ status, res = self.conn.execute_dict(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ if len(res['rows']) == 0:
+ return gone(gettext("The specified table could not be found."
+ ))
+
+ if status:
+ data = res['rows'][0]
+
+ if diff_schema:
+ data['schema'] = diff_schema
+
+ if schema_diff_table:
+ data['orig_name'] = data['name']
+ data['name'] = 'schema_diff_temp_{0}'.format(
+ random.randint(1, 9999999))
+
+ sql, partition_sql = BaseTableView.get_reverse_engineered_sql(
+ self, did, scid, tid, main_sql, data, json_resp,
+ diff_partition_sql=True)
+ else:
+ sql, partition_sql = BaseTableView.get_reverse_engineered_sql(
+ self, did, scid, tid, main_sql, data, json_resp)
+
+ if schema_diff_table:
+ # If partition tables have different partitions
+ sql += render_template(
+ "/".join([self.table_template_path, 'schema_diff.sql']),
+ conn=self.conn, data=data, partition_sql=partition_sql
+ )
+
+ return sql
+
@BaseTableView.check_precondition
def msql(self, gid, sid, did, scid, tid=None):
"""
@@ -1181,7 +1273,7 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
tid: Table ID
"""
data = dict()
- res = None
+ SQL = ''
for k, v in request.args.items():
try:
# comments should be taken as is because if user enters a
@@ -1193,6 +1285,11 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
except (ValueError, TypeError, KeyError):
data[k] = v
+ return self._fetch_sql(did, scid, tid, data)
+
+ def _fetch_sql(self, did, scid, tid, data, json_resp=True):
+ res = None
+
if tid is not None:
SQL = render_template(
"/".join([self.table_template_path, 'properties.sql']),
@@ -1201,13 +1298,18 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return internal_server_error(errormsg=SQL)
SQL, name = self.get_sql(did, scid, tid, data, res)
SQL = re.sub('\n{2,}', '\n\n', SQL)
SQL = SQL.strip('\n')
+
+ if not json_resp:
+ return SQL
+
if SQL == '':
SQL = "--modified SQL"
+
return make_json_response(
data=SQL,
status=200
@@ -1419,7 +1521,7 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
return ajax_response(response=sql)
@BaseTableView.check_precondition
- def delete_sql(self, gid, sid, did, scid, tid):
+ def delete_sql(self, gid, sid, did, scid, tid, json_resp=True):
"""
DELETE script sql for the object
@@ -1448,6 +1550,9 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
self.qtIdent(self.conn, data['schema'], data['name'])
)
+ if not json_resp:
+ return sql
+
return ajax_response(response=sql)
@BaseTableView.check_precondition
@@ -1502,5 +1607,60 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
data={'total_rows': count}
)
+ def get_delete_sql(self, res):
+ self.cmd = 'delete'
+ sql = super(TableView, self).get_delete_sql(res)
+ self.cmd = None
+ return sql
+
+ @BaseTableView.check_precondition
+ def fetch_tables(self, sid, did, scid, tid=None, keys_to_remove=None):
+ """
+ This function will fetch the list of all the tables
+ and will be used by schema diff.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :param tid: Table Id
+ :param keys_to_remove: Table columns to be removed from the dataset
+ :return: Table dataset
+ """
+ if tid:
+ status, data = self._fetch_properties(did, scid, tid)
+
+ if not status:
+ current_app.logger.error(data)
+ return False
+
+ data = super(TableView, self).properties(
+ 0, sid, did, scid, tid, data, False
+ )
+ self.remove_keys_for_comparision(data, keys_to_remove)
+ return data
+
+ else:
+ res = dict()
+ SQL = render_template("/".join([self.table_template_path,
+ 'nodes.sql']), scid=scid)
+ status, tables = self.conn.execute_2darray(SQL)
+ if not status:
+ current_app.logger.error(tables)
+ return False
+
+ for row in tables['rows']:
+ status, data = self._fetch_properties(did, scid, row['oid'])
+
+ if status:
+ data = super(TableView, self).properties(
+ 0, sid, did, scid, row['oid'], data, False
+ )
+
+ self.remove_keys_for_comparision(data, keys_to_remove)
+ res[row['name']] = data
+
+ return res
+
+SchemaDiffRegistry(blueprint.node_type, TableView)
TableView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py
index c0c40e417..3346af8d8 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py
@@ -29,6 +29,7 @@ from pgadmin.utils.driver import get_driver
from config import PG_DEFAULT_DRIVER
from pgadmin.utils import IS_PY2
from pgadmin.utils.ajax import ColParamsJSONDecoder
+
# If we are in Python3
if not IS_PY2:
unicode = str
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py
index 565d00fed..5e91569a5 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py
@@ -26,6 +26,10 @@ from pgadmin.browser.server_groups.servers.databases.schemas.utils \
from pgadmin.utils.driver import get_driver
from config import PG_DEFAULT_DRIVER
from pgadmin.utils import IS_PY2
+from pgadmin.utils.compile_template_name import compile_template_path
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
+
# If we are in Python3
if not IS_PY2:
unicode = str
@@ -155,7 +159,7 @@ class CompoundTriggerModule(CollectionNodeModule):
blueprint = CompoundTriggerModule(__name__)
-class CompoundTriggerView(PGChildNodeView):
+class CompoundTriggerView(PGChildNodeView, SchemaDiffObjectCompare):
"""
This class is responsible for generating routes for Compound Trigger node
@@ -245,6 +249,10 @@ class CompoundTriggerView(PGChildNodeView):
'enable': [{'put': 'enable_disable_trigger'}]
})
+ # Schema Diff: Keys to ignore while comparing
+ keys_to_ignore = ['oid', 'xmin', 'nspname', 'tfunction',
+ 'tgrelid', 'tgfoid']
+
def check_precondition(f):
"""
This function will behave as a decorator which will checks
@@ -267,6 +275,12 @@ class CompoundTriggerView(PGChildNodeView):
]['datlastsysoid'] if self.manager.db_info is not None and \
kwargs['did'] in self.manager.db_info else 0
+ self.table_template_path = compile_template_path(
+ 'tables/sql',
+ self.manager.server_type,
+ self.manager.version
+ )
+
# we will set template path for sql scripts
self.template_path = 'compound_triggers/sql/{0}/#{1}#'.format(
self.manager.server_type, self.manager.version)
@@ -417,6 +431,18 @@ class CompoundTriggerView(PGChildNodeView):
JSON of selected compound trigger node
"""
+ data = self._fetch_properties(tid, trid)
+
+ if not status:
+ return data
+
+ return ajax_response(
+ response=data,
+ status=200
+ )
+
+ def _fetch_properties(self, tid, trid):
+
SQL = render_template("/".join([self.template_path,
'properties.sql']),
tid=tid, trid=trid,
@@ -440,10 +466,7 @@ class CompoundTriggerView(PGChildNodeView):
data = trigger_definition(data)
- return ajax_response(
- response=data,
- status=200
- )
+ return True, data
@check_precondition
def create(self, gid, sid, did, scid, tid):
@@ -519,7 +542,7 @@ class CompoundTriggerView(PGChildNodeView):
return internal_server_error(errormsg=str(e))
@check_precondition
- def delete(self, gid, sid, did, scid, tid, trid=None):
+ def delete(self, gid, sid, did, scid, tid, trid=None, only_sql=False):
"""
This function will updates existing the compound trigger object
@@ -579,6 +602,9 @@ class CompoundTriggerView(PGChildNodeView):
conn=self.conn,
cascade=cascade
)
+ if only_sql:
+ return SQL
+
status, res = self.conn.execute_scalar(SQL)
if not status:
return internal_server_error(errormsg=res)
@@ -846,5 +872,109 @@ class CompoundTriggerView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def get_sql_from_diff(self, gid, sid, did, scid, tid, oid,
+ data=None, diff_schema=None, drop_sql=False):
+ if data:
+ sql, name = self.get_sql(scid, tid, oid, data)
+ if not isinstance(sql, (str, unicode)):
+ return sql
+ sql = sql.strip('\n').strip(' ')
+ else:
+ if drop_sql:
+ SQL = self.delete(gid=gid, sid=sid, did=did,
+ scid=scid, tid=tid,
+ trid=oid, only_sql=True)
+ else:
+ SQL = render_template("/".join([self.template_path,
+ 'properties.sql']),
+ tid=tid, trid=oid,
+ datlastsysoid=self.datlastsysoid)
+
+ status, res = self.conn.execute_dict(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+ if len(res['rows']) == 0:
+ return gone(gettext("""Could not find the compound
+ trigger in the table."""))
+
+ data = dict(res['rows'][0])
+ # Adding parent into data dict,
+ # will be using it while creating sql
+ data['schema'] = self.schema
+ data['table'] = self.table
+
+ if len(data['tgattr']) >= 1:
+ columns = ', '.join(data['tgattr'].split(' '))
+ data['columns'] = self._column_details(tid, columns)
+
+ data = self._trigger_definition(data)
+
+ if diff_schema:
+ data['schema'] = diff_schema
+
+ SQL, name = self.get_sql(scid, tid, None, data)
+
+ sql_header = u"-- Compound Trigger: {0}\n\n-- ".format(
+ data['name'])
+
+ sql_header += render_template("/".join([self.template_path,
+ 'delete.sql']),
+ data=data, conn=self.conn)
+
+ SQL = sql_header + '\n\n' + SQL.strip('\n')
+
+ # If compound trigger is disbaled then add sql
+ # code for the same
+ if not data['is_enable_trigger']:
+ SQL += '\n\n'
+ SQL += render_template("/".join([
+ self.template_path,
+ 'enable_disable_trigger.sql']),
+ data=data, conn=self.conn)
+
+ return SQL
+
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid, tid, oid=None,
+ ignore_keys=False):
+ """
+ This function will fetch the list of all the triggers for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :param tid: Table Id
+ :return:
+ """
+ res = dict()
+
+ if oid:
+ status, data = self._fetch_properties(tid, oid)
+ if not status:
+ current_app.logger.error(data)
+ return False
+ res = data
+ else:
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), tid=tid)
+ status, triggers = self.conn.execute_2darray(SQL)
+ if not status:
+ current_app.logger.error(triggers)
+ return False
+
+ for row in triggers['rows']:
+ status, data = self._fetch_properties(tid, row['oid'])
+ if status:
+ if ignore_keys:
+ for key in self.keys_to_ignore:
+ if key in data:
+ del data[key]
+ res[row['name']] = data
+
+ return res
+
+SchemaDiffRegistry(blueprint.node_type, CompoundTriggerView, 'table')
CompoundTriggerView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/utils.py
index 47baee9b3..04237d645 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/utils.py
@@ -152,7 +152,8 @@ def get_index_constraint_sql(conn, did, tid, data, template_path=None):
modified_sql, name = get_sql(conn, c, did, tid, ctype,
c['oid'])
- sql.append(modified_sql.strip('\n'))
+ if modified_sql:
+ sql.append(modified_sql.strip('\n'))
if 'added' in constraint:
for c in constraint['added']:
@@ -183,6 +184,7 @@ def get_sql(conn, data, did, tid, ctype, cid=None, template_path=None):
:return:
"""
name = data['name'] if 'name' in data else None
+ sql = None
if cid is not None:
sql = render_template("/".join([template_path, 'properties.sql']),
did=did, tid=tid, cid=cid,
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/__init__.py
index 7f19e953a..6a896e079 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/__init__.py
@@ -13,7 +13,7 @@ import simplejson as json
from functools import wraps
import pgadmin.browser.server_groups.servers.databases as database
-from flask import render_template, request, jsonify
+from flask import render_template, request, jsonify, current_app
from flask_babelex import gettext
from pgadmin.browser.collection import CollectionNodeModule
from pgadmin.browser.server_groups.servers.databases.schemas.tables.\
@@ -25,8 +25,14 @@ from pgadmin.utils.compile_template_name import compile_template_path
from pgadmin.utils.driver import get_driver
from config import PG_DEFAULT_DRIVER
from pgadmin.utils import IS_PY2
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.directory_compare import compare_dictionaries,\
+ directory_diff
+from pgadmin.tools.schema_diff.model import SchemaDiffModel
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
from pgadmin.browser.server_groups.servers.databases.schemas. \
tables.indexes import utils as index_utils
+
# If we are in Python3
if not IS_PY2:
unicode = str
@@ -135,7 +141,7 @@ class IndexesModule(CollectionNodeModule):
blueprint = IndexesModule(__name__)
-class IndexesView(PGChildNodeView):
+class IndexesView(PGChildNodeView, SchemaDiffObjectCompare):
"""
This class is responsible for generating routes for Index node
@@ -227,6 +233,11 @@ class IndexesView(PGChildNodeView):
{'get': 'get_op_class'}]
})
+ # Schema Diff: Keys to ignore while comparing
+ keys_to_ignore = ['oid', 'relowner', 'schema',
+ 'indrelid', 'nspname'
+ ]
+
def check_precondition(f):
"""
This function will behave as a decorator which will checks
@@ -248,6 +259,12 @@ class IndexesView(PGChildNodeView):
]['datlastsysoid'] if self.manager.db_info is not None and \
kwargs['did'] in self.manager.db_info else 0
+ self.table_template_path = compile_template_path(
+ 'tables/sql',
+ self.manager.server_type,
+ self.manager.version
+ )
+
# we will set template path for sql scripts
self.template_path = compile_template_path(
'indexes/sql/',
@@ -485,19 +502,35 @@ class IndexesView(PGChildNodeView):
Returns:
JSON of selected schema node
"""
+ status, data = self._fetch_properties(did, tid, idx)
+ if not status:
+ return data
+ return ajax_response(
+ response=data,
+ status=200
+ )
+
+ def _fetch_properties(self, did, tid, idx):
+ """
+ This function is used to fetch the properties of specified object.
+ :param did:
+ :param tid:
+ :param idx:
+ :return:
+ """
SQL = render_template(
"/".join([self.template_path, 'properties.sql']),
did=did, tid=tid, idx=idx, datlastsysoid=self.datlastsysoid
)
status, res = self.conn.execute_dict(SQL)
-
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(gettext("""Could not find the index in the table."""))
+ return False, gone(
+ gettext("""Could not find the index in the table."""))
# Making copy of output for future use
data = dict(res['rows'][0])
@@ -509,10 +542,7 @@ class IndexesView(PGChildNodeView):
if self.manager.version >= 110000:
data = index_utils.get_include_details(self.conn, idx, data)
- return ajax_response(
- response=data,
- status=200
- )
+ return True, data
@check_precondition
def create(self, gid, sid, did, scid, tid):
@@ -620,7 +650,8 @@ class IndexesView(PGChildNodeView):
return internal_server_error(errormsg=str(e))
@check_precondition
- def delete(self, gid, sid, did, scid, tid, idx=None):
+ def delete(self, gid, sid, did, scid, tid, idx=None,
+ only_sql=False):
"""
This function will updates existing the schema object
@@ -676,6 +707,9 @@ class IndexesView(PGChildNodeView):
"/".join([self.template_path, 'delete.sql']),
data=data, conn=self.conn, cascade=cascade
)
+
+ if only_sql:
+ return SQL
status, res = self.conn.execute_scalar(SQL)
if not status:
return internal_server_error(errormsg=res)
@@ -792,6 +826,32 @@ class IndexesView(PGChildNodeView):
return ajax_response(response=SQL)
+ @check_precondition
+ def get_sql_from_index_diff(self, sid, did, scid, tid, idx, data=None,
+ diff_schema=None, drop_req=False):
+
+ tmp_idx = idx
+ schema = ''
+ if data:
+ schema = self.schema
+ elif diff_schema:
+ schema = diff_schema
+
+ sql = index_utils.get_reverse_engineered_sql(
+ self.conn, schema,
+ self.table, did, tid, idx,
+ self.datlastsysoid,
+ template_path=None, with_header=False)
+
+ drop_sql = ''
+ if drop_req:
+ drop_sql = '\n' + render_template(
+ "/".join([self.template_path, 'delete.sql']),
+ data=data, conn=self.conn
+ )
+
+ return drop_sql + '\n\n' + sql
+
@check_precondition
def dependents(self, gid, sid, did, scid, tid, idx):
"""
@@ -914,5 +974,129 @@ class IndexesView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid, tid, oid=None,
+ ignore_keys=False):
+ """
+ This function will fetch the list of all the indexes for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+
+ res = dict()
+
+ if not oid:
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), tid=tid)
+ status, indexes = self.conn.execute_2darray(SQL)
+ if not status:
+ current_app.logger.error(indexes)
+ return False
+
+ for row in indexes['rows']:
+ status, data = self._fetch_properties(did, tid,
+ row['oid'])
+ if status:
+ if ignore_keys:
+ for key in self.keys_to_ignore:
+ if key in data:
+ del data[key]
+ res[row['name']] = data
+ else:
+ status, data = self._fetch_properties(did, tid,
+ oid)
+ if not status:
+ current_app.logger.error(data)
+ return False
+ res = data
+
+ return res
+
+ def ddl_compare(self, **kwargs):
+ """
+ This function will compare index properties and
+ return the difference of SQL
+ """
+
+ src_sid = kwargs.get('source_sid')
+ src_did = kwargs.get('source_did')
+ src_scid = kwargs.get('source_scid')
+ src_tid = kwargs.get('source_tid')
+ src_oid = kwargs.get('source_oid')
+ tar_sid = kwargs.get('target_sid')
+ tar_did = kwargs.get('target_did')
+ tar_scid = kwargs.get('target_scid')
+ tar_tid = kwargs.get('target_tid')
+ tar_oid = kwargs.get('target_oid')
+ comp_status = kwargs.get('comp_status')
+
+ source = ''
+ target = ''
+ diff = ''
+
+ status, target_schema = self.get_schema(tar_sid,
+ tar_did,
+ tar_scid
+ )
+ if not status:
+ return internal_server_error(errormsg=target_schema)
+
+ if comp_status == SchemaDiffModel.COMPARISON_STATUS['source_only']:
+ diff = self.get_sql_from_index_diff(sid=src_sid,
+ did=src_did, scid=src_scid,
+ tid=src_tid, idx=src_oid,
+ diff_schema=target_schema)
+
+ elif comp_status == SchemaDiffModel.COMPARISON_STATUS['target_only']:
+ diff = self.delete(gid=1, sid=tar_sid, did=tar_did,
+ scid=tar_scid, tid=tar_tid,
+ idx=tar_oid, only_sql=True)
+
+ else:
+ source = self.fetch_objects_to_compare(sid=src_sid, did=src_did,
+ scid=src_scid, tid=src_tid,
+ oid=src_oid)
+ target = self.fetch_objects_to_compare(sid=tar_sid, did=tar_did,
+ scid=tar_scid, tid=tar_tid,
+ oid=tar_oid)
+
+ if not (source or target):
+ return None
+
+ diff_dict = directory_diff(
+ source, target, ignore_keys=self.keys_to_ignore,
+ difference={}
+ )
+
+ required_create_keys = ['columns']
+ create_req = False
+
+ for key in required_create_keys:
+ if key in diff_dict:
+ create_req = True
+
+ if create_req:
+ diff = self.get_sql_from_index_diff(sid=src_sid,
+ did=src_did,
+ scid=src_scid,
+ tid=src_tid,
+ idx=src_oid,
+ diff_schema=target_schema,
+ drop_req=True)
+ else:
+ diff = self.get_sql_from_index_diff(sid=tar_sid,
+ did=tar_did,
+ scid=tar_scid,
+ tid=tar_tid,
+ idx=tar_oid,
+ data=diff_dict)
+
+ return diff
+
+SchemaDiffRegistry(blueprint.node_type, IndexesView, 'table')
IndexesView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/utils.py
index 44534ac6e..eb9001f0a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/utils.py
@@ -26,7 +26,7 @@ def get_template_path(f):
def wrap(*args, **kwargs):
# Here args[0] will hold the connection object
conn_obj = args[0]
- if 'template_path' not in kwargs:
+ if 'template_path' not in kwargs or kwargs['template_path'] is None:
kwargs['template_path'] = \
'indexes/sql/#{0}#'.format(conn_obj.manager.version)
@@ -229,7 +229,7 @@ def get_sql(conn, data, did, tid, idx, datlastsysoid,
@get_template_path
def get_reverse_engineered_sql(conn, schema, table, did, tid, idx,
datlastsysoid,
- template_path=None):
+ template_path=None, with_header=True):
"""
This function will return reverse engineered sql for specified trigger.
@@ -240,6 +240,8 @@ def get_reverse_engineered_sql(conn, schema, table, did, tid, idx,
:param idx: Index ID
:param datlastsysoid:
:param template_path: Optional template path
+ :param with_header: Optional parameter to decide whether the SQL will be
+ returned with header or not
:return:
"""
SQL = render_template("/".join([template_path, 'properties.sql']),
@@ -267,11 +269,12 @@ def get_reverse_engineered_sql(conn, schema, table, did, tid, idx,
SQL, name = get_sql(conn, data, did, tid, None, datlastsysoid)
- sql_header = u"-- Index: {0}\n\n-- ".format(data['name'])
+ if with_header:
+ sql_header = u"-- Index: {0}\n\n-- ".format(data['name'])
- sql_header += render_template("/".join([template_path, 'delete.sql']),
- data=data, conn=conn)
+ sql_header += render_template("/".join([template_path, 'delete.sql']),
+ data=data, conn=conn)
- SQL = sql_header + '\n\n' + SQL
+ SQL = sql_header + '\n\n' + SQL
return SQL
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/__init__.py
index aa6694a39..2794bbf09 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/__init__.py
@@ -24,6 +24,11 @@ from pgadmin.browser.collection import CollectionNodeModule
from pgadmin.utils.ajax import make_json_response, precondition_required
from config import PG_DEFAULT_DRIVER
from pgadmin.browser.utils import PGChildModule
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.directory_compare import compare_dictionaries,\
+ directory_diff
+from pgadmin.tools.schema_diff.model import SchemaDiffModel
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
def backend_supported(module, manager, **kwargs):
@@ -152,7 +157,8 @@ class PartitionsModule(CollectionNodeModule):
blueprint = PartitionsModule(__name__)
-class PartitionsView(BaseTableView, DataTypeReader, VacuumSettings):
+class PartitionsView(BaseTableView, DataTypeReader, VacuumSettings,
+ SchemaDiffObjectCompare):
"""
This class is responsible for generating routes for Partition node
@@ -200,6 +206,10 @@ class PartitionsView(BaseTableView, DataTypeReader, VacuumSettings):
})
+ # Schema Diff: Keys to ignore while comparing
+ keys_to_ignore = ['oid', 'schema', 'vacuum_table',
+ 'vacuum_toast', 'edit_types']
+
def children(self, **kwargs):
"""Build a list of treeview nodes from the child nodes."""
@@ -367,6 +377,63 @@ class PartitionsView(BaseTableView, DataTypeReader, VacuumSettings):
return super(PartitionsView, self).properties(
gid, sid, did, scid, ptid, res)
+ @BaseTableView.check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid, tid, ptid=None):
+ """
+ This function will fetch the list of all the tables for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :param tid: Table Id
+ :param ptif: Partition table Id
+ :return:
+ """
+ res = {}
+
+ if ptid:
+ SQL = render_template("/".join([self.partition_template_path,
+ 'properties.sql']),
+ did=did, scid=scid, tid=tid,
+ ptid=ptid, datlastsysoid=self.datlastsysoid)
+ status, result = self.conn.execute_dict(SQL)
+ if not status:
+ current_app.logger.error(result)
+ return False
+
+ res = super(PartitionsView, self).properties(
+ 0, sid, did, scid, ptid, result)
+
+ else:
+ SQL = render_template(
+ "/".join([self.partition_template_path, 'nodes.sql']),
+ scid=scid, tid=tid
+ )
+ status, partitions = self.conn.execute_2darray(SQL)
+ if not status:
+ current_app.logger.error(partitions)
+ return False
+
+ for row in partitions['rows']:
+ SQL = render_template("/".join([self.partition_template_path,
+ 'properties.sql']),
+ did=did, scid=scid, tid=tid,
+ ptid=row['oid'],
+ datlastsysoid=self.datlastsysoid)
+ status, result = self.conn.execute_dict(SQL)
+
+ if not status:
+ current_app.logger.error(result)
+ return False
+
+ data = super(PartitionsView, self).properties(
+ 0, sid, did, scid, row['oid'], result, False
+ )
+ res[row['name']] = data
+
+ return res
+
@BaseTableView.check_precondition
def sql(self, gid, sid, did, scid, tid, ptid):
"""
@@ -400,6 +467,62 @@ class PartitionsView(BaseTableView, DataTypeReader, VacuumSettings):
return BaseTableView.get_reverse_engineered_sql(self, did, scid, ptid,
main_sql, data)
+ @BaseTableView.check_precondition
+ def get_sql_from_diff(self, **kwargs):
+ """
+ This function will create sql on the basis the difference of 2 tables
+ """
+ data = dict()
+ res = None
+ sid = kwargs['sid']
+ did = kwargs['did']
+ scid = kwargs['scid']
+ tid = kwargs['tid']
+ ptid = kwargs['ptid']
+ diff_data = kwargs['diff_data'] if 'diff_data' in kwargs else None
+ json_resp = kwargs['json_resp'] if 'json_resp' in kwargs else True
+ diff_schema = kwargs['diff_schema'] if 'diff_schema' in kwargs else\
+ None
+
+ if diff_data:
+ SQL = render_template("/".join([self.partition_template_path,
+ 'properties.sql']),
+ did=did, scid=scid, tid=tid,
+ ptid=ptid, datlastsysoid=self.datlastsysoid)
+ status, res = self.conn.execute_dict(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ SQL, name = self.get_sql(did, scid, ptid, diff_data, res)
+ SQL = re.sub('\n{2,}', '\n\n', SQL)
+ SQL = SQL.strip('\n')
+ return SQL
+ else:
+ main_sql = []
+
+ SQL = render_template("/".join([self.partition_template_path,
+ 'properties.sql']),
+ did=did, scid=scid, tid=tid,
+ ptid=ptid, datlastsysoid=self.datlastsysoid)
+ status, res = self.conn.execute_dict(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ if len(res['rows']) == 0:
+ return gone(gettext(
+ "The specified partitioned table could not be found."))
+
+ data = res['rows'][0]
+
+ if diff_schema:
+ data['schema'] = diff_schema
+ data['parent_schema'] = diff_schema
+
+ return BaseTableView.get_reverse_engineered_sql(self, did,
+ scid, ptid,
+ main_sql, data,
+ False)
+
@BaseTableView.check_precondition
def detach(self, gid, sid, did, scid, tid, ptid):
"""
@@ -601,7 +724,7 @@ class PartitionsView(BaseTableView, DataTypeReader, VacuumSettings):
return internal_server_error(errormsg=str(e))
@BaseTableView.check_precondition
- def delete(self, gid, sid, did, scid, tid, ptid=None):
+ def delete(self, gid, sid, did, scid, tid, ptid=None, only_sql=False):
"""
This function will delete the table object
@@ -656,5 +779,61 @@ class PartitionsView(BaseTableView, DataTypeReader, VacuumSettings):
except Exception as e:
return internal_server_error(errormsg=str(e))
+ def ddl_compare(self, **kwargs):
+ """
+ This function will compare index properties and
+ return the difference of SQL
+ """
+
+ src_sid = kwargs.get('source_sid')
+ src_did = kwargs.get('source_did')
+ src_scid = kwargs.get('source_scid')
+ src_tid = kwargs.get('source_tid')
+ src_oid = kwargs.get('source_oid')
+ tar_sid = kwargs.get('target_sid')
+ tar_did = kwargs.get('target_did')
+ tar_scid = kwargs.get('target_scid')
+ tar_tid = kwargs.get('target_tid')
+ tar_oid = kwargs.get('target_oid')
+ comp_status = kwargs.get('comp_status')
+
+ source = ''
+ target = ''
+ diff = ''
+
+ status, target_schema = self.get_schema_for_schema_diff(tar_sid,
+ tar_did,
+ tar_scid
+ )
+ if not status:
+ return internal_server_error(errormsg=target_schema)
+
+ if comp_status == SchemaDiffModel.COMPARISON_STATUS['source_only']:
+ diff = self.get_sql_from_diff(sid=src_sid,
+ did=src_did, scid=src_scid,
+ tid=src_tid, ptid=src_oid,
+ diff_schema=target_schema)
+
+ elif comp_status == SchemaDiffModel.COMPARISON_STATUS['target_only']:
+ SQL = render_template("/".join([self.partition_template_path,
+ 'properties.sql']),
+ did=did, scid=scid, tid=tid,
+ ptid=ptid, datlastsysoid=self.datlastsysoid)
+ status, res = self.conn.execute_dict(SQL)
+
+ SQL = render_template(
+ "/".join([self.table_template_path, 'properties.sql']),
+ did=tar_did, scid=tar_scid, tid=tar_oid,
+ datlastsysoid=self.datlastsysoid
+ )
+ status, res = self.conn.execute_dict(SQL)
+ if status:
+ self.cmd = 'delete'
+ diff = super(PartitionsView, self).get_delete_sql(res)
+ self.cmd = None
+
+ return diff
+
+SchemaDiffRegistry(blueprint.node_type, PartitionsView, 'table')
PartitionsView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/__init__.py
index 070875e8f..2b9f476f3 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/__init__.py
@@ -13,7 +13,8 @@ import simplejson as json
from functools import wraps
import pgadmin.browser.server_groups.servers.databases.schemas as schemas
-from flask import render_template, make_response, request, jsonify
+from flask import render_template, make_response, request, jsonify,\
+ current_app
from flask_babelex import gettext
from pgadmin.browser.collection import CollectionNodeModule
from pgadmin.browser.server_groups.servers.databases.schemas.utils import \
@@ -23,7 +24,11 @@ from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.driver import get_driver
from config import PG_DEFAULT_DRIVER
+from pgadmin.utils.compile_template_name import compile_template_path
from pgadmin.utils import IS_PY2
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
+
# If we are in Python3
if not IS_PY2:
unicode = str
@@ -134,7 +139,7 @@ class RuleModule(CollectionNodeModule):
blueprint = RuleModule(__name__)
-class RuleView(PGChildNodeView):
+class RuleView(PGChildNodeView, SchemaDiffObjectCompare):
"""
This is a class for rule node which inherits the
properties and methods from PGChildNodeView class and define
@@ -178,6 +183,9 @@ class RuleView(PGChildNodeView):
'configs': [{'get': 'configs'}]
})
+ # Schema Diff: Keys to ignore while comparing
+ keys_to_ignore = ['oid', 'schema', 'definition']
+
def check_precondition(f):
"""
This function will behave as a decorator which will check the
@@ -197,6 +205,12 @@ class RuleView(PGChildNodeView):
]['datlastsysoid'] if self.manager.db_info is not None and \
kwargs['did'] in self.manager.db_info else 0
self.template_path = 'rules/sql'
+ self.table_template_path = compile_template_path(
+ 'tables/sql',
+ self.manager.server_type,
+ self.manager.version
+ )
+
return f(*args, **kwargs)
return wrap
@@ -278,6 +292,21 @@ class RuleView(PGChildNodeView):
"""
Fetch the properties of an individual rule and render in properties tab
+ """
+ status, data = self._fetch_properties(rid)
+ if not status:
+ return data
+
+ return ajax_response(
+ response=data,
+ status=200
+ )
+
+ def _fetch_properties(self, rid):
+ """
+ This function is used to fetch the properties of the specified object
+ :param rid:
+ :return:
"""
SQL = render_template("/".join(
[self.template_path, 'properties.sql']
@@ -285,15 +314,13 @@ class RuleView(PGChildNodeView):
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(gettext("""Could not find the rule in the table."""))
+ return False, gone(
+ gettext("""Could not find the rule in the table."""))
- return ajax_response(
- response=parse_rule_definition(res),
- status=200
- )
+ return True, parse_rule_definition(res)
@check_precondition
def create(self, gid, sid, did, scid, tid):
@@ -369,7 +396,7 @@ class RuleView(PGChildNodeView):
return internal_server_error(errormsg=str(e))
@check_precondition
- def delete(self, gid, sid, did, scid, tid, rid=None):
+ def delete(self, gid, sid, did, scid, tid, rid=None, only_sql=False):
"""
This function will drop a rule object
"""
@@ -412,6 +439,8 @@ class RuleView(PGChildNodeView):
nspname=rset['nspname'],
cascade=cascade
)
+ if only_sql:
+ return SQL
status, res = self.conn.execute_scalar(SQL)
if not status:
return internal_server_error(errormsg=res)
@@ -489,6 +518,44 @@ class RuleView(PGChildNodeView):
[self.template_path, 'create.sql']), data=data)
return SQL, data['name'] if 'name' in data else old_data['name']
+ @check_precondition
+ def get_sql_from_diff(self, gid, sid, did, scid, tid, oid, data=None,
+ diff_schema=None, drop_sql=False):
+
+ if drop_sql:
+ SQL = self.delete(gid=gid, sid=sid, did=did,
+ scid=scid, tid=tid,
+ rid=oid, only_sql=True)
+ else:
+ SQL = render_template("/".join(
+ [self.template_path, 'properties.sql']), rid=oid)
+ status, res = self.conn.execute_dict(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+ if len(res['rows']) == 0:
+ return gone(
+ gettext("""Could not find the rule in the table.""")
+ )
+ res_data = parse_rule_definition(res)
+
+ SQL = ''
+
+ if data:
+ old_data = res_data
+ SQL = render_template(
+ "/".join([self.template_path, 'update.sql']),
+ data=data, o_data=old_data
+ )
+ else:
+ if diff_schema:
+ res_data['schema'] = diff_schema
+
+ SQL = render_template("/".join(
+ [self.template_path, 'create.sql']),
+ data=res_data, display_comments=True)
+
+ return SQL
+
@check_precondition
def dependents(self, gid, sid, did, scid, tid, rid):
"""
@@ -527,5 +594,47 @@ class RuleView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid, tid, oid=None,
+ ignore_keys=False):
+ """
+ This function will fetch the list of all the rules for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :param tid: Table Id
+ :return:
+ """
+
+ res = {}
+ if oid:
+ status, data = self._fetch_properties(oid)
+ if not status:
+ current_app.logger.error(data)
+ return False
+
+ res = data
+ else:
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']),
+ tid=tid)
+ status, rules = self.conn.execute_2darray(SQL)
+ if not status:
+ current_app.logger.error(rules)
+ return False
+
+ for row in rules['rows']:
+ status, data = self._fetch_properties(row['oid'])
+ if status:
+ if ignore_keys:
+ for key in self.keys_to_ignore:
+ if key in data:
+ del data[key]
+ res[row['name']] = data
+ return res
+
+SchemaDiffRegistry(blueprint.node_type, RuleView, 'table')
RuleView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/schema_diff_utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/schema_diff_utils.py
new file mode 100644
index 000000000..7a9cff6fa
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/schema_diff_utils.py
@@ -0,0 +1,507 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+""" Implements Utility class for Table and Partitioned Table. """
+
+import copy
+
+from flask import render_template
+from pgadmin.utils.driver import get_driver
+from config import PG_DEFAULT_DRIVER
+from pgadmin.tools.schema_diff.directory_compare import compare_dictionaries,\
+ directory_diff
+from pgadmin.tools.schema_diff.model import SchemaDiffModel
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+
+
+class SchemaDiffTableCompare(SchemaDiffObjectCompare):
+
+ keys_to_ignore = ['oid', 'schema', 'vacuum_table',
+ 'vacuum_toast', 'edit_types', 'attnum', 'col_type',
+ 'references', 'reltuples', 'rows_cnt']
+
+ keys_to_ignore_ddl_comp = ['oid',
+ 'schema',
+ 'columns',
+ 'edit_types',
+ 'primary_key',
+ 'exclude_constraint',
+ 'check_constraint',
+ 'foreign_key',
+ 'reltuples',
+ 'rows_cnt'
+ ]
+
+ keys_to_remove = {
+ 'columns': ['relname', 'nspname', 'parent_tbl', 'attrelid', 'adrelid'],
+ 'primary_key': ['oid'],
+ 'unique_constraint': ['oid'],
+ 'check_constraint': ['oid', 'nspname'],
+ 'foreign_key': ['oid', 'fknsp', 'confrelid'],
+ 'exclude_constraint': ['oid'],
+ 'partitions': ['oid'],
+ }
+
+ keys_to_remove_ddl_comp = {
+ 'columns': ['relname', 'nspname', 'parent_tbl', 'attrelid', 'adrelid'],
+ 'check_constraint': ['nspname'],
+ 'foreign_key': ['fknsp', 'confrelid']
+ }
+
+ def compare(self, **kwargs):
+ """
+ This function is used to compare all the table objects
+ from two different schemas.
+
+ :return: Comparison Dictionary
+ """
+ src_sid = kwargs.get('source_sid')
+ src_did = kwargs.get('source_did')
+ src_scid = kwargs.get('source_scid')
+ tar_sid = kwargs.get('target_sid')
+ tar_did = kwargs.get('target_did')
+ tar_scid = kwargs.get('target_scid')
+ sub_modules = ['index', 'rule', 'trigger']
+
+ source_tables = self.fetch_tables(sid=src_sid, did=src_did,
+ scid=src_scid)
+
+ target_tables = self.fetch_tables(sid=tar_sid, did=tar_did,
+ scid=tar_scid)
+
+ if self.manager.version >= 120000:
+ sub_modules.append('compound_trigger')
+
+ # If both the dict have no items then return None.
+ if not (source_tables or target_tables) or (
+ len(source_tables) <= 0 and len(target_tables) <= 0):
+ return None
+
+ src_server_type, tar_server_type = self.get_server_type(src_sid,
+ tar_sid)
+ for module in sub_modules:
+
+ module_view = SchemaDiffRegistry.get_node_view(
+ module)
+
+ # Get sub module data for source tables
+ if module_view.blueprint.server_type is None or \
+ src_server_type in module_view.blueprint.server_type:
+ for key, val in source_tables.items():
+ source = module_view.fetch_objects_to_compare(
+ sid=src_sid,
+ did=src_did,
+ scid=src_scid,
+ tid=val['oid'],
+ oid=None,
+ ignore_keys=True
+ )
+ source_tables[key][module] = source
+
+ # Get sub module data for target tables
+ if module_view.blueprint.server_type is None or \
+ tar_server_type in module_view.blueprint.server_type:
+ for key, val in target_tables.items():
+ target = module_view.fetch_objects_to_compare(
+ sid=tar_sid,
+ did=tar_did,
+ scid=tar_scid,
+ tid=val['oid'],
+ oid=None,
+ ignore_keys=True
+ )
+ target_tables[key][module] = target
+
+ return compare_dictionaries(source_tables, target_tables,
+ self.node_type,
+ self.blueprint.COLLECTION_LABEL,
+ self.keys_to_ignore)
+
+ @staticmethod
+ def get_server_type(src_id, tar_id):
+ """Get server types of source and target servers."""
+ driver = get_driver(PG_DEFAULT_DRIVER)
+ src_manager = driver.connection_manager(src_id)
+ tar_manager = driver.connection_manager(tar_id)
+
+ return src_manager.server_type, tar_manager.server_type
+
+ def ddl_compare(self, **kwargs):
+ """
+ This function will compare properties of 2 tables and
+ return the source DDL, target DDL and Difference of them.
+ """
+
+ src_sid = kwargs.get('source_sid')
+ src_did = kwargs.get('source_did')
+ src_scid = kwargs.get('source_scid')
+ src_oid = kwargs.get('source_oid')
+ tar_sid = kwargs.get('target_sid')
+ tar_did = kwargs.get('target_did')
+ tar_scid = kwargs.get('target_scid')
+ tar_oid = kwargs.get('target_oid')
+ comp_status = kwargs.get('comp_status')
+ generate_script = False
+
+ if 'generate_script' in kwargs and kwargs['generate_script']:
+ generate_script = True
+
+ source = ''
+ target = ''
+ diff = ''
+ ignore_sub_modules = ['column', 'constraints']
+
+ src_server_type, tar_server_type = self.get_server_type(src_sid,
+ tar_sid)
+
+ status, target_schema = self.get_schema(tar_sid,
+ tar_did,
+ tar_scid
+ )
+
+ if not status:
+ return internal_server_error(errormsg=target_schema)
+
+ if comp_status == SchemaDiffModel.COMPARISON_STATUS['source_only']:
+ if not generate_script:
+ source = self.get_sql_from_table_diff(sid=src_sid,
+ did=src_did,
+ scid=src_scid,
+ tid=src_oid,
+ json_resp=False)
+ diff = self.get_sql_from_table_diff(sid=src_sid, did=src_did,
+ scid=src_scid, tid=src_oid,
+ diff_schema=target_schema,
+ json_resp=False)
+
+ elif comp_status == SchemaDiffModel.COMPARISON_STATUS['target_only']:
+ if not generate_script:
+ target = self.get_sql_from_table_diff(sid=tar_sid,
+ did=tar_did,
+ scid=tar_scid,
+ tid=tar_oid,
+ json_resp=False)
+ SQL = render_template(
+ "/".join([self.table_template_path, 'properties.sql']),
+ did=tar_did, scid=tar_scid, tid=tar_oid,
+ datlastsysoid=self.datlastsysoid
+ )
+ status, res = self.conn.execute_dict(SQL)
+
+ if status:
+ diff = self.get_delete_sql(res)
+
+ elif comp_status == SchemaDiffModel.COMPARISON_STATUS['different']:
+ source = self.fetch_tables(
+ sid=src_sid, did=src_did,
+ scid=src_scid, tid=src_oid,
+ keys_to_remove=self.keys_to_remove_ddl_comp
+ )
+ target = self.fetch_tables(
+ sid=tar_sid, did=tar_did,
+ scid=tar_scid, tid=tar_oid,
+ keys_to_remove=self.keys_to_remove_ddl_comp
+ )
+
+ if self.manager.version < 100000:
+ ignore_sub_modules.append('partition')
+
+ if self.manager.version < 120000:
+ ignore_sub_modules.append('compound_trigger')
+
+ # In case of error return None
+ if not (source or target):
+ return None
+
+ diff_dict = directory_diff(
+ source, target, ignore_keys=self.keys_to_ignore_ddl_comp,
+ difference={}
+ )
+
+ # Column comparison
+ col_diff = self.table_col_ddl_comp(source, target)
+ diff_dict.update(col_diff)
+
+ # Constraint comparison
+ pk_diff = self.constraint_ddl_comp(source, target)
+ diff_dict.update(pk_diff)
+
+ diff_dict['relacl'] = self.parce_acl(source, target)
+
+ if not generate_script:
+ source = self.get_sql_from_table_diff(sid=src_sid,
+ did=src_did,
+ scid=src_scid,
+ tid=src_oid,
+ json_resp=False)
+ target = self.get_sql_from_table_diff(sid=tar_sid,
+ did=tar_did,
+ scid=tar_scid,
+ tid=tar_oid,
+ json_resp=False)
+ diff = self.get_sql_from_table_diff(sid=tar_sid, did=tar_did,
+ scid=tar_scid, tid=tar_oid,
+ diff_data=diff_dict,
+ json_resp=False)
+
+ for module in self.blueprint.submodules:
+ if module.NODE_TYPE not in ignore_sub_modules:
+ module_view = SchemaDiffRegistry.get_node_view(
+ module.NODE_TYPE)
+
+ if module_view.blueprint.server_type and (
+ src_server_type not in
+ module_view.blueprint.server_type and
+ tar_server_type not in
+ module_view.blueprint.server_type
+ ):
+ continue
+
+ if module_view.blueprint.server_type and (
+ (src_server_type in
+ module_view.blueprint.server_type and
+ tar_server_type not in
+ module_view.blueprint.server_type) or (
+ src_server_type not in
+ module_view.blueprint.server_type and
+ tar_server_type in
+ module_view.blueprint.server_type)
+ ):
+ continue
+
+ result = module_view.compare(
+ source_sid=src_sid, source_did=src_did,
+ source_scid=src_scid, source_tid=src_oid,
+ target_sid=tar_sid, target_did=tar_did,
+ target_scid=tar_scid, target_tid=tar_oid
+ )
+ if result and module.NODE_TYPE != 'partition':
+ child_diff = ''
+ for res in result:
+ if res['status'] == \
+ SchemaDiffModel.COMPARISON_STATUS[
+ 'different']:
+ source_oid = res['source_oid']
+ target_oid = res['target_oid']
+ else:
+ source_oid = res['oid']
+ target_oid = res['oid']
+
+ if res['status'] != \
+ SchemaDiffModel.COMPARISON_STATUS[
+ 'identical']:
+ child_diff = module_view.ddl_compare(
+ source_sid=src_sid, source_did=src_did,
+ source_scid=src_scid,
+ source_oid=source_oid,
+ source_tid=src_oid, target_sid=tar_sid,
+ target_did=tar_did, target_scid=tar_scid,
+ target_tid=tar_oid, target_oid=target_oid,
+ comp_status=res['status']
+
+ )
+ if child_diff:
+ diff += child_diff
+ elif result:
+ # For partition module
+ identical = False
+ source_only = False
+ target_only = False
+ different = False
+ for res in result:
+ if res['status'] == \
+ SchemaDiffModel.COMPARISON_STATUS[
+ 'identical']:
+ identical = True
+ elif res['status'] == \
+ SchemaDiffModel.COMPARISON_STATUS[
+ 'source_only']:
+ source_only = True
+ elif res['status'] == \
+ SchemaDiffModel.COMPARISON_STATUS[
+ 'target_only']:
+ target_only = True
+ else:
+ different = True
+
+ if identical:
+ pass
+ elif (source_only or target_only) and not different:
+ for res in result:
+ source_oid = res['oid']
+ target_oid = res['oid']
+
+ child_diff = module_view.ddl_compare(
+ source_sid=src_sid, source_did=src_did,
+ source_scid=src_scid,
+ source_oid=source_oid,
+ source_tid=src_oid, target_sid=tar_sid,
+ target_did=tar_did, target_scid=tar_scid,
+ target_tid=tar_oid, target_oid=target_oid,
+ comp_status=res['status']
+
+ )
+ if ddl_compare:
+ diff += child_diff
+ else:
+ diff = self.get_sql_from_table_diff(
+ sid=src_sid,
+ did=src_did,
+ scid=src_scid,
+ tid=src_oid,
+ diff_schema=target_schema,
+ json_resp=False,
+ schema_diff_table=True
+ )
+ else:
+ source = self.get_sql_from_table_diff(sid=src_sid, did=src_did,
+ scid=src_scid, tid=src_oid,
+ json_resp=False)
+ target = self.get_sql_from_table_diff(sid=tar_sid, did=tar_did,
+ scid=tar_scid, tid=tar_oid,
+ json_resp=False)
+
+ return {'source_ddl': source,
+ 'target_ddl': target,
+ 'diff_ddl': diff
+ }
+
+ @staticmethod
+ def table_col_ddl_comp(source, target):
+ """
+ Table Column comparison
+ :param source: Source columns
+ :param target: Target columns
+ :return: Difference of the columns
+ """
+ source_cols = source['columns']
+ target_cols = copy.deepcopy(target['columns'])
+ added = []
+ updated = []
+ different = {'columns': {}}
+
+ for source in source_cols:
+ if 'name' in source:
+ if type(target_cols) is list and len(
+ target_cols) > 0:
+ tmp = None
+ for item in target_cols:
+ if item['name'] == source['name']:
+ tmp = copy.deepcopy(item)
+ if tmp and source != tmp:
+ tmp_updated = copy.deepcopy(source)
+ # Preserve the column number
+ tmp_updated['attnum'] = tmp['attnum']
+ if item['typname'] not in tmp_updated['edit_types']:
+ tmp_updated['col_type_conversion'] = False
+ updated.append(tmp_updated)
+ target_cols.remove(tmp)
+ elif tmp and source == tmp:
+ target_cols.remove(tmp)
+ elif tmp is None:
+ added.append(source)
+ else:
+ added.append(source)
+ different['columns']['added'] = added
+ different['columns']['changed'] = updated
+
+ if target_cols and len(target_cols) > 0:
+ different['columns']['deleted'] = target_cols
+
+ return different
+
+ @staticmethod
+ def constraint_ddl_comp(source_table, target_table):
+ """
+ Table Constraint DDL comparison
+ :param source: Source Table
+ :param target: Target Table
+ :return: Difference of constraints
+ """
+ different = {}
+ non_editable_keys = {}
+
+ non_editable_keys = {'primary_key': ['col_count',
+ 'condeferrable',
+ 'condeffered',
+ 'columns'],
+ 'check_constraint': ['consrc'],
+ 'exclude_constraint': ['amname',
+ 'indconstraint',
+ 'columns']
+ }
+
+ for constraint in ['primary_key', 'check_constraint',
+ 'exclude_constraint']:
+ source_cols = source_table[constraint] if \
+ constraint in source_table else []
+ target_cols = copy.deepcopy(target_table[constraint]) if\
+ constraint in target_table else []
+ added = []
+ updated = []
+ deleted = []
+
+ different[constraint] = {}
+ for source in source_cols:
+ if 'name' in source:
+ if type(target_cols) is list and len(
+ target_cols) > 0:
+ tmp_src = copy.deepcopy(source)
+ tmp_src.pop('oid')
+ tmp_tar = None
+ tmp = None
+ for item in target_cols:
+ if item['name'] == source['name']:
+ tmp_tar = copy.deepcopy(item)
+ tmp = copy.deepcopy(item)
+ tmp_tar.pop('oid')
+ if tmp_tar and tmp_src != tmp_tar:
+ tmp_updated = copy.deepcopy(source)
+ for key in non_editable_keys[constraint]:
+ if key in tmp_updated and \
+ tmp_updated[key] != tmp_tar[key]:
+ added.append(source)
+ deleted.append(tmp_updated)
+ tmp_updated = None
+ break
+ if tmp_updated:
+ tmp_updated['oid'] = tmp_tar['oid']
+ updated.append(tmp_updated)
+ target_cols.remove(tmp)
+ elif tmp_tar and tmp_src == tmp_tar:
+ target_cols.remove(tmp)
+ elif tmp_tar is None:
+ added.append(source)
+ else:
+ added.append(source)
+ different[constraint]['added'] = added
+ different[constraint]['changed'] = updated
+ different[constraint]['deleted'] = deleted
+
+ if target_cols and len(target_cols) > 0:
+ different[constraint]['deleted'] = target_cols
+
+ return different
+
+ def remove_keys_for_comparision(self, data, keys=None):
+ """
+ This function is used to remove specific keys from data
+ """
+
+ keys_to_remove = keys if keys else self.keys_to_remove
+
+ for p_key, p_val in keys_to_remove.items():
+ if p_key in data and data[p_key] is not None \
+ and len(data[p_key]) > 0:
+ for item in data[p_key]:
+ # Remove keys that should not be the part of comparision.
+ for key in p_val:
+ if key in item:
+ item.pop(key)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/create.sql
index 36eb7ff8e..c189a7488 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/create.sql
@@ -21,7 +21,7 @@ CACHE {{data.seqcache|int}} {% endif %}
{% endif %}{% endif %};
{### Add comments ###}
-{% if data and data.description %}
+{% if data and data.description and data.description != None %}
COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.table, data.name)}}
IS {{data.description|qtLiteral}};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/update.sql
index 4b943defb..4e8b982fd 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/update.sql
@@ -10,8 +10,14 @@ ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
{% endif %}
{### Alter column type and collation ###}
{% if (data.cltype and data.cltype != o_data.cltype) or (data.attlen is defined and data.attlen != o_data.attlen) or (data.attprecision is defined and data.attprecision != o_data.attprecision) or (data.collspcname and data.collspcname != o_data.collspcname)%}
-ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
- ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} TYPE {{ GET_TYPE.UPDATE_TYPE_SQL(conn, data, o_data) }}{% if data.collspcname and data.collspcname != o_data.collspcname %}
+{% if data.col_type_conversion is defined and data.col_type_conversion == False %}
+-- WARNING:
+-- The SQL statement below would normally be used to alter the datatype for the {{o_data.name}} column, however,
+-- the current datatype cannot be cast to the target datatype so this conversion cannot be made automatically.
+
+{% endif %}
+{% if data.col_type_conversion is defined and data.col_type_conversion == False %} -- {% endif %}ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
+{% if data.col_type_conversion is defined and data.col_type_conversion == False %} -- {% endif %} ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} TYPE {{ GET_TYPE.UPDATE_TYPE_SQL(conn, data, o_data) }}{% if data.collspcname and data.collspcname != o_data.collspcname %}
COLLATE {{data.collspcname}}{% elif o_data.collspcname %} COLLATE {{o_data.collspcname}}{% endif %};
{% endif %}
{### Alter column default value ###}
@@ -95,7 +101,7 @@ COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.table, o_data.name)}}
{% endif %}
{### Update column variables ###}
-{% if 'attoptions' in data and data.attoptions|length > 0 %}
+{% if 'attoptions' in data and data.attoptions and data.attoptions|length > 0 %}
{% set variables = data.attoptions %}
{% if 'deleted' in variables and variables.deleted|length > 0 %}
ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/12_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/12_plus/create.sql
index 71de43658..19e26f2c2 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/12_plus/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/12_plus/create.sql
@@ -21,7 +21,7 @@ CACHE {{data.seqcache|int}} {% endif %}
{% endif %}{% endif %}{% if data.colconstype == 'g' and data.genexpr and data.genexpr != '' %} GENERATED ALWAYS AS ({{data.genexpr}}) STORED{% endif %};
{### Add comments ###}
-{% if data and data.description %}
+{% if data and data.description and data.description != None %}
COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.table, data.name)}}
IS {{data.description|qtLiteral}};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/9.2_plus/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/9.2_plus/update.sql
index d27734401..dfb7555c1 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/9.2_plus/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/9.2_plus/update.sql
@@ -6,6 +6,12 @@
{% if data.name and data.name != o_data.name %}
ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
RENAME {{conn|qtIdent(o_data.name)}} TO {{conn|qtIdent(data.name)}};
+{% endif %}
+{% if data.col_type_conversion is defined and data.col_type_conversion == False %}
+-- WARNING:
+-- The SQL statement below would normally be used to alter the datatype for the {{o_data.name}} column, however,
+-- the current datatype cannot be cast to the target datatype so this conversion cannot be made automatically.
+
{% endif %}
{### Alter column type and collation ###}
{% if (data.cltype and data.cltype != o_data.cltype) or (data.attlen is defined and data.attlen != o_data.attlen) or (data.attprecision is defined and data.attprecision != o_data.attprecision) or (data.collspcname and data.collspcname != o_data.collspcname)%}
@@ -45,7 +51,7 @@ PLAIN{% elif data.attstorage == 'm'%}MAIN{% elif data.attstorage == 'e'%}
EXTERNAL{% elif data.attstorage == 'x'%}EXTENDED{% endif %};
{% endif %}
-{% if data.description is defined %}
+{% if data.description is defined and data.description != None %}
{% if data.name %}
COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.table, data.name)}}
{% else %}
@@ -55,7 +61,7 @@ COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.table, o_data.name)}}
{% endif %}
{### Update column variables ###}
-{% if 'attoptions' in data and data.attoptions|length > 0 %}
+{% if 'attoptions' in data and data.attoptions != None and data.attoptions|length > 0 %}
{% set variables = data.attoptions %}
{% if 'deleted' in variables and variables.deleted|length > 0 %}
ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/create.sql
index affd88906..ed7f5f1c6 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/create.sql
@@ -12,7 +12,7 @@ ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
{% endif %}
{### Add comments ###}
-{% if data and data.description %}
+{% if data and data.description and data.description != None %}
COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.table, data.name)}}
IS {{data.description|qtLiteral}};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/update.sql
index ac0afe8d1..3c6ae0a91 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/update.sql
@@ -9,9 +9,15 @@ ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
{% endif %}
{### Alter column type and collation ###}
-{% if (data.cltype and data.cltype != o_data.cltype) or (data.attlen is defined and data.attlen != o_data.attlen) or (data.attprecision is defined and data.attprecision != o_data.attprecision) or (data.collspcname and data.collspcname != o_data.collspcname) %}
-ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
- ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} TYPE {{ GET_TYPE.UPDATE_TYPE_SQL(conn, data, o_data) }}{% if data.collspcname and data.collspcname != o_data.collspcname %}
+{% if (data.cltype and data.cltype != o_data.cltype) or (data.attlen is defined and data.attlen != o_data.attlen) or (data.attprecision is defined and data.attprecision != o_data.attprecision) or (data.collspcname and data.collspcname != o_data.collspcname)%}
+{% if data.col_type_conversion is defined and data.col_type_conversion == False %}
+-- WARNING:
+-- The SQL statement below would normally be used to alter the datatype for the XXX column, however,
+-- the current datatype cannot be cast to the target datatype so this conversion cannot be made automatically.
+
+{% endif %}
+{% if data.col_type_conversion is defined and data.col_type_conversion == False %} -- {% endif %}ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
+{% if data.col_type_conversion is defined and data.col_type_conversion == False %} -- {% endif %} ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} TYPE {{ GET_TYPE.UPDATE_TYPE_SQL(conn, data, o_data) }}{% if data.collspcname and data.collspcname != o_data.collspcname %}
COLLATE {{data.collspcname}}{% elif o_data.collspcname %} COLLATE {{o_data.collspcname}}{% endif %};
{% endif %}
{### Alter column default value ###}
@@ -46,7 +52,7 @@ PLAIN{% elif data.attstorage == 'm'%}MAIN{% elif data.attstorage == 'e'%}
EXTERNAL{% elif data.attstorage == 'x'%}EXTENDED{% endif %};
{% endif %}
-{% if data.description is defined %}
+{% if data.description is defined and data.description != None %}
{% if data.name %}
COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.table, data.name)}}
{% else %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/partitions/sql/pg/10_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/partitions/sql/pg/10_plus/create.sql
index 6db5452b5..01f9bfbab 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/partitions/sql/pg/10_plus/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/partitions/sql/pg/10_plus/create.sql
@@ -3,6 +3,7 @@
{#====== MAIN TABLE TEMPLATE STARTS HERE ======#}
{#===========================================#}
{### CREATE TABLE STATEMENT FOR partitions ###}
+
CREATE {% if data.relpersistence %}UNLOGGED {% endif %}TABLE {{conn|qtIdent(data.schema, data.name)}}{% if data.relispartition is defined and data.relispartition %} PARTITION OF {{conn|qtIdent(data.parent_schema, data.partitioned_table_name)}}{% endif %}
{# Macro to render for constraints #}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/10_plus/schema_diff.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/10_plus/schema_diff.sql
new file mode 100644
index 000000000..ebd4ae6e5
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/10_plus/schema_diff.sql
@@ -0,0 +1,14 @@
+
+
+INSERT INTO {{conn|qtIdent(data.schema, data.name)}}(
+{% if data.columns and data.columns|length > 0 %}
+{% for c in data.columns %}{{c.name}}{% if not loop.last %},{% endif %}{% endfor %}{% endif %})
+SELECT {% if data.columns and data.columns|length > 0 %}{% for c in data.columns %}{{c.name}}{% if not loop.last %},{% endif %}{% endfor %}{% endif %}
+ FROM {{conn|qtIdent(data.schema, data.orig_name)}};
+
+DROP TABLE {{conn|qtIdent(data.schema, data.orig_name)}};
+
+{{partition_sql}}
+
+ALTER TABLE {{conn|qtIdent(data.schema, data.name)}}
+ RENAME TO {{conn|qtIdent(data.orig_name)}};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/__init__.py
index d6f6867e0..0344fcbd0 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/__init__.py
@@ -13,7 +13,7 @@ import simplejson as json
from functools import wraps
import pgadmin.browser.server_groups.servers.databases as database
-from flask import render_template, request, jsonify
+from flask import render_template, request, jsonify, current_app
from flask_babelex import gettext
from pgadmin.browser.collection import CollectionNodeModule
from pgadmin.browser.utils import PGChildNodeView
@@ -25,7 +25,11 @@ from pgadmin.browser.server_groups.servers.databases.schemas.utils \
import trigger_definition
from pgadmin.utils.driver import get_driver
from config import PG_DEFAULT_DRIVER
+from pgadmin.utils.compile_template_name import compile_template_path
from pgadmin.utils import IS_PY2
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
+
# If we are in Python3
if not IS_PY2:
unicode = str
@@ -151,7 +155,7 @@ class TriggerModule(CollectionNodeModule):
blueprint = TriggerModule(__name__)
-class TriggerView(PGChildNodeView):
+class TriggerView(PGChildNodeView, SchemaDiffObjectCompare):
"""
This class is responsible for generating routes for Trigger node
@@ -244,6 +248,10 @@ class TriggerView(PGChildNodeView):
'enable': [{'put': 'enable_disable_trigger'}]
})
+ # Schema Diff: Keys to ignore while comparing
+ keys_to_ignore = ['oid', 'xmin', 'nspname', 'tfunction',
+ 'tgrelid', 'tgfoid', 'prosrc']
+
def check_precondition(f):
"""
This function will behave as a decorator which will checks
@@ -267,6 +275,11 @@ class TriggerView(PGChildNodeView):
kwargs['did'] in self.manager.db_info else 0
# we will set template path for sql scripts
+ self.table_template_path = compile_template_path(
+ 'tables/sql',
+ self.manager.server_type,
+ self.manager.version
+ )
self.template_path = 'triggers/sql/{0}/#{1}#'.format(
self.manager.server_type, self.manager.version)
# Store server type
@@ -450,7 +463,22 @@ class TriggerView(PGChildNodeView):
Returns:
JSON of selected trigger node
"""
+ status, data = self._fetch_properties(tid, trid)
+ if not status:
+ return data
+
+ return ajax_response(
+ response=data,
+ status=200
+ )
+ def _fetch_properties(self, tid, trid):
+ """
+ This function is used to fetch the properties of the specified object
+ :param tid:
+ :param trid:
+ :return:
+ """
SQL = render_template("/".join([self.template_path,
'properties.sql']),
tid=tid, trid=trid,
@@ -459,10 +487,10 @@ class TriggerView(PGChildNodeView):
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(
+ return False, gone(
gettext("""Could not find the trigger in the table."""))
# Making copy of output for future use
@@ -472,10 +500,7 @@ class TriggerView(PGChildNodeView):
data = trigger_definition(data)
- return ajax_response(
- response=data,
- status=200
- )
+ return True, data
@check_precondition
def create(self, gid, sid, did, scid, tid):
@@ -552,7 +577,7 @@ class TriggerView(PGChildNodeView):
return internal_server_error(errormsg=str(e))
@check_precondition
- def delete(self, gid, sid, did, scid, tid, trid=None):
+ def delete(self, gid, sid, did, scid, tid, trid=None, only_sql=False):
"""
This function will updates existing the trigger object
@@ -610,6 +635,8 @@ class TriggerView(PGChildNodeView):
conn=self.conn,
cascade=cascade
)
+ if only_sql:
+ return SQL
status, res = self.conn.execute_scalar(SQL)
if not status:
return internal_server_error(errormsg=res)
@@ -761,6 +788,36 @@ class TriggerView(PGChildNodeView):
return ajax_response(response=SQL)
+ @check_precondition
+ def get_sql_from_diff(self, gid, sid, did, scid, tid, oid,
+ data=None, diff_schema=None, drop_sql=False):
+ if data:
+ SQL, name = trigger_utils.get_sql(
+ self.conn, data, tid, oid,
+ self.datlastsysoid,
+ self.blueprint.show_system_objects)
+
+ if not isinstance(SQL, (str, unicode)):
+ return SQL
+ SQL = SQL.strip('\n').strip(' ')
+ else:
+ if drop_sql:
+ SQL = self.delete(gid=gid, sid=sid, did=did,
+ scid=scid, tid=tid, trid=oid,
+ only_sql=True)
+ else:
+ schema = self.schema
+ if diff_schema:
+ schema = diff_schema
+ SQL = trigger_utils.get_reverse_engineered_sql(
+ self.conn, schema,
+ self.table, tid, oid,
+ self.datlastsysoid,
+ self.blueprint.show_system_objects,
+ template_path=None, with_header=False)
+
+ return SQL
+
@check_precondition
def enable_disable_trigger(self, gid, sid, did, scid, tid, trid):
"""
@@ -875,5 +932,46 @@ class TriggerView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid, tid, oid=None,
+ ignore_keys=False):
+ """
+ This function will fetch the list of all the triggers for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :param tid: Table Id
+ :return:
+ """
+ res = dict()
+
+ if oid:
+ status, data = self._fetch_properties(tid, oid)
+ if not status:
+ current_app.logger.error(data)
+ return False
+ res = data
+ else:
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), tid=tid)
+ status, triggers = self.conn.execute_2darray(SQL)
+ if not status:
+ current_app.logger.error(triggers)
+ return False
+
+ for row in triggers['rows']:
+ status, data = self._fetch_properties(tid, row['oid'])
+ if status:
+ if ignore_keys:
+ for key in self.keys_to_ignore:
+ if key in data:
+ del data[key]
+ res[row['name']] = data
+
+ return res
+
+SchemaDiffRegistry(blueprint.node_type, TriggerView, 'table')
TriggerView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/utils.py
index 166d2a14c..221f48d52 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/utils.py
@@ -30,7 +30,7 @@ def get_template_path(f):
def wrap(*args, **kwargs):
# Here args[0] will hold the connection object
conn_obj = args[0]
- if 'template_path' not in kwargs:
+ if 'template_path' not in kwargs or kwargs['template_path'] is None:
kwargs['template_path'] = 'triggers/sql/{0}/#{1}#'.format(
conn_obj.manager.server_type, conn_obj.manager.version)
@@ -201,7 +201,7 @@ def get_sql(conn, data, tid, trid, datlastsysoid,
@get_template_path
def get_reverse_engineered_sql(conn, schema, table, tid, trid,
datlastsysoid, show_system_objects,
- template_path=None):
+ template_path=None, with_header=True):
"""
This function will return reverse engineered sql for specified trigger.
@@ -213,6 +213,8 @@ def get_reverse_engineered_sql(conn, schema, table, tid, trid,
:param datlastsysoid:
:param show_system_objects: Show System Object value True or False
:param template_path: Optional template path
+ :param with_header: Optional parameter to decide whether the SQL will be
+ returned with header or not
:return:
"""
SQL = render_template("/".join([template_path, 'properties.sql']),
@@ -240,12 +242,15 @@ def get_reverse_engineered_sql(conn, schema, table, tid, trid,
SQL, name = get_sql(conn, data, tid, None, datlastsysoid,
show_system_objects)
- sql_header = u"-- Trigger: {0}\n\n-- ".format(data['name'])
+ if with_header:
+ sql_header = u"-- Trigger: {0}\n\n-- ".format(data['name'])
- sql_header += render_template("/".join([template_path, 'delete.sql']),
- data=data, conn=conn)
+ sql_header += render_template("/".join([template_path, 'delete.sql']),
+ data=data, conn=conn)
- SQL = sql_header + '\n\n' + SQL.strip('\n')
+ SQL = sql_header + '\n\n' + SQL.strip('\n')
+ else:
+ SQL = SQL.strip('\n')
# If trigger is disabled then add sql code for the same
if data['is_enable_trigger'] != 'O':
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/utils.py
index 1599d35e2..3247d2fc7 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/utils.py
@@ -10,6 +10,7 @@
""" Implements Utility class for Table and Partitioned Table. """
import re
+import copy
from functools import wraps
import simplejson as json
from flask import render_template, jsonify, request
@@ -179,8 +180,10 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
data[row['deftype']] = [priv]
# We will add Auto vacuum defaults with out result for grid
- data['vacuum_table'] = self.parse_vacuum_data(self.conn, data, 'table')
- data['vacuum_toast'] = self.parse_vacuum_data(self.conn, data, 'toast')
+ data['vacuum_table'] = copy.deepcopy(
+ self.parse_vacuum_data(self.conn, data, 'table'))
+ data['vacuum_toast'] = copy.deepcopy(
+ self.parse_vacuum_data(self.conn, data, 'toast'))
# Fetch columns for the table logic
#
@@ -405,7 +408,8 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
status=200
)
- def get_reverse_engineered_sql(self, did, scid, tid, main_sql, data):
+ def get_reverse_engineered_sql(self, did, scid, tid, main_sql, data,
+ json_resp=True, diff_partition_sql=False):
"""
This function will creates reverse engineered sql for
the table object
@@ -416,6 +420,9 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
tid: Table ID
main_sql: List contains all the reversed engineered sql
data: Table's Data
+ json_resp: Json response or plain SQL
+ diff_partition_sql: In Schema diff, the Partition sql should be
+ return separately to perform further task
"""
"""
#####################################
@@ -427,6 +434,7 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
schema = data['schema']
table = data['name']
is_partitioned = 'is_partitioned' in data and data['is_partitioned']
+ sql_header = ''
data = self._formatter(did, scid, tid, data)
@@ -444,18 +452,20 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
c['cltype'], c['hasSqrBracket'] = \
column_utils.type_formatter(c['cltype'])
- sql_header = u"-- Table: {0}\n\n-- ".format(
- self.qtIdent(self.conn, data['schema'], data['name']))
+ if json_resp:
+ sql_header = u"-- Table: {0}\n\n-- ".format(
+ self.qtIdent(self.conn, data['schema'], data['name']))
- sql_header += render_template("/".join([self.table_template_path,
- 'delete.sql']),
- data=data, conn=self.conn)
+ sql_header += render_template("/".join([self.table_template_path,
+ 'delete.sql']),
+ data=data, conn=self.conn)
- sql_header = sql_header.strip('\n')
- sql_header += '\n'
+ sql_header = sql_header.strip('\n')
+ sql_header += '\n'
- # Add into main sql
- main_sql.append(sql_header)
+ # Add into main sql
+ main_sql.append(sql_header)
+ partition_main_sql = ""
# Parse privilege data
if 'relacl' in data:
@@ -493,12 +503,14 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
for row in rset['rows']:
index_sql = index_utils.get_reverse_engineered_sql(
self.conn, schema, table, did, tid, row['oid'],
- self.datlastsysoid)
+ self.datlastsysoid,
+ template_path=None, with_header=json_resp)
index_sql = u"\n" + index_sql
# Add into main sql
index_sql = re.sub('\n{2,}', '\n\n', index_sql)
- main_sql.append(index_sql)
+
+ main_sql.append(index_sql.strip('\n'))
"""
########################################
@@ -514,7 +526,8 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
for row in rset['rows']:
trigger_sql = trigger_utils.get_reverse_engineered_sql(
self.conn, schema, table, tid, row['oid'],
- self.datlastsysoid, self.blueprint.show_system_objects)
+ self.datlastsysoid, self.blueprint.show_system_objects,
+ template_path=None, with_header=json_resp)
trigger_sql = u"\n" + trigger_sql
# Add into main sql
@@ -571,10 +584,13 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
if not status:
return internal_server_error(errormsg=res)
+ display_comments = True
+ if not json_resp:
+ display_comments = False
res_data = parse_rule_definition(res)
rules_sql += render_template("/".join(
[self.rules_template_path, 'create.sql']),
- data=res_data, display_comments=True)
+ data=res_data, display_comments=display_comments)
# Add into main sql
rules_sql = re.sub('\n{2,}', '\n\n', rules_sql)
@@ -594,13 +610,17 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
return internal_server_error(errormsg=rset)
if len(rset['rows']):
- sql_header = u"\n-- Partitions SQL"
+ if json_resp:
+ sql_header = u"\n-- Partitions SQL"
partition_sql = ''
for row in rset['rows']:
part_data = dict()
- part_data['partitioned_table_name'] = table
- part_data['parent_schema'] = schema
- part_data['schema'] = row['schema_name']
+ part_data['partitioned_table_name'] = data['name']
+ part_data['parent_schema'] = data['schema']
+ if not json_resp:
+ part_data['schema'] = data['schema']
+ else:
+ part_data['schema'] = row['schema_name']
part_data['relispartition'] = True
part_data['name'] = row['name']
part_data['partition_value'] = row['partition_value']
@@ -612,13 +632,18 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
data=part_data, conn=self.conn)
# Add into main sql
- partition_sql = re.sub('\n{2,}', '\n\n', partition_sql)
- main_sql.append(
- sql_header + '\n\n' + partition_sql.strip('\n')
- )
+ partition_sql = re.sub('\n{2,}', '\n\n', partition_sql
+ ).strip('\n')
+ partition_main_sql = partition_sql.strip('\n')
+ if not diff_partition_sql:
+ main_sql.append(
+ sql_header + '\n\n' + partition_main_sql
+ )
sql = '\n'.join(main_sql)
+ if not json_resp:
+ return sql, partition_main_sql
return ajax_response(response=sql.strip('\n'))
def reset_statistics(self, scid, tid):
@@ -907,7 +932,8 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
conn=self.conn).strip('\n') + '\n\n'
# If partition(s) is/are added
- if 'added' in partitions:
+ if 'added' in partitions and 'partition_scheme' in old_data\
+ and old_data['partition_scheme'] != '':
temp_data = dict()
temp_data['schema'] = data['schema']
temp_data['name'] = data['name']
@@ -1133,7 +1159,8 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
except Exception as e:
return internal_server_error(errormsg=str(e))
- def properties(self, gid, sid, did, scid, tid, res):
+ def properties(self, gid, sid, did, scid, tid, res,
+ return_ajax_response=True):
"""
This function will show the properties of the selected table node.
@@ -1145,6 +1172,7 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
scid: Schema ID
tid: Table ID
res: Table/Partition table properties
+ return_ajax_response: If True then return the ajax response
Returns:
JSON of selected table node
@@ -1242,6 +1270,9 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
data['partitions'] = partitions
+ if not return_ajax_response:
+ return data
+
return ajax_response(
response=data,
status=200
@@ -1359,18 +1390,7 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
}
)
- def delete(self, gid, sid, did, scid, tid, res):
- """
- This function will delete the table object
-
- Args:
- gid: Server Group ID
- sid: Server ID
- did: Database ID
- scid: Schema ID
- tid: Table ID
- """
-
+ def get_delete_sql(self, res):
# Below will decide if it's simple drop or drop with cascade call
if self.cmd == 'delete':
# This is a cascade operation
@@ -1380,11 +1400,26 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
data = res['rows'][0]
- SQL = render_template(
+ return render_template(
"/".join([self.table_template_path, 'delete.sql']),
data=data, cascade=cascade,
conn=self.conn
)
+
+ def delete(self, gid, sid, did, scid, tid, res):
+ """
+ This function will delete the table object
+
+ Args:
+ gid: Server Group ID
+ sid: Server ID
+ did: Database ID
+ scid: Schema ID
+ tid: Table ID
+ """
+
+ SQL = self.get_delete_sql(res)
+
status, res = self.conn.execute_scalar(SQL)
if not status:
return status, res
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py
index b50e6d7d7..b173a4058 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py
@@ -26,6 +26,8 @@ from pgadmin.utils import IS_PY2
from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -94,7 +96,7 @@ class TypeModule(SchemaChildModule):
blueprint = TypeModule(__name__)
-class TypeView(PGChildNodeView, DataTypeReader):
+class TypeView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare):
"""
This class is responsible for generating routes for Type node
@@ -173,6 +175,10 @@ class TypeView(PGChildNodeView, DataTypeReader):
* get_external_functions_list(gid, sid, did, scid, tid):
- This function will return list of external functions
in ajax response
+
+ * compare(**kwargs):
+ - This function will compare the type nodes from two
+ different schemas.
"""
node_type = blueprint.node_type
@@ -559,6 +565,22 @@ class TypeView(PGChildNodeView, DataTypeReader):
Returns:
JSON of selected type node
"""
+ status, res = self._fetch_properties(scid, tid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, tid):
+ """
+ This function is used to fecth the properties of the specified object.
+ :param scid:
+ :param tid:
+ :return:
+ """
SQL = render_template(
"/".join([self.template_path,
@@ -569,10 +591,10 @@ class TypeView(PGChildNodeView, DataTypeReader):
)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(
+ return False, gone(
gettext("""Could not find the type in the database."""))
# Making copy of output for future use
@@ -583,7 +605,7 @@ class TypeView(PGChildNodeView, DataTypeReader):
scid=scid, tid=tid)
status, acl = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=acl)
+ return False, internal_server_error(errormsg=acl)
# We will set get privileges from acl sql so we don't need
# it from properties sql
@@ -599,10 +621,7 @@ class TypeView(PGChildNodeView, DataTypeReader):
# Calling function to check and additional properties if available
copy_dict.update(self.additional_properties(copy_dict, tid))
- return ajax_response(
- response=copy_dict,
- status=200
- )
+ return True, copy_dict
@check_precondition
def get_collations(self, gid, sid, did, scid, tid=None):
@@ -1428,5 +1447,31 @@ class TypeView(PGChildNodeView, DataTypeReader):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the types for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']),
+ scid=scid, datlastsysoid=self.datlastsysoid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
TypeView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py
index 13da66e35..ee87d9694 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py
@@ -15,6 +15,8 @@ from flask import render_template
from pgadmin.browser.collection import CollectionNodeModule
from pgadmin.utils.ajax import internal_server_error
+from pgadmin.utils.driver import get_driver
+from config import PG_DEFAULT_DRIVER
class SchemaChildModule(CollectionNodeModule):
@@ -485,44 +487,50 @@ class VacuumSettings:
* type - table/toast vacuum type
"""
+ vacuum_settings = dict()
def __init__(self):
pass
- def get_vacuum_table_settings(self, conn):
+ def fetch_default_vacuum_settings(self, conn, sid, setting_type):
"""
- Fetch the default values for autovacuum
- fields, return an array of
- - label
- - name
- - setting
- values
+ This function is used to fetch and cached the default vacuum settings
+ for specified server id.
+ :param conn: Connection Object
+ :param sid: Server ID
+ :param setting_type: Type (table or toast)
+ :return:
"""
+ if sid in VacuumSettings.vacuum_settings:
+ if setting_type in VacuumSettings.vacuum_settings[sid]:
+ return VacuumSettings.vacuum_settings[sid][setting_type]
+ else:
+ VacuumSettings.vacuum_settings[sid] = dict()
# returns an array of name & label values
vacuum_fields = render_template("vacuum_settings/vacuum_fields.json")
-
vacuum_fields = json.loads(vacuum_fields)
# returns an array of setting & name values
vacuum_fields_keys = "'" + "','".join(
- vacuum_fields['table'].keys()) + "'"
+ vacuum_fields[setting_type].keys()) + "'"
SQL = render_template('vacuum_settings/sql/vacuum_defaults.sql',
columns=vacuum_fields_keys)
- status, res = conn.execute_dict(SQL)
+ status, res = conn.execute_dict(SQL)
if not status:
return internal_server_error(errormsg=res)
for row in res['rows']:
row_name = row['name']
- row['name'] = vacuum_fields['table'][row_name][0]
- row['label'] = vacuum_fields['table'][row_name][1]
- row['column_type'] = vacuum_fields['table'][row_name][2]
+ row['name'] = vacuum_fields[setting_type][row_name][0]
+ row['label'] = vacuum_fields[setting_type][row_name][1]
+ row['column_type'] = vacuum_fields[setting_type][row_name][2]
- return res
+ VacuumSettings.vacuum_settings[sid][setting_type] = res['rows']
+ return VacuumSettings.vacuum_settings[sid][setting_type]
- def get_vacuum_toast_settings(self, conn):
+ def get_vacuum_table_settings(self, conn, sid):
"""
Fetch the default values for autovacuum
fields, return an array of
@@ -531,29 +539,18 @@ class VacuumSettings:
- setting
values
"""
+ return self.fetch_default_vacuum_settings(conn, sid, 'table')
- # returns an array of name & label values
- vacuum_fields = render_template("vacuum_settings/vacuum_fields.json")
-
- vacuum_fields = json.loads(vacuum_fields)
-
- # returns an array of setting & name values
- vacuum_fields_keys = "'" + "','".join(
- vacuum_fields['toast'].keys()) + "'"
- SQL = render_template('vacuum_settings/sql/vacuum_defaults.sql',
- columns=vacuum_fields_keys)
- status, res = conn.execute_dict(SQL)
-
- if not status:
- return internal_server_error(errormsg=res)
-
- for row in res['rows']:
- row_name = row['name']
- row['name'] = vacuum_fields['toast'][row_name][0]
- row['label'] = vacuum_fields['toast'][row_name][1]
- row['column_type'] = vacuum_fields['table'][row_name][2]
-
- return res
+ def get_vacuum_toast_settings(self, conn, sid):
+ """
+ Fetch the default values for autovacuum
+ fields, return an array of
+ - label
+ - name
+ - setting
+ values
+ """
+ return self.fetch_default_vacuum_settings(conn, sid, 'toast')
def parse_vacuum_data(self, conn, result, type):
"""
@@ -567,47 +564,46 @@ class VacuumSettings:
* type - table/toast vacuum type
"""
- # returns an array of name & label values
- vacuum_fields = render_template("vacuum_settings/vacuum_fields.json")
+ vacuum_settings_tmp = self.fetch_default_vacuum_settings(
+ conn, self.manager.sid, type)
- vacuum_fields = json.loads(vacuum_fields)
+ for row in vacuum_settings_tmp:
+ row_name = row['name']
+ if type is 'toast':
+ row_name = 'toast_{0}'.format(row['name'])
+ if row_name in result and result[row_name] is not None:
+ if row['column_type'] == 'number':
+ value = float(result[row_name])
+ else:
+ value = int(result[row_name])
+ row['value'] = value
+ else:
+ if 'value' in row:
+ row.pop('value')
- # returns an array of setting & name values
- vacuum_fields_keys = "'" + "','".join(
- vacuum_fields[type].keys()) + "'"
- SQL = render_template('vacuum_settings/sql/vacuum_defaults.sql',
- columns=vacuum_fields_keys)
- status, res = conn.execute_dict(SQL)
+ return vacuum_settings_tmp
- if not status:
- return internal_server_error(errormsg=res)
- if type is 'table':
- for row in res['rows']:
- row_name = row['name']
- row['name'] = vacuum_fields[type][row_name][0]
- row['label'] = vacuum_fields[type][row_name][1]
- row['column_type'] = vacuum_fields[type][row_name][2]
- if result[row['name']] is not None:
- if row['column_type'] == 'number':
- value = float(result[row['name']])
- else:
- value = int(result[row['name']])
- row['value'] = row['setting'] = value
-
- elif type is 'toast':
- for row in res['rows']:
- row_old_name = row['name']
- row_name = 'toast_{0}'.format(
- vacuum_fields[type][row_old_name][0])
- row['name'] = vacuum_fields[type][row_old_name][0]
- row['label'] = vacuum_fields[type][row_old_name][1]
- row['column_type'] = vacuum_fields[type][row_old_name][2]
- if result[row_name] and result[row_name] is not None:
- if row['column_type'] == 'number':
- value = float(result[row_name])
- else:
- value = int(result[row_name])
- row['value'] = row['setting'] = value
+def get_schema(sid, did, scid):
+ """
+ This function will return the schema name.
+ """
+
+ driver = get_driver(PG_DEFAULT_DRIVER)
+ manager = driver.connection_manager(sid)
+ conn = manager.connection(did=did)
+
+ ver = manager.version
+ server_type = manager.server_type
+
+ # Fetch schema name
+ status, schema_name = conn.execute_scalar(
+ render_template("/".join(['schemas',
+ '{0}/#{1}#'.format(server_type,
+ ver),
+ 'sql/get_name.sql']),
+ conn=conn, scid=scid
+ )
+ )
- return res['rows']
+ return status, schema_name
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 4bc357c83..b03136891 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
@@ -9,6 +9,7 @@
"""Implements View and Materialized View Node"""
+import copy
from functools import wraps
import simplejson as json
@@ -18,13 +19,16 @@ from flask_babelex import gettext
import pgadmin.browser.server_groups.servers.databases as databases
from config import PG_DEFAULT_DRIVER
from pgadmin.browser.server_groups.servers.databases.schemas.utils import \
- SchemaChildModule, parse_rule_definition, VacuumSettings
+ SchemaChildModule, parse_rule_definition, VacuumSettings, get_schema
from pgadmin.browser.server_groups.servers.utils import parse_priv_from_db, \
parse_priv_to_db
from pgadmin.browser.utils import PGChildNodeView
from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
+
"""
This module is responsible for generating two nodes
@@ -197,7 +201,7 @@ def check_precondition(f):
return wrap
-class ViewNode(PGChildNodeView, VacuumSettings):
+class ViewNode(PGChildNodeView, VacuumSettings, SchemaDiffObjectCompare):
"""
This class is responsible for generating routes for view node.
@@ -250,6 +254,10 @@ class ViewNode(PGChildNodeView, VacuumSettings):
* dependent(gid, sid, did, scid):
- This function will generate dependent list to show it in dependent
pane for the selected view node.
+
+ * compare(**kwargs):
+ - This function will compare the view nodes from two
+ different schemas.
"""
node_type = view_blueprint.node_type
@@ -290,6 +298,8 @@ class ViewNode(PGChildNodeView, VacuumSettings):
{'get': 'get_toast_table_vacuum'}]
})
+ keys_to_ignore = ['oid', 'schema', 'xmin']
+
def __init__(self, *args, **kwargs):
"""
Initialize the variables used by methods of ViewNode.
@@ -400,21 +410,37 @@ class ViewNode(PGChildNodeView, VacuumSettings):
Fetches the properties of an individual view
and render in the properties tab
"""
+ status, res = self._fetch_properties(scid, vid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, vid):
+ """
+ This function is used to fetch the properties of the specified object
+ :param scid:
+ :param vid:
+ :return:
+ """
SQL = render_template("/".join(
[self.template_path, 'sql/properties.sql']
), vid=vid, datlastsysoid=self.datlastsysoid)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(gettext("""Could not find the view."""))
+ return False, gone(gettext("""Could not find the view."""))
SQL = render_template("/".join(
[self.template_path, 'sql/acl.sql']), vid=vid)
status, dataclres = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
for row in dataclres['rows']:
priv = parse_priv_from_db(row)
@@ -428,10 +454,7 @@ class ViewNode(PGChildNodeView, VacuumSettings):
# merging formated result with main result again
result.update(frmtd_reslt)
- return ajax_response(
- response=result,
- status=200
- )
+ return True, result
@staticmethod
def formatter(result):
@@ -556,7 +579,7 @@ class ViewNode(PGChildNodeView, VacuumSettings):
return internal_server_error(errormsg=str(e))
@check_precondition
- def delete(self, gid, sid, did, scid, vid=None):
+ def delete(self, gid, sid, did, scid, vid=None, only_sql=False):
"""
This function will drop a view object
"""
@@ -604,6 +627,10 @@ class ViewNode(PGChildNodeView, VacuumSettings):
nspname=res_data['rows'][0]['schema'],
name=res_data['rows'][0]['name'], cascade=cascade
)
+
+ if only_sql:
+ return SQL
+
status, res = self.conn.execute_scalar(SQL)
if not status:
return internal_server_error(errormsg=res)
@@ -840,7 +867,7 @@ class ViewNode(PGChildNodeView, VacuumSettings):
return columns
- def get_rule_sql(self, vid):
+ def get_rule_sql(self, vid, display_comments=True):
"""
Get all non system rules of view node,
generate their sql and render
@@ -869,12 +896,12 @@ class ViewNode(PGChildNodeView, VacuumSettings):
res = parse_rule_definition(res)
SQL = render_template("/".join(
[self.rule_temp_path, 'sql/create.sql']),
- data=res, display_comments=True)
+ data=res, display_comments=display_comments)
SQL_data += '\n'
SQL_data += SQL
return SQL_data
- def get_compound_trigger_sql(self, vid):
+ def get_compound_trigger_sql(self, vid, display_comments=True):
"""
Get all compound trigger nodes associated with view node,
generate their sql and render into sql tab
@@ -945,13 +972,13 @@ class ViewNode(PGChildNodeView, VacuumSettings):
[self.ct_trigger_temp_path,
'sql/{0}/#{1}#/create.sql'.format(
self.manager.server_type, self.manager.version)]),
- data=res_rows, display_comments=True)
+ data=res_rows, display_comments=display_comments)
SQL_data += '\n'
SQL_data += SQL
return SQL_data
- def get_trigger_sql(self, vid):
+ def get_trigger_sql(self, vid, display_comments=True):
"""
Get all trigger nodes associated with view node,
generate their sql and render
@@ -1038,13 +1065,13 @@ class ViewNode(PGChildNodeView, VacuumSettings):
[self.trigger_temp_path,
'sql/{0}/#{1}#/create.sql'.format(
self.manager.server_type, self.manager.version)]),
- data=res_rows, display_comments=True)
+ data=res_rows, display_comments=display_comments)
SQL_data += '\n'
SQL_data += SQL
return SQL_data
- def get_index_sql(self, did, vid):
+ def get_index_sql(self, did, vid, display_comments=True):
"""
Get all index associated with view node,
generate their sql and render
@@ -1084,17 +1111,23 @@ class ViewNode(PGChildNodeView, VacuumSettings):
SQL = render_template("/".join(
[self.index_temp_path,
'sql/#{0}#/create.sql'.format(self.manager.version)]),
- data=data, display_comments=True)
+ data=data, display_comments=display_comments)
SQL_data += '\n'
SQL_data += SQL
return SQL_data
@check_precondition
- def sql(self, gid, sid, did, scid, vid):
+ def sql(self, gid, sid, did, scid, vid, diff_schema=None,
+ json_resp=True):
"""
This function will generate sql to render into the sql panel
"""
+ display_comments = True
+
+ if not json_resp:
+ display_comments = False
+
SQL_data = ''
SQL = render_template("/".join(
[self.template_path, 'sql/properties.sql']),
@@ -1111,6 +1144,9 @@ class ViewNode(PGChildNodeView, VacuumSettings):
)
result = res['rows'][0]
+ if diff_schema:
+ result['schema'] = diff_schema
+
# sending result to formtter
frmtd_reslt = self.formatter(result)
@@ -1152,18 +1188,20 @@ class ViewNode(PGChildNodeView, VacuumSettings):
[self.template_path, 'sql/create.sql']),
data=result,
conn=self.conn,
- display_comments=True
+ display_comments=display_comments
)
SQL += "\n"
SQL += render_template("/".join(
[self.template_path, 'sql/grant.sql']), data=result)
SQL_data += SQL
- SQL_data += self.get_rule_sql(vid)
- SQL_data += self.get_trigger_sql(vid)
- SQL_data += self.get_compound_trigger_sql(vid)
- SQL_data += self.get_index_sql(did, vid)
+ SQL_data += self.get_rule_sql(vid, display_comments)
+ SQL_data += self.get_trigger_sql(vid, display_comments)
+ SQL_data += self.get_compound_trigger_sql(vid, display_comments)
+ SQL_data += self.get_index_sql(did, vid, display_comments)
+ if not json_resp:
+ return SQL_data
return ajax_response(response=SQL_data)
@check_precondition
@@ -1357,6 +1395,60 @@ class ViewNode(PGChildNodeView, VacuumSettings):
return ajax_response(response=sql)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid, oid=None):
+ """
+ This function will fetch the list of all the views for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+
+ if not oid:
+ SQL = render_template("/".join([self.template_path,
+ 'sql/nodes.sql']), did=did,
+ scid=scid, datlastsysoid=self.datlastsysoid)
+ status, views = self.conn.execute_2darray(SQL)
+ if not status:
+ current_app.logger.error(views)
+ return False
+
+ for row in views['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+ else:
+ status, data = self._fetch_properties(scid, oid)
+ if not status:
+ current_app.logger.error(data)
+ return False
+ res = data
+
+ return res
+
+ def get_sql_from_diff(self, gid, sid, did, scid, oid, data=None,
+ diff_schema=None, drop_sql=False):
+ sql = ''
+ if data:
+ if diff_schema:
+ data['schema'] = diff_schema
+ sql, nameOrError = self.getSQL(gid, sid, did, data, oid)
+ else:
+ if drop_sql:
+ sql = self.delete(gid=gid, sid=sid, did=did,
+ scid=scid, vid=oid, only_sql=True)
+ elif diff_schema:
+ sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, vid=oid,
+ diff_schema=diff_schema, json_resp=False)
+ else:
+ sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, vid=oid,
+ json_resp=False)
+ return sql
+
# Override the operations for materialized view
mview_operations = {
@@ -1631,11 +1723,17 @@ class MViewNode(ViewNode, VacuumSettings):
return SQL, data['name'] if 'name' in data else old_data['name']
@check_precondition
- def sql(self, gid, sid, did, scid, vid):
+ def sql(self, gid, sid, did, scid, vid, diff_schema=None,
+ json_resp=True):
"""
This function will generate sql to render into the sql panel
"""
+ display_comments = True
+
+ if not json_resp:
+ display_comments = False
+
SQL_data = ''
SQL = render_template("/".join(
[self.template_path, 'sql/properties.sql']),
@@ -1654,6 +1752,9 @@ class MViewNode(ViewNode, VacuumSettings):
result = res['rows'][0]
+ if diff_schema:
+ result['schema'] = diff_schema
+
# sending result to formtter
frmtd_reslt = self.formatter(result)
@@ -1732,17 +1833,20 @@ class MViewNode(ViewNode, VacuumSettings):
[self.template_path, 'sql/create.sql']),
data=result,
conn=self.conn,
- display_comments=True
+ display_comments=display_comments
)
SQL += "\n"
SQL += render_template("/".join(
[self.template_path, 'sql/grant.sql']), data=result)
SQL_data += SQL
- SQL_data += self.get_rule_sql(vid)
- SQL_data += self.get_trigger_sql(vid)
- SQL_data += self.get_index_sql(did, vid)
+ SQL_data += self.get_rule_sql(vid, display_comments)
+ SQL_data += self.get_trigger_sql(vid, display_comments)
+ SQL_data += self.get_index_sql(did, vid, display_comments)
SQL_data = SQL_data.strip('\n')
+
+ if not json_resp:
+ return SQL_data
return ajax_response(response=SQL_data)
@check_precondition
@@ -1756,9 +1860,9 @@ class MViewNode(ViewNode, VacuumSettings):
values
"""
- res = self.get_vacuum_table_settings(self.conn)
+ res = self.get_vacuum_table_settings(self.conn, sid)
return ajax_response(
- response=res['rows'],
+ response=res,
status=200
)
@@ -1772,10 +1876,10 @@ class MViewNode(ViewNode, VacuumSettings):
- setting
values
"""
- res = self.get_vacuum_toast_settings(self.conn)
+ res = self.get_vacuum_toast_settings(self.conn, sid)
return ajax_response(
- response=res['rows'],
+ response=res,
status=200
)
@@ -1785,21 +1889,39 @@ class MViewNode(ViewNode, VacuumSettings):
Fetches the properties of an individual view
and render in the properties tab
"""
+ status, res = self._fetch_properties(did, scid, vid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, did, scid, vid):
+ """
+ This function is used to fetch the properties of the specified object
+ :param did:
+ :param scid:
+ :param vid:
+ :return:
+ """
SQL = render_template("/".join(
[self.template_path, 'sql/properties.sql']
), did=did, vid=vid, datlastsysoid=self.datlastsysoid)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(gettext("""Could not find the materialized view."""))
+ return False, gone(
+ gettext("""Could not find the materialized view."""))
SQL = render_template("/".join(
[self.template_path, 'sql/acl.sql']), vid=vid)
status, dataclres = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
for row in dataclres['rows']:
priv = parse_priv_from_db(row)
@@ -1818,10 +1940,7 @@ class MViewNode(ViewNode, VacuumSettings):
result['vacuum_toast'] = self.parse_vacuum_data(
self.conn, result, 'toast')
- return ajax_response(
- response=result,
- status=200
- )
+ return True, result
@check_precondition
def refresh_data(self, gid, sid, did, scid, vid):
@@ -1873,6 +1992,34 @@ class MViewNode(ViewNode, VacuumSettings):
current_app.logger.exception(e)
return internal_server_error(errormsg=str(e))
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid, oid=None):
+ """
+ This function will fetch the list of all the mviews for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'sql/nodes.sql']), did=did,
+ scid=scid, datlastsysoid=self.datlastsysoid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(did, scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
+SchemaDiffRegistry(view_blueprint.node_type, ViewNode)
ViewNode.register_node_view(view_blueprint)
+SchemaDiffRegistry(mview_blueprint.node_type, MViewNode)
MViewNode.register_node_view(mview_blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.2_plus/sql/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.2_plus/sql/update.sql
index 38606cc0b..d49f7fb9f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.2_plus/sql/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.2_plus/sql/update.sql
@@ -19,7 +19,7 @@ ALTER TABLE {{ conn|qtIdent(view_schema, view_name) }}
{% endif %}
{% if def and def != o_data.definition.rstrip(';') %}
CREATE OR REPLACE VIEW {{ conn|qtIdent(view_schema, view_name) }}
- WITH (security_barrier={{ data.security_barrier|lower if data.security_barrier else o_data.security_barrier|default('false', 'true')|lower }})
+ WITH (security_barrier={{ data.security_barrier|lower if data.security_barrier is defined else o_data.security_barrier|default('false', 'true')|lower }})
AS
{{ def }};
{% else %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.3_plus/sql/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.3_plus/sql/update.sql
index 38606cc0b..d49f7fb9f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.3_plus/sql/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.3_plus/sql/update.sql
@@ -19,7 +19,7 @@ ALTER TABLE {{ conn|qtIdent(view_schema, view_name) }}
{% endif %}
{% if def and def != o_data.definition.rstrip(';') %}
CREATE OR REPLACE VIEW {{ conn|qtIdent(view_schema, view_name) }}
- WITH (security_barrier={{ data.security_barrier|lower if data.security_barrier else o_data.security_barrier|default('false', 'true')|lower }})
+ WITH (security_barrier={{ data.security_barrier|lower if data.security_barrier is defined else o_data.security_barrier|default('false', 'true')|lower }})
AS
{{ def }};
{% else %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.4_plus/sql/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.4_plus/sql/update.sql
index 4235f5c90..805c658d1 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.4_plus/sql/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.4_plus/sql/update.sql
@@ -19,7 +19,7 @@ ALTER TABLE {{ conn|qtIdent(view_schema, view_name) }}
{% endif %}
{% if def and def != o_data.definition.rstrip(';') %}
CREATE OR REPLACE VIEW {{ conn|qtIdent(view_schema, view_name) }}
- WITH ({% if (data.check_option or o_data.check_option) %}check_option={{ data.check_option if data.check_option else o_data.check_option }}{{', ' }}{% endif %}security_barrier={{ data.security_barrier|lower if data.security_barrier else o_data.security_barrier|default('false', 'true')|lower }})
+ WITH ({% if (data.check_option or o_data.check_option) %}check_option={{ data.check_option if data.check_option else o_data.check_option }}{{', ' }}{% endif %}security_barrier={{ data.security_barrier|lower if data.security_barrier is defined else o_data.security_barrier|default('false', 'true')|lower }})
AS
{{ def }};
{% else %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/css/database.css b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/css/database.css
index f0b12e306..0c9ae10dd 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/css/database.css
+++ b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/css/database.css
@@ -11,4 +11,9 @@
background-image: url('{{ url_for('NODE-database.static', filename='img/databasebad.svg') }}') !important;
border-radius: 10px;
background-size: 20px !important;
+ background-repeat: no-repeat;
+ vertical-align: middle;
+ align-content: center;
+ height: 1.3em;
+
}
diff --git a/web/pgadmin/static/bundle/slickgrid.js b/web/pgadmin/static/bundle/slickgrid.js
index 731b42026..20670b981 100644
--- a/web/pgadmin/static/bundle/slickgrid.js
+++ b/web/pgadmin/static/bundle/slickgrid.js
@@ -14,9 +14,12 @@ import 'slickgrid/slick.grid';
import 'slickgrid/slick.dataview';
import 'slickgrid/slick.editors';
import 'slickgrid/slick.formatters';
+import 'slickgrid/slick.groupitemmetadataprovider';
import 'slickgrid/plugins/slick.autotooltips';
import 'slickgrid/plugins/slick.cellrangedecorator';
import 'slickgrid/plugins/slick.cellrangeselector';
+import 'slickgrid/plugins/slick.checkboxselectcolumn';
+import 'slickgrid/plugins/slick.rowselectionmodel';
import 'sources/slickgrid/custom_header_buttons';
export default window.Slick;
diff --git a/web/pgadmin/static/js/backform.pgadmin.js b/web/pgadmin/static/js/backform.pgadmin.js
index c53be832c..6c47ae2a5 100644
--- a/web/pgadmin/static/js/backform.pgadmin.js
+++ b/web/pgadmin/static/js/backform.pgadmin.js
@@ -817,7 +817,7 @@ define([
},
});
- Backform.Accordian = Backform.Dialog.extend({
+ Backform.Accordian = Backform.Dialog.extend({
className: function() {
return 'set-group pg-el-12';
},
@@ -2129,7 +2129,9 @@ define([
formatter: Select2Formatter,
template: _.template([
- '<label class="<%=Backform.controlLabelClassName%>" for="<%=cId%>"><%=label%></label>',
+ '<% if(label == false) {} else {%>',
+ ' <label class="<%=Backform.controlLabelClassName%>" for="<%=cId%>"><%=label%></label>',
+ '<% }%>',
'<div class="<%=Backform.controlsClassName%>">',
' <select id="<%=cId%>" class="<%=Backform.controlClassName%> <%=extraClasses.join(\' \')%>"',
' name="<%=name%>" value="<%-value%>" <%=disabled ? "disabled" : ""%>',
@@ -2161,7 +2163,6 @@ define([
'</div>',
].join('\n')),
render: function() {
-
if (this.$sel && this.$sel.select2 &&
this.$sel.select2.hasOwnProperty('destroy')) {
this.$sel.select2('destroy');
@@ -2474,7 +2475,7 @@ define([
self.sqlCtrl.setOption('autoCloseBrackets', sqlEditPreferences.insert_pair_brackets);
self.sqlCtrl.setOption('matchBrackets', sqlEditPreferences.brace_matching);
setTimeout(function() {
- self.sqlCtrl.refresh();
+ if (self.sqlCtrl) self.sqlCtrl.refresh();
}, 500);
}
},
diff --git a/web/pgadmin/static/scss/resources/_default.variables.scss b/web/pgadmin/static/scss/resources/_default.variables.scss
index f769e50b3..e13cf08ba 100644
--- a/web/pgadmin/static/scss/resources/_default.variables.scss
+++ b/web/pgadmin/static/scss/resources/_default.variables.scss
@@ -256,4 +256,11 @@ $loading-bg : rgba($black,0.6);
$loading-fg : $white;
$loader-icon : url("data:image/svg+xml;charset=UTF-8,%3c?xml version='1.0' encoding='utf-8'?%3e%3csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 38 38' style='enable-background:new 0 0 38 38;' xml:space='preserve'%3e%3cstyle type='text/css'%3e .st0%7bfill:none;stroke:%23ebeef3;stroke-width:2;%7d .st1%7bfill:none;stroke:%23326690;stroke-width:2;%7d %3c/style%3e%3cg%3e%3cg transform='translate(1 1)'%3e%3ccircle class='st0' cx='18' cy='18' r='18'/%3e%3cpath class='st1' d='M36,18c0-9.9-8.1-18-18-18 '%3e%3canimateTransform accumulate='none' additive='replace' attributeName='transform' calcMode='linear' dur='0.7s' fill='remove' from='0 18 18' repeatCount='indefinite' restart='always' to='360 18 18' type='rotate'%3e%3c/animateTransform%3e%3c/path%3e%3c/g%3e%3c/g%3e%3c/svg%3e ") !default;
+
$loader-icon-small: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='utf-8'%3F%3E%3C!-- Generator: Adobe Illustrator 23.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --%3E%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 38 38' style='enable-background:new 0 0 38 38;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:none;stroke:%23EBEEF3;stroke-width:5;%7D .st1%7Bfill:none;stroke:%23326690;stroke-width:5;%7D%0A%3C/style%3E%3Cg%3E%3Cg transform='translate(1 1)'%3E%3Ccircle class='st0' cx='18' cy='18' r='16'/%3E%3Cpath class='st1' d='M34,18c0-8.8-7.2-16-16-16 '%3E%3CanimateTransform accumulate='none' additive='replace' attributeName='transform' calcMode='linear' dur='0.7s' fill='remove' from='0 18 18' repeatCount='indefinite' restart='always' to='360 18 18' type='rotate'%3E%3C/animateTransform%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E%0A") !default;
+
+/***************/
+
+$schemadiff-diff-row-color: #fff9c4;
+$schemadiff-source-row-color: #ffebee;
+$schemadiff-target-row-color: #fbe3bf;
diff --git a/web/pgadmin/tools/datagrid/static/js/show_query_tool.js b/web/pgadmin/tools/datagrid/static/js/show_query_tool.js
index b7a8d0338..24b44f3e3 100644
--- a/web/pgadmin/tools/datagrid/static/js/show_query_tool.js
+++ b/web/pgadmin/tools/datagrid/static/js/show_query_tool.js
@@ -11,6 +11,7 @@ import gettext from '../../../../static/js/gettext';
import url_for from '../../../../static/js/url_for';
import {getTreeNodeHierarchyFromIdentifier} from '../../../../static/js/tree/pgadmin_tree_node';
import {getPanelTitle} from './datagrid_panel_title';
+import {getRandomInt} from 'sources/utils';
function hasDatabaseInformation(parentData) {
return parentData.database;
@@ -66,3 +67,21 @@ export function showQueryTool(datagrid, pgBrowser, alertify, url, aciTreeIdentif
datagrid.launch_grid(transId, gridUrl, true, queryToolTitle, sURL);
}
+
+export function generateScript(parentData, datagrid) {
+ const queryToolTitle = `${parentData.database}/${parentData.user}@${parentData.server}`;
+ const transId = getRandomInt(1, 9999999);
+
+ let url_endpoint = url_for('datagrid.panel', {
+ 'trans_id': transId,
+ });
+
+ url_endpoint += `?is_query_tool=${true}`
+ +`&sgid=${parentData.sgid}`
+ +`&sid=${parentData.sid}`
+ +`&server_type=${parentData.stype}`
+ +`&did=${parentData.did}`;
+
+ datagrid.launch_grid(transId, url_endpoint, true, queryToolTitle, '');
+
+}
diff --git a/web/pgadmin/tools/datagrid/templates/datagrid/index.html b/web/pgadmin/tools/datagrid/templates/datagrid/index.html
index 621d88d15..8c7e62832 100644
--- a/web/pgadmin/tools/datagrid/templates/datagrid/index.html
+++ b/web/pgadmin/tools/datagrid/templates/datagrid/index.html
@@ -443,6 +443,15 @@ require(['sources/generated/browser_nodes', 'sources/generated/codemirror', 'sou
{{ url_params|safe}},
'{{ layout|safe }}'
);
+
+ // If opening from schema diff, set the generated script to the SQL Editor
+
+ var schema_ddl_diff = (window.opener !== null) ? window.opener.pgAdmin.ddl_diff : (window.parent !== null) ? window.parent.pgAdmin.ddl_diff : window.top.pgAdmin.ddl_diff;
+ sqlEditorController.set_value_to_editor(schema_ddl_diff);
+ if (window.opener !== null) window.opener.pgAdmin.ddl_diff = '';
+ else if (window.parent !== null) window.parent.pgAdmin.ddl_diff = '';
+ else if (window.top !== null) window.top.pgAdmin.ddl_diff = '';
+
});
});
{% endblock %}
diff --git a/web/pgadmin/tools/schema_diff/__init__.py b/web/pgadmin/tools/schema_diff/__init__.py
new file mode 100644
index 000000000..ac3a283ae
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/__init__.py
@@ -0,0 +1,613 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+"""A blueprint module implementing the schema_diff frame."""
+
+MODULE_NAME = 'schema_diff'
+
+import simplejson as json
+import pickle
+import random
+
+from flask import Response, session, url_for, request
+from flask import render_template, current_app as app
+from flask_security import current_user, login_required
+from flask_babelex import gettext
+from pgadmin.utils import PgAdminModule
+from pgadmin.utils.ajax import make_json_response, bad_request, \
+ make_response as ajax_response, not_implemented
+from pgadmin.model import Server
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.model import SchemaDiffModel
+from config import PG_DEFAULT_DRIVER
+from pgadmin.utils.driver import get_driver
+
+
+class SchemaDiffModule(PgAdminModule):
+ """
+ class SchemaDiffModule(PgAdminModule)
+
+ A module class for Schema Diff derived from PgAdminModule.
+ """
+
+ LABEL = "Schema Diff"
+
+ def get_own_menuitems(self):
+ return {}
+
+ def get_own_javascripts(self):
+ return [{
+ 'name': 'pgadmin.schema_diff',
+ 'path': url_for('schema_diff.index') + "schema_diff",
+ 'when': None
+ }]
+
+ def get_panels(self):
+ return []
+
+ def get_exposed_url_endpoints(self):
+ """
+ Returns:
+ list: URL endpoints for Schema Diff module
+ """
+ return [
+ 'schema_diff.initialize',
+ 'schema_diff.panel',
+ 'schema_diff.servers',
+ 'schema_diff.databases',
+ 'schema_diff.schemas',
+ 'schema_diff.compare',
+ 'schema_diff.poll',
+ 'schema_diff.ddl_compare',
+ 'schema_diff.connect_server',
+ 'schema_diff.connect_database',
+ 'schema_diff.get_server',
+ 'schema_diff.generate_script'
+ ]
+
+ def register_preferences(self):
+ self.preference.register(
+ 'display', 'schema_diff_new_browser_tab',
+ gettext("Open in new browser tab"), 'boolean', False,
+ category_label=gettext('Display'),
+ help_str=gettext('If set to True, the Schema Diff '
+ 'will be opened in a new browser tab.')
+ )
+
+
+blueprint = SchemaDiffModule(MODULE_NAME, __name__, static_url_path='/static')
+
+
[email protected]("/")
+@login_required
+def index():
+ return bad_request(
+ errormsg=gettext('This URL cannot be requested directly.')
+ )
+
+
[email protected](
+ '/panel/<int:trans_id>/<path:editor_title>',
+ methods=["GET"],
+ endpoint='panel'
+)
+def panel(trans_id, editor_title):
+ """
+ This method calls index.html to render the schema diff.
+
+ Args:
+ editor_title: Title of the editor
+ """
+ # If title has slash(es) in it then replace it
+ if request.args and request.args['fslashes'] != '':
+ try:
+ fslashesList = request.args['fslashes'].split(',')
+ for idx in fslashesList:
+ idx = int(idx)
+ editor_title = editor_title[:idx] + '/' + editor_title[idx:]
+ except IndexError as e:
+ app.logger.exception(e)
+
+ return render_template(
+ "schema_diff/index.html",
+ _=gettext,
+ trans_id=trans_id,
+ editor_title=editor_title
+ )
+
+
[email protected]("/schema_diff.js")
+@login_required
+def script():
+ """render the required javascript"""
+ return Response(
+ response=render_template("schema_diff/js/schema_diff.js", _=gettext),
+ status=200,
+ mimetype="application/javascript"
+ )
+
+
+def check_transaction_status(trans_id):
+ """
+ This function is used to check the transaction id
+ is available in the session object.
+
+ Args:
+ trans_id:
+ """
+
+ if 'schemaDiff' not in session:
+ return False, gettext(
+ 'Transaction ID not found in the session.'
+ ), None, None
+
+ schema_diff_data = session['schemaDiff']
+
+ # Return from the function if transaction id not found
+ if str(trans_id) not in schema_diff_data:
+ return False, gettext(
+ 'Transaction ID not found in the session.'
+ ), None, None
+
+ # Fetch the object for the specified transaction id.
+ # Use pickle.loads function to get the model object
+ session_obj = schema_diff_data[str(trans_id)]
+ diff_model_obj = pickle.loads(session_obj['diff_model_obj'])
+
+ return True, None, diff_model_obj, session_obj
+
+
+def update_session_diff_transaction(trans_id, session_obj, diff_model_obj):
+ """
+ This function is used to update the diff model into the session.
+ :param trans_id:
+ :param session_obj:
+ :param diff_model_obj:
+ :return:
+ """
+ session_obj['diff_model_obj'] = pickle.dumps(diff_model_obj, -1)
+
+ if 'schemaDiff' in session:
+ schema_diff_data = session['schemaDiff']
+ schema_diff_data[str(trans_id)] = session_obj
+ session['schemaDiff'] = schema_diff_data
+
+
[email protected](
+ '/initialize',
+ methods=["GET"],
+ endpoint="initialize"
+)
+@login_required
+def initialize():
+ """
+ This function will initialize the schema diff and return the list
+ of all the server's.
+ """
+ trans_id = None
+ try:
+ # Create a unique id for the transaction
+ trans_id = str(random.randint(1, 9999999))
+
+ if 'schemaDiff' not in session:
+ schema_diff_data = dict()
+ else:
+ schema_diff_data = session['schemaDiff']
+
+ # Use pickle to store the Schema Diff Model which will be used
+ # later by the diff module.
+ schema_diff_data[trans_id] = {
+ 'diff_model_obj': pickle.dumps(SchemaDiffModel(), -1)
+ }
+
+ # Store the schema diff dictionary into the session variable
+ session['schemaDiff'] = schema_diff_data
+
+ except Exception as e:
+ app.logger.exception(e)
+
+ return make_json_response(
+ data={'schemaDiffTransId': trans_id})
+
+
[email protected](
+ '/servers',
+ methods=["GET"],
+ endpoint="servers"
+)
+@login_required
+def servers():
+ """
+ This function will return the list of servers for the specified
+ server id.
+ """
+ res = []
+ try:
+ """Return a JSON document listing the server groups for the user"""
+ driver = get_driver(PG_DEFAULT_DRIVER)
+
+ from pgadmin.browser.server_groups.servers import\
+ server_icon_and_background
+
+ for server in Server.query.filter_by(user_id=current_user.id):
+ manager = driver.connection_manager(server.id)
+ conn = manager.connection()
+ connected = conn.connected()
+
+ res.append({
+ "value": server.id,
+ "label": server.name,
+ "image": server_icon_and_background(connected, manager,
+ server),
+ "_id": server.id,
+ "connected": connected,
+ })
+
+ except Exception as e:
+ app.logger.exception(e)
+
+ return make_json_response(data=res)
+
+
[email protected](
+ '/get_server/<int:sid>/<int:did>',
+ methods=["GET"],
+ endpoint="get_server"
+)
+@login_required
+def get_server(sid, did):
+ """
+ This function will return the server details for the specified
+ server id.
+ """
+ try:
+ """Return a JSON document listing the server groups for the user"""
+ driver = get_driver(PG_DEFAULT_DRIVER)
+
+ server = Server.query.filter_by(id=sid).first()
+ manager = driver.connection_manager(sid)
+ conn = manager.connection(did=did)
+ connected = conn.connected()
+
+ res = {
+ "sid": sid,
+ "name": server.name,
+ "user": server.username,
+ "gid": server.servergroup_id,
+ "type": manager.server_type,
+ "connected": connected,
+ "database": conn.db
+ }
+
+ except Exception as e:
+ app.logger.exception(e)
+
+ return make_json_response(data=res)
+
+
[email protected](
+ '/server/connect/<int:sid>',
+ methods=["POST"],
+ endpoint="connect_server"
+)
+@login_required
+def connect_server(sid):
+ server = Server.query.filter_by(id=sid).first()
+ view = SchemaDiffRegistry.get_node_view('server')
+ return view.connect(server.servergroup_id, sid)
+
+
[email protected](
+ '/database/connect/<int:sid>/<int:did>',
+ methods=["POST"],
+ endpoint="connect_database"
+)
+@login_required
+def connect_database(sid, did):
+ server = Server.query.filter_by(id=sid).first()
+ view = SchemaDiffRegistry.get_node_view('database')
+ return view.connect(server.servergroup_id, sid, did)
+
+
[email protected](
+ '/databases/<int:sid>',
+ methods=["GET"],
+ endpoint="databases"
+)
+@login_required
+def databases(sid):
+ """
+ This function will return the list of databases for the specified
+ server id.
+ """
+ res = []
+ try:
+ view = SchemaDiffRegistry.get_node_view('database')
+
+ server = Server.query.filter_by(id=sid).first()
+ response = view.nodes(gid=server.servergroup_id, sid=sid)
+ databases = json.loads(response.data)['data']
+ for db in databases:
+ res.append({
+ "value": db['_id'],
+ "label": db['label'],
+ "_id": db['_id'],
+ "connected": db['connected'],
+ "allowConn": db['allowConn'],
+ "image": db['icon'],
+ "canDisconn": db['canDisconn']
+ })
+
+ except Exception as e:
+ app.logger.exception(e)
+
+ return make_json_response(data=res)
+
+
[email protected](
+ '/schemas/<int:sid>/<int:did>',
+ methods=["GET"],
+ endpoint="schemas"
+)
+@login_required
+def schemas(sid, did):
+ """
+ This function will return the list of schemas for the specified
+ server id and database id.
+ """
+ res = []
+ try:
+ view = SchemaDiffRegistry.get_node_view('schema')
+ server = Server.query.filter_by(id=sid).first()
+ response = view.nodes(gid=server.servergroup_id, sid=sid, did=did)
+ schemas = json.loads(response.data)['data']
+ for sch in schemas:
+ res.append({
+ "value": sch['_id'],
+ "label": sch['label'],
+ "_id": sch['_id'],
+ "image": sch['icon'],
+ })
+ except Exception as e:
+ app.logger.exception(e)
+
+ return make_json_response(data=res)
+
+
[email protected](
+ '/compare/<int:trans_id>/<int:source_sid>/<int:source_did>/'
+ '<int:source_scid>/<int:target_sid>/<int:target_did>/<int:target_scid>',
+ methods=["GET"],
+ endpoint="compare"
+)
+@login_required
+def compare(trans_id, source_sid, source_did, source_scid,
+ target_sid, target_did, target_scid):
+ """
+ This function will compare the two schemas.
+ """
+ # Check the transaction and connection status
+ status, error_msg, diff_model_obj, session_obj = \
+ check_transaction_status(trans_id)
+
+ if error_msg == gettext('Transaction ID not found in the session.'):
+ return make_json_response(success=0, errormsg=error_msg, status=404)
+
+ if not check_version_compatibility(source_sid, target_sid):
+ return not_implemented(errormsg=gettext("Version mismatch."))
+
+ comparison_result = []
+
+ diff_model_obj.set_comparison_info("Comparing objects...", 0)
+ update_session_diff_transaction(trans_id, session_obj,
+ diff_model_obj)
+
+ try:
+ all_registered_nodes = SchemaDiffRegistry.get_registered_nodes()
+ node_percent = round(100 / len(all_registered_nodes))
+ total_percent = 0
+
+ for node_name, node_view in all_registered_nodes.items():
+ view = SchemaDiffRegistry.get_node_view(node_name)
+ if hasattr(view, 'compare'):
+ msg = "Comparing " + view.blueprint.COLLECTION_LABEL + " ..."
+ diff_model_obj.set_comparison_info(msg, total_percent)
+ # Update the message and total percentage in session object
+ update_session_diff_transaction(trans_id, session_obj,
+ diff_model_obj)
+
+ res = view.compare(source_sid=source_sid,
+ source_did=source_did,
+ source_scid=source_scid,
+ target_sid=target_sid,
+ target_did=target_did,
+ target_scid=target_scid)
+
+ if res is not None:
+ comparison_result = comparison_result + res
+ total_percent = total_percent + node_percent
+
+ msg = "Successfully compare the specified schemas."
+ total_percent = 100
+ diff_model_obj.set_comparison_info(msg, total_percent)
+ # Update the message and total percentage done in session object
+ update_session_diff_transaction(trans_id, session_obj, diff_model_obj)
+
+ except Exception as e:
+ app.logger.exception(e)
+
+ return make_json_response(data=comparison_result)
+
+
[email protected](
+ '/poll/<int:trans_id>', methods=["GET"], endpoint="poll"
+)
+@login_required
+def poll(trans_id):
+ """
+ This function is used to check the schema comparison is completed or not.
+ :param trans_id:
+ :return:
+ """
+
+ # Check the transaction and connection status
+ status, error_msg, diff_model_obj, session_obj = \
+ check_transaction_status(trans_id)
+
+ if error_msg == gettext('Transaction ID not found in the session.'):
+ return make_json_response(success=0, errormsg=error_msg, status=404)
+
+ msg, diff_percentage = diff_model_obj.get_comparison_info()
+
+ if diff_percentage == 100:
+ diff_model_obj.set_comparison_info("Comparing objects...", 0)
+ update_session_diff_transaction(trans_id, session_obj,
+ diff_model_obj)
+
+ return make_json_response(data={'compare_msg': msg,
+ 'diff_percentage': diff_percentage})
+
+
[email protected](
+ '/generate_script/<int:trans_id>/',
+ methods=["POST"],
+ endpoint="generate_script"
+)
+def generate_script(trans_id):
+ """This function will generate the scripts for the selected objects."""
+ data = request.form if request.form else json.loads(
+ request.data, encoding='utf-8'
+ )
+
+ status, error_msg, diff_model_obj, session_obj = \
+ check_transaction_status(trans_id)
+
+ if error_msg == gettext('Transaction ID not found in the session.'):
+ return make_json_response(success=0, errormsg=error_msg, status=404)
+
+ source_sid = int(data['source_sid'])
+ source_did = int(data['source_did'])
+ source_scid = int(data['source_scid'])
+ target_sid = int(data['target_sid'])
+ target_did = int(data['target_did'])
+ target_scid = int(data['target_scid'])
+ diff_ddl = ''
+
+ for d in data['sel_rows']:
+ node_type = d['node_type']
+ source_oid = int(d['source_oid'])
+ target_oid = int(d['target_oid'])
+ comp_status = d['comp_status']
+
+ view = SchemaDiffRegistry.get_node_view(node_type)
+ if view and hasattr(view, 'ddl_compare') and \
+ comp_status != SchemaDiffModel.COMPARISON_STATUS['identical']:
+ sql = view.ddl_compare(source_sid=source_sid,
+ source_did=source_did,
+ source_scid=source_scid,
+ target_sid=target_sid,
+ target_did=target_did,
+ target_scid=target_scid,
+ source_oid=source_oid,
+ target_oid=target_oid,
+ comp_status=comp_status,
+ generate_script=True)
+
+ diff_ddl += sql['diff_ddl']
+
+ return ajax_response(
+ status=200,
+ response={'diff_ddl': diff_ddl}
+ )
+
+
[email protected](
+ '/ddl_compare/<int:trans_id>/<int:source_sid>/<int:source_did>/'
+ '<int:source_scid>/<int:target_sid>/<int:target_did>/<int:target_scid>/'
+ '<int:source_oid>/<int:target_oid>/<node_type>/<comp_status>/',
+ methods=["GET"],
+ endpoint="ddl_compare"
+)
+@login_required
+def ddl_compare(trans_id, source_sid, source_did, source_scid,
+ target_sid, target_did, target_scid, source_oid,
+ target_oid, node_type, comp_status):
+ """
+ This function is used to compare the specified object and return the
+ DDL comparison.
+ """
+ # Check the transaction and connection status
+ status, error_msg, diff_model_obj, session_obj = \
+ check_transaction_status(trans_id)
+
+ if error_msg == gettext('Transaction ID not found in the session.'):
+ return make_json_response(success=0, errormsg=error_msg, status=404)
+
+ source_ddl = ''
+ target_ddl = ''
+ diff_ddl = ''
+
+ view = SchemaDiffRegistry.get_node_view(node_type)
+ if view and hasattr(view, 'ddl_compare'):
+ sql = view.ddl_compare(source_sid=source_sid, source_did=source_did,
+ source_scid=source_scid, target_sid=target_sid,
+ target_did=target_did, target_scid=target_scid,
+ source_oid=source_oid, target_oid=target_oid,
+ comp_status=comp_status)
+ return ajax_response(
+ status=200,
+ response={'source_ddl': sql['source_ddl'],
+ 'target_ddl': sql['target_ddl'],
+ 'diff_ddl': sql['diff_ddl']}
+ )
+
+ msg = gettext('Selected object is not supported for DDL comparison.')
+
+ return ajax_response(
+ status=200,
+ response={'source_ddl': msg,
+ 'target_ddl': msg,
+ 'diff_ddl': msg
+ }
+ )
+
+
+def check_version_compatibility(sid, tid):
+ """Check the version compatibility of source and target servers."""
+
+ driver = get_driver(PG_DEFAULT_DRIVER)
+ src_server = Server.query.filter_by(id=sid).first()
+ src_manager = driver.connection_manager(src_server.id)
+
+ tar_server = Server.query.filter_by(id=tid).first()
+ tar_manager = driver.connection_manager(tar_server.id)
+
+ src_server_version = src_manager.version
+ tar_server_version = tar_manager.version
+
+ server_versions = [120000, 110000, 100000, 90600, 90500, 90400,
+ 90300, 90200, 90100, 90000]
+
+ for version in server_versions:
+ if version > src_server_version:
+ continue
+
+ src_server_version = version
+ break
+
+ for version in server_versions:
+ if version > tar_server_version:
+ continue
+
+ tar_server_version = version
+ break
+
+ if src_server_version == tar_server_version:
+ return True
+ return False
diff --git a/web/pgadmin/tools/schema_diff/compare.py b/web/pgadmin/tools/schema_diff/compare.py
new file mode 100644
index 000000000..3bc38a134
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/compare.py
@@ -0,0 +1,212 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+"""Schema diff object comparison."""
+
+import copy
+
+from flask import render_template
+from pgadmin.utils.compile_template_name import compile_template_path
+from pgadmin.utils.driver import get_driver
+from config import PG_DEFAULT_DRIVER
+from pgadmin.tools.schema_diff.directory_compare import compare_dictionaries,\
+ directory_diff
+from pgadmin.tools.schema_diff.model import SchemaDiffModel
+from abc import abstractmethod
+
+
+class SchemaDiffObjectCompare():
+
+ keys_to_ignore = ['oid', 'schema']
+
+ @staticmethod
+ def get_schema(sid, did, scid):
+ """
+ This function will return the schema name.
+ """
+
+ driver = get_driver(PG_DEFAULT_DRIVER)
+ manager = driver.connection_manager(sid)
+ conn = manager.connection(did=did)
+
+ ver = manager.version
+ server_type = manager.server_type
+
+ # Fetch schema name
+ status, schema_name = conn.execute_scalar(
+ render_template(
+ "/".join(['schemas',
+ '{0}/#{1}#'.format(server_type, ver),
+ 'sql/get_name.sql']),
+ conn=conn, scid=scid
+ )
+ )
+
+ return status, schema_name
+
+ def compare(self, **kwargs):
+ """
+ This function is used to compare all the objects
+ from two different schemas.
+
+ :param kwargs:
+ :return:
+ """
+
+ source_params = {'sid': kwargs.get('source_sid'),
+ 'did': kwargs.get('source_did'),
+ 'scid': kwargs.get('source_scid')
+ }
+
+ target_params = {'sid': kwargs.get('target_sid'),
+ 'did': kwargs.get('target_did'),
+ 'scid': kwargs.get('target_scid')
+ }
+
+ if 'source_tid' in kwargs:
+ source_params['tid'] = kwargs['source_tid']
+ if 'target_tid' in kwargs:
+ target_params['tid'] = kwargs['target_tid']
+
+ source = self.fetch_objects_to_compare(**source_params)
+
+ target = self.fetch_objects_to_compare(**target_params)
+
+ # If both the dict have no items then return None.
+ if not (source or target) or (
+ len(source) <= 0 and len(target) <= 0):
+ return None
+
+ return compare_dictionaries(source, target,
+ self.node_type,
+ self.blueprint.COLLECTION_LABEL,
+ self.keys_to_ignore)
+
+ def ddl_compare(self, **kwargs):
+ """
+ This function will compare object properties and
+ return the difference of SQL
+ """
+
+ source = ''
+ target = ''
+ diff = ''
+ comp_status = kwargs.get('comp_status')
+ only_diff = False
+ generate_script = False
+
+ source_params = {'gid': 1,
+ 'sid': kwargs.get('source_sid'),
+ 'did': kwargs.get('source_did'),
+ 'scid': kwargs.get('source_scid'),
+ 'oid': kwargs.get('source_oid')
+ }
+
+ target_params = {'gid': 1,
+ 'sid': kwargs.get('target_sid'),
+ 'did': kwargs.get('target_did'),
+ 'scid': kwargs.get('target_scid'),
+ 'oid': kwargs.get('target_oid')
+ }
+
+ if 'source_tid' in kwargs:
+ source_params['tid'] = kwargs['source_tid']
+ only_diff = True
+ if 'target_tid' in kwargs:
+ target_params['tid'] = kwargs['target_tid']
+ only_diff = True
+
+ if 'generate_script' in kwargs and kwargs['generate_script']:
+ generate_script = True
+
+ source_params_adv = copy.deepcopy(source_params)
+ target_params_adv = copy.deepcopy(target_params)
+
+ del source_params_adv['gid']
+ del target_params_adv['gid']
+
+ status, target_schema = self.get_schema(kwargs.get('target_sid'),
+ kwargs.get('target_did'),
+ kwargs.get('target_scid')
+ )
+ if not status:
+ return internal_server_error(errormsg=target_schema)
+
+ if comp_status == SchemaDiffModel.COMPARISON_STATUS['source_only']:
+ if not generate_script:
+ source = self.get_sql_from_diff(**source_params)
+ source_params.update({
+ 'diff_schema': target_schema
+ })
+ diff = self.get_sql_from_diff(**source_params)
+
+ elif comp_status == SchemaDiffModel.COMPARISON_STATUS['target_only']:
+ if not generate_script:
+ target = self.get_sql_from_diff(**target_params)
+ target_params.update(
+ {'drop_sql': True})
+ diff = self.get_sql_from_diff(**target_params)
+
+ elif comp_status == SchemaDiffModel.COMPARISON_STATUS['different']:
+ source = self.fetch_objects_to_compare(**source_params_adv)
+ target = self.fetch_objects_to_compare(**target_params_adv)
+
+ if not (source or target):
+ return None
+
+ diff_dict = directory_diff(source,
+ target,
+ ignore_keys=self.keys_to_ignore,
+ difference={}
+ )
+
+ diff_dict.update(self.parce_acl(source, target))
+
+ if not generate_script:
+ source = self.get_sql_from_diff(**source_params)
+ target = self.get_sql_from_diff(**target_params)
+
+ target_params.update(
+ {'data': diff_dict})
+ diff = self.get_sql_from_diff(**target_params)
+ else:
+ source = self.get_sql_from_diff(**source_params)
+ target = self.get_sql_from_diff(**target_params)
+
+ if only_diff:
+ return diff
+
+ return {'source_ddl': source,
+ 'target_ddl': target,
+ 'diff_ddl': diff
+ }
+
+ @staticmethod
+ def parce_acl(source, target):
+ key = 'acl'
+
+ if 'datacl' in source:
+ key = 'datacl'
+ elif 'relacl' in source:
+ key = 'relacl'
+
+ tmp_source = source[key] if\
+ key in source and source[key] is not None else []
+ tmp_target = copy.deepcopy(target[key]) if\
+ key in target and target[key] is not None else []
+
+ diff = {'added': [], 'deleted': []}
+ for acl in tmp_source:
+ if acl in tmp_target:
+ tmp_target.remove(acl)
+ elif acl not in tmp_target:
+ diff['added'].append(acl)
+ diff['deleted'] = tmp_target
+
+ return {key: diff}
diff --git a/web/pgadmin/tools/schema_diff/directory_compare.py b/web/pgadmin/tools/schema_diff/directory_compare.py
new file mode 100644
index 000000000..eeb495d36
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/directory_compare.py
@@ -0,0 +1,279 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+"""Directory comparison"""
+
+import copy
+from pgadmin.tools.schema_diff.model import SchemaDiffModel
+
+count = 1
+
+
+def compare_dictionaries(source_dict, target_dict, node, node_label,
+ ignore_keys=None):
+ """
+ This function will compare the two dictionaries.
+
+ :param source_dict: First Dictionary
+ :param target_dict: Second Dictionary
+ :param node: node type
+ :param ignore_keys: List of keys that will be ignored while comparing
+ :return:
+ """
+
+ dict1 = copy.deepcopy(source_dict)
+ dict2 = copy.deepcopy(target_dict)
+
+ # Find the duplicate keys in both the dictionaries
+ dict1_keys = set(dict1.keys())
+ dict2_keys = set(dict2.keys())
+ intersect_keys = dict1_keys.intersection(dict2_keys)
+
+ # Keys that are available in source and missing in target.
+ source_only = []
+ added = dict1_keys - dict2_keys
+ global count
+ for item in added:
+ source_only.append({
+ 'id': count,
+ 'type': node,
+ 'label': node_label,
+ 'title': item,
+ 'oid': source_dict[item]['oid'],
+ 'status': SchemaDiffModel.COMPARISON_STATUS['source_only']
+ })
+ count += 1
+
+ target_only = []
+ # Keys that are available in target and missing in source.
+ removed = dict2_keys - dict1_keys
+ for item in removed:
+ target_only.append({
+ 'id': count,
+ 'type': node,
+ 'label': node_label,
+ 'title': item,
+ 'oid': target_dict[item]['oid'],
+ 'status': SchemaDiffModel.COMPARISON_STATUS['target_only']
+ })
+ count += 1
+
+ # Compare the values of duplicates keys.
+ identical = []
+ different = []
+ for key in intersect_keys:
+ # ignore the keys if available.
+ for ig_key in ignore_keys:
+ if ig_key in dict1[key]:
+ dict1[key].pop(ig_key)
+ if ig_key in dict2[key]:
+ dict2[key].pop(ig_key)
+
+ # Recursively Compare the two dictionary
+ if are_dictionaries_identical(dict1[key], dict2[key], ignore_keys):
+ identical.append({
+ 'id': count,
+ 'type': node,
+ 'label': node_label,
+ 'title': key,
+ 'oid': source_dict[key]['oid'],
+ 'source_oid': source_dict[key]['oid'],
+ 'target_oid': target_dict[key]['oid'],
+ 'status': SchemaDiffModel.COMPARISON_STATUS['identical']
+ })
+ else:
+ different.append({
+ 'id': count,
+ 'type': node,
+ 'label': node_label,
+ 'title': key,
+ 'oid': source_dict[key]['oid'],
+ 'source_oid': source_dict[key]['oid'],
+ 'target_oid': target_dict[key]['oid'],
+ 'status': SchemaDiffModel.COMPARISON_STATUS['different']
+ })
+ count += 1
+
+ return source_only + target_only + different + identical
+
+
+def are_lists_identical(source_list, target_list, ignore_keys):
+ """
+ This function is used to compare two list.
+ :param source_list:
+ :param target_list:
+ :return:
+ """
+ if source_list is None or target_list is None or \
+ len(source_list) != len(target_list):
+ return False
+ else:
+ for index in range(len(source_list)):
+ # Check the type of the value if it is an dictionary then
+ # call are_dictionaries_identical() function.
+ if type(source_list[index]) is dict:
+ if not are_dictionaries_identical(source_list[index],
+ target_list[index],
+ ignore_keys):
+ return False
+ else:
+ if source_list[index] != target_list[index]:
+ return False
+ return True
+
+
+def are_dictionaries_identical(source_dict, target_dict, ignore_keys):
+ """
+ This function is used to recursively compare two dictionaries with
+ same keys.
+ :param source_dict:
+ :param target_dict:
+ :return:
+ """
+
+ src_keys = set(source_dict.keys())
+ tar_keys = set(target_dict.keys())
+
+ # ignore the keys if available.
+ for ig_key in ignore_keys:
+ if ig_key in src_keys:
+ source_dict.pop(ig_key)
+ if ig_key in target_dict:
+ target_dict.pop(ig_key)
+
+ # Keys that are available in source and missing in target.
+ src_only = src_keys - tar_keys
+ # Keys that are available in target and missing in source.
+ tar_only = tar_keys - src_keys
+
+ # If number of keys are different in source and target then
+ # return False
+ if len(src_only) != len(tar_only):
+ return False
+ else:
+ # If number of keys are same but key is not present in target then
+ # return False
+ for key in src_only:
+ if key not in tar_only:
+ return False
+
+ for key in source_dict.keys():
+ if type(source_dict[key]) is dict:
+ if not are_dictionaries_identical(source_dict[key],
+ target_dict[key], ignore_keys):
+ return False
+ elif type(source_dict[key]) is list:
+ if not are_lists_identical(source_dict[key], target_dict[key],
+ ignore_keys):
+ return False
+ else:
+ if source_dict[key] != target_dict[key]:
+ return False
+
+ return True
+
+
+def directory_diff(source_dict, target_dict, ignore_keys=[], difference={}):
+ """
+ This function is used to recursively compare two dictionaries and
+ return the difference.
+ The difference is from source to target
+ :param source_dict: source dict
+ :param target_dict: target dict
+ :param ignore_keys: ignore keys to compare
+ """
+
+ src_keys = set(source_dict.keys())
+ tar_keys = set(target_dict.keys())
+
+ # Keys that are available in source and missing in target.
+ src_only = src_keys - tar_keys
+ # Keys that are available in target and missing in source.
+ tar_only = tar_keys - src_keys
+
+ for key in source_dict.keys():
+ added = []
+ deleted = []
+ updated = []
+ source = None
+
+ # ignore the keys if available.
+ if key in ignore_keys:
+ pass
+ elif key in tar_only:
+ target_only[key] = target_dict[key]
+ # Target only values in deleted list
+ difference[key]['deleted'] = target_dict[key]
+ elif key in src_only:
+ # Source only values in the newly added list
+ if type(source_dict[key]) is list:
+ difference[key] = {}
+ difference[key]['added'] = source_dict[key]
+ elif type(source_dict[key]) is dict:
+ directory_diff(source_dict[key], target_dict[key],
+ ignore_keys, difference)
+ elif type(source_dict[key]) is list:
+ tmp_target = None
+ for index in range(len(source_dict[key])):
+ source = copy.deepcopy(source_dict[key][index])
+ if type(source) is list:
+ # TODO
+ pass
+ elif type(source) is dict:
+ if 'name' in source or 'colname' in source:
+ if type(target_dict[key]) is list and len(
+ target_dict[key]) > 0:
+ tmp = None
+ tmp_target = copy.deepcopy(target_dict[key])
+ for item in tmp_target:
+ if (
+ 'name' in item and
+ item['name'] == source['name']
+ ) or (
+ 'colname' in item and
+ item['colname'] == source['colname']
+ ):
+ tmp = copy.deepcopy(item)
+ if tmp and source != tmp:
+ updated.append(copy.deepcopy(source))
+ tmp_target.remove(tmp)
+ elif tmp and source == tmp:
+ tmp_target.remove(tmp)
+ elif tmp is None:
+ added.append(source)
+ else:
+ added.append(source)
+ difference[key] = {}
+ difference[key]['added'] = added
+ difference[key]['changed'] = updated
+ elif target_dict[key] is None or \
+ (type(target_dict[key]) is list and
+ len(target_dict[key]) < index and
+ source != target_dict[key][index]):
+ difference[key] = source
+ elif type(target_dict[key]) is list and\
+ len(target_dict[key]) > index:
+ difference[key] = source
+
+ if type(source) is dict and tmp_target and key in tmp_target and \
+ tmp_target[key] and len(tmp_target[key]) > 0:
+ if type(tmp_target[key]) is list and \
+ type(tmp_target[key][0]) is dict:
+ deleted = deleted + tmp_target[key]
+ else:
+ deleted.append({key: tmp_target[key]})
+ difference[key]['deleted'] = deleted
+ elif tmp_target and type(tmp_target) is list:
+ difference[key]['deleted'] = tmp_target
+
+ else:
+ if source_dict[key] != target_dict[key]:
+ difference[key] = source_dict[key]
+
+ return difference
diff --git a/web/pgadmin/tools/schema_diff/model.py b/web/pgadmin/tools/schema_diff/model.py
new file mode 100644
index 000000000..4fac21007
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/model.py
@@ -0,0 +1,76 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+
+class SchemaDiffModel(object):
+ """
+ SchemaDiffModel
+ """
+
+ COMPARISON_STATUS = {
+ 'source_only': 'Source Only',
+ 'target_only': 'Target Only',
+ 'different': 'Different',
+ 'identical': 'Identical'
+ }
+
+ def __init__(self, **kwargs):
+ """
+ This method is used to initialize the class and
+ create a proper object name which will be used
+ to fetch the data using namespace name and object name.
+
+ Args:
+ **kwargs : N number of parameters
+ """
+ self._comparison_result = dict()
+ self._comparison_msg = 'Comparision started...'
+ self._comparison_percentage = 0
+
+ def clear_data(self):
+ """
+ This function clear the model data.
+ """
+ self._comparison_result.clear()
+
+ def set_result(self, node_name, compare_result):
+ """
+ This method set the result of the comparision based on nodes.
+ """
+ self._comparison_result[node_name] = compare_result
+
+ def get_result(self, node_name=None):
+ """
+ This function will return the result for the node if specified
+ else return the complete result.
+ :param node_name: Name of the node ex: Database, Schema, etc..
+ :return:
+ """
+
+ if node_name is not None:
+ return self._comparison_result[node_name]
+
+ return self._comparison_result
+
+ def get_comparison_info(self):
+ """
+ This function is used to get the comparison information.
+ :return:
+ """
+ return self._comparison_msg, self._comparison_percentage
+
+ def set_comparison_info(self, msg, percentage):
+ """
+ This function is used to set the comparison information.
+ :param msg:
+ :param percentage:
+ :return:
+ """
+ self._comparison_msg = msg
+ self._comparison_percentage = percentage
diff --git a/web/pgadmin/tools/schema_diff/node_registry.py b/web/pgadmin/tools/schema_diff/node_registry.py
new file mode 100644
index 000000000..9e7e25533
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/node_registry.py
@@ -0,0 +1,61 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+
+class SchemaDiffRegistry(object):
+ """
+ SchemaDiffRegistry
+
+ It is more of a registry for different type of nodes for schema diff.
+ """
+ _registered_nodes = dict()
+
+ def __init__(self, node_name, node_view, parent_node='schema'):
+ if node_name not in SchemaDiffRegistry._registered_nodes:
+ SchemaDiffRegistry._registered_nodes[node_name] = {
+ 'view': node_view,
+ 'parent': parent_node
+ }
+
+ @classmethod
+ def get_registered_nodes(cls, node_name=None, parent_node='schema'):
+ """
+ This function will return the node's view object if node name
+ is specified or return the complete list of registered nodes.
+
+ :param node_name: Name of the node ex: Database, Schema, etc..
+ :return:
+ """
+ if node_name is not None:
+ if node_name in cls._registered_nodes:
+ return cls._registered_nodes[node_name]['view']
+ else:
+ return None
+
+ registered_nodes = {}
+ for key, value in cls._registered_nodes.items():
+ if value['parent'] == parent_node:
+ registered_nodes[key] = value['view']
+
+ return registered_nodes
+
+ @classmethod
+ def get_node_view(cls, node_name):
+ """
+ This function will return the view object for the "nodes"
+ command as per the specified node name.
+
+ :param node_name: Name of the node ex: Database, Schema, etc..
+ :return:
+ """
+ cmd = {"cmd": "nodes, compare, ddl_compare"}
+ module = SchemaDiffRegistry.get_registered_nodes(node_name)
+ if not module:
+ return None
+ return module(**cmd)
diff --git a/web/pgadmin/tools/schema_diff/static/css/schema_diff.css b/web/pgadmin/tools/schema_diff/static/css/schema_diff.css
new file mode 100644
index 000000000..93f7d32d3
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/css/schema_diff.css
@@ -0,0 +1,189 @@
+.icon-schema-diff {
+ display: inline-block;
+ align-content: center;
+ vertical-align: middle;
+ height: 18px;
+ width: 18px;
+ background-size: 20px !important;
+ background-repeat: no-repeat;
+ background-position-x: center;
+ background-position-y: center;
+ background-image: url('../img/compare.svg') !important;
+}
+
+.icon-schema-diff-white {
+ display: inline-block;
+ align-content: center;
+ vertical-align: middle;
+ height: 18px;
+ width: 18px;
+ background-size: 20px !important;
+ background-repeat: no-repeat;
+ background-position-x: center;
+ background-position-y: center;
+ background-image: url('../img/compare-white.svg') !important;
+}
+
+.icon-script {
+ display: inline-block;
+ align-content: center;
+ vertical-align: middle;
+ height: 18px;
+ width: 18px;
+ background-size: 20px !important;
+ background-repeat: no-repeat;
+ background-position-x: center;
+ background-position-y: center;
+ background-image: url('../img/script.svg') !important;
+}
+
+.really-hidden {
+ display: none !important;
+}
+
+#schema-diff-header {
+ margin-top: 2px;
+}
+
+#schema-diff-header .control-label {
+ width: 120px !important;
+ padding: 5px 5px !important;
+}
+
+.slick-header-column.ui-state-default {
+ height: 32px !important;
+}
+
+#schema-diff-grid .grid-header label {
+ display: inline-block;
+ font-weight: bold;
+ margin: auto auto auto 6px;
+}
+
+.grid-header .ui-icon {
+ margin: 4px 4px auto 6px;
+ background-color: transparent;
+ border-color: transparent;
+}
+
+.slick-row .cell-actions {
+ text-align: left;
+}
+
+/* Slick.Editors.Text, Slick.Editors.Date */
+#schema-diff-grid .slick-header > input.editor-text {
+ width: 100%;
+ height: 100%;
+ border: 0;
+ margin: 0;
+ background: transparent;
+ outline: 0;
+ padding: 0;
+}
+
+/* Slick.Editors.Checkbox */
+#schema-diff-grid .slick-header > input.editor-checkbox {
+ margin: 0;
+ height: 100%;
+ padding: 0;
+ border: 0;
+}
+
+.slick-row.selected .cell-selection {
+ background-color: transparent; /* show default selected row background */
+}
+
+#schema-diff-grid .slick-header .ui-state-default,
+#schema-diff-grid .slick-header .ui-widget-content.ui-state-default,
+#schema-diff-grid .slick-header .ui-widget-header .ui-state-default {
+ background: none;
+}
+
+#schema-diff-grid .slick-header .slick-header-column {
+ font-weight: bold;
+ display: block;
+}
+
+.slick-group-toggle.collapsed, .slick-group-toggle.expanded {
+ background: none !important;
+ width: 20px;
+}
+
+.slick-group-toggle.collapsed::before {
+ font-family: "FontAwesome";
+ content: "\f054";
+ font-size: 0.6rem;
+ border: none;
+}
+
+.slick-group-toggle.expanded::before {
+ font-family: "FontAwesome";
+ content: "\f078";
+ font-size: 0.6rem;
+ margin-left: 0rem;
+}
+
+.slick-group-toggle {
+ margin-right: 0px !important;
+ height: 11px !important;
+}
+
+#schema-diff-ddl-comp .badge .caret {
+ display: inline-block;
+ margin-left: 2px;
+ margin-right: 4px;
+ width: 0.7rem;
+}
+
+#schema-diff-ddl-comp .badge .caret::before {
+ font-family: "FontAwesome";
+ content: "\f078";
+ font-size: 0.7rem;
+ margin-left: 0rem;
+}
+
+#schema-diff-ddl-comp .badge {
+ font-size: inherit;
+ padding: 7px;
+}
+
+#schema-diff-ddl-comp .accordian-group {
+ padding: 0px;
+}
+
+#ddl_comp_fetching_data.pg-sp-container {
+ height: 100%;
+ bottom: 10px;
+
+ .pg-sp-content {
+ position: absolute;
+ width: 100%;
+ }
+}
+
+.ddl-copy {
+ z-index: 10;
+ position: absolute;
+ right: 1px;
+ top: 1px;
+}
+
+#schema-diff-grid .pg-panel-message {
+ font-size: 0.875rem;
+}
+
+
+#schema-diff-ddl-comp .sql_field_layout {
+ overflow: auto !important;
+ height: 100%;
+}
+
+#schema-diff-ddl-comp .source_ddl, #schema-diff-ddl-comp .target_ddl, #schema-diff-ddl-comp .diff_ddl {
+ height: 300px;
+ overflow: hidden;
+}
+
+.target-buttons {
+ flex-wrap: wrap;
+ max-width: 40% !important;
+}
diff --git a/web/pgadmin/tools/schema_diff/static/img/compare-white.svg b/web/pgadmin/tools/schema_diff/static/img/compare-white.svg
new file mode 100644
index 000000000..47b95be03
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/img/compare-white.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Слой_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 26 26" style="enable-background:new 0 0 26 26;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#FFFFFF;}
+</style>
+<path class="st0" d="M21.5,2h-9c-1.1,0-2,0.9-2,2v3h-6c-1.1,0-2,0.9-2,2v13c0,1.1,0.9,2,2,2h8c1.1,0,2-0.9,2-2v-3h7c1.1,0,2-0.9,2-2
+ V4C23.5,2.9,22.6,2,21.5,2z M12.5,14.8H8.9l1-1c0.1-0.1,0.1-0.2,0.1-0.3s0-0.2-0.1-0.3l-0.3-0.3c-0.1-0.1-0.2-0.1-0.3-0.1
+ c-0.1,0-0.2,0-0.3,0.1l-2.3,2.3c-0.1,0.1-0.1,0.2-0.1,0.3c0,0.1,0,0.2,0.1,0.3L9,18.1c0.1,0.1,0.2,0.1,0.3,0.1c0.1,0,0.2,0,0.3-0.1
+ l0.3-0.3c0.1-0.1,0.1-0.2,0.1-0.3c0-0.1,0-0.2-0.1-0.3l-1-1h3.6l0,5.8h-8V9h8L12.5,14.8z M21.5,9.8h-3.6l1-1
+ c0.1-0.1,0.1-0.2,0.1-0.3s0-0.2-0.1-0.3l-0.3-0.3c-0.1-0.1-0.2-0.1-0.3-0.1c-0.1,0-0.2,0-0.3,0.1l-2.3,2.3c-0.1,0.1-0.1,0.2-0.1,0.3
+ c0,0.1,0,0.2,0.1,0.3l2.3,2.3c0.1,0.1,0.2,0.1,0.3,0.1c0.1,0,0.2,0,0.3-0.1l0.3-0.3c0.1-0.1,0.1-0.2,0.1-0.3c0-0.1,0-0.2-0.1-0.3
+ l-1-1h3.6l0,5.8h-7V9c0-1.1-0.9-2-2-2V4h9L21.5,9.8z"/>
+</svg>
diff --git a/web/pgadmin/tools/schema_diff/static/img/compare.svg b/web/pgadmin/tools/schema_diff/static/img/compare.svg
new file mode 100644
index 000000000..1366f50a5
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/img/compare.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Слой_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 26 26" style="enable-background:new 0 0 26 26;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#222222;}
+</style>
+<path class="st0" d="M21.5,2h-9c-1.1,0-2,0.9-2,2v3h-6c-1.1,0-2,0.9-2,2v13c0,1.1,0.9,2,2,2h8c1.1,0,2-0.9,2-2v-3h7c1.1,0,2-0.9,2-2
+ V4C23.5,2.9,22.6,2,21.5,2z M12.5,14.8H8.9l1-1c0.1-0.1,0.1-0.2,0.1-0.3s0-0.2-0.1-0.3l-0.3-0.3c-0.1-0.1-0.2-0.1-0.3-0.1
+ c-0.1,0-0.2,0-0.3,0.1l-2.3,2.3c-0.1,0.1-0.1,0.2-0.1,0.3c0,0.1,0,0.2,0.1,0.3L9,18.1c0.1,0.1,0.2,0.1,0.3,0.1c0.1,0,0.2,0,0.3-0.1
+ l0.3-0.3c0.1-0.1,0.1-0.2,0.1-0.3c0-0.1,0-0.2-0.1-0.3l-1-1h3.6l0,5.8h-8V9h8L12.5,14.8z M21.5,9.8h-3.6l1-1
+ c0.1-0.1,0.1-0.2,0.1-0.3s0-0.2-0.1-0.3l-0.3-0.3c-0.1-0.1-0.2-0.1-0.3-0.1c-0.1,0-0.2,0-0.3,0.1l-2.3,2.3c-0.1,0.1-0.1,0.2-0.1,0.3
+ c0,0.1,0,0.2,0.1,0.3l2.3,2.3c0.1,0.1,0.2,0.1,0.3,0.1c0.1,0,0.2,0,0.3-0.1l0.3-0.3c0.1-0.1,0.1-0.2,0.1-0.3c0-0.1,0-0.2-0.1-0.3
+ l-1-1h3.6l0,5.8h-7V9c0-1.1-0.9-2-2-2V4h9L21.5,9.8z"/>
+</svg>
diff --git a/web/pgadmin/tools/schema_diff/static/img/script.svg b/web/pgadmin/tools/schema_diff/static/img/script.svg
new file mode 100644
index 000000000..488b911c7
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/img/script.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 50 50" style="enable-background:new 0 0 50 50;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#222222;}
+</style>
+<g>
+ <path class="st0" d="M40,35V11c0-3.9-3.1-7-7-7H7c-3.9,0-7,3.1-7,7c0,3.1,2.1,5.8,5,6.7V39c0,3.9,3.1,7,7,7h31c3.9,0,7-3.1,7-7v-4
+ H40z M43,42c-0.8,0-1.8-1.4-2.5-3h5C44.9,40.5,43.8,42,43,42z M7,8h19.6C26.2,8.9,26,9.9,26,11c0,1,0.2,2,0.7,3H7c-1.7,0-3-1.3-3-3
+ S5.3,8,7,8z M36.7,42H12c-1.7,0-3-1.3-3-3V18h25v-4h-1c-1.7,0-3-1.3-3-3s1.3-3,3-3s3,1.3,3,3v28C36,40,36.2,41,36.7,42z"/>
+ <rect x="13" y="21" class="st0" width="4" height="4"/>
+ <rect x="19" y="21" class="st0" width="13" height="4"/>
+ <rect x="13" y="28" class="st0" width="4" height="4"/>
+ <rect x="19" y="28" class="st0" width="13" height="4"/>
+ <rect x="13" y="35" class="st0" width="4" height="4"/>
+ <rect x="19" y="35" class="st0" width="13" height="4"/>
+</g>
+</svg>
diff --git a/web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js b/web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js
new file mode 100644
index 000000000..b2cf4cf00
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js
@@ -0,0 +1,500 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+import $ from 'jquery';
+import Backbone from 'backbone';
+import Backform from 'pgadmin.backform';
+import gettext from 'sources/gettext';
+import clipboard from 'sources/selection/clipboard';
+
+var formatNode = function (opt) {
+ if (!opt.id) {
+ return opt.text;
+ }
+
+ var optimage = $(opt.element).data('image');
+
+ if (!optimage) {
+ return opt.text;
+ } else {
+ return $('<span></span>').append(
+ $('<span></span>', {
+ class: 'wcTabIcon ' + optimage,
+ })
+ ).append($('<span></span>').text(opt.text));
+ }
+};
+
+let SchemaDiffSqlControl =
+ Backform.SqlFieldControl.extend({
+ defaults: {
+ label: '',
+ extraClasses: [], // Add default control height
+ helpMessage: null,
+ maxlength: 4096,
+ rows: undefined,
+ copyRequired: false,
+ },
+
+ template: _.template([
+ '<% if (copyRequired) { %><button class="btn btn-secondary ddl-copy d-none">Copy</button> <% } %>',
+ '<div class="pgadmin-controls pg-el-9 pg-el-12 sql_field_layout <%=extraClasses.join(\' \')%>">',
+ ' <textarea ',
+ ' class="<%=Backform.controlClassName%> " name="<%=name%>"',
+ ' maxlength="<%=maxlength%>" placeholder="<%-placeholder%>" <%=disabled ? "disabled" : ""%>',
+ ' rows=<%=rows%>',
+ ' <%=required ? "required" : ""%>><%-value%></textarea>',
+ ' <% if (helpMessage && helpMessage.length) { %>',
+ ' <span class="<%=Backform.helpMessageClassName%>"><%=helpMessage%></span>',
+ ' <% } %>',
+ '</div>',
+ ].join('\n')),
+ initialize: function() {
+ Backform.TextareaControl.prototype.initialize.apply(this, arguments);
+ this.sqlCtrl = null;
+
+ _.bindAll(this, 'onFocus', 'onBlur', 'refreshTextArea', 'copyData',);
+ },
+ render: function() {
+ let obj = Backform.SqlFieldControl.prototype.render.apply(this, arguments);
+ if(this.$el.find('.ddl-copy')) this.$el.find('.ddl-copy').on('click', this.copyData);
+ return obj;
+ },
+ copyData() {
+ event.stopPropagation();
+ clipboard.copyTextToClipboard(this.model.get('diff_ddl'));
+ return false;
+ },
+ onFocus: function() {
+ let $ctrl = this.$el.find('.pgadmin-controls').first(),
+ $copy = this.$el.find('.ddl-copy');
+ if (!$ctrl.hasClass('focused')) $ctrl.addClass('focused');
+ if ($copy.hasClass('d-none')) $copy.removeClass('d-none');
+
+ },
+ onBlur: function() {
+ let $copy = this.$el.find('.ddl-copy');
+ if (!$(event.relatedTarget).hasClass('ddl-copy')) {
+ if (!$copy.hasClass('d-none')) $copy.addClass('d-none');
+ this.$el.find('.pgadmin-controls').first().removeClass('focused');
+ }
+ },
+
+ });
+
+let SchemaDiffSelect2Control =
+ Backform.Select2Control.extend({
+ defaults: _.extend(Backform.Select2Control.prototype.defaults, {
+ url: undefined,
+ transform: undefined,
+ url_with_id: false,
+ select2: {
+ allowClear: true,
+ placeholder: gettext('Select an item...'),
+ width: 'style',
+ templateResult: formatNode,
+ templateSelection: formatNode,
+ },
+ controlsClassName: 'pgadmin-controls pg-el-sm-11 pg-el-12',
+ }),
+ className: function() {
+ return 'pgadmin-controls pg-el-sm-4';
+ },
+ events: {
+ 'focus select': 'clearInvalid',
+ 'keydown :input': 'processTab',
+ 'select2:select': 'onSelect',
+ 'select2:selecting': 'beforeSelect',
+ 'select2:clear': 'onChange',
+ },
+ template: _.template([
+ '<% if(label == false) {} else {%>',
+ ' <label class="<%=Backform.controlLabelClassName%>"><%=label%></label>',
+ '<% }%>',
+ '<div class="<%=controlsClassName%>">',
+ ' <select class="<%=Backform.controlClassName%> <%=extraClasses.join(\' \')%>"',
+ ' name="<%=name%>" value="<%-value%>" <%=disabled ? "disabled" : ""%>',
+ ' <%=required ? "required" : ""%><%= select2.multiple ? " multiple>" : ">" %>',
+ ' <%=select2.first_empty ? " <option></option>" : ""%>',
+ ' <% for (var i=0; i < options.length; i++) {%>',
+ ' <% var option = options[i]; %>',
+ ' <option ',
+ ' <% if (option.image) { %> data-image=<%=option.image%> <%}%>',
+ ' <% if (option.connected) { %> data-connected=connected <%}%>',
+ ' value=<%- formatter.fromRaw(option.value) %>',
+ ' <% if (option.selected) {%>selected="selected"<%} else {%>',
+ ' <% if (!select2.multiple && option.value === rawValue) {%>selected="selected"<%}%>',
+ ' <% if (select2.multiple && rawValue && rawValue.indexOf(option.value) != -1){%>selected="selected" data-index="rawValue.indexOf(option.value)"<%}%>',
+ ' <%}%>',
+ ' <%= disabled ? "disabled" : ""%>><%-option.label%></option>',
+ ' <%}%>',
+ ' </select>',
+ ' <% if (helpMessage && helpMessage.length) { %>',
+ ' <span class="<%=Backform.helpMessageClassName%>"><%=helpMessage%></span>',
+ ' <% } %>',
+ '</div>',
+ ].join('\n')),
+ beforeSelect: function() {
+ var selVal = arguments[0].params.args.data.id;
+
+ if(this.field.get('connect') && this.$el.find('option[value="'+selVal+'"]').attr('data-connected') !== 'connected') {
+ this.field.get('connect').apply(this, [selVal, this.changeIcon.bind(this)]);
+ } else {
+ $(this.$sel).trigger('change');
+ setTimeout(function(){ this.onChange.apply(this); }.bind(this), 200);
+ }
+ },
+ changeIcon: function(data) {
+ let span = this.$el.find('.select2-selection .select2-selection__rendered span.wcTabIcon'),
+ selSpan = this.$el.find('option:selected');
+
+ if (span.hasClass('icon-server-not-connected')) {
+ let icon = (data.icon) ? data.icon : 'icon-pg';
+ span.removeClass('icon-server-not-connected');
+ span.addClass(icon);
+ span.attr('data-connected', 'connected');
+
+ selSpan.data().image = icon;
+ selSpan.attr('data-connected', 'connected');
+
+ this.onChange.apply(this);
+ }
+ else if (span.hasClass('icon-database-not-connected')) {
+ let icon = (data.icon) ? data.icon : 'pg-icon-database';
+
+ span.removeClass('icon-database-not-connected');
+ span.addClass(icon);
+ span.attr('data-connected', 'connected');
+
+ selSpan.removeClass('icon-database-not-connected');
+ selSpan.data().image = icon;
+ selSpan.attr('data-connected', 'connected');
+
+ this.onChange.apply(this);
+ }
+ },
+ onChange: function() {
+ var model = this.model,
+ attrArr = this.field.get('name').split('.'),
+ name = attrArr.shift(),
+ path = attrArr.join('.'),
+ value = this.getValueFromDOM(),
+ changes = {},
+ that = this;
+
+ if (this.model.errorModel instanceof Backbone.Model) {
+ if (_.isEmpty(path)) {
+ this.model.errorModel.unset(name);
+ } else {
+ var nestedError = this.model.errorModel.get(name);
+ if (nestedError) {
+ this.keyPathSetter(nestedError, path, null);
+ this.model.errorModel.set(name, nestedError);
+ }
+ }
+ }
+
+ changes[name] = _.isEmpty(path) ? value : _.clone(model.get(name)) || {};
+
+ if (!_.isEmpty(path)) that.keyPathSetter(changes[name], path, value);
+ that.stopListening(that.model, 'change:' + name, that.render);
+ model.set(changes);
+ that.listenTo(that.model, 'change:' + name, that.render);
+
+ },
+ render: function() {
+ /*
+ * Initialization from the original control.
+ */
+ this.fetchData();
+ return Backform.Select2Control.prototype.render.apply(this, arguments);
+
+ },
+ fetchData: function() {
+ /*
+ * We're about to fetch the options required for this control.
+ */
+ var self = this,
+ url = self.field.get('url'),
+ m = self.model;
+
+ url = _.isFunction(url) ? url.apply(m) : url;
+
+ if (url && self.field.get('deps')) {
+ url = url.replace('sid', m.get(self.field.get('deps')[0]));
+ }
+
+ // Hmm - we found the url option.
+ // That means - we needs to fetch the options from that node.
+ if (url) {
+ var data;
+
+ m.trigger('pgadmin:view:fetching', m, self.field);
+ $.ajax({
+ async: false,
+ url: url,
+ })
+ .done(function(res) {
+ /*
+ * We will cache this data for short period of time for avoiding
+ * same calls.
+ */
+ data = res.data;
+ })
+ .fail(function() {
+ m.trigger('pgadmin:view:fetch:error', m, self.field);
+ });
+
+ m.trigger('pgadmin:view:fetched', m, self.field);
+ // To fetch only options from cache, we do not need time from 'at'
+ // attribute but only options.
+ //
+
+ /*
+ * Transform the data
+ */
+ var transform = this.field.get('transform') || self.defaults.transform;
+ if (transform && _.isFunction(transform)) {
+ // We will transform the data later, when rendering.
+ // It will allow us to generate different data based on the
+ // dependencies.
+ self.field.set('options', transform.bind(self, data));
+ } else {
+ self.field.set('options', data);
+ }
+ }
+ },
+ });
+
+
+let SchemaDiffHeaderView = Backform.Form.extend({
+ label: '',
+ className: function() {
+ return 'pg-el-sm-12 pg-el-md-12 pg-el-lg-12 pg-el-12';
+ },
+ tabPanelClassName: function() {
+ return Backform.tabClassName;
+ },
+ tabIndex: 0,
+ initialize: function(opts) {
+ this.label = opts.label;
+ Backform.Form.prototype.initialize.apply(this, arguments);
+ },
+ template: _.template(`
+ <div class="row pgadmin-control-group">
+ <div class="control-label">Select Source</div>
+ <div class="col-6 source row"></div>
+ </div>
+ <div class="row pgadmin-control-group">
+ <div class="control-label">Select Target</div>
+ <div class="col-6 target row"></div>
+ <div class="col-5 target-buttons">
+ <div class="action-btns d-flex">
+ <button class="btn btn-primary mr-auto"><i class="icon-schema-diff-white"></i> Compare</button>
+ <button id="generate-script" class="btn btn-secondary mr-1" disabled><i class="icon-script sql-icon-lg"></i> Generate Script</button>
+ <div class="btn-group mr-1" role="group" aria-label="">
+ <button id="btn-filter" type="button" class="btn btn-sm btn-secondary"
+ title=""
+ accesskey=""
+ tabindex="0">
+ <i class="fa fa-filter sql-icon-lg" aria-hidden="true"></i> Filter
+ </button>
+ <button id="btn-filter-dropdown" type="button" class="btn btn-sm btn-secondary dropdown-toggle dropdown-toggle-split"
+ data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"
+ title=""
+ accesskey=""
+ tabindex="0">
+ </button>` +
+ [
+ '<ul class="dropdown-menu filter">',
+ '<li>',
+ '<a class="dropdown-item" id="btn-identical" href="#" tabindex="0">',
+ '<i class="identical fa fa-check" aria-hidden="true"></i>',
+ '<span> ' + gettext('Identical') + ' </span>',
+ '</a>',
+ '</li>',
+ '<li>',
+ '<a class="dropdown-item" id="btn-differentt" href="#" tabindex="0">',
+ '<i class="different fa fa-check" aria-hidden="true"></i>',
+ '<span> ' + gettext('Different') + ' </span>',
+ '</a>',
+ '</li>',
+ '<li>',
+ '<a class="dropdown-item" id="btn-source-only" href="#" tabindex="0">',
+ '<i class="source-only fa fa-check" aria-hidden="true"></i>',
+ '<span> ' + gettext('Source Only') + ' </span>',
+ '</a>',
+ '</li>',
+ '<li>',
+ '<a class="dropdown-item" id="btn-target-only" href="#" tabindex="0">',
+ '<i class="target-only fa fa-check" aria-hidden="true"></i>',
+ '<span> ' + gettext('Target Only') + ' </span>',
+ '</a>',
+ '</li>',
+ '</ul>',
+ '</div>',
+ '</div>',
+ '</div>',
+ '</div>',
+ ].join('\n')
+ ),
+ render: function() {
+ this.cleanup();
+
+ var controls = this.controls,
+ m = this.model,
+ self = this,
+ idx = (this.tabIndex * 100);
+
+ this.$el.empty();
+
+ $(this.template()).appendTo(this.$el);
+
+ this.fields.each(function(f) {
+ var cntr = new(f.get('control'))({
+ field: f,
+ model: m,
+ dialog: self,
+ tabIndex: idx,
+ });
+
+ if (f.get('group') && f.get('group') == 'source') {
+ self.$el.find('.source').append(cntr.render().$el);
+ }
+ else {
+ self.$el.find('.target').append(cntr.render().$el);
+ }
+
+ controls.push(cntr);
+ });
+
+ return this;
+ },
+ remove: function(opts) {
+ if (opts && opts.data) {
+ if (this.model) {
+ if (this.model.reset) {
+ this.model.reset({
+ validate: false,
+ silent: true,
+ stop: true,
+ });
+ }
+ this.model.clear({
+ validate: false,
+ silent: true,
+ stop: true,
+ });
+ delete(this.model);
+ }
+ if (this.errorModel) {
+ this.errorModel.clear({
+ validate: false,
+ silent: true,
+ stop: true,
+ });
+ delete(this.errorModel);
+ }
+ }
+ this.cleanup();
+ Backform.Form.prototype.remove.apply(this, arguments);
+ },
+});
+
+let SchemaDiffFooterView = Backform.Form.extend({
+ className: function() {
+ return 'set-group pg-el-12';
+ },
+ tabPanelClassName: function() {
+ return Backform.tabClassName;
+ },
+ legendClass: 'badge',
+ contentClass: Backform.accordianContentClassName,
+ template: {
+ 'content': _.template(`
+ <div class="pg-el-sm-12 row <%=contentClass%>">
+ <div class="pg-el-sm-4 ddl-source">Source</div>
+ <div class="pg-el-sm-4 ddl-target">Target</div>
+ <div class="pg-el-sm-4 ddl-diff">Difference
+ </div>
+ </div>
+ </div>
+ `),
+ },
+ initialize: function(opts) {
+ this.label = opts.label;
+ Backform.Form.prototype.initialize.apply(this, arguments);
+ },
+ render: function() {
+ this.cleanup();
+
+ let m = this.model,
+ $el = this.$el,
+ tmpl = this.template,
+ controls = this.controls,
+ data = {
+ 'className': _.result(this, 'className'),
+ 'legendClass': _.result(this, 'legendClass'),
+ 'contentClass': _.result(this, 'contentClass'),
+ 'collapse': _.result(this, 'collapse'),
+ },
+ idx = (this.tabIndex * 100);
+
+ this.$el.empty();
+
+ let el = $((tmpl['content'])(data)).appendTo($el);
+
+ this.fields.each(function(f) {
+ let cntr = new(f.get('control'))({
+ field: f,
+ model: m,
+ dialog: self,
+ tabIndex: idx,
+ name: f.get('name'),
+ });
+
+ if (f.get('group') && f.get('group') == 'ddl-source') {
+ el.find('.ddl-source').append(cntr.render().$el);
+ }
+ else if (f.get('group') && f.get('group') == 'ddl-target') {
+ el.find('.ddl-target').append(cntr.render().$el);
+ }
+ else {
+ el.find('.ddl-diff').append(cntr.render().$el);
+ }
+ controls.push(cntr);
+ });
+
+ let $diff_sc = this.$el.find('.source_ddl'),
+ $diff_tr = this.$el.find('.target_ddl'),
+ $diff = this.$el.find('.diff_ddl'),
+ footer_height = this.$el.parent().height() - 50;
+ $diff_sc.height(footer_height);
+ $diff_sc.css({
+ 'height': footer_height + 'px',
+ });
+ $diff_tr.height(footer_height);
+ $diff_tr.css({
+ 'height': footer_height + 'px',
+ });
+ $diff.height(footer_height);
+ $diff.css({
+ 'height': footer_height + 'px',
+ });
+
+
+ return this;
+ },
+});
+export {
+ SchemaDiffSelect2Control,
+ SchemaDiffHeaderView,
+ SchemaDiffFooterView,
+ SchemaDiffSqlControl,
+};
diff --git a/web/pgadmin/tools/schema_diff/static/js/schema_diff.js b/web/pgadmin/tools/schema_diff/static/js/schema_diff.js
new file mode 100644
index 000000000..a565019bc
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/js/schema_diff.js
@@ -0,0 +1,145 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+define('pgadmin.schemadiff', [
+ 'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
+ 'sources/pgadmin', 'sources/csrf', 'pgadmin.browser.node',
+], function(
+ gettext, url_for, $, _, pgAdmin, csrfToken
+) {
+
+ var wcDocker = window.wcDocker,
+ pgBrowser = pgAdmin.Browser;
+ /* Return back, this has been called more than once */
+ if (pgBrowser.SchemaDiff)
+ return pgBrowser.SchemaDiff;
+
+ // Create an Object Restore of pgBrowser class
+ pgBrowser.SchemaDiff = {
+ init: function() {
+ if (this.initialized)
+ return;
+
+ this.initialized = true;
+ csrfToken.setPGCSRFToken(pgAdmin.csrf_token_header, pgAdmin.csrf_token);
+
+
+ // Define the nodes on which the menus to be appear
+ var menus = [{
+ name: 'schema_diff',
+ module: this,
+ applies: ['tools'],
+ callback: 'show_schema_diff_tool',
+ priority: 1,
+ label: gettext('Schema Diff'),
+ enable: true,
+ }];
+
+ pgBrowser.add_menus(menus);
+
+ // Creating a new pgBrowser frame to show the data.
+ var schemaDiffFrameType = new pgBrowser.Frame({
+ name: 'frm_schemadiff',
+ showTitle: true,
+ isCloseable: true,
+ isPrivate: true,
+ url: 'about:blank',
+ });
+
+ let self = this;
+ /* Cache may take time to load for the first time
+ * Keep trying till available
+ */
+ let cacheIntervalId = setInterval(function() {
+ if(pgBrowser.preference_version() > 0) {
+ self.preferences = pgBrowser.get_preferences_for_module('schema_diff');
+ clearInterval(cacheIntervalId);
+ }
+ },0);
+
+ pgBrowser.onPreferencesChange('schema_diff', function() {
+ self.preferences = pgBrowser.get_preferences_for_module('schema_diff');
+ });
+
+ // Load the newly created frame
+ schemaDiffFrameType.load(pgBrowser.docker);
+ return this;
+ },
+
+ // Callback to draw schema diff for objects
+ show_schema_diff_tool: function() {
+ var self = this,
+ baseUrl = url_for('schema_diff.initialize', null);
+
+ $.ajax({
+ url: baseUrl,
+ method: 'GET',
+ dataType: 'json',
+ contentType: 'application/json',
+ })
+ .done(function(res) {
+ self.trans_id = res.data.schemaDiffTransId;
+ res.data.panel_title = 'Schema Diff'; //TODO: Set the panel title
+ // TODO: Following function is used to test the fetching of the
+ // databases this should be moved to server selection event later.
+ self.launch_schema_diff(res.data);
+ })
+ .fail(function(xhr) {
+ self.raise_error_on_fail(gettext('Schema Diff initialize error') , xhr);
+ });
+ },
+
+ launch_schema_diff: function(data) {
+ var panel_title = data.panel_title,
+ trans_id = data.schemaDiffTransId,
+ panel_tooltip = '';
+
+ var url_params = {
+ 'trans_id': trans_id,
+ 'editor_title': panel_title,
+ },
+ baseUrl = url_for('schema_diff.panel', url_params);
+
+ if (this.preferences.schema_diff_new_browser_tab) {
+ window.open(baseUrl, '_blank');
+ } else {
+
+ var propertiesPanel = pgBrowser.docker.findPanels('properties'),
+ schemaDiffPanel = pgBrowser.docker.addPanel('frm_schemadiff', wcDocker.DOCK.STACKED, propertiesPanel[0]);
+
+ // Set panel title and icon
+ schemaDiffPanel.title('<span title="'+panel_tooltip+'">'+panel_title+'</span>');
+ schemaDiffPanel.icon('icon-schema-diff');
+ schemaDiffPanel.focus();
+
+ var openSchemaDiffURL = function(j) {
+ // add spinner element
+ $(j).data('embeddedFrame').$container.append(pgBrowser.SchemaDiff.spinner_el);
+ setTimeout(function() {
+ var frameInitialized = $(j).data('frameInitialized');
+ if (frameInitialized) {
+ var frame = $(j).data('embeddedFrame');
+ if (frame) {
+ frame.openURL(baseUrl);
+ frame.$container.find('.pg-sp-container').delay(1000).hide(1);
+ }
+ } else {
+ openSchemaDiffURL(j);
+ }
+ }, 100);
+ };
+
+ openSchemaDiffURL(schemaDiffPanel);
+ }
+
+ },
+ };
+
+ return pgBrowser.SchemaDiff;
+});
diff --git a/web/pgadmin/tools/schema_diff/static/js/schema_diff_hook.js b/web/pgadmin/tools/schema_diff/static/js/schema_diff_hook.js
new file mode 100644
index 000000000..571e5c8d5
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/js/schema_diff_hook.js
@@ -0,0 +1,38 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+define([
+ 'sources/url_for', 'jquery',
+ 'sources/pgadmin', 'pgadmin.tools.schema_diff_ui',
+], function(
+ url_for, $, pgAdmin, SchemaDiffUIModule
+) {
+ var pgTools = pgAdmin.Tools = pgAdmin.Tools || {};
+ var SchemaDiffUI = SchemaDiffUIModule.default;
+
+ /* Return back, this has been called more than once */
+ if (pgTools.SchemaDiffHook)
+ return pgTools.SchemaDiffHook;
+
+ pgTools.SchemaDiffHook = {
+ load: function(trans_id) {
+ window.onbeforeunload = function() {
+ $.ajax({
+ url: url_for('schemadiff.index') + 'close/'+trans_id,
+ method: 'DELETE',
+ });
+ };
+
+ let schemaUi = new SchemaDiffUI($('#schema-diff-container'), trans_id);
+ schemaUi.render();
+ },
+ };
+
+ return pgTools.SchemaDiffHook;
+});
diff --git a/web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js b/web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js
new file mode 100644
index 000000000..2e62c95fc
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js
@@ -0,0 +1,845 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+import url_for from 'sources/url_for';
+import $ from 'jquery';
+import gettext from 'sources/gettext';
+import Alertify from 'pgadmin.alertifyjs';
+import Backbone from 'backbone';
+import Slick from 'sources/../bundle/slickgrid';
+import pgAdmin from 'sources/pgadmin';
+import {setPGCSRFToken} from 'sources/csrf';
+import {generateScript} from 'tools/datagrid/static/js/show_query_tool';
+import 'pgadmin.sqleditor';
+import pgWindow from 'sources/window';
+
+import {SchemaDiffSelect2Control, SchemaDiffHeaderView,
+ SchemaDiffFooterView, SchemaDiffSqlControl} from './schema_diff.backform';
+
+var wcDocker = window.wcDocker;
+
+export default class SchemaDiffUI {
+ constructor(container, trans_id) {
+ var self = this;
+ this.$container = container;
+ this.header = null;
+ this.trans_id = trans_id;
+ this.filters = ['Identical', 'Different', 'Source Only', 'Target Only'];
+ this.sel_filters = ['Identical', 'Different', 'Source Only', 'Target Only'];
+ this.dataView = null;
+ this.grid = null,
+ this.selection = {};
+
+ this.model = new Backbone.Model({
+ source_sid: undefined,
+ source_did: undefined,
+ source_scid: undefined,
+ target_sid: undefined,
+ target_did: undefined,
+ target_scid: undefined,
+ source_ddl: undefined,
+ target_ddl: undefined,
+ diff_ddl: undefined,
+ });
+
+ setPGCSRFToken(pgAdmin.csrf_token_header, pgAdmin.csrf_token);
+
+ this.docker = new wcDocker(
+ this.$container, {
+ allowContextMenu: false,
+ allowCollapse: false,
+ loadingClass: 'pg-sp-icon',
+ themePath: url_for('static', {
+ 'filename': 'css',
+ }),
+ theme: 'webcabin.overrides.css',
+ }
+ );
+
+ this.header_panel = new pgAdmin.Browser.Panel({
+ name: 'schema_diff_header_panel',
+ showTitle: false,
+ isCloseable: false,
+ isPrivate: true,
+ content: '<div id="schema-diff-header" class="pg-el-container" el="sm"></div><div id="schema-diff-grid" class="pg-el-container" el="sm"></div>',
+ elContainer: true,
+ });
+
+ this.footer_panel = new pgAdmin.Browser.Panel({
+ name: 'schema_diff_footer_panel',
+ title: gettext('DDL Comparison'),
+ isCloseable: false,
+ isPrivate: true,
+ height: '60',
+ content: `<div id="schema-diff-ddl-comp" class="pg-el-container" el="sm">
+ <div id="ddl_comp_fetching_data" class="pg-sp-container schema-diff-busy-fetching d-none">
+ <div class="pg-sp-content">
+ <div class="row">
+ <div class="col-12 pg-sp-icon"></div>
+ </div>
+ <div class="row"><div class="col-12 pg-sp-text">` + gettext('Comparing objects...') + `</div></div>
+ </div>
+ </div></div>`,
+ });
+
+ this.header_panel.load(this.docker);
+ this.footer_panel.load(this.docker);
+
+
+ this.panel_obj = this.docker.addPanel('schema_diff_header_panel', wcDocker.DOCK.TOP, {w:'95%', h:'50%'});
+ this.footer_panel_obj = this.docker.addPanel('schema_diff_footer_panel', wcDocker.DOCK.BOTTOM, this.panel_obj, {w:'95%', h:'50%'});
+
+ self.footer_panel_obj.on(wcDocker.EVENT.VISIBILITY_CHANGED, function() {
+ setTimeout(function() {
+ this.resize_grid();
+ }.bind(self), 200);
+ });
+
+ self.footer_panel_obj.on(wcDocker.EVENT.RESIZE_ENDED, function() {
+ setTimeout(function() {
+ this.resize_panels();
+ }.bind(self), 200);
+ });
+
+ }
+
+
+ raise_error_on_fail(alert_title, xhr) {
+ try {
+ var err = JSON.parse(xhr.responseText);
+ Alertify.alert(alert_title, err.errormsg);
+ } catch (e) {
+ Alertify.alert(alert_title, e.statusText);
+ }
+ }
+
+ resize_panels() {
+ let $src_ddl = $('#schema-diff-ddl-comp .source_ddl'),
+ $tar_ddl = $('#schema-diff-ddl-comp .target_ddl'),
+ $diff_ddl = $('#schema-diff-ddl-comp .diff_ddl'),
+ footer_height = $('#schema-diff-ddl-comp').height() - 50;
+
+ $src_ddl.height(footer_height);
+ $src_ddl.css({
+ 'height': footer_height + 'px',
+ });
+ $tar_ddl.height(footer_height);
+ $tar_ddl.css({
+ 'height': footer_height + 'px',
+ });
+ $diff_ddl.height(footer_height);
+ $diff_ddl.css({
+ 'height': footer_height + 'px',
+ });
+
+ this.resize_grid();
+ }
+
+ compare_schemas() {
+ var self = this,
+ url_params = self.model.toJSON();
+
+ if (url_params['source_sid'] == '' || _.isUndefined(url_params['source_sid']) ||
+ url_params['source_did'] == '' || _.isUndefined(url_params['source_did']) ||
+ url_params['source_scid'] == '' || _.isUndefined(url_params['source_scid']) ||
+ url_params['target_sid'] == '' || _.isUndefined(url_params['target_sid']) ||
+ url_params['target_did'] == '' || _.isUndefined(url_params['target_did']) ||
+ url_params['target_scid'] == '' || _.isUndefined(url_params['target_scid'])
+ ) {
+ Alertify.alert(gettext('Selection Error'), gettext('Please select source and target.'));
+ return false;
+ }
+
+ this.selection = JSON.parse(JSON.stringify(url_params));
+
+ url_params['trans_id'] = self.trans_id;
+
+ _.each(url_params, function(key, val) {
+ url_params[key] = parseInt(val, 10);
+ });
+
+ var baseUrl = url_for('schema_diff.compare', url_params);
+
+ self.model.set({
+ 'source_ddl': undefined,
+ 'target_ddl': undefined,
+ 'diff_ddl': undefined,
+ });
+
+ self.render_grid([]);
+ self.footer.render();
+ self.startDiffPoller();
+
+ return $.ajax({
+ url: baseUrl,
+ method: 'GET',
+ dataType: 'json',
+ contentType: 'application/json',
+ })
+ .done(function (res) {
+ self.stopDiffPoller();
+ self.render_grid(res.data);
+ })
+ .fail(function (xhr) {
+ self.raise_error_on_fail(gettext('Schema compare error'), xhr);
+ self.stopDiffPoller();
+ });
+ }
+
+ generate_script() {
+ var self = this,
+ baseServerUrl = url_for('schema_diff.get_server', {'sid': self.selection['target_sid'],
+ 'did': self.selection['target_did']}),
+ sel_rows = self.grid ? self.grid.getSelectedRows() : [],
+ sel_rows_data = [],
+ url_params = self.selection,
+ generated_script = undefined,
+ open_query_tool;
+
+ _.each(url_params, function(key, val) {
+ url_params[key] = parseInt(val, 10);
+ });
+
+ $('#diff_fetching_data').removeClass('d-none');
+ $('#diff_fetching_data').find('.schema-diff-busy-text').text('Generating script...');
+
+
+ open_query_tool = function get_server_details() {
+ $.ajax({
+ url: baseServerUrl,
+ method: 'GET',
+ dataType: 'json',
+ contentType: 'application/json',
+ })
+ .done(function (res) {
+ let data = res.data;
+ let server_data = {};
+ if (data) {
+ server_data['sgid'] = data.gid;
+ server_data['sid'] = data.sid;
+ server_data['stype'] = data.type;
+ server_data['server'] = data.name;
+ server_data['user'] = data.user;
+ server_data['did'] = self.model.get('target_did');
+ server_data['database'] = data.database;
+
+ if (_.isUndefined(generated_script))
+ generated_script = 'BEGIN;' + '\n' + self.model.get('diff_ddl') + '\n' + 'END;';
+
+ let preferences = pgWindow.pgAdmin.Browser.get_preferences_for_module('schema_diff');
+ if (preferences.schema_diff_new_browser_tab) {
+ pgWindow.pgAdmin.ddl_diff = generated_script;
+ generateScript(server_data, pgWindow.pgAdmin.DataGrid);
+ } else {
+ pgWindow.pgAdmin.ddl_diff = generated_script;
+ generateScript(server_data, pgWindow.pgAdmin.DataGrid);
+ }
+ }
+
+ $('#diff_fetching_data').find('.schema-diff-busy-text').text('');
+ $('#diff_fetching_data').addClass('d-none');
+
+ })
+ .fail(function (xhr) {
+ self.raise_error_on_fail(gettext('Generate script error'), xhr);
+ $('#diff_fetching_data').find('.schema-diff-busy-text').text('');
+ $('#diff_fetching_data').addClass('d-none');
+ });
+ };
+
+ if (sel_rows.length > 0) {
+ for (var row = 0; row < sel_rows.length; row++) {
+ let data = self.grid.getData().getItem(sel_rows[row]);
+
+ if (data.type) {
+ let tmp_data = {
+ 'node_type': data.type,
+ 'source_oid': parseInt(data.oid, 10),
+ 'target_oid': parseInt(data.oid, 10),
+ 'comp_status': data.status,
+ };
+
+ if(data.status && (data.status.toLowerCase() == 'different' || data.status.toLowerCase() == 'identical')) {
+ tmp_data['target_oid'] = data.target_oid;
+ }
+ sel_rows_data.push(tmp_data);
+ }
+ }
+
+ url_params['sel_rows'] = sel_rows_data;
+
+ let baseUrl = url_for('schema_diff.generate_script', {'trans_id': self.trans_id});
+
+ $.ajax({
+ url: baseUrl,
+ method: 'POST',
+ dataType: 'json',
+ contentType: 'application/json',
+ data: JSON.stringify(url_params),
+ })
+ .done(function (res) {
+ if (res) {
+ generated_script = 'BEGIN;' + '\n' + res.diff_ddl + '\n' + 'END;';
+ }
+ open_query_tool();
+ })
+ .fail(function (xhr) {
+ self.raise_error_on_fail(gettext('Generate script error'), xhr);
+ $('#diff_fetching_data').addClass('d-none');
+ });
+ } else if (!_.isUndefined(self.model.get('diff_ddl'))) {
+ open_query_tool();
+ }
+ return false;
+ }
+
+ render_grid(data) {
+
+ var self = this;
+ var grid;
+
+ if (self.grid) {
+ // Only render the data
+ self.render_grid_data(data);
+ return;
+ }
+ // Checkbox Column
+ var checkboxSelector = new Slick.CheckboxSelectColumn({
+ cssClass: 'slick-cell-checkboxsel',
+ minWidth: 30,
+ });
+
+ // Format Schema object title with appropriate icon
+ var formatColumnTitle = function (row, cell, value, columnDef, dataContext) {
+ let icon = 'icon-' + dataContext.type;
+ return '<i class="ml-5 wcTabIcon '+ icon +'"></i><span>' + value + '</span>';
+ };
+
+ // Grid Columns
+ var grid_width = (self.grid_width - 47) / 2 ;
+ var columns = [
+ checkboxSelector.getColumnDefinition(),
+ {id: 'title', name: 'Schema Objects', field: 'title', minWidth: grid_width, formatter: formatColumnTitle},
+ {id: 'status', name: 'Comparison Result', field: 'status', minWidth: grid_width},
+ {id: 'label', name: 'Schema Objects', field: 'label', width: 0, minWidth: 0, maxWidth: 0,
+ cssClass: 'really-hidden', headerCssClass: 'really-hidden'},
+ {id: 'type', name: 'Schema Objects', field: 'type', width: 0, minWidth: 0, maxWidth: 0,
+ cssClass: 'really-hidden', headerCssClass: 'really-hidden'},
+ {id: 'id', name: 'id', field: 'id', width: 0, minWidth: 0, maxWidth: 0,
+ cssClass: 'really-hidden', headerCssClass: 'really-hidden' },
+
+ ];
+
+ // Grid Options
+ var options = {
+ enableCellNavigation: true,
+ enableColumnReorder: false,
+ enableRowSelection: true,
+ };
+
+ // Grouping by Schema Object
+ self.groupBySchemaObject = function() {
+ self.dataView.setGrouping({
+ getter: 'type',
+ formatter: function (g) {
+ let icon = 'icon-coll-' + g.value;
+ return '<i class="wcTabIcon '+ icon +'"></i><span>' + g.rows[0].label + '</span>';
+ },
+ aggregateCollapsed: true,
+ lazyTotalsCalculation: true,
+ });
+ };
+
+ var groupItemMetadataProvider = new Slick.Data.GroupItemMetadataProvider({ checkboxSelect: true,
+ checkboxSelectPlugin: checkboxSelector });
+
+ // Dataview for grid
+ self.dataView = new Slick.Data.DataView({
+ groupItemMetadataProvider: groupItemMetadataProvider,
+ inlineFilters: false,
+ });
+
+ // Wire up model events to drive the grid
+ self.dataView.onRowCountChanged.subscribe(function () {
+ grid.updateRowCount();
+ grid.render();
+ });
+ self.dataView.onRowsChanged.subscribe(function (e, args) {
+ grid.invalidateRows(args.rows);
+ grid.render();
+ });
+
+ // Change Row css on the basis of item status
+ self.dataView.getItemMetadata = function(row) {
+ var item = self.dataView.getItem(row);
+ if (item.__group) {
+ return groupItemMetadataProvider.getGroupRowMetadata(item);
+ }
+
+ if(item.status === 'Different') {
+ return { cssClasses: 'different' };
+ } else if (item.status === 'Source Only') {
+ return { cssClasses: 'source' };
+ } else if (item.status === 'Target Only') {
+ return { cssClasses: 'target' };
+ }
+
+ return null;
+ };
+
+ // Grid filter
+ self.filter = function (item) {
+ let self = this;
+ if (self.sel_filters.indexOf(item.status) !== -1) return true;
+ return false;
+ };
+
+ let $data_grid = $('#schema-diff-grid');
+ grid = this.grid = new Slick.Grid($data_grid, self.dataView, columns, options);
+ grid.registerPlugin(groupItemMetadataProvider);
+ grid.setSelectionModel(new Slick.RowSelectionModel({selectActiveRow: false}));
+ grid.registerPlugin(checkboxSelector);
+
+ grid.onClick.subscribe(function(e, args) {
+ if (args.row) {
+ data = args.grid.getData().getItem(args.row);
+ if (data.status) this.ddlCompare(data);
+ }
+ }.bind(self));
+
+ grid.onSelectedRowsChanged.subscribe(self.handle_generate_button.bind(self));
+
+ self.model.on('change:diff_ddl', self.handle_generate_button.bind(self));
+
+ $('#schema-diff-grid').on('keyup', function() {
+ if ((event.keyCode == 38 || event.keyCode ==40) && this.grid.getActiveCell().row) {
+ data = this.grid.getData().getItem(this.grid.getActiveCell().row);
+ this.ddlCompare(data);
+ }
+ }.bind(self));
+
+ self.render_grid_data(data);
+ }
+
+
+
+ render_grid_data(data) {
+ var self = this;
+ self.dataView.beginUpdate();
+ self.dataView.setItems(data);
+ self.dataView.setFilter(self.filter.bind(self));
+ self.groupBySchemaObject();
+ self.dataView.endUpdate();
+
+ self.resize_grid();
+ }
+
+ handle_generate_button(){
+ if (this.grid.getSelectedRows().length > 0 || (this.model.get('diff_ddl') != '' && !_.isUndefined(this.model.get('diff_ddl')))) {
+ this.header.$el.find('button#generate-script').removeAttr('disabled');
+ } else {
+ this.header.$el.find('button#generate-script').attr('disabled', true);
+ }
+ }
+
+ resize_grid() {
+ let $data_grid = $('#schema-diff-grid'),
+ grid_height = (this.panel_obj.height() > 0) ? this.panel_obj.height() - 100 : this.grid_height - 100;
+
+ $data_grid.height(grid_height);
+ $data_grid.css({
+ 'height': grid_height + 'px',
+ });
+ if (this.grid) this.grid.resizeCanvas();
+ }
+
+ getCompareStatus() {
+ var self = this,
+ url_params = {'trans_id': self.trans_id},
+ baseUrl = url_for('schema_diff.poll', url_params);
+
+ $.ajax({
+ url: baseUrl,
+ method: 'GET',
+ dataType: 'json',
+ contentType: 'application/json',
+ })
+ .done(function (res) {
+ let msg = res.data.compare_msg + res.data.diff_percentage + '% completed';
+ $('#diff_fetching_data').find('.schema-diff-busy-text').text(msg);
+ })
+ .fail(function (xhr) {
+ self.raise_error_on_fail(gettext('Poll error'), xhr);
+ self.stopDiffPoller('fail');
+ });
+ }
+
+ startDiffPoller() {
+ $('#ddl_comp_fetching_data').addClass('d-none');
+ $('#diff_fetching_data').removeClass('d-none');
+ /* Execute once for the first time as setInterval will not do */
+ this.getCompareStatus();
+ this.diff_poller_int_id = setInterval(this.getCompareStatus.bind(this), 1000);
+ }
+
+ stopDiffPoller(status) {
+ clearInterval(this.diff_poller_int_id);
+ // The last polling for comparison
+ if (status !== 'fail') this.getCompareStatus();
+
+ $('#diff_fetching_data').find('.schema-diff-busy-text').text('');
+ $('#diff_fetching_data').addClass('d-none');
+
+ }
+
+ ddlCompare(data) {
+ var self = this,
+ node_type = data.type,
+ source_oid = data.oid,
+ target_oid = data.oid;
+
+ self.model.set({
+ 'source_ddl': undefined,
+ 'target_ddl': undefined,
+ 'diff_ddl': undefined,
+ });
+
+ var url_params = self.selection;
+
+ if(data.status && (data.status.toLowerCase() == 'different' || data.status.toLowerCase() == 'identical')) {
+ target_oid = data.target_oid;
+ }
+
+ url_params['trans_id'] = self.trans_id;
+ url_params['source_oid'] = source_oid;
+ url_params['target_oid'] = target_oid;
+ url_params['comp_status'] = data.status;
+ url_params['node_type'] = node_type;
+
+ _.each(url_params, function(key, val) {
+ url_params[key] = parseInt(val, 10);
+ });
+
+ $('#ddl_comp_fetching_data').removeClass('d-none');
+
+ var baseUrl = url_for('schema_diff.ddl_compare', url_params);
+ self.model.url = baseUrl;
+
+ self.model.fetch({
+ success: function() {
+ self.footer.render();
+ $('#ddl_comp_fetching_data').addClass('d-none');
+ },
+ error: function() {
+ self.footer.render();
+ $('#ddl_comp_fetching_data').addClass('d-none');
+ },
+ });
+ }
+
+ render() {
+ let self = this;
+ let panel = self.docker.findPanels('schema_diff_header_panel')[0];
+
+ var header = panel.$container.find('#schema-diff-header');
+
+ self.header = new SchemaDiffHeaderView({
+ el: header,
+ model: this.model,
+ fields: [{
+ name: 'source_sid', label: false,
+ control: SchemaDiffSelect2Control,
+ url: url_for('schema_diff.servers'),
+ select2: {
+ allowClear: true,
+ placeholder: gettext('Select server...'),
+ },
+ connect: function() {
+ self.connect_server(arguments[0], arguments[1]);
+ },
+ group: 'source',
+ disabled: function() {
+ return false;
+ },
+ }, {
+ name: 'source_did',
+ group: 'source',
+ deps: ['source_sid'],
+ control: SchemaDiffSelect2Control,
+ url: function() {
+ if (this.get('source_sid'))
+ return url_for('schema_diff.databases', {'sid': this.get('source_sid')});
+ return false;
+ },
+ select2: {
+ allowClear: true,
+ placeholder: gettext('Select database...'),
+ },
+ disabled: function(m) {
+ if (!_.isUndefined(m.get('source_sid')) && !_.isNull(m.get('source_sid')))
+ return false;
+ return true;
+ },
+ connect: function() {
+ self.connect_database(this.model.get('source_sid'), arguments[0], arguments[1]);
+ },
+ }, {
+ name: 'source_scid',
+ control: SchemaDiffSelect2Control,
+ group: 'source',
+ deps: ['source_sid', 'source_did'],
+ url: function() {
+ if (this.get('source_sid') && this.get('source_did'))
+ return url_for('schema_diff.schemas', {'sid': this.get('source_sid'), 'did': this.get('source_did')});
+ return false;
+ },
+ select2: {
+ allowClear: true,
+ placeholder: gettext('Select schema...'),
+ },
+ disabled: function(m) {
+ if (!_.isUndefined(m.get('source_did')) && !_.isNull(m.get('source_did')))
+ return false;
+ return true;
+ },
+ }, {
+ name: 'target_sid', label: false,
+ control: SchemaDiffSelect2Control,
+ group: 'target',
+ url: url_for('schema_diff.servers'),
+ select2: {
+ allowClear: true,
+ placeholder: gettext('Select server...'),
+ },
+ disabled: function() {
+ return false;
+ },
+ connect: function() {
+ self.connect_server(arguments[0], arguments[1]);
+ },
+ }, {
+ name: 'target_did',
+ control: SchemaDiffSelect2Control,
+ group: 'target',
+ deps: ['target_sid'],
+ url: function() {
+ if (this.get('target_sid'))
+ return url_for('schema_diff.databases', {'sid': this.get('target_sid')});
+ return false;
+ },
+ select2: {
+ allowClear: true,
+ placeholder: gettext('Select database...'),
+ },
+ disabled: function(m) {
+ if (!_.isUndefined(m.get('target_sid')) && !_.isNull(m.get('target_sid')))
+ return false;
+ return true;
+ },
+ connect: function() {
+ self.connect_database(this.model.get('target_sid'), arguments[0], arguments[1]);
+ },
+ }, {
+ name: 'target_scid',
+ control: SchemaDiffSelect2Control,
+ group: 'target',
+ deps: ['target_sid', 'target_did'],
+ url: function() {
+ if (this.get('target_sid') && this.get('target_did'))
+ return url_for('schema_diff.schemas', {'sid': this.get('target_sid'), 'did': this.get('target_did')});
+ return false;
+ },
+ select2: {
+ allowClear: true,
+ placeholder: gettext('Select schema...'),
+ },
+ disabled: function(m) {
+ if (!_.isUndefined(m.get('target_did')) && !_.isNull(m.get('target_did')))
+ return false;
+ return true;
+ },
+ }],
+ });
+
+ self.footer = new SchemaDiffFooterView({
+ model: this.model,
+ fields: [{
+ name: 'source_ddl', label: false,
+ control: SchemaDiffSqlControl,
+ group: 'ddl-source',
+ }, {
+ name: 'target_ddl', label: false,
+ control: SchemaDiffSqlControl,
+ group: 'ddl-target',
+ }, {
+ name: 'diff_ddl', label: false,
+ control: SchemaDiffSqlControl,
+ group: 'ddl-diff', copyRequired: true,
+ }],
+ });
+
+ self.header.render();
+
+ self.header.$el.find('button.btn-primary').on('click', self.compare_schemas.bind(self));
+ self.header.$el.find('button#generate-script').on('click', self.generate_script.bind(self));
+ self.header.$el.find('ul.filter a.dropdown-item').on('click', self.refresh_filters.bind(self));
+
+ let footer_panel = self.docker.findPanels('schema_diff_footer_panel')[0],
+ header_panel = self.docker.findPanels('schema_diff_header_panel')[0];
+
+ footer_panel.$container.find('#schema-diff-ddl-comp').append(self.footer.render().$el);
+ header_panel.$container.find('#schema-diff-grid').append(`<div class='obj_properties container-fluid'>
+ <div class='alert alert-info pg-panel-message'>` + gettext('Select the server, database and schema for the source and target and click <b>Compare</b> to compare them.') + '</div></div>');
+
+ self.grid_width = $('#schema-diff-grid').width();
+ self.grid_height = this.panel_obj.height();
+ }
+
+ refresh_filters(event) {
+ let self = this;
+ _.each(self.filters, function(filter) {
+ let index = self.sel_filters.indexOf(filter);
+ let filter_class = '.' + filter.replace(' ', '-').toLowerCase();
+ if ($(event.currentTarget).find(filter_class).length == 1) {
+ if ($(filter_class).hasClass('visibility-hidden') === true) {
+ $(filter_class).removeClass('visibility-hidden');
+ if (index === -1) self.sel_filters.push(filter);
+ } else {
+ $(filter_class).addClass('visibility-hidden');
+ if(index !== -1 ) delete self.sel_filters[index];
+ }
+ }
+ });
+ // Refresh the grid
+ self.dataView.refresh();
+ }
+
+ connect_database(server_id, db_id, callback) {
+ var url = url_for('schema_diff.connect_database', {'sid': server_id, 'did': db_id});
+ $.post(url)
+ .done(function(res) {
+ if (res.success && res.data) {
+ callback(res.data);
+ }
+ })
+ .fail(function(xhr, error) {
+ Alertify.pgNotifier(error, xhr, gettext('Failed to connect the database.'));
+ });
+
+ }
+
+ connect_server(server_id, callback) {
+ var onFailure = function(
+ xhr, status, error, server_id, callback
+ ) {
+ Alertify.pgNotifier('error', xhr, error, function(msg) {
+ setTimeout(function() {
+ Alertify.dlgServerPass(
+ gettext('Connect to Server'),
+ msg,
+ server_id,
+ callback
+ ).resizeTo();
+ }, 100);
+ });
+ },
+ onSuccess = function(res, callback) {
+ if (res && res.data) {
+ // We're not reconnecting
+ callback(res.data);
+ }
+ };
+
+
+ // Ask Password and send it back to the connect server
+ if (!Alertify.dlgServerPass) {
+ Alertify.dialog('dlgServerPass', function factory() {
+ return {
+ main: function(
+ title, message, server_id, success_callback, _onSuccess, _onFailure, _onCancel
+ ) {
+ this.set('title', title);
+ this.message = message;
+ this.server_id = server_id;
+ this.success_callback = success_callback;
+ this.onSuccess = _onSuccess || onSuccess;
+ this.onFailure = _onFailure || onFailure;
+ this.onCancel = _onCancel || onCancel;
+ },
+ setup:function() {
+ return {
+ buttons:[{
+ text: gettext('Cancel'), className: 'btn btn-secondary fa fa-times pg-alertify-button',
+ key: 27,
+ },{
+ text: gettext('OK'), key: 13, className: 'btn btn-primary fa fa-check pg-alertify-button',
+ }],
+ focus: {element: '#password', select: true},
+ options: {
+ modal: 0, resizable: false, maximizable: false, pinnable: false,
+ },
+ };
+ },
+ build:function() {},
+ prepare:function() {
+ this.setContent(this.message);
+ },
+ callback: function(closeEvent) {
+ var _onFailure = this.onFailure,
+ _onSuccess = this.onSuccess,
+ _onCancel = this.onCancel,
+ _success_callback = this.success_callback;
+
+ if (closeEvent.button.text == gettext('OK')) {
+
+ var _url = url_for('schema_diff.connect_server', {'sid': this.server_id});
+
+ $.ajax({
+ type: 'POST',
+ timeout: 30000,
+ url: _url,
+ data: $('#frmPassword').serialize(),
+ })
+ .done(function(res) {
+ if (res.success == 1) {
+ return _onSuccess(res, _success_callback);
+ }
+ })
+ .fail(function(xhr, status, error) {
+ return _onFailure(
+ xhr, status, error, this.server_id, _success_callback
+ );
+ });
+ } else {
+ _onCancel && typeof(_onCancel) == 'function' &&
+ _onCancel();
+ }
+ },
+ };
+ });
+ }
+
+ var onCancel = function() {
+ return false;
+ };
+
+ var url = url_for('schema_diff.connect_server', {'sid': server_id});
+ $.post(url)
+ .done(function(res) {
+ if (res.success == 1) {
+ return onSuccess(res, callback);
+ }
+ })
+ .fail(function(xhr, status, error) {
+ return onFailure(
+ xhr, status, error, server_id, callback
+ );
+ });
+ }
+}
diff --git a/web/pgadmin/tools/schema_diff/static/scss/_schema_diff.scss b/web/pgadmin/tools/schema_diff/static/scss/_schema_diff.scss
new file mode 100644
index 000000000..800449655
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/scss/_schema_diff.scss
@@ -0,0 +1,85 @@
+#schema-diff-container {
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ padding-top: 10px;
+ background-color: $color-gray-light;
+}
+
+#schema-diff-grid {
+ background: $color-bg;
+ outline: 0;
+ font-size: 9pt;
+ margin-top: 28px;
+ background: none;
+ background-color: $color-gray-light;
+}
+
+#schema-diff-grid .slick-header .slick-header-columns {
+ background: $color-bg;
+ height: 40px;
+ border-bottom: $panel-border;
+}
+
+#schema-diff-grid .slick-header .slick-header-column.ui-state-default {
+ padding: 4px 0 3px 6px;
+ border-bottom: $panel-border;
+ border-right: $panel-border;
+}
+
+.slick-row:hover .slick-cell{
+ border-top: $table-hover-border;
+ border-bottom: $table-hover-border;
+ background-color: $table-hover-bg-color;
+}
+
+#schema-diff-grid .slick-header .slick-header-column.selected {
+ background-color: $color-primary;
+ color: $color-primary-fg;
+}
+.slick-row .slick-cell {
+ border-bottom: $panel-border;
+ border-right: $panel-border;
+ z-index: 0;
+}
+
+#schema-diff-grid .slick-row .slick-cell.l0.r0.selected {
+ background-color: $color-primary;
+ color: $color-primary-fg;
+}
+
+#schema-diff-grid .slick-row > .slick-cell:not(.l0):not(.r0).selected {
+ background-color: $table-hover-bg-color;
+ border-top: $table-hover-border;
+ border-bottom: $table-hover-border;
+}
+
+#schema-diff-grid div.slick-header.ui-state-default {
+ background: $color-bg;
+ border-bottom: none;
+ border-right: none;
+ border-top: none;
+}
+
+#schema-diff-grid .different {
+ background-color: $schemadiff-diff-row-color !important;
+}
+#schema-diff-grid .source {
+ background-color: $schemadiff-source-row-color !important;
+}
+#schema-diff-grid .target {
+ background-color: $schemadiff-target-row-color !important;
+}
+
+#schema-diff-grid .slick-row.active {
+ background-color: $table-bg-selected !important;
+}
+
+#schema-diff-ddl-comp {
+ height: 100%;
+ bottom: 10px;
+ background-color: $color-bg !important;
+ overflow-y: hidden;
+}
diff --git a/web/pgadmin/tools/schema_diff/templates/schema_diff/index.html b/web/pgadmin/tools/schema_diff/templates/schema_diff/index.html
new file mode 100644
index 000000000..9788264d9
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/templates/schema_diff/index.html
@@ -0,0 +1,31 @@
+{% extends "base.html" %}
+{% block init_script %}
+try {
+ require(
+ ['sources/generated/schema_diff', 'sources/generated/slickgrid', 'sources/generated/codemirror', 'sources/generated/browser_nodes'],
+ function(pgSchemaDiffHook) {
+ var pgSchemaDiffHook = pgSchemaDiffHook || pgAdmin.Tools.SchemaDiffHook;
+ pgSchemaDiffHook.load({{trans_id}});
+ },
+ function() {
+ console.log(arguments);
+ });
+} catch (err) {
+ console.log(err);
+}
+{% endblock %}
+{% block css_link %}
+<link type="text/css" rel="stylesheet" href="{{ url_for('browser.browser_css')}}"/>
+{% endblock %}
+{% block body %}
+<div id="schema-diff-container">
+ <div id="diff_fetching_data" class="pg-sp-container schema-diff-busy-fetching d-none">
+ <div class="pg-sp-content">
+ <div class="row">
+ <div class="col-12 pg-sp-icon"></div>
+ </div>
+ <div class="row"><div class="col-12 pg-sp-text schema-diff-busy-text"></div></div>
+ </div>
+ </div>
+</div>
+{% endblock %}
diff --git a/web/pgadmin/tools/schema_diff/tests/__init__.py b/web/pgadmin/tools/schema_diff/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/web/pgadmin/tools/schema_diff/tests/pg/10_plus/source.sql b/web/pgadmin/tools/schema_diff/tests/pg/10_plus/source.sql
new file mode 100644
index 000000000..99757ceb2
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/pg/10_plus/source.sql
@@ -0,0 +1,440 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:54:15 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- TOC entry 17 (class 2615 OID 139770)
+-- Name: source; Type: SCHEMA; Schema: -; Owner: postgres
+--
+
+CREATE SCHEMA source;
+
+
+ALTER SCHEMA source OWNER TO postgres;
+
+SET default_tablespace = '';
+
+
+CREATE EXTENSION btree_gist
+ SCHEMA source;
+
+--
+-- TOC entry 12272 (class 1259 OID 149205)
+-- Name: table_for_partition; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_partition (
+ col1 bigint NOT NULL
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE source.table_for_partition OWNER TO postgres;
+
+--
+-- TOC entry 12273 (class 1259 OID 149208)
+-- Name: part1; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.part1 (
+ col1 bigint NOT NULL
+);
+ALTER TABLE ONLY source.table_for_partition ATTACH PARTITION source.part1 FOR VALUES FROM ('1') TO ('23');
+
+
+ALTER TABLE source.part1 OWNER TO postgres;
+
+--
+-- TOC entry 12274 (class 1259 OID 149213)
+-- Name: table_for_partition_1; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_partition_1 (
+ col1 bigint
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE source.table_for_partition_1 OWNER TO postgres;
+
+--
+-- TOC entry 12275 (class 1259 OID 149216)
+-- Name: part3; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.part3 (
+ col1 bigint
+);
+ALTER TABLE ONLY source.table_for_partition_1 ATTACH PARTITION source.part3 FOR VALUES FROM ('1') TO ('10');
+
+
+ALTER TABLE source.part3 OWNER TO postgres;
+
+--
+-- TOC entry 12276 (class 1259 OID 149219)
+-- Name: part4; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.part4 (
+ col1 bigint
+);
+ALTER TABLE ONLY source.table_for_partition_1 ATTACH PARTITION source.part4 FOR VALUES FROM ('11') TO ('20');
+
+
+ALTER TABLE source.part4 OWNER TO postgres;
+
+--
+-- TOC entry 12258 (class 1259 OID 148963)
+-- Name: table_for_column; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_column (
+ col1 bigint NOT NULL,
+ col2 text,
+ col3 text
+);
+
+
+ALTER TABLE source.table_for_column OWNER TO postgres;
+
+--
+-- TOC entry 12256 (class 1259 OID 148895)
+-- Name: table_for_constraints; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_constraints OWNER TO postgres;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12256
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON TABLE source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 12262 (class 1259 OID 149004)
+-- Name: table_for_identical; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_identical OWNER TO postgres;
+
+--
+-- TOC entry 12260 (class 1259 OID 148977)
+-- Name: table_for_index; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_index OWNER TO postgres;
+
+--
+-- TOC entry 12269 (class 1259 OID 149128)
+-- Name: table_for_primary_key; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE source.table_for_primary_key OWNER TO postgres;
+
+--
+-- TOC entry 12264 (class 1259 OID 149024)
+-- Name: table_for_rule; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_rule OWNER TO postgres;
+
+--
+-- TOC entry 12266 (class 1259 OID 149048)
+-- Name: table_for_trigger; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_trigger OWNER TO postgres;
+
+--
+-- TOC entry 56893 (class 2606 OID 148904)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='12') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 56893
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56891 (class 2606 OID 148911)
+-- Name: table_for_constraints check_con; Type: CHECK CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE source.table_for_constraints
+ ADD CONSTRAINT check_con CHECK ((col1 > 10)) NOT VALID;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56891
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT check_con ON source.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 56899 (class 2606 OID 148970)
+-- Name: table_for_column table_for_column_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_column
+ ADD CONSTRAINT table_for_column_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56895 (class 2606 OID 148902)
+-- Name: table_for_constraints table_for_constraints_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT table_for_constraints_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 148984)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56913 (class 2606 OID 149135)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1, col2);
+
+
+--
+-- TOC entry 56909 (class 2606 OID 149031)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56907 (class 2606 OID 149011)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56911 (class 2606 OID 149055)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148913)
+-- Name: table_for_constraints unique; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "unique" UNIQUE (col1);
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 56897
+-- Name: CONSTRAINT "unique" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "unique" ON source.table_for_constraints IS 'cmnt';
+
+
+--
+-- TOC entry 56900 (class 1259 OID 149023)
+-- Name: index1; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index1 ON source.table_for_index USING btree (col2 varchar_pattern_ops);
+
+
+--
+-- TOC entry 56905 (class 1259 OID 149012)
+-- Name: index_identical; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index_identical ON source.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56901 (class 1259 OID 149211)
+-- Name: index_same; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index_same ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56902 (class 1259 OID 149022)
+-- Name: index_source; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index_source ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 61044 (class 2618 OID 149032)
+-- Name: table_for_rule rule1; Type: RULE; Schema: source; Owner: postgres
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO source.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61070 (class 0 OID 0)
+-- Dependencies: 61044
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON RULE rule1 ON source.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149033)
+-- Name: table_for_rule rule2; Type: RULE; Schema: source; Owner: postgres
+--
+
+CREATE RULE rule2 AS
+ ON INSERT TO source.table_for_rule DO NOTHING;
+
+--
+-- TOC entry 12283 (class 1259 OID 347818)
+-- Name: test view; Type: VIEW; Schema: source; Owner: postgres
+--
+
+CREATE VIEW source."test view" AS
+ SELECT pg_class.relname,
+ pg_class.relnamespace,
+ pg_class.reltype,
+ pg_class.reloftype,
+ pg_class.relowner,
+ pg_class.relam,
+ pg_class.relfilenode,
+ pg_class.reltablespace,
+ pg_class.relpages,
+ pg_class.reltuples,
+ pg_class.relallvisible,
+ pg_class.reltoastrelid,
+ pg_class.relhasindex,
+ pg_class.relisshared,
+ pg_class.relpersistence,
+ pg_class.relkind,
+ pg_class.relnatts,
+ pg_class.relchecks,
+ pg_class.relhasoids,
+ pg_class.relhaspkey,
+ pg_class.relhasrules,
+ pg_class.relhastriggers,
+ pg_class.relhassubclass,
+ pg_class.relrowsecurity,
+ pg_class.relforcerowsecurity,
+ pg_class.relispopulated,
+ pg_class.relreplident,
+ pg_class.relispartition,
+ pg_class.relfrozenxid,
+ pg_class.relminmxid,
+ pg_class.relacl,
+ pg_class.reloptions,
+ pg_class.relpartbound
+ FROM pg_class
+ LIMIT 10;
+
+
+ALTER TABLE source."test view" OWNER TO postgres;
+
+--
+-- TOC entry 12286 (class 1259 OID 347832)
+-- Name: test view f; Type: VIEW; Schema: source; Owner: postgres
+--
+
+CREATE VIEW source."test view f" WITH (security_barrier='false') AS
+ SELECT 2;
+
+
+ALTER TABLE source."test view f" OWNER TO postgres;
+
+--
+-- TOC entry 61111 (class 0 OID 0)
+-- Dependencies: 12286
+-- Name: VIEW "test view f"; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON VIEW source."test view f" IS 'cmn';
diff --git a/web/pgadmin/tools/schema_diff/tests/pg/10_plus/target.sql b/web/pgadmin/tools/schema_diff/tests/pg/10_plus/target.sql
new file mode 100644
index 000000000..c3042ab60
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/pg/10_plus/target.sql
@@ -0,0 +1,429 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:55:22 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- TOC entry 18 (class 2615 OID 139771)
+-- Name: target; Type: SCHEMA; Schema: -; Owner: postgres
+--
+
+CREATE SCHEMA target;
+
+ALTER SCHEMA target OWNER TO postgres;
+
+SET default_tablespace = '';
+
+CREATE EXTENSION btree_gist
+ SCHEMA target;
+
+--
+-- TOC entry 12250 (class 1259 OID 139938)
+-- Name: MView; Type: MATERIALIZED VIEW; Schema: target; Owner: postgres
+--
+
+CREATE MATERIALIZED VIEW target."MView" AS
+ SELECT 'tekst'::text AS text
+ WITH NO DATA;
+
+
+ALTER TABLE target."MView" OWNER TO postgres;
+
+--
+-- TOC entry 12277 (class 1259 OID 149234)
+-- Name: table_for_partition_1; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_partition_1 (
+ col1 bigint
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE target.table_for_partition_1 OWNER TO postgres;
+
+--
+-- TOC entry 12278 (class 1259 OID 149237)
+-- Name: part3; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.part3 (
+ col1 bigint
+);
+ALTER TABLE ONLY target.table_for_partition_1 ATTACH PARTITION target.part3 FOR VALUES FROM ('13') TO ('56');
+
+
+ALTER TABLE target.part3 OWNER TO postgres;
+
+--
+-- TOC entry 12259 (class 1259 OID 148971)
+-- Name: table_for_column; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_column (
+ col1 bigint,
+ col2 bigint,
+ col4 text
+);
+
+
+ALTER TABLE target.table_for_column OWNER TO postgres;
+
+--
+-- TOC entry 12268 (class 1259 OID 149089)
+-- Name: table_for_constraints; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text,
+ CONSTRAINT check_con CHECK ((col1 > 30))
+);
+
+
+ALTER TABLE target.table_for_constraints OWNER TO postgres;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON TABLE target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT check_con ON target.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 12257 (class 1259 OID 148960)
+-- Name: table_for_del; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_del (
+);
+
+
+ALTER TABLE target.table_for_del OWNER TO postgres;
+
+--
+-- TOC entry 12271 (class 1259 OID 149172)
+-- Name: table_for_foreign_key; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_foreign_key (
+ col1 integer NOT NULL,
+ col2 "char",
+ col3 bigint
+);
+
+
+ALTER TABLE target.table_for_foreign_key OWNER TO postgres;
+
+--
+-- TOC entry 12263 (class 1259 OID 149013)
+-- Name: table_for_identical; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_identical OWNER TO postgres;
+
+--
+-- TOC entry 12261 (class 1259 OID 148986)
+-- Name: table_for_index; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_index OWNER TO postgres;
+
+--
+-- TOC entry 12270 (class 1259 OID 149144)
+-- Name: table_for_primary_key; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE target.table_for_primary_key OWNER TO postgres;
+
+--
+-- TOC entry 12265 (class 1259 OID 149034)
+-- Name: table_for_rule; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_rule OWNER TO postgres;
+
+--
+-- TOC entry 12267 (class 1259 OID 149066)
+-- Name: table_for_trigger; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_trigger OWNER TO postgres;
+
+
+--
+-- TOC entry 56906 (class 2606 OID 149097)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='15') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56906
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56910 (class 2606 OID 149176)
+-- Name: table_for_foreign_key table_for_foreign_key_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_foreign_key
+ ADD CONSTRAINT table_for_foreign_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148993)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56908 (class 2606 OID 149151)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56902 (class 2606 OID 149041)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56900 (class 2606 OID 149020)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 149073)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56893 (class 1259 OID 148994)
+-- Name: index1; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index1 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56894 (class 1259 OID 148995)
+-- Name: index2; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index2 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56898 (class 1259 OID 149021)
+-- Name: index_identical; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index_identical ON target.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56895 (class 1259 OID 149212)
+-- Name: index_same; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index_same ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56892 (class 1259 OID 139945)
+-- Name: mview_index; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX mview_index ON target."MView" USING btree (text text_pattern_ops);
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149042)
+-- Name: table_for_rule rule1; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO target.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 61045
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON RULE rule1 ON target.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61046 (class 2618 OID 149043)
+-- Name: table_for_rule rule2; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule2 AS
+ ON UPDATE TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61047 (class 2618 OID 149044)
+-- Name: table_for_rule rule3; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule3 AS
+ ON INSERT TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61050 (class 0 OID 139938)
+-- Dependencies: 12250 61062
+-- Name: MView; Type: MATERIALIZED VIEW DATA; Schema: target; Owner: postgres
+--
+
+REFRESH MATERIALIZED VIEW target."MView";
+
+
+--
+-- TOC entry 12284 (class 1259 OID 347823)
+-- Name: test view; Type: VIEW; Schema: target; Owner: postgres
+--
+
+CREATE VIEW target."test view" AS
+ SELECT pg_class.relname,
+ pg_class.relnamespace,
+ pg_class.reltype,
+ pg_class.reloftype,
+ pg_class.relowner,
+ pg_class.relam,
+ pg_class.relfilenode,
+ pg_class.reltablespace,
+ pg_class.relpages,
+ pg_class.reltuples,
+ pg_class.relallvisible,
+ pg_class.reltoastrelid,
+ pg_class.relhasindex,
+ pg_class.relisshared,
+ pg_class.relpersistence,
+ pg_class.relkind,
+ pg_class.relnatts,
+ pg_class.relchecks,
+ pg_class.relhasoids,
+ pg_class.relhaspkey,
+ pg_class.relhasrules,
+ pg_class.relhastriggers,
+ pg_class.relhassubclass,
+ pg_class.relrowsecurity,
+ pg_class.relforcerowsecurity,
+ pg_class.relispopulated,
+ pg_class.relreplident,
+ pg_class.relispartition,
+ pg_class.relfrozenxid,
+ pg_class.relminmxid,
+ pg_class.relacl,
+ pg_class.reloptions,
+ pg_class.relpartbound
+ FROM pg_class
+ LIMIT 10;
+
+
+ALTER TABLE target."test view" OWNER TO postgres;
+
+--
+-- TOC entry 12285 (class 1259 OID 347828)
+-- Name: test view f; Type: VIEW; Schema: target; Owner: postgres
+--
+
+CREATE VIEW target."test view f" WITH (security_barrier='true') AS
+ SELECT 2;
+
+
+ALTER TABLE target."test view f" OWNER TO postgres;
+
+--
+-- TOC entry 61105 (class 0 OID 0)
+-- Dependencies: 12285
+-- Name: VIEW "test view f"; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON VIEW target."test view f" IS 'cmn';
diff --git a/web/pgadmin/tools/schema_diff/tests/pg/12_plus/source.sql b/web/pgadmin/tools/schema_diff/tests/pg/12_plus/source.sql
new file mode 100644
index 000000000..8ef87e3bc
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/pg/12_plus/source.sql
@@ -0,0 +1,440 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:54:15 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- TOC entry 17 (class 2615 OID 139770)
+-- Name: source; Type: SCHEMA; Schema: -; Owner: postgres
+--
+
+CREATE SCHEMA source;
+
+
+ALTER SCHEMA source OWNER TO postgres;
+
+SET default_tablespace = '';
+
+
+CREATE EXTENSION btree_gist
+ SCHEMA source;
+
+--
+-- TOC entry 12272 (class 1259 OID 149205)
+-- Name: table_for_partition; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_partition (
+ col1 bigint NOT NULL
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE source.table_for_partition OWNER TO postgres;
+
+--
+-- TOC entry 12273 (class 1259 OID 149208)
+-- Name: part1; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.part1 (
+ col1 bigint NOT NULL
+);
+ALTER TABLE ONLY source.table_for_partition ATTACH PARTITION source.part1 FOR VALUES FROM ('1') TO ('23');
+
+
+ALTER TABLE source.part1 OWNER TO postgres;
+
+--
+-- TOC entry 12274 (class 1259 OID 149213)
+-- Name: table_for_partition_1; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_partition_1 (
+ col1 bigint
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE source.table_for_partition_1 OWNER TO postgres;
+
+--
+-- TOC entry 12275 (class 1259 OID 149216)
+-- Name: part3; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.part3 (
+ col1 bigint
+);
+ALTER TABLE ONLY source.table_for_partition_1 ATTACH PARTITION source.part3 FOR VALUES FROM ('1') TO ('10');
+
+
+ALTER TABLE source.part3 OWNER TO postgres;
+
+--
+-- TOC entry 12276 (class 1259 OID 149219)
+-- Name: part4; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.part4 (
+ col1 bigint
+);
+ALTER TABLE ONLY source.table_for_partition_1 ATTACH PARTITION source.part4 FOR VALUES FROM ('11') TO ('20');
+
+
+ALTER TABLE source.part4 OWNER TO postgres;
+
+--
+-- TOC entry 12258 (class 1259 OID 148963)
+-- Name: table_for_column; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_column (
+ col1 bigint NOT NULL,
+ col2 text,
+ col3 text
+);
+
+
+ALTER TABLE source.table_for_column OWNER TO postgres;
+
+--
+-- TOC entry 12256 (class 1259 OID 148895)
+-- Name: table_for_constraints; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_constraints OWNER TO postgres;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12256
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON TABLE source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 12262 (class 1259 OID 149004)
+-- Name: table_for_identical; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_identical OWNER TO postgres;
+
+--
+-- TOC entry 12260 (class 1259 OID 148977)
+-- Name: table_for_index; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_index OWNER TO postgres;
+
+--
+-- TOC entry 12269 (class 1259 OID 149128)
+-- Name: table_for_primary_key; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE source.table_for_primary_key OWNER TO postgres;
+
+--
+-- TOC entry 12264 (class 1259 OID 149024)
+-- Name: table_for_rule; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_rule OWNER TO postgres;
+
+--
+-- TOC entry 12266 (class 1259 OID 149048)
+-- Name: table_for_trigger; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_trigger OWNER TO postgres;
+
+--
+-- TOC entry 56893 (class 2606 OID 148904)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='12') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 56893
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56891 (class 2606 OID 148911)
+-- Name: table_for_constraints check_con; Type: CHECK CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE source.table_for_constraints
+ ADD CONSTRAINT check_con CHECK ((col1 > 10)) NOT VALID;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56891
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT check_con ON source.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 56899 (class 2606 OID 148970)
+-- Name: table_for_column table_for_column_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_column
+ ADD CONSTRAINT table_for_column_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56895 (class 2606 OID 148902)
+-- Name: table_for_constraints table_for_constraints_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT table_for_constraints_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 148984)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56913 (class 2606 OID 149135)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1, col2);
+
+
+--
+-- TOC entry 56909 (class 2606 OID 149031)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56907 (class 2606 OID 149011)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56911 (class 2606 OID 149055)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148913)
+-- Name: table_for_constraints unique; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "unique" UNIQUE (col1);
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 56897
+-- Name: CONSTRAINT "unique" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "unique" ON source.table_for_constraints IS 'cmnt';
+
+
+--
+-- TOC entry 56900 (class 1259 OID 149023)
+-- Name: index1; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index1 ON source.table_for_index USING btree (col2 varchar_pattern_ops);
+
+
+--
+-- TOC entry 56905 (class 1259 OID 149012)
+-- Name: index_identical; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index_identical ON source.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56901 (class 1259 OID 149211)
+-- Name: index_same; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index_same ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56902 (class 1259 OID 149022)
+-- Name: index_source; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index_source ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 61044 (class 2618 OID 149032)
+-- Name: table_for_rule rule1; Type: RULE; Schema: source; Owner: postgres
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO source.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61070 (class 0 OID 0)
+-- Dependencies: 61044
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON RULE rule1 ON source.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149033)
+-- Name: table_for_rule rule2; Type: RULE; Schema: source; Owner: postgres
+--
+
+CREATE RULE rule2 AS
+ ON INSERT TO source.table_for_rule DO NOTHING;
+
+--
+-- TOC entry 12283 (class 1259 OID 347818)
+-- Name: test view; Type: VIEW; Schema: source; Owner: postgres
+--
+
+CREATE VIEW source."test view" AS
+ SELECT pg_class.relname,
+ pg_class.relnamespace,
+ pg_class.reltype,
+ pg_class.reloftype,
+ pg_class.relowner,
+ pg_class.relam,
+ pg_class.relfilenode,
+ pg_class.reltablespace,
+ pg_class.relpages
+ FROM pg_class
+ LIMIT 10;
+
+
+ALTER TABLE source."test view" OWNER TO postgres;
+
+--
+-- TOC entry 12286 (class 1259 OID 347832)
+-- Name: test view f; Type: VIEW; Schema: source; Owner: postgres
+--
+
+CREATE VIEW source."test view f" WITH (security_barrier='false') AS
+ SELECT 2;
+
+
+ALTER TABLE source."test view f" OWNER TO postgres;
+
+--
+-- TOC entry 61111 (class 0 OID 0)
+-- Dependencies: 12286
+-- Name: VIEW "test view f"; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON VIEW source."test view f" IS 'cmn';
+
+--
+-- TOC entry 223 (class 1255 OID 67206)
+-- Name: dodaj_klijenta(character varying, character varying, character varying, character varying, integer, character varying, character varying, character varying, boolean, boolean, character varying, character varying, character varying, character varying, numeric, character varying); Type: PROCEDURE; Schema: public; Owner: postgres
+--
+
+CREATE PROCEDURE source.dodaj_klijenta(v_naziv character varying, v_oib character varying, v_pdv_id character varying, v_adresa character varying, v_mjesto integer, v_drzava character varying, v_tip_p_sub character varying, v_vlasnik character varying, v_pdv boolean, v_fisk boolean, v_iban character varying, v_k_osoba character varying, v_email character varying, v_br_tel character varying, v_radna_god numeric, v_schema character varying)
+ LANGUAGE sql
+ AS $$select 1;$$;
+
+
+ALTER PROCEDURE source.dodaj_klijenta(v_naziv character varying, v_oib character varying, v_pdv_id character varying, v_adresa character varying, v_mjesto integer, v_drzava character varying, v_tip_p_sub character varying, v_vlasnik character varying, v_pdv boolean, v_fisk boolean, v_iban character varying, v_k_osoba character varying, v_email character varying, v_br_tel character varying, v_radna_god numeric, v_schema character varying) OWNER TO postgres;
+
+--
+-- TOC entry 220 (class 1255 OID 67205)
+-- Name: proc1(bigint); Type: PROCEDURE; Schema: source; Owner: postgres
+--
+
+CREATE PROCEDURE source.proc1(arg1 bigint)
+ LANGUAGE sql
+ AS $$select 1;$$;
+
+
+ALTER PROCEDURE source.proc1(arg1 bigint) OWNER TO postgres;
diff --git a/web/pgadmin/tools/schema_diff/tests/pg/12_plus/target.sql b/web/pgadmin/tools/schema_diff/tests/pg/12_plus/target.sql
new file mode 100644
index 000000000..d57841744
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/pg/12_plus/target.sql
@@ -0,0 +1,417 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:55:22 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- TOC entry 18 (class 2615 OID 139771)
+-- Name: target; Type: SCHEMA; Schema: -; Owner: postgres
+--
+
+CREATE SCHEMA target;
+
+ALTER SCHEMA target OWNER TO postgres;
+
+SET default_tablespace = '';
+
+CREATE EXTENSION btree_gist
+ SCHEMA target;
+
+--
+-- TOC entry 12250 (class 1259 OID 139938)
+-- Name: MView; Type: MATERIALIZED VIEW; Schema: target; Owner: postgres
+--
+
+CREATE MATERIALIZED VIEW target."MView" AS
+ SELECT 'tekst'::text AS text
+ WITH NO DATA;
+
+
+ALTER TABLE target."MView" OWNER TO postgres;
+
+--
+-- TOC entry 12277 (class 1259 OID 149234)
+-- Name: table_for_partition_1; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_partition_1 (
+ col1 bigint
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE target.table_for_partition_1 OWNER TO postgres;
+
+--
+-- TOC entry 12278 (class 1259 OID 149237)
+-- Name: part3; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.part3 (
+ col1 bigint
+);
+ALTER TABLE ONLY target.table_for_partition_1 ATTACH PARTITION target.part3 FOR VALUES FROM ('13') TO ('56');
+
+
+ALTER TABLE target.part3 OWNER TO postgres;
+
+--
+-- TOC entry 12259 (class 1259 OID 148971)
+-- Name: table_for_column; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_column (
+ col1 bigint,
+ col2 bigint,
+ col4 text
+);
+
+
+ALTER TABLE target.table_for_column OWNER TO postgres;
+
+--
+-- TOC entry 12268 (class 1259 OID 149089)
+-- Name: table_for_constraints; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text,
+ CONSTRAINT check_con CHECK ((col1 > 30))
+);
+
+
+ALTER TABLE target.table_for_constraints OWNER TO postgres;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON TABLE target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT check_con ON target.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 12257 (class 1259 OID 148960)
+-- Name: table_for_del; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_del (
+);
+
+
+ALTER TABLE target.table_for_del OWNER TO postgres;
+
+--
+-- TOC entry 12271 (class 1259 OID 149172)
+-- Name: table_for_foreign_key; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_foreign_key (
+ col1 integer NOT NULL,
+ col2 "char",
+ col3 bigint
+);
+
+
+ALTER TABLE target.table_for_foreign_key OWNER TO postgres;
+
+--
+-- TOC entry 12263 (class 1259 OID 149013)
+-- Name: table_for_identical; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_identical OWNER TO postgres;
+
+--
+-- TOC entry 12261 (class 1259 OID 148986)
+-- Name: table_for_index; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_index OWNER TO postgres;
+
+--
+-- TOC entry 12270 (class 1259 OID 149144)
+-- Name: table_for_primary_key; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE target.table_for_primary_key OWNER TO postgres;
+
+--
+-- TOC entry 12265 (class 1259 OID 149034)
+-- Name: table_for_rule; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_rule OWNER TO postgres;
+
+--
+-- TOC entry 12267 (class 1259 OID 149066)
+-- Name: table_for_trigger; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_trigger OWNER TO postgres;
+
+
+--
+-- TOC entry 56906 (class 2606 OID 149097)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='15') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56906
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56910 (class 2606 OID 149176)
+-- Name: table_for_foreign_key table_for_foreign_key_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_foreign_key
+ ADD CONSTRAINT table_for_foreign_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148993)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56908 (class 2606 OID 149151)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56902 (class 2606 OID 149041)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56900 (class 2606 OID 149020)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 149073)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56893 (class 1259 OID 148994)
+-- Name: index1; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index1 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56894 (class 1259 OID 148995)
+-- Name: index2; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index2 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56898 (class 1259 OID 149021)
+-- Name: index_identical; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index_identical ON target.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56895 (class 1259 OID 149212)
+-- Name: index_same; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index_same ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56892 (class 1259 OID 139945)
+-- Name: mview_index; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX mview_index ON target."MView" USING btree (text text_pattern_ops);
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149042)
+-- Name: table_for_rule rule1; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO target.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 61045
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON RULE rule1 ON target.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61046 (class 2618 OID 149043)
+-- Name: table_for_rule rule2; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule2 AS
+ ON UPDATE TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61047 (class 2618 OID 149044)
+-- Name: table_for_rule rule3; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule3 AS
+ ON INSERT TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61050 (class 0 OID 139938)
+-- Dependencies: 12250 61062
+-- Name: MView; Type: MATERIALIZED VIEW DATA; Schema: target; Owner: postgres
+--
+
+REFRESH MATERIALIZED VIEW target."MView";
+
+--
+-- TOC entry 12284 (class 1259 OID 347823)
+-- Name: test view; Type: VIEW; Schema: target; Owner: postgres
+--
+
+CREATE VIEW target."test view" AS
+ SELECT pg_class.relname,
+ pg_class.relnamespace,
+ pg_class.reltype,
+ pg_class.reloftype,
+ pg_class.relowner,
+ pg_class.relam,
+ pg_class.relfilenode,
+ pg_class.reltablespace,
+ pg_class.relpages
+ FROM pg_class
+ LIMIT 10;
+
+
+ALTER TABLE target."test view" OWNER TO postgres;
+
+--
+-- TOC entry 12285 (class 1259 OID 347828)
+-- Name: test view f; Type: VIEW; Schema: target; Owner: postgres
+--
+
+CREATE VIEW target."test view f" WITH (security_barrier='true') AS
+ SELECT 2;
+
+
+ALTER TABLE target."test view f" OWNER TO postgres;
+
+--
+-- TOC entry 61105 (class 0 OID 0)
+-- Dependencies: 12285
+-- Name: VIEW "test view f"; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON VIEW target."test view f" IS 'cmn';
+
+
+--
+-- TOC entry 437 (class 1255 OID 112907)
+-- Name: dodaj_klijenta(character varying, character varying, character varying, character varying, integer, character varying, character varying, character varying, boolean, boolean, character varying, character varying, character varying, character varying, numeric, character varying); Type: PROCEDURE; Schema: target schema; Owner: postgres
+--
+
+CREATE PROCEDURE target.dodaj_klijenta(v_naziv character varying, v_oib character varying, v_pdv_id character varying, v_adresa character varying, v_mjesto integer, v_drzava character varying, v_tip_p_sub character varying, v_vlasnik character varying, v_pdv boolean, v_fisk boolean, v_iban character varying, v_k_osoba character varying, v_email character varying, v_br_tel character varying, v_radna_god numeric, v_schema character varying)
+ LANGUAGE sql
+ AS $$select 4;$$;
+
+
+ALTER PROCEDURE target.dodaj_klijenta(v_naziv character varying, v_oib character varying, v_pdv_id character varying, v_adresa character varying, v_mjesto integer, v_drzava character varying, v_tip_p_sub character varying, v_vlasnik character varying, v_pdv boolean, v_fisk boolean, v_iban character varying, v_k_osoba character varying, v_email character varying, v_br_tel character varying, v_radna_god numeric, v_schema character varying) OWNER TO postgres;
diff --git a/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/source.sql b/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/source.sql
new file mode 100644
index 000000000..af9054eeb
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/source.sql
@@ -0,0 +1,311 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:54:15 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+
+--
+-- TOC entry 17 (class 2615 OID 139770)
+-- Name: source; Type: SCHEMA; Schema: -; Owner: postgres
+--
+
+CREATE SCHEMA source;
+
+
+ALTER SCHEMA source OWNER TO postgres;
+
+SET default_tablespace = '';
+
+
+CREATE EXTENSION btree_gist
+ SCHEMA source;
+
+
+--
+-- TOC entry 12258 (class 1259 OID 148963)
+-- Name: table_for_column; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_column (
+ col1 bigint NOT NULL,
+ col2 text,
+ col3 text
+);
+
+
+ALTER TABLE source.table_for_column OWNER TO postgres;
+
+--
+-- TOC entry 12256 (class 1259 OID 148895)
+-- Name: table_for_constraints; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_constraints OWNER TO postgres;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12256
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON TABLE source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 12262 (class 1259 OID 149004)
+-- Name: table_for_identical; Type: TABLE; Schema: source; Owner: postgres;
+--
+
+CREATE TABLE source.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_identical OWNER TO postgres;;
+
+--
+-- TOC entry 12260 (class 1259 OID 148977)
+-- Name: table_for_index; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_index OWNER TO postgres;
+
+--
+-- TOC entry 12269 (class 1259 OID 149128)
+-- Name: table_for_primary_key; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE source.table_for_primary_key OWNER TO postgres;
+
+--
+-- TOC entry 12264 (class 1259 OID 149024)
+-- Name: table_for_rule; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_rule OWNER TO postgres;
+
+--
+-- TOC entry 12266 (class 1259 OID 149048)
+-- Name: table_for_trigger; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_trigger OWNER TO postgres;
+
+--
+-- TOC entry 56893 (class 2606 OID 148904)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='12') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 56893
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56891 (class 2606 OID 148911)
+-- Name: table_for_constraints check_con; Type: CHECK CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE source.table_for_constraints
+ ADD CONSTRAINT check_con CHECK ((col1 > 10)) NOT VALID;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56891
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT check_con ON source.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 56899 (class 2606 OID 148970)
+-- Name: table_for_column table_for_column_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_column
+ ADD CONSTRAINT table_for_column_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56895 (class 2606 OID 148902)
+-- Name: table_for_constraints table_for_constraints_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT table_for_constraints_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 148984)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56913 (class 2606 OID 149135)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1, col2);
+
+
+--
+-- TOC entry 56909 (class 2606 OID 149031)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56907 (class 2606 OID 149011)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres;
+--
+
+ALTER TABLE ONLY source.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56911 (class 2606 OID 149055)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148913)
+-- Name: table_for_constraints unique; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "unique" UNIQUE (col1);
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 56897
+-- Name: CONSTRAINT "unique" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "unique" ON source.table_for_constraints IS 'cmnt';
+
+
+--
+-- TOC entry 56900 (class 1259 OID 149023)
+-- Name: index1; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index1 ON source.table_for_index USING btree (col2 varchar_pattern_ops);
+
+
+--
+-- TOC entry 56905 (class 1259 OID 149012)
+-- Name: index_identical; Type: INDEX; Schema: source; Owner: postgres;
+--
+
+CREATE INDEX index_identical ON source.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56901 (class 1259 OID 149211)
+-- Name: index_same; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index_same ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56902 (class 1259 OID 149022)
+-- Name: index_source; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index_source ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 61044 (class 2618 OID 149032)
+-- Name: table_for_rule rule1; Type: RULE; Schema: source; Owner: postgres
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO source.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61070 (class 0 OID 0)
+-- Dependencies: 61044
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON RULE rule1 ON source.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149033)
+-- Name: table_for_rule rule2; Type: RULE; Schema: source; Owner: postgres
+--
+
+CREATE RULE rule2 AS
+ ON INSERT TO source.table_for_rule DO NOTHING;
+
diff --git a/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/target.sql b/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/target.sql
new file mode 100644
index 000000000..ddc4fda28
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/target.sql
@@ -0,0 +1,337 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:55:22 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+
+--
+-- TOC entry 18 (class 2615 OID 139771)
+-- Name: target; Type: SCHEMA; Schema: -; Owner: postgres
+--
+
+CREATE SCHEMA target;
+
+
+ALTER SCHEMA target OWNER TO postgres;
+
+SET default_tablespace = '';
+
+CREATE EXTENSION btree_gist
+ SCHEMA target;
+
+--
+-- TOC entry 12250 (class 1259 OID 139938)
+-- Name: MView; Type: MATERIALIZED VIEW; Schema: target; Owner: postgres
+--
+
+CREATE MATERIALIZED VIEW target."MView" AS
+ SELECT 'tekst'::text AS text
+ WITH NO DATA;
+
+
+ALTER TABLE target."MView" OWNER TO postgres;
+
+--
+-- TOC entry 12259 (class 1259 OID 148971)
+-- Name: table_for_column; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_column (
+ col1 bigint,
+ col2 bigint,
+ col4 text
+);
+
+
+ALTER TABLE target.table_for_column OWNER TO postgres;
+
+--
+-- TOC entry 12268 (class 1259 OID 149089)
+-- Name: table_for_constraints; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text,
+ CONSTRAINT check_con CHECK ((col1 > 30))
+);
+
+
+ALTER TABLE target.table_for_constraints OWNER TO postgres;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON TABLE target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT check_con ON target.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 12257 (class 1259 OID 148960)
+-- Name: table_for_del; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_del (
+);
+
+
+ALTER TABLE target.table_for_del OWNER TO postgres;
+
+--
+-- TOC entry 12271 (class 1259 OID 149172)
+-- Name: table_for_foreign_key; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_foreign_key (
+ col1 integer NOT NULL,
+ col2 "char",
+ col3 bigint
+);
+
+
+ALTER TABLE target.table_for_foreign_key OWNER TO postgres;
+
+--
+-- TOC entry 12263 (class 1259 OID 149013)
+-- Name: table_for_identical; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_identical OWNER TO postgres;
+
+--
+-- TOC entry 12261 (class 1259 OID 148986)
+-- Name: table_for_index; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_index OWNER TO postgres;
+
+--
+-- TOC entry 12270 (class 1259 OID 149144)
+-- Name: table_for_primary_key; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE target.table_for_primary_key OWNER TO postgres;
+
+--
+-- TOC entry 12265 (class 1259 OID 149034)
+-- Name: table_for_rule; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_rule OWNER TO postgres;
+
+--
+-- TOC entry 12267 (class 1259 OID 149066)
+-- Name: table_for_trigger; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_trigger OWNER TO postgres;
+
+
+--
+-- TOC entry 56906 (class 2606 OID 149097)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='15') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56906
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56910 (class 2606 OID 149176)
+-- Name: table_for_foreign_key table_for_foreign_key_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_foreign_key
+ ADD CONSTRAINT table_for_foreign_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148993)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56908 (class 2606 OID 149151)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56902 (class 2606 OID 149041)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56900 (class 2606 OID 149020)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 149073)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56893 (class 1259 OID 148994)
+-- Name: index1; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index1 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56894 (class 1259 OID 148995)
+-- Name: index2; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index2 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56898 (class 1259 OID 149021)
+-- Name: index_identical; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index_identical ON target.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56895 (class 1259 OID 149212)
+-- Name: index_same; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index_same ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56892 (class 1259 OID 139945)
+-- Name: mview_index; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX mview_index ON target."MView" USING btree (text text_pattern_ops);
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149042)
+-- Name: table_for_rule rule1; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO target.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 61045
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON RULE rule1 ON target.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61046 (class 2618 OID 149043)
+-- Name: table_for_rule rule2; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule2 AS
+ ON UPDATE TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61047 (class 2618 OID 149044)
+-- Name: table_for_rule rule3; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule3 AS
+ ON INSERT TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61050 (class 0 OID 139938)
+-- Dependencies: 12250 61062
+-- Name: MView; Type: MATERIALIZED VIEW DATA; Schema: target; Owner: postgres
+--
+
+REFRESH MATERIALIZED VIEW target."MView";
diff --git a/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/source.sql b/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/source.sql
new file mode 100644
index 000000000..b60dbcd55
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/source.sql
@@ -0,0 +1,376 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:54:15 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- TOC entry 17 (class 2615 OID 139770)
+-- Name: source; Type: SCHEMA; Schema: -; Owner: enterprisedb
+--
+
+CREATE SCHEMA source;
+
+
+ALTER SCHEMA source OWNER TO enterprisedb;
+
+SET default_tablespace = '';
+
+
+CREATE EXTENSION btree_gist
+ SCHEMA source;
+
+--
+-- TOC entry 12272 (class 1259 OID 149205)
+-- Name: table_for_partition; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_partition (
+ col1 bigint NOT NULL
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE source.table_for_partition OWNER TO enterprisedb;
+
+--
+-- TOC entry 12273 (class 1259 OID 149208)
+-- Name: part1; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.part1 (
+ col1 bigint NOT NULL
+);
+ALTER TABLE ONLY source.table_for_partition ATTACH PARTITION source.part1 FOR VALUES FROM ('1') TO ('23');
+
+
+ALTER TABLE source.part1 OWNER TO enterprisedb;
+
+--
+-- TOC entry 12274 (class 1259 OID 149213)
+-- Name: table_for_partition_1; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_partition_1 (
+ col1 bigint
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE source.table_for_partition_1 OWNER TO enterprisedb;
+
+--
+-- TOC entry 12275 (class 1259 OID 149216)
+-- Name: part3; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.part3 (
+ col1 bigint
+);
+ALTER TABLE ONLY source.table_for_partition_1 ATTACH PARTITION source.part3 FOR VALUES FROM ('1') TO ('10');
+
+
+ALTER TABLE source.part3 OWNER TO enterprisedb;
+
+--
+-- TOC entry 12276 (class 1259 OID 149219)
+-- Name: part4; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.part4 (
+ col1 bigint
+);
+ALTER TABLE ONLY source.table_for_partition_1 ATTACH PARTITION source.part4 FOR VALUES FROM ('11') TO ('20');
+
+
+ALTER TABLE source.part4 OWNER TO enterprisedb;
+
+--
+-- TOC entry 12258 (class 1259 OID 148963)
+-- Name: table_for_column; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_column (
+ col1 bigint NOT NULL,
+ col2 text,
+ col3 text
+);
+
+
+ALTER TABLE source.table_for_column OWNER TO enterprisedb;
+
+--
+-- TOC entry 12256 (class 1259 OID 148895)
+-- Name: table_for_constraints; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_constraints OWNER TO enterprisedb;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12256
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON TABLE source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 12262 (class 1259 OID 149004)
+-- Name: table_for_identical; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_identical OWNER TO enterprisedb;
+
+--
+-- TOC entry 12260 (class 1259 OID 148977)
+-- Name: table_for_index; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_index OWNER TO enterprisedb;
+
+--
+-- TOC entry 12269 (class 1259 OID 149128)
+-- Name: table_for_primary_key; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE source.table_for_primary_key OWNER TO enterprisedb;
+
+--
+-- TOC entry 12264 (class 1259 OID 149024)
+-- Name: table_for_rule; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_rule OWNER TO enterprisedb;
+
+--
+-- TOC entry 12266 (class 1259 OID 149048)
+-- Name: table_for_trigger; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_trigger OWNER TO enterprisedb;
+
+--
+-- TOC entry 56893 (class 2606 OID 148904)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='12') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 56893
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56891 (class 2606 OID 148911)
+-- Name: table_for_constraints check_con; Type: CHECK CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE source.table_for_constraints
+ ADD CONSTRAINT check_con CHECK ((col1 > 10)) NOT VALID;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56891
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT check_con ON source.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 56899 (class 2606 OID 148970)
+-- Name: table_for_column table_for_column_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_column
+ ADD CONSTRAINT table_for_column_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56895 (class 2606 OID 148902)
+-- Name: table_for_constraints table_for_constraints_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT table_for_constraints_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 148984)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56913 (class 2606 OID 149135)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1, col2);
+
+
+--
+-- TOC entry 56909 (class 2606 OID 149031)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56907 (class 2606 OID 149011)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56911 (class 2606 OID 149055)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148913)
+-- Name: table_for_constraints unique; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "unique" UNIQUE (col1);
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 56897
+-- Name: CONSTRAINT "unique" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT "unique" ON source.table_for_constraints IS 'cmnt';
+
+
+--
+-- TOC entry 56900 (class 1259 OID 149023)
+-- Name: index1; Type: INDEX; Schema: source; Owner: enterprisedb
+--
+
+CREATE INDEX index1 ON source.table_for_index USING btree (col2 varchar_pattern_ops);
+
+
+--
+-- TOC entry 56905 (class 1259 OID 149012)
+-- Name: index_identical; Type: INDEX; Schema: source; Owner: enterprisedb
+--
+
+CREATE INDEX index_identical ON source.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56901 (class 1259 OID 149211)
+-- Name: index_same; Type: INDEX; Schema: source; Owner: enterprisedb
+--
+
+CREATE INDEX index_same ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56902 (class 1259 OID 149022)
+-- Name: index_source; Type: INDEX; Schema: source; Owner: enterprisedb
+--
+
+CREATE INDEX index_source ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 61044 (class 2618 OID 149032)
+-- Name: table_for_rule rule1; Type: RULE; Schema: source; Owner: enterprisedb
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO source.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61070 (class 0 OID 0)
+-- Dependencies: 61044
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON RULE rule1 ON source.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149033)
+-- Name: table_for_rule rule2; Type: RULE; Schema: source; Owner: enterprisedb
+--
+
+CREATE RULE rule2 AS
+ ON INSERT TO source.table_for_rule DO NOTHING;
diff --git a/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/target.sql b/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/target.sql
new file mode 100644
index 000000000..57ef05d6a
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/target.sql
@@ -0,0 +1,364 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:55:22 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- TOC entry 18 (class 2615 OID 139771)
+-- Name: target; Type: SCHEMA; Schema: -; Owner: enterprisedb
+--
+
+CREATE SCHEMA target;
+
+ALTER SCHEMA target OWNER TO enterprisedb;
+
+SET default_tablespace = '';
+
+CREATE EXTENSION btree_gist
+ SCHEMA target;
+
+--
+-- TOC entry 12250 (class 1259 OID 139938)
+-- Name: MView; Type: MATERIALIZED VIEW; Schema: target; Owner: enterprisedb
+--
+
+CREATE MATERIALIZED VIEW target."MView" AS
+ SELECT 'tekst'::text AS text
+ WITH NO DATA;
+
+
+ALTER TABLE target."MView" OWNER TO enterprisedb;
+
+--
+-- TOC entry 12277 (class 1259 OID 149234)
+-- Name: table_for_partition_1; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_partition_1 (
+ col1 bigint
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE target.table_for_partition_1 OWNER TO enterprisedb;
+
+--
+-- TOC entry 12278 (class 1259 OID 149237)
+-- Name: part3; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.part3 (
+ col1 bigint
+);
+ALTER TABLE ONLY target.table_for_partition_1 ATTACH PARTITION target.part3 FOR VALUES FROM ('13') TO ('56');
+
+
+ALTER TABLE target.part3 OWNER TO enterprisedb;
+
+--
+-- TOC entry 12259 (class 1259 OID 148971)
+-- Name: table_for_column; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_column (
+ col1 bigint,
+ col2 bigint,
+ col4 text
+);
+
+
+ALTER TABLE target.table_for_column OWNER TO enterprisedb;
+
+--
+-- TOC entry 12268 (class 1259 OID 149089)
+-- Name: table_for_constraints; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text,
+ CONSTRAINT check_con CHECK ((col1 > 30))
+);
+
+
+ALTER TABLE target.table_for_constraints OWNER TO enterprisedb;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: target; Owner: enterprisedb
+--
+
+COMMENT ON TABLE target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: target; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT check_con ON target.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 12257 (class 1259 OID 148960)
+-- Name: table_for_del; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_del (
+);
+
+
+ALTER TABLE target.table_for_del OWNER TO enterprisedb;
+
+--
+-- TOC entry 12271 (class 1259 OID 149172)
+-- Name: table_for_foreign_key; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_foreign_key (
+ col1 integer NOT NULL,
+ col2 "char",
+ col3 bigint
+);
+
+
+ALTER TABLE target.table_for_foreign_key OWNER TO enterprisedb;
+
+--
+-- TOC entry 12263 (class 1259 OID 149013)
+-- Name: table_for_identical; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_identical OWNER TO enterprisedb;
+
+--
+-- TOC entry 12261 (class 1259 OID 148986)
+-- Name: table_for_index; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_index OWNER TO enterprisedb;
+
+--
+-- TOC entry 12270 (class 1259 OID 149144)
+-- Name: table_for_primary_key; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE target.table_for_primary_key OWNER TO enterprisedb;
+
+--
+-- TOC entry 12265 (class 1259 OID 149034)
+-- Name: table_for_rule; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_rule OWNER TO enterprisedb;
+
+--
+-- TOC entry 12267 (class 1259 OID 149066)
+-- Name: table_for_trigger; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_trigger OWNER TO enterprisedb;
+
+
+--
+-- TOC entry 56906 (class 2606 OID 149097)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='15') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56906
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: target; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56910 (class 2606 OID 149176)
+-- Name: table_for_foreign_key table_for_foreign_key_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_foreign_key
+ ADD CONSTRAINT table_for_foreign_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148993)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56908 (class 2606 OID 149151)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56902 (class 2606 OID 149041)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56900 (class 2606 OID 149020)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 149073)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56893 (class 1259 OID 148994)
+-- Name: index1; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX index1 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56894 (class 1259 OID 148995)
+-- Name: index2; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX index2 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56898 (class 1259 OID 149021)
+-- Name: index_identical; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX index_identical ON target.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56895 (class 1259 OID 149212)
+-- Name: index_same; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX index_same ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56892 (class 1259 OID 139945)
+-- Name: mview_index; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX mview_index ON target."MView" USING btree (text text_pattern_ops);
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149042)
+-- Name: table_for_rule rule1; Type: RULE; Schema: target; Owner: enterprisedb
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO target.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 61045
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: target; Owner: enterprisedb
+--
+
+COMMENT ON RULE rule1 ON target.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61046 (class 2618 OID 149043)
+-- Name: table_for_rule rule2; Type: RULE; Schema: target; Owner: enterprisedb
+--
+
+CREATE RULE rule2 AS
+ ON UPDATE TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61047 (class 2618 OID 149044)
+-- Name: table_for_rule rule3; Type: RULE; Schema: target; Owner: enterprisedb
+--
+
+CREATE RULE rule3 AS
+ ON INSERT TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61050 (class 0 OID 139938)
+-- Dependencies: 12250 61062
+-- Name: MView; Type: MATERIALIZED VIEW DATA; Schema: target; Owner: enterprisedb
+--
+
+REFRESH MATERIALIZED VIEW target."MView";
diff --git a/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/source.sql b/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/source.sql
new file mode 100644
index 000000000..67ec216d6
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/source.sql
@@ -0,0 +1,311 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:54:15 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+
+--
+-- TOC entry 17 (class 2615 OID 139770)
+-- Name: source; Type: SCHEMA; Schema: -; Owner: enterprisedb
+--
+
+CREATE SCHEMA source;
+
+
+ALTER SCHEMA source OWNER TO enterprisedb;
+
+SET default_tablespace = '';
+
+
+CREATE EXTENSION btree_gist
+ SCHEMA source;
+
+
+--
+-- TOC entry 12258 (class 1259 OID 148963)
+-- Name: table_for_column; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_column (
+ col1 bigint NOT NULL,
+ col2 text,
+ col3 text
+);
+
+
+ALTER TABLE source.table_for_column OWNER TO enterprisedb;
+
+--
+-- TOC entry 12256 (class 1259 OID 148895)
+-- Name: table_for_constraints; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_constraints OWNER TO enterprisedb;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12256
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON TABLE source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 12262 (class 1259 OID 149004)
+-- Name: table_for_identical; Type: TABLE; Schema: source; Owner: enterprisedb;
+--
+
+CREATE TABLE source.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_identical OWNER TO enterprisedb;;
+
+--
+-- TOC entry 12260 (class 1259 OID 148977)
+-- Name: table_for_index; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_index OWNER TO enterprisedb;
+
+--
+-- TOC entry 12269 (class 1259 OID 149128)
+-- Name: table_for_primary_key; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE source.table_for_primary_key OWNER TO enterprisedb;
+
+--
+-- TOC entry 12264 (class 1259 OID 149024)
+-- Name: table_for_rule; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_rule OWNER TO enterprisedb;
+
+--
+-- TOC entry 12266 (class 1259 OID 149048)
+-- Name: table_for_trigger; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_trigger OWNER TO enterprisedb;
+
+--
+-- TOC entry 56893 (class 2606 OID 148904)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='12') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 56893
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56891 (class 2606 OID 148911)
+-- Name: table_for_constraints check_con; Type: CHECK CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE source.table_for_constraints
+ ADD CONSTRAINT check_con CHECK ((col1 > 10)) NOT VALID;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56891
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT check_con ON source.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 56899 (class 2606 OID 148970)
+-- Name: table_for_column table_for_column_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_column
+ ADD CONSTRAINT table_for_column_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56895 (class 2606 OID 148902)
+-- Name: table_for_constraints table_for_constraints_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT table_for_constraints_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 148984)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56913 (class 2606 OID 149135)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1, col2);
+
+
+--
+-- TOC entry 56909 (class 2606 OID 149031)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56907 (class 2606 OID 149011)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb;
+--
+
+ALTER TABLE ONLY source.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56911 (class 2606 OID 149055)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148913)
+-- Name: table_for_constraints unique; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "unique" UNIQUE (col1);
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 56897
+-- Name: CONSTRAINT "unique" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT "unique" ON source.table_for_constraints IS 'cmnt';
+
+
+--
+-- TOC entry 56900 (class 1259 OID 149023)
+-- Name: index1; Type: INDEX; Schema: source; Owner: enterprisedb
+--
+
+CREATE INDEX index1 ON source.table_for_index USING btree (col2 varchar_pattern_ops);
+
+
+--
+-- TOC entry 56905 (class 1259 OID 149012)
+-- Name: index_identical; Type: INDEX; Schema: source; Owner: enterprisedb;
+--
+
+CREATE INDEX index_identical ON source.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56901 (class 1259 OID 149211)
+-- Name: index_same; Type: INDEX; Schema: source; Owner: enterprisedb
+--
+
+CREATE INDEX index_same ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56902 (class 1259 OID 149022)
+-- Name: index_source; Type: INDEX; Schema: source; Owner: enterprisedb
+--
+
+CREATE INDEX index_source ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 61044 (class 2618 OID 149032)
+-- Name: table_for_rule rule1; Type: RULE; Schema: source; Owner: enterprisedb
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO source.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61070 (class 0 OID 0)
+-- Dependencies: 61044
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON RULE rule1 ON source.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149033)
+-- Name: table_for_rule rule2; Type: RULE; Schema: source; Owner: enterprisedb
+--
+
+CREATE RULE rule2 AS
+ ON INSERT TO source.table_for_rule DO NOTHING;
+
diff --git a/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/target.sql b/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/target.sql
new file mode 100644
index 000000000..f64765224
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/target.sql
@@ -0,0 +1,337 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:55:22 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+
+--
+-- TOC entry 18 (class 2615 OID 139771)
+-- Name: target; Type: SCHEMA; Schema: -; Owner: enterprisedb
+--
+
+CREATE SCHEMA target;
+
+
+ALTER SCHEMA target OWNER TO enterprisedb;
+
+SET default_tablespace = '';
+
+CREATE EXTENSION btree_gist
+ SCHEMA target;
+
+--
+-- TOC entry 12250 (class 1259 OID 139938)
+-- Name: MView; Type: MATERIALIZED VIEW; Schema: target; Owner: enterprisedb
+--
+
+CREATE MATERIALIZED VIEW target."MView" AS
+ SELECT 'tekst'::text AS text
+ WITH NO DATA;
+
+
+ALTER TABLE target."MView" OWNER TO enterprisedb;
+
+--
+-- TOC entry 12259 (class 1259 OID 148971)
+-- Name: table_for_column; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_column (
+ col1 bigint,
+ col2 bigint,
+ col4 text
+);
+
+
+ALTER TABLE target.table_for_column OWNER TO enterprisedb;
+
+--
+-- TOC entry 12268 (class 1259 OID 149089)
+-- Name: table_for_constraints; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text,
+ CONSTRAINT check_con CHECK ((col1 > 30))
+);
+
+
+ALTER TABLE target.table_for_constraints OWNER TO enterprisedb;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: target; Owner: enterprisedb
+--
+
+COMMENT ON TABLE target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: target; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT check_con ON target.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 12257 (class 1259 OID 148960)
+-- Name: table_for_del; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_del (
+);
+
+
+ALTER TABLE target.table_for_del OWNER TO enterprisedb;
+
+--
+-- TOC entry 12271 (class 1259 OID 149172)
+-- Name: table_for_foreign_key; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_foreign_key (
+ col1 integer NOT NULL,
+ col2 "char",
+ col3 bigint
+);
+
+
+ALTER TABLE target.table_for_foreign_key OWNER TO enterprisedb;
+
+--
+-- TOC entry 12263 (class 1259 OID 149013)
+-- Name: table_for_identical; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_identical OWNER TO enterprisedb;
+
+--
+-- TOC entry 12261 (class 1259 OID 148986)
+-- Name: table_for_index; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_index OWNER TO enterprisedb;
+
+--
+-- TOC entry 12270 (class 1259 OID 149144)
+-- Name: table_for_primary_key; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE target.table_for_primary_key OWNER TO enterprisedb;
+
+--
+-- TOC entry 12265 (class 1259 OID 149034)
+-- Name: table_for_rule; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_rule OWNER TO enterprisedb;
+
+--
+-- TOC entry 12267 (class 1259 OID 149066)
+-- Name: table_for_trigger; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_trigger OWNER TO enterprisedb;
+
+
+--
+-- TOC entry 56906 (class 2606 OID 149097)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='15') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56906
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: target; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56910 (class 2606 OID 149176)
+-- Name: table_for_foreign_key table_for_foreign_key_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_foreign_key
+ ADD CONSTRAINT table_for_foreign_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148993)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56908 (class 2606 OID 149151)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56902 (class 2606 OID 149041)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56900 (class 2606 OID 149020)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 149073)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56893 (class 1259 OID 148994)
+-- Name: index1; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX index1 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56894 (class 1259 OID 148995)
+-- Name: index2; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX index2 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56898 (class 1259 OID 149021)
+-- Name: index_identical; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX index_identical ON target.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56895 (class 1259 OID 149212)
+-- Name: index_same; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX index_same ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56892 (class 1259 OID 139945)
+-- Name: mview_index; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX mview_index ON target."MView" USING btree (text text_pattern_ops);
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149042)
+-- Name: table_for_rule rule1; Type: RULE; Schema: target; Owner: enterprisedb
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO target.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 61045
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: target; Owner: enterprisedb
+--
+
+COMMENT ON RULE rule1 ON target.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61046 (class 2618 OID 149043)
+-- Name: table_for_rule rule2; Type: RULE; Schema: target; Owner: enterprisedb
+--
+
+CREATE RULE rule2 AS
+ ON UPDATE TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61047 (class 2618 OID 149044)
+-- Name: table_for_rule rule3; Type: RULE; Schema: target; Owner: enterprisedb
+--
+
+CREATE RULE rule3 AS
+ ON INSERT TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61050 (class 0 OID 139938)
+-- Dependencies: 12250 61062
+-- Name: MView; Type: MATERIALIZED VIEW DATA; Schema: target; Owner: enterprisedb
+--
+
+REFRESH MATERIALIZED VIEW target."MView";
diff --git a/web/pgadmin/tools/schema_diff/tests/test_schema_diff_comp.py b/web/pgadmin/tools/schema_diff/tests/test_schema_diff_comp.py
new file mode 100644
index 000000000..3e790bc06
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/test_schema_diff_comp.py
@@ -0,0 +1,204 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import uuid
+import json
+import os
+import random
+
+from pgadmin.utils import server_utils as server_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression import parent_node_dict
+from regression.python_test_utils import test_utils as utils
+from .utils import create_table, create_schema, restore_schema
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.versioned_template_loader import \
+ get_version_mapping_directories
+
+
+class SchemaDiffTestCase(BaseTestGenerator):
+ """ This class will test the schema diff. """
+ scenarios = [
+ # Fetching default URL for database node.
+ ('Schema diff comparison', dict(
+ url='schema_diff/compare/{0}/{1}/{2}/{3}/{4}/{5}/{6}'))
+ ]
+
+ def setUp(self):
+ self.src_database = "db_schema_diff_src_%s" % str(uuid.uuid4())[1:8]
+ self.tar_database = "db_schema_diff_tar_%s" % str(uuid.uuid4())[1:8]
+
+ self.src_db_id = utils.create_database(self.server, self.src_database)
+ self.tar_db_id = utils.create_database(self.server, self.tar_database)
+
+ self.server = parent_node_dict["server"][-1]["server"]
+ self.server_id = parent_node_dict["server"][-1]["server_id"]
+ self.nodes = ['table', 'function', 'procedure', 'view', 'mview']
+ self.restore_backup()
+
+ def restore_backup(self):
+ self.sql_folder = self.get_sql_folder()
+
+ if self.sql_folder is None:
+ raise FileNotFoundError('Schema diff folder does not exists')
+
+ src_sql_path = os.path.join(self.sql_folder, 'source.sql')
+ tar_sql_path = os.path.join(self.sql_folder, 'target.sql')
+
+ if not os.path.exists(src_sql_path):
+ raise FileNotFoundError(
+ '{} file does not exists'.format(src_sql_path))
+
+ if not os.path.exists(tar_sql_path):
+ raise FileNotFoundError(
+ '{} file does not exists'.format(tar_sql_path))
+
+ self.src_schema_id = restore_schema(self.server, self.src_database,
+ 'source', src_sql_path)
+ self.tar_schema_id = restore_schema(self.server, self.tar_database,
+ 'target', tar_sql_path)
+
+ def get_sql_folder(self):
+ """
+ This function will get the appropriate test folder based on
+ server version and their existence.
+
+ :param module_path: Path of the module to be tested.
+ :return:
+ """
+ # Join the application path, module path and tests folder
+ tests_folder_path = os.path.dirname(os.path.abspath(__file__))
+
+ # A folder name matching the Server Type (pg, ppas) takes priority so
+ # check whether that exists or not. If so, than check the version
+ # folder in it, else look directly in the 'tests' folder.
+ absolute_path = os.path.join(tests_folder_path, self.server['type'])
+ if not os.path.exists(absolute_path):
+ absolute_path = tests_folder_path
+
+ # Iterate the version mapping directories.
+ for version_mapping in get_version_mapping_directories(
+ self.server['type']):
+ if version_mapping['number'] > \
+ self.server_information['server_version']:
+ continue
+
+ complete_path = os.path.join(absolute_path,
+ version_mapping['name'])
+
+ if os.path.exists(complete_path):
+ return complete_path
+
+ return None
+
+ def compare(self):
+ comp_url = self.url.format(self.trans_id, self.server_id,
+ self.src_db_id,
+ self.src_schema_id,
+ self.server_id,
+ self.tar_db_id,
+ self.tar_schema_id
+ )
+
+ response = self.tester.get(comp_url)
+
+ self.assertEquals(response.status_code, 200)
+ return json.loads(response.data.decode('utf-8'))
+
+ def runTest(self):
+ """ This function will test the schema diff."""
+
+ response = self.tester.get("schema_diff/initialize")
+ self.assertEquals(response.status_code, 200)
+ response_data = json.loads(response.data.decode('utf-8'))
+ self.trans_id = response_data['data']['schemaDiffTransId']
+
+ url = 'schema_diff/server/connect/{}'.format(self.server_id)
+ data = {'password': self.server['db_password']}
+ response = self.tester.post(url,
+ data=json.dumps(data),
+ content_type='html/json'
+ )
+ response = self.tester.post(
+ 'schema_diff/database/connect/{0}/{1}'.format(
+ self.server_id,
+ self.src_db_id))
+ response = self.tester.post(
+ 'schema_diff/database/connect/{0}/{1}'.format(
+ self.server_id,
+ self.tar_db_id))
+
+ response_data = self.compare()
+
+ diff_file = os.path.join(self.sql_folder, 'diff_{0}.sql'.format(
+ str(random.randint(1, 99999))))
+ file_obj = open(diff_file, 'a')
+
+ for diff in response_data['data']:
+ if diff['type'] in self.nodes:
+ src_obj_oid = tar_obj_oid = None
+ if diff['status'] == 'Source Only' or\
+ diff['status'] == 'Target Only':
+ src_obj_oid = tar_obj_oid = diff['oid']
+ elif diff['status'] == 'Different':
+ src_obj_oid = diff['source_oid']
+ tar_obj_oid = diff['target_oid']
+
+ if src_obj_oid is not None:
+ url = 'schema_diff/ddl_compare/{0}/{1}/{2}/{3}/{4}/{5}/' \
+ '{6}/{7}/{8}/{9}/{10}/'.format(self.trans_id,
+ self.server_id,
+ self.src_db_id,
+ self.src_schema_id,
+ self.server_id,
+ self.tar_db_id,
+ self.tar_schema_id,
+ src_obj_oid,
+ tar_obj_oid,
+ diff['type'],
+ diff['status']
+ )
+
+ response = self.tester.get(url)
+
+ self.assertEquals(response.status_code, 200)
+ response_data = json.loads(response.data.decode('utf-8'))
+ file_obj.write(response_data['diff_ddl'])
+
+ file_obj.close()
+ try:
+ restore_schema(self.server, self.tar_database, 'target',
+ diff_file)
+
+ os.remove(diff_file)
+
+ response_data = self.compare()
+ for diff in response_data['data']:
+ if diff['type'] in self.nodes:
+ self.assertEquals(diff['status'], 'Identical')
+ except Exception as e:
+ os.remove(diff_file)
+
+ def tearDown(self):
+ """This function drop the added database"""
+ connection = utils.get_db_connection(self.server['db'],
+ self.server['username'],
+ self.server['db_password'],
+ self.server['host'],
+ self.server['port'],
+ self.server['sslmode'])
+ utils.drop_database(connection, self.src_database)
+ connection = utils.get_db_connection(self.server['db'],
+ self.server['username'],
+ self.server['db_password'],
+ self.server['host'],
+ self.server['port'],
+ self.server['sslmode'])
+ utils.drop_database(connection, self.tar_database)
diff --git a/web/pgadmin/tools/schema_diff/tests/utils.py b/web/pgadmin/tools/schema_diff/tests/utils.py
new file mode 100644
index 000000000..ee513e490
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/utils.py
@@ -0,0 +1,103 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import sys
+import traceback
+
+from regression.python_test_utils import test_utils as utils
+from pgadmin.browser.server_groups.servers.databases.schemas.tests import \
+ utils as schema_utils
+
+
+def restore_schema(server, db_name, schema_name, sql_path):
+ connection = utils.get_db_connection(db_name,
+ server['username'],
+ server['db_password'],
+ server['host'],
+ server['port'],
+ server['sslmode']
+ )
+
+ old_isolation_level = connection.isolation_level
+ connection.set_isolation_level(0)
+ pg_cursor = connection.cursor()
+
+ sql = ''
+ with open(sql_path, 'r') as content_file:
+ sql = content_file.read()
+ pg_cursor.execute(sql)
+ connection.set_isolation_level(old_isolation_level)
+ connection.commit()
+
+ SQL = """SELECT
+ nsp.oid
+FROM
+ pg_namespace nsp
+ WHERE nsp.nspname = '{0}'""".format(schema_name)
+
+ pg_cursor.execute(SQL)
+ schema = pg_cursor.fetchone()
+ schema_id = None
+ if schema:
+ schema_id = schema[0]
+ connection.close()
+ return schema_id
+
+
+def create_schema(server, db_name, schema_name):
+ connection = utils.get_db_connection(db_name,
+ server['username'],
+ server['db_password'],
+ server['host'],
+ server['port'],
+ server['sslmode']
+ )
+ return schema_utils.create_schema(connection, schema_name)
+
+
+def create_table(server, db_name, schema_id, table_name, query):
+ """
+ This function creates a table under provided schema.
+ :param server: server details
+ :type server: dict
+ :param db_name: database name
+ :type db_name: str
+ :param schema_id: schema oid
+ :type schema_name: int
+ :param table_name: table name
+ :type table_name: str
+ :return table_id: table id
+ :rtype: int
+ """
+ try:
+ connection = utils.get_db_connection(db_name,
+ server['username'],
+ server['db_password'],
+ server['host'],
+ server['port'],
+ server['sslmode'])
+ old_isolation_level = connection.isolation_level
+ connection.set_isolation_level(0)
+ pg_cursor = connection.cursor()
+ pg_cursor.execute(query)
+ connection.set_isolation_level(old_isolation_level)
+ connection.commit()
+ # Get 'oid' from newly created table
+ pg_cursor.execute("SELECT oid FROM pg_class WHERE relname='{0}'"
+ " AND relnamespace = {1}".format(table_name,
+ schema_id))
+ table = pg_cursor.fetchone()
+ table_id = ''
+ if table:
+ table_id = table[0]
+ connection.close()
+ return table_id
+ except Exception:
+ traceback.print_exc(file=sys.stderr)
+ raise
diff --git a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
index 5e8b82aad..e6c2a9f50 100644
--- a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
+++ b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
@@ -84,6 +84,8 @@ define('tools.querytool', [
this.handler.preferences = this.preferences;
this.connIntervalId = null;
this.layout = opts.layout;
+ this.set_server_version(opts.server_ver);
+ this.trigger('pgadmin-sqleditor:view:initialised');
},
// Bind all the events
@@ -2318,6 +2320,12 @@ define('tools.querytool', [
}
},
+ set_value_to_editor: function(query) {
+ if (this.gridView && this.gridView.query_tool_obj && !_.isUndefined(query)) {
+ this.gridView.query_tool_obj.setValue(query);
+ }
+ },
+
init_events: function() {
var self = this;
// Listen to the file manager button events
diff --git a/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/primary_keys.sql b/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/primary_keys.sql
index a96c928f6..d1e398579 100644
--- a/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/primary_keys.sql
+++ b/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/primary_keys.sql
@@ -4,5 +4,5 @@ SELECT at.attname, at.attnum, ty.typname
FROM pg_attribute at LEFT JOIN pg_type ty ON (ty.oid = at.atttypid)
WHERE attrelid={{obj_id}}::oid AND attnum = ANY (
(SELECT con.conkey FROM pg_class rel LEFT OUTER JOIN pg_constraint con ON con.conrelid=rel.oid
- AND con.contype='p' WHERE rel.relkind IN ('r','s','t') AND rel.oid = {{obj_id}}::oid)::oid[])
+ AND con.contype='p' WHERE rel.relkind IN ('r','s','t') AND rel.oid = ({{obj_id}})::oid)::oid[])
{% endif %}
diff --git a/web/pgadmin/tools/sqleditor/utils/get_column_types.py b/web/pgadmin/tools/sqleditor/utils/get_column_types.py
index 99bcb9fa8..74b2e2f60 100644
--- a/web/pgadmin/tools/sqleditor/utils/get_column_types.py
+++ b/web/pgadmin/tools/sqleditor/utils/get_column_types.py
@@ -35,12 +35,13 @@ def get_columns_types(is_query_tool, columns_info, table_oid, conn, has_oids):
column_types[col['name']] = col_type
if not is_query_tool:
- col_type['not_null'] = col['not_null'] = \
- rset['rows'][key]['not_null']
+ if key in rset['rows']:
+ col_type['not_null'] = col['not_null'] = \
+ rset['rows'][key]['not_null']
- col_type['has_default_val'] = \
- col['has_default_val'] = \
- rset['rows'][key]['has_default_val']
+ col_type['has_default_val'] = \
+ col['has_default_val'] = \
+ rset['rows'][key]['has_default_val']
else:
for row in rset['rows']:
diff --git a/web/pgadmin/utils/csrf.py b/web/pgadmin/utils/csrf.py
index dfeb3a6a9..02c2dc00f 100644
--- a/web/pgadmin/utils/csrf.py
+++ b/web/pgadmin/utils/csrf.py
@@ -34,6 +34,8 @@ class _PGCSRFProtect(CSRFProtect):
'pgadmin.tools.datagrid.panel',
'pgadmin.tools.debugger.initialize_target',
'pgadmin.tools.debugger.direct_new',
+ 'pgadmin.tools.schema_diff.panel',
+ 'pgadmin.tools.schema_diff.ddl_compare',
]
for exempt in exempt_views:
diff --git a/web/webpack.config.js b/web/webpack.config.js
index a6749a5ed..230172cf0 100644
--- a/web/webpack.config.js
+++ b/web/webpack.config.js
@@ -356,6 +356,7 @@ module.exports = [{
slickgrid: sourceDir + '/bundle/slickgrid.js',
sqleditor: './pgadmin/tools/sqleditor/static/js/sqleditor.js',
debugger_direct: './pgadmin/tools/debugger/static/js/direct.js',
+ schema_diff: './pgadmin/tools/schema_diff/static/js/schema_diff_hook.js',
file_utils: './pgadmin/misc/file_manager/static/js/utility.js',
'pgadmin.style': pgadminCssStyles,
pgadmin: pgadminScssStyles,
@@ -492,7 +493,8 @@ module.exports = [{
',pgadmin.tools.import_export' +
',pgadmin.tools.debugger.controller' +
',pgadmin.tools.debugger.direct' +
- ',pgadmin.node.pga_job',
+ ',pgadmin.node.pga_job' +
+ ',pgadmin.tools.schema_diff',
},
}, {
test: require.resolve('snapsvg'),
diff --git a/web/webpack.shim.js b/web/webpack.shim.js
index 2e2b7ed41..daa4c8e99 100644
--- a/web/webpack.shim.js
+++ b/web/webpack.shim.js
@@ -278,6 +278,8 @@ var webpackShimConfig = {
'pgadmin.tools.import_export': path.join(__dirname, './pgadmin/tools/import_export/static/js/import_export'),
'pgadmin.tools.maintenance': path.join(__dirname, './pgadmin/tools/maintenance/static/js/maintenance'),
'pgadmin.tools.restore': path.join(__dirname, './pgadmin/tools/restore/static/js/restore'),
+ 'pgadmin.tools.schema_diff': path.join(__dirname, './pgadmin/tools/schema_diff/static/js/schema_diff'),
+ 'pgadmin.tools.schema_diff_ui': path.join(__dirname, './pgadmin/tools/schema_diff/static/js/schema_diff_ui'),
'pgadmin.tools.user_management': path.join(__dirname, './pgadmin/tools/user_management/static/js/user_management'),
'pgadmin.user_management.current_user': '/user_management/current_user',
'slick.pgadmin.editors': path.join(__dirname, './pgadmin/tools/../static/js/slickgrid/editors'),
^ permalink raw reply [nested|flat] 10+ messages in thread
* Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures
2019-12-20 13:29 [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Akshay Joshi <[email protected]>
2020-01-02 06:34 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Khushboo Vashi <[email protected]>
@ 2020-01-02 08:34 ` Chethana Kumar <[email protected]>
2020-01-02 09:03 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Khushboo Vashi <[email protected]>
1 sibling, 1 reply; 10+ messages in thread
From: Chethana Kumar @ 2020-01-02 08:34 UTC (permalink / raw)
To: Khushboo Vashi <[email protected]>; +Cc: Aditya Toshniwal <[email protected]>; Akshay Joshi <[email protected]>; pgadmin-hackers
Hi Khushboo,
On Thu, Jan 2, 2020 at 12:04 PM Khushboo Vashi <
[email protected]> wrote:
> Hi Aditya,
>
> Thanks for the review. Please find the inline response.
> Also, the updated patch attached.
>
> On Fri, Dec 27, 2019 at 4:55 PM Aditya Toshniwal <
> [email protected]> wrote:
>
>> Hi Akshay/Khushboo,
>>
>> I have few suggestions/questions for the attached patch:
>>
>> 1. Code like SchemaDiffRegistry('server', ServerNode) should be
>> replaced with SSchemaDiffRegistry(ServerModule.NODE_TYPE, ServerNode)
>>
>> Done
>
>>
>> 1. The variables return_ajax_response, only_sql, json_resp as far as
>> I understood are similar. Can we have same var name everywhere ?
>>
>> only_sql is used when I need only SQL but not to be executed in the
> backend. json_resp is used to have the plain text/json response.
>
>>
>> 1. Remove commented code -
>> web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
>> -> get_sql_from_table_diff
>>
>> Done
>
>>
>> 1. In
>> web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
>> -> fetch_tables - keys_to_remove is passed. How is it different from
>> keys_to_ignore used at other places ?
>>
>> keys_to_remove used to remove the table properties before comparison as
> we combine all child nodes of the table while comparing and keys_to_ignore
> is to ignore the keys while comparing. We have also used the keys_to_ignore
> in the table node itself.
>
>>
>> 1. web/pgadmin/tools/schema_diff/__init__.py
>> -> check_version_compatibility has hardcoded version numbers. Can we
>> use get_version_mapping_directories from
>> web/pgadmin/utils/versioned_template_loader.py ?
>>
>> I have checked the possibilities before using it in the schema diff. The
> * purpose and the return values * are different for both the files.
>
>>
>> 1. Rename .reallyHidden to .really-hidden
>>
>> Done
>
>>
>> 1. CSS class #schema-diff-grid -> background: white; - hardcoded
>> color can be changed to use $color-bg instead. Also use rem or px for -
>> font-size: 9pt.
>>
>> Done
>
>>
>> 1.
>> 2. .slick-group-toggle.collapsed, .slick-group-toggle.expanded - svgs
>> are not required. Font awesome has the icons. refer - .obj_properties
>> .collapsed .caret::before.
>>
>> Done
>
>>
>> 1.
>> 2. In web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js
>> -> formatNode - Appends can be avoided and formed in a single statement.
>> + } else {
>> + return $('<span></span>').append(
>> + $('<span></span>', {
>> + class: 'wcTabIcon ' + optimage,
>> + })
>> + ).append($('<span></span>').text(opt.text));
>> + }
>> +};
>>
>> Any harm in this approach?
>
>>
>> 1.
>> 2. In web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js
>> -> fetchData - We should not use async = false.
>> + $.ajax({
>> + async: false,
>> + url: url,
>> + })
>> 3. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js -
>> Use 'sources/window' - pgWindow.
>>
>>
>> 1. + let preferences = (window.opener !== null) ?
>> window.opener.pgAdmin.Browser.get_preferences_for_module('schema_diff') :
>> window.top.pgAdmin.Browser.get_preferences_for_module('schema_diff');
>>
>> Done
>
>>
>> 1. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js - Use
>> map instead of for loop. It will also remove the sel_rows_data.push. will
>> be helpfull in large data.
>> + for (var row = 0; row < sel_rows.length; row++) {
>> + let data = self.grid.getData().getItem(sel_rows[row]);
>> +
>> + if (data.type) {
>> + let tmp_data = {
>> + 'node_type': data.type,
>> + 'source_oid': parseInt(data.oid, 10),
>> + 'target_oid': parseInt(data.oid, 10),
>> + 'comp_status': data.status,
>> + };
>> +
>> + if(data.status && (data.status.toLowerCase() ==
>> 'different' || data.status.toLowerCase() == 'identical')) {
>> + tmp_data['target_oid'] = data.target_oid;
>> + }
>> + sel_rows_data.push(tmp_data);
>> + }
>> + }
>> +
>> + url_params['sel_rows'] = sel_rows_data;
>>
>> This is a debatable topic as there are pros and cons of both map and for
> loop. Like, it's more readable if we use map and in case of for loop,
> chrome and firefox will be more happy in terms of performance.
>
>>
>> 1.
>> 2. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js -Are
>> we doing anything to handle failure.
>> + connect_database(server_id, db_id, callback) {
>> + var url = url_for('schema_diff.connect_database', {'sid':
>> server_id, 'did': db_id});
>> + $.post(url)
>> + .done(function(res) {
>> + if (res.success && res.data) {
>> + callback(res.data);
>> + }
>> + })
>> + .fail(function() {
>> + // Fail
>> + });
>> +
>> + }
>>
>> Forgot to handle, now added.
>
>>
>> 1.
>> 2. As you've added a completely different function for
>> connect_server, I would suggest to rename dlgServerPass to a different name
>> to avoid conflict with existing dlgServerPass in server.js
>> + if (!Alertify.dlgServerPass) {
>> + Alertify.dialog('dlgServerPass', function factory() {
>>
>> As we open the schema diff in different frame, I think, this should not
> be the issue.
>
>>
>> 1.
>> 2. Generate script does not work if pgAdmin opened in iframe. Iframes
>> are used by tools like Katacoda.
>> [image: Screenshot 2019-12-27 at 16.40.47.png]
>>
>> Fixed, good catch.
>
>>
>> 1.
>> 2. Comparing objects loader is not attached to DDL Comparison panel.
>> [image: compare_overlay.png]
>>
>> Fixed.
>
>>
>> 1.
>> 2. Filter icon and Generate script icon size are different. Also
>> change icons CSS to use font-icon. You can refer icons from sqleditor.
>> [image: Screenshot 2019-12-27 at 12.18.00.png]
>>
>> The problem is, for the generate script icon, I have used the svg (as no
> similar icon in font-awesome) whereas for Filter, font-awesome is used. I
> can replace the Generate Script icon from font-awesome (can search for some
> similar icon) if Chetana agrees.
> @Chethana Kumar <[email protected]> , please have a look.
>
> https://fontawesome.com/v4.7.0/icon/file-code-o
>
We can use the above one as it looks appropriate to me.
Thanks,
Chethana kumar
>
> https://fontawesome.com/v4.7.0/icon/file-text-o
>
>>
>> 1.
>>
>> *The fetch_objects_to_compare function used in each node uses loop to
>> fetch data. Although it is working for now, but I would suggest using bulk
>> fetch nodes instead of looping through all the nodes one by one.*
>>
>
> Can you please elaborate the approach which you are suggesting?
>
> Thanks,
> Khushboo
>
>>
>> On Fri, Dec 20, 2019 at 6:59 PM Akshay Joshi <
>> [email protected]> wrote:
>>
>>> Hi Hackers,
>>>
>>> Attached is the implementation of the new feature Schema Diff Tool.
>>> Initial work(backend code to compare the objects) has been done by me and
>>> then most of the task has been completed by *Khushboo Vashi. *Sending
>>> the patch on behalf of her*.*
>>>
>>> Currently, this tool only supports Tables, Views, Materialized Views,
>>> Functions and Procedures node.
>>>
>>> Please review and test it thoroughly. Suggestions are welcome to improve
>>> the tool.
>>>
>>> --
>>> *Thanks & Regards*
>>> *Akshay Joshi*
>>>
>>> *Sr. Software Architect*
>>> *EnterpriseDB Software India Private Limited*
>>> *Mobile: +91 976-788-8246*
>>>
>>
>>
>> --
>> Thanks and Regards,
>> Aditya Toshniwal
>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune
>> "Don't Complain about Heat, Plant a TREE"
>>
>
--
Chethana Kumar
Principal UI/UX Designer
EnterpriseDB Corporation
The Postgres Database Company
P: +91 86981 57146
www.enterprisedb.com
Attachments:
[image/png] Screenshot 2019-12-27 at 12.18.00.png (47.9K, 3-Screenshot%202019-12-27%20at%2012.18.00.png)
download | view image
[image/png] Screenshot 2019-12-27 at 16.40.47.png (395.3K, 4-Screenshot%202019-12-27%20at%2016.40.47.png)
download | view image
[image/png] compare_overlay.png (411.6K, 5-compare_overlay.png)
download | view image
^ permalink raw reply [nested|flat] 10+ messages in thread
* Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures
2019-12-20 13:29 [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Akshay Joshi <[email protected]>
2020-01-02 06:34 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Khushboo Vashi <[email protected]>
2020-01-02 08:34 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Chethana Kumar <[email protected]>
@ 2020-01-02 09:03 ` Khushboo Vashi <[email protected]>
0 siblings, 0 replies; 10+ messages in thread
From: Khushboo Vashi @ 2020-01-02 09:03 UTC (permalink / raw)
To: Chethana Kumar <[email protected]>; +Cc: Aditya Toshniwal <[email protected]>; Akshay Joshi <[email protected]>; pgadmin-hackers
On Thu, Jan 2, 2020 at 2:04 PM Chethana Kumar <
[email protected]> wrote:
> Hi Khushboo,
>
> On Thu, Jan 2, 2020 at 12:04 PM Khushboo Vashi <
> [email protected]> wrote:
>
>> Hi Aditya,
>>
>> Thanks for the review. Please find the inline response.
>> Also, the updated patch attached.
>>
>> On Fri, Dec 27, 2019 at 4:55 PM Aditya Toshniwal <
>> [email protected]> wrote:
>>
>>> Hi Akshay/Khushboo,
>>>
>>> I have few suggestions/questions for the attached patch:
>>>
>>> 1. Code like SchemaDiffRegistry('server', ServerNode) should be
>>> replaced with SSchemaDiffRegistry(ServerModule.NODE_TYPE, ServerNode)
>>>
>>> Done
>>
>>>
>>> 1. The variables return_ajax_response, only_sql, json_resp as far as
>>> I understood are similar. Can we have same var name everywhere ?
>>>
>>> only_sql is used when I need only SQL but not to be executed in the
>> backend. json_resp is used to have the plain text/json response.
>>
>>>
>>> 1. Remove commented code -
>>> web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
>>> -> get_sql_from_table_diff
>>>
>>> Done
>>
>>>
>>> 1. In
>>> web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
>>> -> fetch_tables - keys_to_remove is passed. How is it different from
>>> keys_to_ignore used at other places ?
>>>
>>> keys_to_remove used to remove the table properties before comparison as
>> we combine all child nodes of the table while comparing and keys_to_ignore
>> is to ignore the keys while comparing. We have also used the keys_to_ignore
>> in the table node itself.
>>
>>>
>>> 1. web/pgadmin/tools/schema_diff/__init__.py
>>> -> check_version_compatibility has hardcoded version numbers. Can we
>>> use get_version_mapping_directories from
>>> web/pgadmin/utils/versioned_template_loader.py ?
>>>
>>> I have checked the possibilities before using it in the schema diff. The
>> * purpose and the return values * are different for both the files.
>>
>>>
>>> 1. Rename .reallyHidden to .really-hidden
>>>
>>> Done
>>
>>>
>>> 1. CSS class #schema-diff-grid -> background: white; - hardcoded
>>> color can be changed to use $color-bg instead. Also use rem or px for -
>>> font-size: 9pt.
>>>
>>> Done
>>
>>>
>>> 1.
>>> 2. .slick-group-toggle.collapsed, .slick-group-toggle.expanded -
>>> svgs are not required. Font awesome has the icons. refer - .obj_properties
>>> .collapsed .caret::before.
>>>
>>> Done
>>
>>>
>>> 1.
>>> 2. In
>>> web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js ->
>>> formatNode - Appends can be avoided and formed in a single statement.
>>> + } else {
>>> + return $('<span></span>').append(
>>> + $('<span></span>', {
>>> + class: 'wcTabIcon ' + optimage,
>>> + })
>>> + ).append($('<span></span>').text(opt.text));
>>> + }
>>> +};
>>>
>>> Any harm in this approach?
>>
>>>
>>> 1.
>>> 2. In
>>> web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js
>>> -> fetchData - We should not use async = false.
>>> + $.ajax({
>>> + async: false,
>>> + url: url,
>>> + })
>>> 3. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js -
>>> Use 'sources/window' - pgWindow.
>>>
>>>
>>> 1. + let preferences = (window.opener !== null) ?
>>> window.opener.pgAdmin.Browser.get_preferences_for_module('schema_diff') :
>>> window.top.pgAdmin.Browser.get_preferences_for_module('schema_diff');
>>>
>>> Done
>>
>>>
>>> 1. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js -
>>> Use map instead of for loop. It will also remove the sel_rows_data.push.
>>> will be helpfull in large data.
>>> + for (var row = 0; row < sel_rows.length; row++) {
>>> + let data = self.grid.getData().getItem(sel_rows[row]);
>>> +
>>> + if (data.type) {
>>> + let tmp_data = {
>>> + 'node_type': data.type,
>>> + 'source_oid': parseInt(data.oid, 10),
>>> + 'target_oid': parseInt(data.oid, 10),
>>> + 'comp_status': data.status,
>>> + };
>>> +
>>> + if(data.status && (data.status.toLowerCase() ==
>>> 'different' || data.status.toLowerCase() == 'identical')) {
>>> + tmp_data['target_oid'] = data.target_oid;
>>> + }
>>> + sel_rows_data.push(tmp_data);
>>> + }
>>> + }
>>> +
>>> + url_params['sel_rows'] = sel_rows_data;
>>>
>>> This is a debatable topic as there are pros and cons of both map and for
>> loop. Like, it's more readable if we use map and in case of for loop,
>> chrome and firefox will be more happy in terms of performance.
>>
>>>
>>> 1.
>>> 2. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js -Are
>>> we doing anything to handle failure.
>>> + connect_database(server_id, db_id, callback) {
>>> + var url = url_for('schema_diff.connect_database', {'sid':
>>> server_id, 'did': db_id});
>>> + $.post(url)
>>> + .done(function(res) {
>>> + if (res.success && res.data) {
>>> + callback(res.data);
>>> + }
>>> + })
>>> + .fail(function() {
>>> + // Fail
>>> + });
>>> +
>>> + }
>>>
>>> Forgot to handle, now added.
>>
>>>
>>> 1.
>>> 2. As you've added a completely different function for
>>> connect_server, I would suggest to rename dlgServerPass to a different name
>>> to avoid conflict with existing dlgServerPass in server.js
>>> + if (!Alertify.dlgServerPass) {
>>> + Alertify.dialog('dlgServerPass', function factory() {
>>>
>>> As we open the schema diff in different frame, I think, this should not
>> be the issue.
>>
>>>
>>> 1.
>>> 2. Generate script does not work if pgAdmin opened in iframe.
>>> Iframes are used by tools like Katacoda.
>>> [image: Screenshot 2019-12-27 at 16.40.47.png]
>>>
>>> Fixed, good catch.
>>
>>>
>>> 1.
>>> 2. Comparing objects loader is not attached to DDL Comparison panel.
>>> [image: compare_overlay.png]
>>>
>>> Fixed.
>>
>>>
>>> 1.
>>> 2. Filter icon and Generate script icon size are different. Also
>>> change icons CSS to use font-icon. You can refer icons from sqleditor.
>>> [image: Screenshot 2019-12-27 at 12.18.00.png]
>>>
>>> The problem is, for the generate script icon, I have used the svg (as no
>> similar icon in font-awesome) whereas for Filter, font-awesome is used. I
>> can replace the Generate Script icon from font-awesome (can search for some
>> similar icon) if Chetana agrees.
>> @Chethana Kumar <[email protected]> , please have a look.
>>
>> https://fontawesome.com/v4.7.0/icon/file-code-o
>>
>
> We can use the above one as it looks appropriate to me.
>
Thanks, I will change it.
>
> Thanks,
> Chethana kumar
>
>
>>
>> https://fontawesome.com/v4.7.0/icon/file-text-o
>>
>>>
>>> 1.
>>>
>>> *The fetch_objects_to_compare function used in each node uses loop to
>>> fetch data. Although it is working for now, but I would suggest using bulk
>>> fetch nodes instead of looping through all the nodes one by one.*
>>>
>>
>> Can you please elaborate the approach which you are suggesting?
>>
>> Thanks,
>> Khushboo
>>
>>>
>>> On Fri, Dec 20, 2019 at 6:59 PM Akshay Joshi <
>>> [email protected]> wrote:
>>>
>>>> Hi Hackers,
>>>>
>>>> Attached is the implementation of the new feature Schema Diff Tool.
>>>> Initial work(backend code to compare the objects) has been done by me and
>>>> then most of the task has been completed by *Khushboo Vashi. *Sending
>>>> the patch on behalf of her*.*
>>>>
>>>> Currently, this tool only supports Tables, Views, Materialized Views,
>>>> Functions and Procedures node.
>>>>
>>>> Please review and test it thoroughly. Suggestions are welcome to
>>>> improve the tool.
>>>>
>>>> --
>>>> *Thanks & Regards*
>>>> *Akshay Joshi*
>>>>
>>>> *Sr. Software Architect*
>>>> *EnterpriseDB Software India Private Limited*
>>>> *Mobile: +91 976-788-8246*
>>>>
>>>
>>>
>>> --
>>> Thanks and Regards,
>>> Aditya Toshniwal
>>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune
>>> "Don't Complain about Heat, Plant a TREE"
>>>
>>
>
> --
> Chethana Kumar
> Principal UI/UX Designer
> EnterpriseDB Corporation
>
>
> The Postgres Database Company
>
> P: +91 86981 57146
> www.enterprisedb.com
>
Attachments:
[image/png] Screenshot 2019-12-27 at 12.18.00.png (47.9K, 3-Screenshot%202019-12-27%20at%2012.18.00.png)
download | view image
[image/png] Screenshot 2019-12-27 at 16.40.47.png (395.3K, 4-Screenshot%202019-12-27%20at%2016.40.47.png)
download | view image
[image/png] compare_overlay.png (411.6K, 5-compare_overlay.png)
download | view image
^ permalink raw reply [nested|flat] 10+ messages in thread
* Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures
2019-12-20 13:29 [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Akshay Joshi <[email protected]>
2020-01-02 06:34 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Khushboo Vashi <[email protected]>
@ 2020-01-02 09:13 ` Aditya Toshniwal <[email protected]>
2020-01-02 09:38 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Khushboo Vashi <[email protected]>
1 sibling, 1 reply; 10+ messages in thread
From: Aditya Toshniwal @ 2020-01-02 09:13 UTC (permalink / raw)
To: Khushboo Vashi <[email protected]>; +Cc: Chethana Kumar <[email protected]>; Akshay Joshi <[email protected]>; pgadmin-hackers
Hi Khushboo,
On Thu, Jan 2, 2020 at 12:04 PM Khushboo Vashi <
[email protected]> wrote:
> Hi Aditya,
>
> Thanks for the review. Please find the inline response.
> Also, the updated patch attached.
>
> On Fri, Dec 27, 2019 at 4:55 PM Aditya Toshniwal <
> [email protected]> wrote:
>
>> Hi Akshay/Khushboo,
>>
>> I have few suggestions/questions for the attached patch:
>>
>> 1. Code like SchemaDiffRegistry('server', ServerNode) should be
>> replaced with SSchemaDiffRegistry(ServerModule.NODE_TYPE, ServerNode)
>>
>> Done
>
>>
>> 1. The variables return_ajax_response, only_sql, json_resp as far as
>> I understood are similar. Can we have same var name everywhere ?
>>
>> only_sql is used when I need only SQL but not to be executed in the
> backend. json_resp is used to have the plain text/json response.
>
>>
>> 1. Remove commented code -
>> web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
>> -> get_sql_from_table_diff
>>
>> Done
>
>>
>> 1. In
>> web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
>> -> fetch_tables - keys_to_remove is passed. How is it different from
>> keys_to_ignore used at other places ?
>>
>> keys_to_remove used to remove the table properties before comparison as
> we combine all child nodes of the table while comparing and keys_to_ignore
> is to ignore the keys while comparing. We have also used the keys_to_ignore
> in the table node itself.
>
>>
>> 1. web/pgadmin/tools/schema_diff/__init__.py
>> -> check_version_compatibility has hardcoded version numbers. Can we
>> use get_version_mapping_directories from
>> web/pgadmin/utils/versioned_template_loader.py ?
>>
>> I have checked the possibilities before using it in the schema diff. The
> * purpose and the return values * are different for both the files.
>
The return value can be taken and tweaked to fit your purpose. If let's say
a new version of Postgres is released then that also need to be added in
schema diff along with get_version_mapping_directories. That would not be
the case if you use get_version_mapping_directories.
>
>> 1. Rename .reallyHidden to .really-hidden
>>
>> Done
>
>>
>> 1. CSS class #schema-diff-grid -> background: white; - hardcoded
>> color can be changed to use $color-bg instead. Also use rem or px for -
>> font-size: 9pt.
>>
>> Done
>
>>
>> 1.
>> 2. .slick-group-toggle.collapsed, .slick-group-toggle.expanded - svgs
>> are not required. Font awesome has the icons. refer - .obj_properties
>> .collapsed .caret::before.
>>
>> Done
>
>>
>> 1.
>> 2. In web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js
>> -> formatNode - Appends can be avoided and formed in a single statement.
>> + } else {
>> + return $('<span></span>').append(
>> + $('<span></span>', {
>> + class: 'wcTabIcon ' + optimage,
>> + })
>> + ).append($('<span></span>').text(opt.text));
>> + }
>> +};
>>
>> Any harm in this approach?
>
Obviously the extra append operations, which can be avoided.
>
>> 1.
>> 2. In web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js
>> -> fetchData - We should not use async = false.
>> + $.ajax({
>> + async: false,
>> + url: url,
>> + })
>>
>> This is pending.
>
>> 1. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js -
>> Use 'sources/window' - pgWindow.
>>
>>
>> 1. + let preferences = (window.opener !== null) ?
>> window.opener.pgAdmin.Browser.get_preferences_for_module('schema_diff') :
>> window.top.pgAdmin.Browser.get_preferences_for_module('schema_diff');
>>
>> Done
>
>>
>> 1. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js - Use
>> map instead of for loop. It will also remove the sel_rows_data.push. will
>> be helpfull in large data.
>> + for (var row = 0; row < sel_rows.length; row++) {
>> + let data = self.grid.getData().getItem(sel_rows[row]);
>> +
>> + if (data.type) {
>> + let tmp_data = {
>> + 'node_type': data.type,
>> + 'source_oid': parseInt(data.oid, 10),
>> + 'target_oid': parseInt(data.oid, 10),
>> + 'comp_status': data.status,
>> + };
>> +
>> + if(data.status && (data.status.toLowerCase() ==
>> 'different' || data.status.toLowerCase() == 'identical')) {
>> + tmp_data['target_oid'] = data.target_oid;
>> + }
>> + sel_rows_data.push(tmp_data);
>> + }
>> + }
>> +
>> + url_params['sel_rows'] = sel_rows_data;
>>
>> This is a debatable topic as there are pros and cons of both map and for
> loop. Like, it's more readable if we use map and in case of for loop,
> chrome and firefox will be more happy in terms of performance.
>
I'm not comparing "map" and "for" here. I'm trying to avoid
sel_rows_data.push statement here which is directly proportional to the
number of selected rows.
>
>> 1.
>> 2. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js -Are
>> we doing anything to handle failure.
>> + connect_database(server_id, db_id, callback) {
>> + var url = url_for('schema_diff.connect_database', {'sid':
>> server_id, 'did': db_id});
>> + $.post(url)
>> + .done(function(res) {
>> + if (res.success && res.data) {
>> + callback(res.data);
>> + }
>> + })
>> + .fail(function() {
>> + // Fail
>> + });
>> +
>> + }
>>
>> Forgot to handle, now added.
>
>>
>> 1.
>> 2. As you've added a completely different function for
>> connect_server, I would suggest to rename dlgServerPass to a different name
>> to avoid conflict with existing dlgServerPass in server.js
>> + if (!Alertify.dlgServerPass) {
>> + Alertify.dialog('dlgServerPass', function factory() {
>>
>> As we open the schema diff in different frame, I think, this should not
> be the issue.
>
>>
>> 1.
>> 2. Generate script does not work if pgAdmin opened in iframe. Iframes
>> are used by tools like Katacoda.
>> [image: Screenshot 2019-12-27 at 16.40.47.png]
>>
>> Fixed, good catch.
>
>>
>> 1.
>> 2. Comparing objects loader is not attached to DDL Comparison panel.
>> [image: compare_overlay.png]
>>
>> Fixed.
>
>>
>> 1.
>> 2. Filter icon and Generate script icon size are different. Also
>> change icons CSS to use font-icon. You can refer icons from sqleditor.
>> [image: Screenshot 2019-12-27 at 12.18.00.png]
>>
>> The problem is, for the generate script icon, I have used the svg (as no
> similar icon in font-awesome) whereas for Filter, font-awesome is used. I
> can replace the Generate Script icon from font-awesome (can search for some
> similar icon) if Chetana agrees.
>
@Chethana Kumar <[email protected]> , please have a look.
>
> https://fontawesome.com/v4.7.0/icon/file-code-o
> https://fontawesome.com/v4.7.0/icon/file-text-o
>
>>
>> 1.
>>
>> *The fetch_objects_to_compare function used in each node uses loop to
>> fetch data. Although it is working for now, but I would suggest using bulk
>> fetch nodes instead of looping through all the nodes one by one.*
>>
>
> Can you please elaborate the approach which you are suggesting?
>
The fetch_objects_to_compare function fetches all the nodes first, and then
in a loop the properties for each node is fetched. Instead of that, all the
nodes along with their properties can be fetched in one go from the
database. Although this is no stopper, but it can be an improvement done in
future.
>
> Thanks,
> Khushboo
>
>>
>> On Fri, Dec 20, 2019 at 6:59 PM Akshay Joshi <
>> [email protected]> wrote:
>>
>>> Hi Hackers,
>>>
>>> Attached is the implementation of the new feature Schema Diff Tool.
>>> Initial work(backend code to compare the objects) has been done by me and
>>> then most of the task has been completed by *Khushboo Vashi. *Sending
>>> the patch on behalf of her*.*
>>>
>>> Currently, this tool only supports Tables, Views, Materialized Views,
>>> Functions and Procedures node.
>>>
>>> Please review and test it thoroughly. Suggestions are welcome to improve
>>> the tool.
>>>
>>> --
>>> *Thanks & Regards*
>>> *Akshay Joshi*
>>>
>>> *Sr. Software Architect*
>>> *EnterpriseDB Software India Private Limited*
>>> *Mobile: +91 976-788-8246*
>>>
>>
>>
>> --
>> Thanks and Regards,
>> Aditya Toshniwal
>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune
>> "Don't Complain about Heat, Plant a TREE"
>>
>
--
Thanks and Regards,
Aditya Toshniwal
pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune
"Don't Complain about Heat, Plant a TREE"
Attachments:
[image/png] Screenshot 2019-12-27 at 12.18.00.png (47.9K, 3-Screenshot%202019-12-27%20at%2012.18.00.png)
download | view image
[image/png] Screenshot 2019-12-27 at 16.40.47.png (395.3K, 4-Screenshot%202019-12-27%20at%2016.40.47.png)
download | view image
[image/png] compare_overlay.png (411.6K, 5-compare_overlay.png)
download | view image
^ permalink raw reply [nested|flat] 10+ messages in thread
* Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures
2019-12-20 13:29 [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Akshay Joshi <[email protected]>
2020-01-02 06:34 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Khushboo Vashi <[email protected]>
2020-01-02 09:13 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Aditya Toshniwal <[email protected]>
@ 2020-01-02 09:38 ` Khushboo Vashi <[email protected]>
2020-01-02 09:48 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Aditya Toshniwal <[email protected]>
2020-01-08 06:06 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Khushboo Vashi <[email protected]>
0 siblings, 2 replies; 10+ messages in thread
From: Khushboo Vashi @ 2020-01-02 09:38 UTC (permalink / raw)
To: Aditya Toshniwal <[email protected]>; +Cc: Chethana Kumar <[email protected]>; Akshay Joshi <[email protected]>; pgadmin-hackers
On Thu, Jan 2, 2020 at 2:43 PM Aditya Toshniwal <
[email protected]> wrote:
> Hi Khushboo,
>
> On Thu, Jan 2, 2020 at 12:04 PM Khushboo Vashi <
> [email protected]> wrote:
>
>> Hi Aditya,
>>
>> Thanks for the review. Please find the inline response.
>> Also, the updated patch attached.
>>
>> On Fri, Dec 27, 2019 at 4:55 PM Aditya Toshniwal <
>> [email protected]> wrote:
>>
>>> Hi Akshay/Khushboo,
>>>
>>> I have few suggestions/questions for the attached patch:
>>>
>>> 1. Code like SchemaDiffRegistry('server', ServerNode) should be
>>> replaced with SSchemaDiffRegistry(ServerModule.NODE_TYPE, ServerNode)
>>>
>>> Done
>>
>>>
>>> 1. The variables return_ajax_response, only_sql, json_resp as far as
>>> I understood are similar. Can we have same var name everywhere ?
>>>
>>> only_sql is used when I need only SQL but not to be executed in the
>> backend. json_resp is used to have the plain text/json response.
>>
>>>
>>> 1. Remove commented code -
>>> web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
>>> -> get_sql_from_table_diff
>>>
>>> Done
>>
>>>
>>> 1. In
>>> web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
>>> -> fetch_tables - keys_to_remove is passed. How is it different from
>>> keys_to_ignore used at other places ?
>>>
>>> keys_to_remove used to remove the table properties before comparison as
>> we combine all child nodes of the table while comparing and keys_to_ignore
>> is to ignore the keys while comparing. We have also used the keys_to_ignore
>> in the table node itself.
>>
>>>
>>> 1. web/pgadmin/tools/schema_diff/__init__.py
>>> -> check_version_compatibility has hardcoded version numbers. Can we
>>> use get_version_mapping_directories from
>>> web/pgadmin/utils/versioned_template_loader.py ?
>>>
>>> I have checked the possibilities before using it in the schema diff. The
>> * purpose and the return values * are different for both the files.
>>
> The return value can be taken and tweaked to fit your purpose. If let's
> say a new version of Postgres is released then that also need to be added
> in schema diff along with get_version_mapping_directories. That would not
> be the case if you use get_version_mapping_directories.
>
I can do one thing, will take the versions dict at one place and both the
functions get_version_mapping_directories and schema_diff can use that
version dict.
As, I am not in favour of tweaking get_version_mapping_directories function
as the name suggests something else.
>
>>> 1. Rename .reallyHidden to .really-hidden
>>>
>>> Done
>>
>>>
>>> 1. CSS class #schema-diff-grid -> background: white; - hardcoded
>>> color can be changed to use $color-bg instead. Also use rem or px for -
>>> font-size: 9pt.
>>>
>>> Done
>>
>>>
>>> 1.
>>> 2. .slick-group-toggle.collapsed, .slick-group-toggle.expanded -
>>> svgs are not required. Font awesome has the icons. refer - .obj_properties
>>> .collapsed .caret::before.
>>>
>>> Done
>>
>>>
>>> 1.
>>> 2. In
>>> web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js ->
>>> formatNode - Appends can be avoided and formed in a single statement.
>>> + } else {
>>> + return $('<span></span>').append(
>>> + $('<span></span>', {
>>> + class: 'wcTabIcon ' + optimage,
>>> + })
>>> + ).append($('<span></span>').text(opt.text));
>>> + }
>>> +};
>>>
>>> Any harm in this approach?
>>
> Obviously the extra append operations, which can be avoided.
>
Yeah, right but I don't think it is going to be a performance issue.
>
>>> 1.
>>> 2. In
>>> web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js
>>> -> fetchData - We should not use async = false.
>>> + $.ajax({
>>> + async: false,
>>> + url: url,
>>> + })
>>>
>>> This is pending.
>
It's not pending, I left it as it is, as I have copied this code from
backform.pgadmin.js and tweaked it accordingly, as we already cleaned up
the async: false in the past but this has not been changed. So, before
changing it, we need to analyse why we have not changed it.
>
>>> 1. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js -
>>> Use 'sources/window' - pgWindow.
>>>
>>>
>>> 1. + let preferences = (window.opener !== null) ?
>>> window.opener.pgAdmin.Browser.get_preferences_for_module('schema_diff') :
>>> window.top.pgAdmin.Browser.get_preferences_for_module('schema_diff');
>>>
>>> Done
>>
>>>
>>> 1. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js -
>>> Use map instead of for loop. It will also remove the sel_rows_data.push.
>>> will be helpfull in large data.
>>> + for (var row = 0; row < sel_rows.length; row++) {
>>> + let data = self.grid.getData().getItem(sel_rows[row]);
>>> +
>>> + if (data.type) {
>>> + let tmp_data = {
>>> + 'node_type': data.type,
>>> + 'source_oid': parseInt(data.oid, 10),
>>> + 'target_oid': parseInt(data.oid, 10),
>>> + 'comp_status': data.status,
>>> + };
>>> +
>>> + if(data.status && (data.status.toLowerCase() ==
>>> 'different' || data.status.toLowerCase() == 'identical')) {
>>> + tmp_data['target_oid'] = data.target_oid;
>>> + }
>>> + sel_rows_data.push(tmp_data);
>>> + }
>>> + }
>>> +
>>> + url_params['sel_rows'] = sel_rows_data;
>>>
>>> This is a debatable topic as there are pros and cons of both map and for
>> loop. Like, it's more readable if we use map and in case of for loop,
>> chrome and firefox will be more happy in terms of performance.
>>
> I'm not comparing "map" and "for" here. I'm trying to avoid
> sel_rows_data.push statement here which is directly proportional to the
> number of selected rows.
>
At the end, it will return the new array according to the condition in both
the cases.
>
>>> 1.
>>> 2. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js -Are
>>> we doing anything to handle failure.
>>> + connect_database(server_id, db_id, callback) {
>>> + var url = url_for('schema_diff.connect_database', {'sid':
>>> server_id, 'did': db_id});
>>> + $.post(url)
>>> + .done(function(res) {
>>> + if (res.success && res.data) {
>>> + callback(res.data);
>>> + }
>>> + })
>>> + .fail(function() {
>>> + // Fail
>>> + });
>>> +
>>> + }
>>>
>>> Forgot to handle, now added.
>>
>>>
>>> 1.
>>> 2. As you've added a completely different function for
>>> connect_server, I would suggest to rename dlgServerPass to a different name
>>> to avoid conflict with existing dlgServerPass in server.js
>>> + if (!Alertify.dlgServerPass) {
>>> + Alertify.dialog('dlgServerPass', function factory() {
>>>
>>> As we open the schema diff in different frame, I think, this should not
>> be the issue.
>>
>>>
>>> 1.
>>> 2. Generate script does not work if pgAdmin opened in iframe.
>>> Iframes are used by tools like Katacoda.
>>> [image: Screenshot 2019-12-27 at 16.40.47.png]
>>>
>>> Fixed, good catch.
>>
>>>
>>> 1.
>>> 2. Comparing objects loader is not attached to DDL Comparison panel.
>>> [image: compare_overlay.png]
>>>
>>> Fixed.
>>
>>>
>>> 1.
>>> 2. Filter icon and Generate script icon size are different. Also
>>> change icons CSS to use font-icon. You can refer icons from sqleditor.
>>> [image: Screenshot 2019-12-27 at 12.18.00.png]
>>>
>>> The problem is, for the generate script icon, I have used the svg (as no
>> similar icon in font-awesome) whereas for Filter, font-awesome is used. I
>> can replace the Generate Script icon from font-awesome (can search for some
>> similar icon) if Chetana agrees.
>>
> @Chethana Kumar <[email protected]> , please have a look.
>>
>> https://fontawesome.com/v4.7.0/icon/file-code-o
>> https://fontawesome.com/v4.7.0/icon/file-text-o
>>
>>>
>>> 1.
>>>
>>> *The fetch_objects_to_compare function used in each node uses loop to
>>> fetch data. Although it is working for now, but I would suggest using bulk
>>> fetch nodes instead of looping through all the nodes one by one.*
>>>
>>
>> Can you please elaborate the approach which you are suggesting?
>>
> The fetch_objects_to_compare function fetches all the nodes first, and
> then in a loop the properties for each node is fetched. Instead of that,
> all the nodes along with their properties can be fetched in one go from the
> database. Although this is no stopper, but it can be an improvement done in
> future.
>
Sure, will look into it in the second phase.
>
>> Thanks,
>> Khushboo
>>
>>>
>>> On Fri, Dec 20, 2019 at 6:59 PM Akshay Joshi <
>>> [email protected]> wrote:
>>>
>>>> Hi Hackers,
>>>>
>>>> Attached is the implementation of the new feature Schema Diff Tool.
>>>> Initial work(backend code to compare the objects) has been done by me and
>>>> then most of the task has been completed by *Khushboo Vashi. *Sending
>>>> the patch on behalf of her*.*
>>>>
>>>> Currently, this tool only supports Tables, Views, Materialized Views,
>>>> Functions and Procedures node.
>>>>
>>>> Please review and test it thoroughly. Suggestions are welcome to
>>>> improve the tool.
>>>>
>>>> --
>>>> *Thanks & Regards*
>>>> *Akshay Joshi*
>>>>
>>>> *Sr. Software Architect*
>>>> *EnterpriseDB Software India Private Limited*
>>>> *Mobile: +91 976-788-8246*
>>>>
>>>
>>>
>>> --
>>> Thanks and Regards,
>>> Aditya Toshniwal
>>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune
>>> "Don't Complain about Heat, Plant a TREE"
>>>
>>
>
> --
> Thanks and Regards,
> Aditya Toshniwal
> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune
> "Don't Complain about Heat, Plant a TREE"
>
Attachments:
[image/png] Screenshot 2019-12-27 at 12.18.00.png (47.9K, 3-Screenshot%202019-12-27%20at%2012.18.00.png)
download | view image
[image/png] Screenshot 2019-12-27 at 16.40.47.png (395.3K, 4-Screenshot%202019-12-27%20at%2016.40.47.png)
download | view image
[image/png] compare_overlay.png (411.6K, 5-compare_overlay.png)
download | view image
^ permalink raw reply [nested|flat] 10+ messages in thread
* Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures
2019-12-20 13:29 [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Akshay Joshi <[email protected]>
2020-01-02 06:34 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Khushboo Vashi <[email protected]>
2020-01-02 09:13 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Aditya Toshniwal <[email protected]>
2020-01-02 09:38 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Khushboo Vashi <[email protected]>
@ 2020-01-02 09:48 ` Aditya Toshniwal <[email protected]>
1 sibling, 0 replies; 10+ messages in thread
From: Aditya Toshniwal @ 2020-01-02 09:48 UTC (permalink / raw)
To: Khushboo Vashi <[email protected]>; +Cc: Chethana Kumar <[email protected]>; Akshay Joshi <[email protected]>; pgadmin-hackers
Hi,
On Thu, Jan 2, 2020 at 3:08 PM Khushboo Vashi <
[email protected]> wrote:
>
>
> On Thu, Jan 2, 2020 at 2:43 PM Aditya Toshniwal <
> [email protected]> wrote:
>
>> Hi Khushboo,
>>
>> On Thu, Jan 2, 2020 at 12:04 PM Khushboo Vashi <
>> [email protected]> wrote:
>>
>>> Hi Aditya,
>>>
>>> Thanks for the review. Please find the inline response.
>>> Also, the updated patch attached.
>>>
>>> On Fri, Dec 27, 2019 at 4:55 PM Aditya Toshniwal <
>>> [email protected]> wrote:
>>>
>>>> Hi Akshay/Khushboo,
>>>>
>>>> I have few suggestions/questions for the attached patch:
>>>>
>>>> 1. Code like SchemaDiffRegistry('server', ServerNode) should be
>>>> replaced with SSchemaDiffRegistry(ServerModule.NODE_TYPE, ServerNode)
>>>>
>>>> Done
>>>
>>>>
>>>> 1. The variables return_ajax_response, only_sql, json_resp as far
>>>> as I understood are similar. Can we have same var name everywhere ?
>>>>
>>>> only_sql is used when I need only SQL but not to be executed in the
>>> backend. json_resp is used to have the plain text/json response.
>>>
>>>>
>>>> 1. Remove commented code -
>>>> web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
>>>> -> get_sql_from_table_diff
>>>>
>>>> Done
>>>
>>>>
>>>> 1. In
>>>> web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
>>>> -> fetch_tables - keys_to_remove is passed. How is it different from
>>>> keys_to_ignore used at other places ?
>>>>
>>>> keys_to_remove used to remove the table properties before comparison as
>>> we combine all child nodes of the table while comparing and keys_to_ignore
>>> is to ignore the keys while comparing. We have also used the keys_to_ignore
>>> in the table node itself.web/pgadmin/tools/schema_diff/__init__.py
>>> -> check_version_compatibility has hardcoded version numbers. Can we
>>> use get_version_mapping_directories from web/pgadmin/utils/versioned_template_loader.py
>>> ?
>>>
>> I have checked the possibilities before using it in the schema diff. The
>>> * purpose and the return values * are different for both the files.
>>>
>> The return value can be taken and tweaked to fit your purpose. If let's
>> say a new version of Postgres is released then that also need to be added
>> in schema diff along with get_version_mapping_directories. That would
>> not be the case if you use get_version_mapping_directories.
>>
> I can do one thing, will take the versions dict at one place and both the
> functions get_version_mapping_directories and schema_diff can use that
> version dict.
> As, I am not in favour of tweaking get_version_mapping_directories
> function as the name suggests something else.
>
Neither am I suggesting to change get_version_mapping_directories, but to
use the return value as mentioned.
>
>>>> 1. Rename .reallyHidden to .really-hidden
>>>>
>>>> Done
>>>
>>>>
>>>> 1. CSS class #schema-diff-grid -> background: white; - hardcoded
>>>> color can be changed to use $color-bg instead. Also use rem or px for -
>>>> font-size: 9pt.
>>>>
>>>> Done
>>>
>>>>
>>>> 1.
>>>> 2. .slick-group-toggle.collapsed, .slick-group-toggle.expanded -
>>>> svgs are not required. Font awesome has the icons. refer - .obj_properties
>>>> .collapsed .caret::before.
>>>>
>>>> Done
>>>
>>>>
>>>> 1.
>>>> 2. In
>>>> web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js ->
>>>> formatNode - Appends can be avoided and formed in a single statement.
>>>> + } else {
>>>> + return $('<span></span>').append(
>>>> + $('<span></span>', {
>>>> + class: 'wcTabIcon ' + optimage,
>>>> + })
>>>> + ).append($('<span></span>').text(opt.text));
>>>> + }
>>>> +};
>>>>
>>>> Any harm in this approach?
>>>
>> Obviously the extra append operations, which can be avoided.
>>
> Yeah, right but I don't think it is going to be a performance issue.
>
Well, up to you. There are lot many small things in pgAdmin which do not
affect performance individually, but collectively they do.
>
>>>> 1.
>>>> 2. In
>>>> web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js
>>>> -> fetchData - We should not use async = false.
>>>> + $.ajax({
>>>> + async: false,
>>>> + url: url,
>>>> + })
>>>>
>>>> This is pending.
>>
> It's not pending, I left it as it is, as I have copied this code from
> backform.pgadmin.js and tweaked it accordingly, as we already cleaned up
> the async: false in the past but this has not been changed. So, before
> changing it, we need to analyse why we have not changed it.
>
OK.
>
>>>> 1. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js -
>>>> Use 'sources/window' - pgWindow.
>>>>
>>>>
>>>> 1. + let preferences = (window.opener !== null) ?
>>>> window.opener.pgAdmin.Browser.get_preferences_for_module('schema_diff') :
>>>> window.top.pgAdmin.Browser.get_preferences_for_module('schema_diff');
>>>>
>>>> Done
>>>
>>>>
>>>> 1. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js -
>>>> Use map instead of for loop. It will also remove the sel_rows_data.push.
>>>> will be helpfull in large data.
>>>> + for (var row = 0; row < sel_rows.length; row++) {
>>>> + let data = self.grid.getData().getItem(sel_rows[row]);
>>>> +
>>>> + if (data.type) {
>>>> + let tmp_data = {
>>>> + 'node_type': data.type,
>>>> + 'source_oid': parseInt(data.oid, 10),
>>>> + 'target_oid': parseInt(data.oid, 10),
>>>> + 'comp_status': data.status,
>>>> + };
>>>> +
>>>> + if(data.status && (data.status.toLowerCase() ==
>>>> 'different' || data.status.toLowerCase() == 'identical')) {
>>>> + tmp_data['target_oid'] = data.target_oid;
>>>> + }
>>>> + sel_rows_data.push(tmp_data);
>>>> + }
>>>> + }
>>>> +
>>>> + url_params['sel_rows'] = sel_rows_data;
>>>>
>>>> This is a debatable topic as there are pros and cons of both map and
>>> for loop. Like, it's more readable if we use map and in case of for loop,
>>> chrome and firefox will be more happy in terms of performance.
>>>
>> I'm not comparing "map" and "for" here. I'm trying to avoid
>> sel_rows_data.push statement here which is directly proportional to the
>> number of selected rows.
>>
> At the end, it will return the new array according to the condition in
> both the cases.
>
OK. I'm still not in favor of having "for" with extra "push". May be I'll
send a patch later.
>
>>>> 1.
>>>> 2. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js
>>>> -Are we doing anything to handle failure.
>>>> + connect_database(server_id, db_id, callback) {
>>>> + var url = url_for('schema_diff.connect_database', {'sid':
>>>> server_id, 'did': db_id});
>>>> + $.post(url)
>>>> + .done(function(res) {
>>>> + if (res.success && res.data) {
>>>> + callback(res.data);
>>>> + }
>>>> + })
>>>> + .fail(function() {
>>>> + // Fail
>>>> + });
>>>> +
>>>> + }
>>>>
>>>> Forgot to handle, now added.
>>>
>>>>
>>>> 1.
>>>> 2. As you've added a completely different function for
>>>> connect_server, I would suggest to rename dlgServerPass to a different name
>>>> to avoid conflict with existing dlgServerPass in server.js
>>>> + if (!Alertify.dlgServerPass) {
>>>> + Alertify.dialog('dlgServerPass', function factory() {
>>>>
>>>> As we open the schema diff in different frame, I think, this should not
>>> be the issue.
>>>
>>>>
>>>> 1.
>>>> 2. Generate script does not work if pgAdmin opened in iframe.
>>>> Iframes are used by tools like Katacoda.
>>>> [image: Screenshot 2019-12-27 at 16.40.47.png]
>>>>
>>>> Fixed, good catch.
>>>
>>>>
>>>> 1.
>>>> 2. Comparing objects loader is not attached to DDL Comparison panel.
>>>> [image: compare_overlay.png]
>>>>
>>>> Fixed.
>>>
>>>>
>>>> 1.
>>>> 2. Filter icon and Generate script icon size are different. Also
>>>> change icons CSS to use font-icon. You can refer icons from sqleditor.
>>>> [image: Screenshot 2019-12-27 at 12.18.00.png]
>>>>
>>>> The problem is, for the generate script icon, I have used the svg (as
>>> no similar icon in font-awesome) whereas for Filter, font-awesome is used.
>>> I can replace the Generate Script icon from font-awesome (can search for
>>> some similar icon) if Chetana agrees.
>>>
>> @Chethana Kumar <[email protected]> , please have a look.
>>>
>>> https://fontawesome.com/v4.7.0/icon/file-code-o
>>> https://fontawesome.com/v4.7.0/icon/file-text-o
>>>
>>>>
>>>> 1.
>>>>
>>>> *The fetch_objects_to_compare function used in each node uses loop to
>>>> fetch data. Although it is working for now, but I would suggest using bulk
>>>> fetch nodes instead of looping through all the nodes one by one.*
>>>>
>>>
>>> Can you please elaborate the approach which you are suggesting?
>>>
>> The fetch_objects_to_compare function fetches all the nodes first, and
>> then in a loop the properties for each node is fetched. Instead of that,
>> all the nodes along with their properties can be fetched in one go from the
>> database. Although this is no stopper, but it can be an improvement done in
>> future.
>>
> Sure, will look into it in the second phase.
>
>
>>
>>> Thanks,
>>> Khushboo
>>>
>>>>
>>>> On Fri, Dec 20, 2019 at 6:59 PM Akshay Joshi <
>>>> [email protected]> wrote:
>>>>
>>>>> Hi Hackers,
>>>>>
>>>>> Attached is the implementation of the new feature Schema Diff Tool.
>>>>> Initial work(backend code to compare the objects) has been done by me and
>>>>> then most of the task has been completed by *Khushboo Vashi. *Sending
>>>>> the patch on behalf of her*.*
>>>>>
>>>>> Currently, this tool only supports Tables, Views, Materialized Views,
>>>>> Functions and Procedures node.
>>>>>
>>>>> Please review and test it thoroughly. Suggestions are welcome to
>>>>> improve the tool.
>>>>>
>>>>> --
>>>>> *Thanks & Regards*
>>>>> *Akshay Joshi*
>>>>>
>>>>> *Sr. Software Architect*
>>>>> *EnterpriseDB Software India Private Limited*
>>>>> *Mobile: +91 976-788-8246*
>>>>>
>>>>
>>>>
>>>> --
>>>> Thanks and Regards,
>>>> Aditya Toshniwal
>>>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune
>>>> "Don't Complain about Heat, Plant a TREE"
>>>>
>>>
>>
>> --
>> Thanks and Regards,
>> Aditya Toshniwal
>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune
>> "Don't Complain about Heat, Plant a TREE"
>>
>
--
Thanks and Regards,
Aditya Toshniwal
pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune
"Don't Complain about Heat, Plant a TREE"
Attachments:
[image/png] Screenshot 2019-12-27 at 12.18.00.png (47.9K, 3-Screenshot%202019-12-27%20at%2012.18.00.png)
download | view image
[image/png] Screenshot 2019-12-27 at 16.40.47.png (395.3K, 4-Screenshot%202019-12-27%20at%2016.40.47.png)
download | view image
[image/png] compare_overlay.png (411.6K, 5-compare_overlay.png)
download | view image
^ permalink raw reply [nested|flat] 10+ messages in thread
* Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures
2019-12-20 13:29 [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Akshay Joshi <[email protected]>
2020-01-02 06:34 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Khushboo Vashi <[email protected]>
2020-01-02 09:13 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Aditya Toshniwal <[email protected]>
2020-01-02 09:38 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Khushboo Vashi <[email protected]>
@ 2020-01-08 06:06 ` Khushboo Vashi <[email protected]>
2020-01-10 10:13 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Akshay Joshi <[email protected]>
1 sibling, 1 reply; 10+ messages in thread
From: Khushboo Vashi @ 2020-01-08 06:06 UTC (permalink / raw)
To: Aditya Toshniwal <[email protected]>; +Cc: Chethana Kumar <[email protected]>; Akshay Joshi <[email protected]>; pgadmin-hackers
Hi,
Please find the attached updated patch.
- The Generate Icon has been changed to
https://fontawesome.com/v4.7.0/icon/file-code-o .
Thanks,
Khushboo
On Thu, Jan 2, 2020 at 3:08 PM Khushboo Vashi <
[email protected]> wrote:
>
>
> On Thu, Jan 2, 2020 at 2:43 PM Aditya Toshniwal <
> [email protected]> wrote:
>
>> Hi Khushboo,
>>
>> On Thu, Jan 2, 2020 at 12:04 PM Khushboo Vashi <
>> [email protected]> wrote:
>>
>>> Hi Aditya,
>>>
>>> Thanks for the review. Please find the inline response.
>>> Also, the updated patch attached.
>>>
>>> On Fri, Dec 27, 2019 at 4:55 PM Aditya Toshniwal <
>>> [email protected]> wrote:
>>>
>>>> Hi Akshay/Khushboo,
>>>>
>>>> I have few suggestions/questions for the attached patch:
>>>>
>>>> 1. Code like SchemaDiffRegistry('server', ServerNode) should be
>>>> replaced with SSchemaDiffRegistry(ServerModule.NODE_TYPE, ServerNode)
>>>>
>>>> Done
>>>
>>>>
>>>> 1. The variables return_ajax_response, only_sql, json_resp as far
>>>> as I understood are similar. Can we have same var name everywhere ?
>>>>
>>>> only_sql is used when I need only SQL but not to be executed in the
>>> backend. json_resp is used to have the plain text/json response.
>>>
>>>>
>>>> 1. Remove commented code -
>>>> web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
>>>> -> get_sql_from_table_diff
>>>>
>>>> Done
>>>
>>>>
>>>> 1. In
>>>> web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
>>>> -> fetch_tables - keys_to_remove is passed. How is it different from
>>>> keys_to_ignore used at other places ?
>>>>
>>>> keys_to_remove used to remove the table properties before comparison as
>>> we combine all child nodes of the table while comparing and keys_to_ignore
>>> is to ignore the keys while comparing. We have also used the keys_to_ignore
>>> in the table node itself.
>>>
>>>>
>>>> 1. web/pgadmin/tools/schema_diff/__init__.py
>>>> -> check_version_compatibility has hardcoded version numbers. Can we
>>>> use get_version_mapping_directories from
>>>> web/pgadmin/utils/versioned_template_loader.py ?
>>>>
>>>> I have checked the possibilities before using it in the schema diff.
>>> The * purpose and the return values * are different for both the files.
>>>
>> The return value can be taken and tweaked to fit your purpose. If let's
>> say a new version of Postgres is released then that also need to be added
>> in schema diff along with get_version_mapping_directories. That would
>> not be the case if you use get_version_mapping_directories.
>>
> I can do one thing, will take the versions dict at one place and both the
> functions get_version_mapping_directories and schema_diff can use that
> version dict.
> As, I am not in favour of tweaking get_version_mapping_directories
> function as the name suggests something else.
>
I have changed the logic for the version comparison, so now no need to hard
code the version values and no need to change the existing code.
>
>>>> 1. Rename .reallyHidden to .really-hidden
>>>>
>>>> Done
>>>
>>>>
>>>> 1. CSS class #schema-diff-grid -> background: white; - hardcoded
>>>> color can be changed to use $color-bg instead. Also use rem or px for -
>>>> font-size: 9pt.
>>>>
>>>> Done
>>>
>>>>
>>>> 1.
>>>> 2. .slick-group-toggle.collapsed, .slick-group-toggle.expanded -
>>>> svgs are not required. Font awesome has the icons. refer - .obj_properties
>>>> .collapsed .caret::before.
>>>>
>>>> Done
>>>
>>>>
>>>> 1.
>>>> 2. In
>>>> web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js ->
>>>> formatNode - Appends can be avoided and formed in a single statement.
>>>> + } else {
>>>> + return $('<span></span>').append(
>>>> + $('<span></span>', {
>>>> + class: 'wcTabIcon ' + optimage,
>>>> + })
>>>> + ).append($('<span></span>').text(opt.text));
>>>> + }
>>>> +};
>>>>
>>>> Any harm in this approach?
>>>
>> Obviously the extra append operations, which can be avoided.
>>
> Yeah, right but I don't think it is going to be a performance issue.
>
>>
>>>> 1.
>>>> 2. In
>>>> web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js
>>>> -> fetchData - We should not use async = false.
>>>> + $.ajax({
>>>> + async: false,
>>>> + url: url,
>>>> + })
>>>>
>>>> This is pending.
>>
> It's not pending, I left it as it is, as I have copied this code from
> backform.pgadmin.js and tweaked it accordingly, as we already cleaned up
> the async: false in the past but this has not been changed. So, before
> changing it, we need to analyse why we have not changed it.
>
>>
>>>> 1. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js -
>>>> Use 'sources/window' - pgWindow.
>>>>
>>>>
>>>> 1. + let preferences = (window.opener !== null) ?
>>>> window.opener.pgAdmin.Browser.get_preferences_for_module('schema_diff') :
>>>> window.top.pgAdmin.Browser.get_preferences_for_module('schema_diff');
>>>>
>>>> Done
>>>
>>>>
>>>> 1. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js -
>>>> Use map instead of for loop. It will also remove the sel_rows_data.push.
>>>> will be helpfull in large data.
>>>> + for (var row = 0; row < sel_rows.length; row++) {
>>>> + let data = self.grid.getData().getItem(sel_rows[row]);
>>>> +
>>>> + if (data.type) {
>>>> + let tmp_data = {
>>>> + 'node_type': data.type,
>>>> + 'source_oid': parseInt(data.oid, 10),
>>>> + 'target_oid': parseInt(data.oid, 10),
>>>> + 'comp_status': data.status,
>>>> + };
>>>> +
>>>> + if(data.status && (data.status.toLowerCase() ==
>>>> 'different' || data.status.toLowerCase() == 'identical')) {
>>>> + tmp_data['target_oid'] = data.target_oid;
>>>> + }
>>>> + sel_rows_data.push(tmp_data);
>>>> + }
>>>> + }
>>>> +
>>>> + url_params['sel_rows'] = sel_rows_data;
>>>>
>>>> This is a debatable topic as there are pros and cons of both map and
>>> for loop. Like, it's more readable if we use map and in case of for loop,
>>> chrome and firefox will be more happy in terms of performance.
>>>
>> I'm not comparing "map" and "for" here. I'm trying to avoid
>> sel_rows_data.push statement here which is directly proportional to the
>> number of selected rows.
>>
> At the end, it will return the new array according to the condition in
> both the cases.
>
>>
>>>> 1.
>>>> 2. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js
>>>> -Are we doing anything to handle failure.
>>>> + connect_database(server_id, db_id, callback) {
>>>> + var url = url_for('schema_diff.connect_database', {'sid':
>>>> server_id, 'did': db_id});
>>>> + $.post(url)
>>>> + .done(function(res) {
>>>> + if (res.success && res.data) {
>>>> + callback(res.data);
>>>> + }
>>>> + })
>>>> + .fail(function() {
>>>> + // Fail
>>>> + });
>>>> +
>>>> + }
>>>>
>>>> Forgot to handle, now added.
>>>
>>>>
>>>> 1.
>>>> 2. As you've added a completely different function for
>>>> connect_server, I would suggest to rename dlgServerPass to a different name
>>>> to avoid conflict with existing dlgServerPass in server.js
>>>> + if (!Alertify.dlgServerPass) {
>>>> + Alertify.dialog('dlgServerPass', function factory() {
>>>>
>>>> As we open the schema diff in different frame, I think, this should not
>>> be the issue.
>>>
>>>>
>>>> 1.
>>>> 2. Generate script does not work if pgAdmin opened in iframe.
>>>> Iframes are used by tools like Katacoda.
>>>> [image: Screenshot 2019-12-27 at 16.40.47.png]
>>>>
>>>> Fixed, good catch.
>>>
>>>>
>>>> 1.
>>>> 2. Comparing objects loader is not attached to DDL Comparison panel.
>>>> [image: compare_overlay.png]
>>>>
>>>> Fixed.
>>>
>>>>
>>>> 1.
>>>> 2. Filter icon and Generate script icon size are different. Also
>>>> change icons CSS to use font-icon. You can refer icons from sqleditor.
>>>> [image: Screenshot 2019-12-27 at 12.18.00.png]
>>>>
>>>> The problem is, for the generate script icon, I have used the svg (as
>>> no similar icon in font-awesome) whereas for Filter, font-awesome is used.
>>> I can replace the Generate Script icon from font-awesome (can search for
>>> some similar icon) if Chetana agrees.
>>>
>> @Chethana Kumar <[email protected]> , please have a look.
>>>
>>> https://fontawesome.com/v4.7.0/icon/file-code-o
>>> https://fontawesome.com/v4.7.0/icon/file-text-o
>>>
>>>>
>>>> 1.
>>>>
>>>> *The fetch_objects_to_compare function used in each node uses loop to
>>>> fetch data. Although it is working for now, but I would suggest using bulk
>>>> fetch nodes instead of looping through all the nodes one by one.*
>>>>
>>>
>>> Can you please elaborate the approach which you are suggesting?
>>>
>> The fetch_objects_to_compare function fetches all the nodes first, and
>> then in a loop the properties for each node is fetched. Instead of that,
>> all the nodes along with their properties can be fetched in one go from the
>> database. Although this is no stopper, but it can be an improvement done in
>> future.
>>
> Sure, will look into it in the second phase.
>
>
>>
>>> Thanks,
>>> Khushboo
>>>
>>>>
>>>> On Fri, Dec 20, 2019 at 6:59 PM Akshay Joshi <
>>>> [email protected]> wrote:
>>>>
>>>>> Hi Hackers,
>>>>>
>>>>> Attached is the implementation of the new feature Schema Diff Tool.
>>>>> Initial work(backend code to compare the objects) has been done by me and
>>>>> then most of the task has been completed by *Khushboo Vashi. *Sending
>>>>> the patch on behalf of her*.*
>>>>>
>>>>> Currently, this tool only supports Tables, Views, Materialized Views,
>>>>> Functions and Procedures node.
>>>>>
>>>>> Please review and test it thoroughly. Suggestions are welcome to
>>>>> improve the tool.
>>>>>
>>>>> --
>>>>> *Thanks & Regards*
>>>>> *Akshay Joshi*
>>>>>
>>>>> *Sr. Software Architect*
>>>>> *EnterpriseDB Software India Private Limited*
>>>>> *Mobile: +91 976-788-8246*
>>>>>
>>>>
>>>>
>>>> --
>>>> Thanks and Regards,
>>>> Aditya Toshniwal
>>>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune
>>>> "Don't Complain about Heat, Plant a TREE"
>>>>
>>>
>>
>> --
>> Thanks and Regards,
>> Aditya Toshniwal
>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune
>> "Don't Complain about Heat, Plant a TREE"
>>
>
Attachments:
[image/png] Screenshot 2019-12-27 at 12.18.00.png (47.9K, 3-Screenshot%202019-12-27%20at%2012.18.00.png)
download | view image
[image/png] Screenshot 2019-12-27 at 16.40.47.png (395.3K, 4-Screenshot%202019-12-27%20at%2016.40.47.png)
download | view image
[image/png] compare_overlay.png (411.6K, 5-compare_overlay.png)
download | view image
[application/octet-stream] RM_3452_v3.patch (2.7M, 6-RM_3452_v3.patch)
download | inline diff:
diff --git a/LICENSE b/LICENSE
index 203e6d85a..02193a258 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
pgAdmin 4
-Copyright (C) 2013 - 2020, The pgAdmin Development Team
+Copyright (C) 2013 - 2019, The pgAdmin Development Team
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose, without fee, and without a written agreement is
diff --git a/docs/en_US/code_review.rst b/docs/en_US/code_review.rst
index c179bdc72..c02398bb0 100644
--- a/docs/en_US/code_review.rst
+++ b/docs/en_US/code_review.rst
@@ -16,7 +16,7 @@ review process for any patches submitted for inclusion in pgAdmin.
bulk updates every year). The start date should always be 2013, and the end year
the current year, e.g.
- Copyright (C) 2013 - 2020, The pgAdmin Development Team
+ Copyright (C) 2013 - 2019, The pgAdmin Development Team
* Ensure there's a blank line immediately following any copyright headers.
diff --git a/docs/en_US/coding_standards.rst b/docs/en_US/coding_standards.rst
index bd61efe0c..30f42f132 100644
--- a/docs/en_US/coding_standards.rst
+++ b/docs/en_US/coding_standards.rst
@@ -170,7 +170,7 @@ with the required file header is shown below::
#
# pgAdmin 4 - PostgreSQL Tools
#
- # Copyright (C) 2013 - 2020, The pgAdmin Development Team
+ # Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/docs/en_US/container_deployment.rst b/docs/en_US/container_deployment.rst
index 76ad91773..b6c1e81df 100644
--- a/docs/en_US/container_deployment.rst
+++ b/docs/en_US/container_deployment.rst
@@ -122,17 +122,6 @@ instances.
sudo chown -R 5050:5050 <host_directory>
- On some filesystems that do not support extended attributes, it may not be
- possible to run pgAdmin without specifying a value for *PGADMIN_LISTEN_PORT*
- that is greater than 1024. In such cases, specify an alternate port when
- launching the container by adding the environment variable, for example:
-
- .. code-block:: bash
-
- -e 'PGADMIN_LISTEN_PORT=5050'
-
- Don't forget to adjust any host-container port mapping accordingly.
-
**/var/lib/pgadmin**
This is the working directory in which pgAdmin stores session data, user files,
diff --git a/docs/en_US/licence.rst b/docs/en_US/licence.rst
index e020a17a3..9b38017d4 100644
--- a/docs/en_US/licence.rst
+++ b/docs/en_US/licence.rst
@@ -13,7 +13,7 @@ documentation is attributed to the
.. topic:: pgAdmin 4
- Copyright (C) 2013 - 2020, The pgAdmin Development Team
+ Copyright (C) 2013 - 2019, The pgAdmin Development Team
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose, without fee, and without a written agreement is
diff --git a/docs/en_US/release_notes_4_17.rst b/docs/en_US/release_notes_4_17.rst
index 4d425d89b..74feab25b 100644
--- a/docs/en_US/release_notes_4_17.rst
+++ b/docs/en_US/release_notes_4_17.rst
@@ -10,30 +10,25 @@ New features
************
| `Issue #4764 <https://redmine.postgresql.org/issues/4764>`_ - Allow screen-reader to read relationship attributes in nested elements.
-| `Issue #5060 <https://redmine.postgresql.org/issues/5060>`_ - Ensure all binaries are securely signed and linked with the hardened runtime in the macOS bundle
Housekeeping
************
| `Issue #4988 <https://redmine.postgresql.org/issues/4988>`_ - Refactored SQL of Table's and it's child nodes.
+| `Issue #5017 <https://redmine.postgresql.org/issues/5017>`_ - Use cheroot as default production server for pgAdmin4.
| `Issue #5023 <https://redmine.postgresql.org/issues/5023>`_ - Refactored SQL of Views and Materialized Views.
| `Issue #5024 <https://redmine.postgresql.org/issues/5024>`_ - Refactored SQL of Functions and Procedures.
| `Issue #5038 <https://redmine.postgresql.org/issues/5038>`_ - Added support for on-demand loading of items in Select2.
-| `Issue #5048 <https://redmine.postgresql.org/issues/5048>`_ - Added code coverage tool for pgAdmin.
Bug fixes
*********
| `Issue #4198 <https://redmine.postgresql.org/issues/4198>`_ - Fix syntax highlighting in code mirror for backslash and escape constant.
| `Issue #4506 <https://redmine.postgresql.org/issues/4506>`_ - Fix an issue where clicking on an empty textbox like fill factor or comments, considers it as change and enabled the save button.
-| `Issue #4633 <https://redmine.postgresql.org/issues/4633>`_ - Added support to view multilevel partitioned tables.
| `Issue #4842 <https://redmine.postgresql.org/issues/4842>`_ - Ensure that constraints, indexes, rules, triggers, and compound triggers should be created on partitions.
| `Issue #4943 <https://redmine.postgresql.org/issues/4943>`_ - Added more information to the 'Database connected/disconnected' message.
-| `Issue #4950 <https://redmine.postgresql.org/issues/4950>`_ - Ensure that the user should be able to select/modify tablespace for the partitioned table on v12 and above.
| `Issue #4999 <https://redmine.postgresql.org/issues/4999>`_ - Rename some internal environment variables that could conflict with Kubernetes.
| `Issue #5004 <https://redmine.postgresql.org/issues/5004>`_ - Fix vulnerability issues reported by 'yarn audit'. Replace the deprecated uglifyjs-webpack-plugin with a terser-webpack-plugin.
| `Issue #5008 <https://redmine.postgresql.org/issues/5008>`_ - Ensure that the error message should not be displayed if Tablespace is not selected while creating the index.
| `Issue #5009 <https://redmine.postgresql.org/issues/5009>`_ - Fix an issue where operator, access method and operator class is not visible for exclusion constraints.
-| `Issue #5013 <https://redmine.postgresql.org/issues/5013>`_ - Add a note to the documentation about the use of non-privileged ports on filesystems that don't support extended attributes when running the container.
| `Issue #5047 <https://redmine.postgresql.org/issues/5047>`_ - Added tab navigation for tabs under explain panel in query tool.
-| `Issue #5068 <https://redmine.postgresql.org/issues/5068>`_ - Fix an issue where the table is not created with autovacuum_enabled and toast.autovacuum_enabled for PG/EPAS 12.
\ No newline at end of file
diff --git a/pkg/mac/build.sh b/pkg/mac/build.sh
index c8b443b70..2e6c574aa 100755
--- a/pkg/mac/build.sh
+++ b/pkg/mac/build.sh
@@ -223,22 +223,6 @@ _framework_config() {
./framework-config.sh "${BUILDROOT}/${APP_BUNDLE_NAME}" || { echo "framework-config.sh failed"; exit 1; }
}
-_codesign_binaries() {
- cd ${SOURCEDIR}/pkg/mac
-
- if [ ! -f codesign.conf ]; then
- echo
- echo "******************************************************************"
- echo "* codesign.conf not found. NOT signing the binaries."
- echo "******************************************************************"
- echo
- sleep 5
- return
- fi
-
- ./codesign-binaries.sh "${BUILDROOT}/${APP_BUNDLE_NAME}" || { echo codesign-binaries.sh failed; exit 1; }
-}
-
_codesign_bundle() {
cd ${SOURCEDIR}/pkg/mac
@@ -284,7 +268,6 @@ _build_runtime || { echo Runtime build failed; exit 1; }
_build_doc
_complete_bundle
_framework_config
-_codesign_binaries
_codesign_bundle
_create_dmg
_codesign_dmg
diff --git a/pkg/mac/codesign-binaries.sh b/pkg/mac/codesign-binaries.sh
deleted file mode 100755
index 4bd00b4a6..000000000
--- a/pkg/mac/codesign-binaries.sh
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/bin/sh
-
-BUNDLE="$1"
-
-if ! test -d "${BUNDLE}" ; then
- echo "${BUNDLE} is no bundle!" >&2
- exit 1
-fi
-
-# Get the config
-source codesign.conf
-
-if [ -z "${DEVELOPER_ID}" ] ; then
- echo "Developer ID Application not found in codesign.conf" >&2
- exit 1
-fi
-
-if [ -z "${DEVELOPER_BUNDLE_ID}" ]; then
- echo "Developer Bundle Identifier not found in codesign.conf" >&2
-fi
-
-echo Signing ${BUNDLE} binaries
-IFS=$'\n'
-for i in $(find "${BUNDLE}" -type f)
-do
- file "${i}" | grep -E "Mach-O executable|Mach-O 64-bit executable|Mach-O 64-bit bundle"
- if [ $? -eq 0 ] ; then
- codesign --deep -f -i "${DEVELOPER_BUNDLE_ID}" -s "${DEVELOPER_ID}" --options runtime ${i}
- fi
-done
-
-echo Signing ${BUNDLE} libraries
-for i in $(find "${BUNDLE}" -type f -name "*.dylib*")
-do
- codesign --deep -f -i "${DEVELOPER_BUNDLE_ID}" -s "${DEVELOPER_ID}" --options runtime ${i}
-done
-
diff --git a/pkg/mac/codesign.conf.in b/pkg/mac/codesign.conf.in
index a0b2077b3..9951ee947 100644
--- a/pkg/mac/codesign.conf.in
+++ b/pkg/mac/codesign.conf.in
@@ -2,4 +2,3 @@
# codesign.conf, and edit the value below to reflect your developer ID
DEVELOPER_ID="Developer ID Application: My Name (12345ABCD)"
-DEVELOPER_BUNDLE_ID="Developer Bundle Identifier (pgadmin4-4)"
diff --git a/pkg/mac/licence.rtf b/pkg/mac/licence.rtf
index 0f1f119f7..1b51b6c86 100644
--- a/pkg/mac/licence.rtf
+++ b/pkg/mac/licence.rtf
@@ -10,7 +10,7 @@
\fs22 \
\
-\f1\i Copyright (C) 2013 - 2020, The pgAdmin Development Team
+\f1\i Copyright (C) 2013 - 2019, The pgAdmin Development Team
\f0\i0 \
\
Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written agreement is hereby granted, provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies.\
diff --git a/pkg/pip/build.sh b/pkg/pip/build.sh
index 8a6eefe8a..7ad11ad01 100755
--- a/pkg/pip/build.sh
+++ b/pkg/pip/build.sh
@@ -4,7 +4,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
#########################################################################
diff --git a/pkg/pip/setup_pip.py b/pkg/pip/setup_pip.py
index a616fb6bb..81f90a449 100644
--- a/pkg/pip/setup_pip.py
+++ b/pkg/pip/setup_pip.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/pkg/src/build.sh b/pkg/src/build.sh
index 85d60a194..1f623a371 100755
--- a/pkg/src/build.sh
+++ b/pkg/src/build.sh
@@ -4,7 +4,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
#########################################################################
diff --git a/pkg/win32/Resources/license.rtf b/pkg/win32/Resources/license.rtf
index 75e4389c2a614f99e8e912a491179f24f117add3..53d95acd53fb40f47dc875bafafb7194321ccf50 100644
GIT binary patch
delta 13
UcmaFI`HpkKb0$N}jW1bQ04qrabpQYW
delta 13
UcmaFI`HpkKb0#B$jW1bQ04pK|Z2$lO
diff --git a/requirements.txt b/requirements.txt
index dae5436d6..b2e00d610 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -15,6 +15,7 @@
# ignored when building a PIP Wheel.
##############################################################################
blinker==1.4
+cheroot==8.2.1
Flask==1.0.2
Werkzeug>=0.15.0
Flask-Gravatar==0.5.0
diff --git a/runtime/ConfigWindow.cpp b/runtime/ConfigWindow.cpp
index 275d6b440..3368067cb 100644
--- a/runtime/ConfigWindow.cpp
+++ b/runtime/ConfigWindow.cpp
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// ConfigWindow.h - Configuration window
diff --git a/runtime/ConfigWindow.h b/runtime/ConfigWindow.h
index ed948d603..91af88493 100644
--- a/runtime/ConfigWindow.h
+++ b/runtime/ConfigWindow.h
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// ConfigWindow.h - Configuration window
diff --git a/runtime/FloatingWindow.cpp b/runtime/FloatingWindow.cpp
index 6e2f2348a..6235cb40d 100644
--- a/runtime/FloatingWindow.cpp
+++ b/runtime/FloatingWindow.cpp
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// FloatingWindow.cpp - For GNOME 3.26 and above floating window will be used.
diff --git a/runtime/FloatingWindow.h b/runtime/FloatingWindow.h
index 8b91bf5ce..51d3b8de7 100644
--- a/runtime/FloatingWindow.h
+++ b/runtime/FloatingWindow.h
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// FloatingWindow.h - For GNOME 3.26 and above floating window will be used.
diff --git a/runtime/Info.plist b/runtime/Info.plist
index 0621dcde0..b670eeec8 100644
--- a/runtime/Info.plist
+++ b/runtime/Info.plist
@@ -8,13 +8,13 @@
<key>CFBundleName</key>
<string>pgAdmin 4</string>
<key>CFBundleShortVersionString</key>
- <string>4.17.0</string>
+ <string>4.16.0</string>
<key>CFBundleVersion</key>
- <string>4.17.0</string>
+ <string>4.16.0</string>
<key>LSMinimumSystemVersion</key>
<string>10.10</string>
<key>NSHumanReadableCopyright</key>
- <string>Copyright (C) 2013 - 2020, The pgAdmin Development Team</string>
+ <string>Copyright (C) 2013 - 2019, The pgAdmin Development Team</string>
<key>CFBundleIconFile</key>
<string>@ICON@</string>
<key>CFBundlePackageType</key>
diff --git a/runtime/LogWindow.cpp b/runtime/LogWindow.cpp
index 4d9d6962e..d64ac266c 100644
--- a/runtime/LogWindow.cpp
+++ b/runtime/LogWindow.cpp
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// LogWindow.cpp - Log viewer window
diff --git a/runtime/LogWindow.h b/runtime/LogWindow.h
index 5f7bc8633..4f088b996 100644
--- a/runtime/LogWindow.h
+++ b/runtime/LogWindow.h
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// LogWindow.h - Log viewer window
diff --git a/runtime/Logger.cpp b/runtime/Logger.cpp
index acd9f5dcb..e227f97ee 100644
--- a/runtime/Logger.cpp
+++ b/runtime/Logger.cpp
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// Logger.cpp - Logger Utility
diff --git a/runtime/Logger.h b/runtime/Logger.h
index c97aa8832..71d78fb59 100644
--- a/runtime/Logger.h
+++ b/runtime/Logger.h
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// Logger.h - Logger Utility
diff --git a/runtime/MenuActions.cpp b/runtime/MenuActions.cpp
index 5115a429c..8c2bfcf5a 100644
--- a/runtime/MenuActions.cpp
+++ b/runtime/MenuActions.cpp
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// MenuActions.cpp - Common file for menu actions.
diff --git a/runtime/MenuActions.h b/runtime/MenuActions.h
index 2d9403712..6557de388 100644
--- a/runtime/MenuActions.h
+++ b/runtime/MenuActions.h
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// MenuActions.h - Common file for menu actions.
diff --git a/runtime/Server.cpp b/runtime/Server.cpp
index b8e924ae0..76ee95d6b 100644
--- a/runtime/Server.cpp
+++ b/runtime/Server.cpp
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// Server.cpp - Thread in which the web server will run.
diff --git a/runtime/Server.h b/runtime/Server.h
index 1094f84bd..37068dab9 100644
--- a/runtime/Server.h
+++ b/runtime/Server.h
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// Server.h - Thread in which the web server will run.
diff --git a/runtime/TrayIcon.cpp b/runtime/TrayIcon.cpp
index 9e583eac0..754585942 100644
--- a/runtime/TrayIcon.cpp
+++ b/runtime/TrayIcon.cpp
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// TrayIcon.cpp - Manages the tray icon
diff --git a/runtime/TrayIcon.h b/runtime/TrayIcon.h
index 5c84e414b..d317d30e1 100644
--- a/runtime/TrayIcon.h
+++ b/runtime/TrayIcon.h
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// TrayIcon.h - Manages the tray icon
diff --git a/runtime/pgAdmin4.cpp b/runtime/pgAdmin4.cpp
index e4d164bb7..4d03eca86 100644
--- a/runtime/pgAdmin4.cpp
+++ b/runtime/pgAdmin4.cpp
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// pgAdmin4.cpp - Main application entry point
diff --git a/runtime/pgAdmin4.h b/runtime/pgAdmin4.h
index 96efdd8de..b7c76dd33 100644
--- a/runtime/pgAdmin4.h
+++ b/runtime/pgAdmin4.h
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// pgAdmin4.h - Main application header
diff --git a/runtime/pgAdmin4.pro b/runtime/pgAdmin4.pro
index 9947fbc69..00002d858 100644
--- a/runtime/pgAdmin4.pro
+++ b/runtime/pgAdmin4.pro
@@ -1,8 +1,8 @@
-VERSION = 4.17.0.0
+VERSION = 4.16.0.0
QMAKE_TARGET_COMPANY = "The pgAdmin Development Team"
QMAKE_TARGET_PRODUCT = "pgAdmin 4"
QMAKE_TARGET_DESCRIPTION = "pgAdmin 4 Desktop Runtime"
-QMAKE_TARGET_COPYRIGHT = "Copyright (C) 2013 - 2020, The pgAdmin Development Team"
+QMAKE_TARGET_COPYRIGHT = "Copyright (C) 2013 - 2019, The pgAdmin Development Team"
# Configure QT modules for the appropriate version of QT
greaterThan(QT_MAJOR_VERSION, 4) {
diff --git a/tools/copyright_updater.py b/tools/copyright_updater.py
index 4af08aa1b..4ab8540e7 100644
--- a/tools/copyright_updater.py
+++ b/tools/copyright_updater.py
@@ -4,7 +4,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/tools/dependency_inventory.py b/tools/dependency_inventory.py
index ef6938910..c2f493382 100644
--- a/tools/dependency_inventory.py
+++ b/tools/dependency_inventory.py
@@ -4,7 +4,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/tools/get_chromedriver.py b/tools/get_chromedriver.py
index 48c6cc131..dfd62afe3 100644
--- a/tools/get_chromedriver.py
+++ b/tools/get_chromedriver.py
@@ -4,7 +4,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/tools/sql_keywords.py b/tools/sql_keywords.py
index 9f1d466c2..1c9eba3f3 100644
--- a/tools/sql_keywords.py
+++ b/tools/sql_keywords.py
@@ -4,7 +4,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/.eslintrc.js b/web/.eslintrc.js
index 795c8bcd0..a9d7437fd 100644
--- a/web/.eslintrc.js
+++ b/web/.eslintrc.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/config.py b/web/config.py
index f24373e4a..416454f6e 100644
--- a/web/config.py
+++ b/web/config.py
@@ -4,7 +4,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
# config.py - Core application configuration settings
@@ -51,7 +51,7 @@ APP_ICON = 'pg-icon'
# Application version number components
APP_RELEASE = 4
-APP_REVISION = 17
+APP_REVISION = 16
# Application version suffix, e.g. 'beta1', 'dev'. Usually an empty string
# for GA releases.
@@ -60,7 +60,7 @@ APP_SUFFIX = ''
# Numeric application version for upgrade checks. Should be in the format:
# [X]XYYZZ, where X is the release version, Y is the revision, with a leading
# zero if needed, and Z represents the suffix, with a leading zero if needed
-APP_VERSION_INT = 41700
+APP_VERSION_INT = 41600
# DO NOT CHANGE!
# The application version string, constructed from the components
@@ -71,7 +71,7 @@ else:
# Copyright string for display in the app
# Any changes made here must also be made in runtime/pgAdmin4.pro
-APP_COPYRIGHT = 'Copyright (C) 2013 - 2020, The pgAdmin Development Team'
+APP_COPYRIGHT = 'Copyright (C) 2013 - 2019, The pgAdmin Development Team'
##########################################################################
# Misc stuff
diff --git a/web/karma.conf.js b/web/karma.conf.js
index f41512575..9ed1be861 100644
--- a/web/karma.conf.js
+++ b/web/karma.conf.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/migrations/alembic.ini b/web/migrations/alembic.ini
index 68e529342..7755852db 100644
--- a/web/migrations/alembic.ini
+++ b/web/migrations/alembic.ini
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/migrations/env.py b/web/migrations/env.py
index 15f6c3c5b..c2145ab71 100644
--- a/web/migrations/env.py
+++ b/web/migrations/env.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/migrations/script.py.mako b/web/migrations/script.py.mako
index c8b4c12d3..eadf9cc40 100644
--- a/web/migrations/script.py.mako
+++ b/web/migrations/script.py.mako
@@ -2,7 +2,7 @@
##
## pgAdmin 4 - PostgreSQL Tools
##
-## Copyright (C) 2013 - 2020, The pgAdmin Development Team
+## Copyright (C) 2013 - 2019, The pgAdmin Development Team
## This software is released under the PostgreSQL Licence
##
##########################################################################
diff --git a/web/migrations/versions/02b9dccdcfcb_.py b/web/migrations/versions/02b9dccdcfcb_.py
index 185eb2156..613772a02 100644
--- a/web/migrations/versions/02b9dccdcfcb_.py
+++ b/web/migrations/versions/02b9dccdcfcb_.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/migrations/versions/09d53fca90c7_.py b/web/migrations/versions/09d53fca90c7_.py
index 55678c882..a9d696d93 100644
--- a/web/migrations/versions/09d53fca90c7_.py
+++ b/web/migrations/versions/09d53fca90c7_.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/migrations/versions/aa86fb60b73d_.py b/web/migrations/versions/aa86fb60b73d_.py
index 1581af4c5..df369da36 100644
--- a/web/migrations/versions/aa86fb60b73d_.py
+++ b/web/migrations/versions/aa86fb60b73d_.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/migrations/versions/b5b87fdfcb30_.py b/web/migrations/versions/b5b87fdfcb30_.py
index 124606fc9..fdb2a8d9c 100644
--- a/web/migrations/versions/b5b87fdfcb30_.py
+++ b/web/migrations/versions/b5b87fdfcb30_.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/migrations/versions/ca00ec32581b_.py b/web/migrations/versions/ca00ec32581b_.py
index cd6bf6877..a20b90426 100644
--- a/web/migrations/versions/ca00ec32581b_.py
+++ b/web/migrations/versions/ca00ec32581b_.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/migrations/versions/ece2e76bf60e_.py b/web/migrations/versions/ece2e76bf60e_.py
index 2142f65f8..a91abdd56 100644
--- a/web/migrations/versions/ece2e76bf60e_.py
+++ b/web/migrations/versions/ece2e76bf60e_.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/migrations/versions/fdc58d9bd449_.py b/web/migrations/versions/fdc58d9bd449_.py
index b9906c100..fdfc49413 100644
--- a/web/migrations/versions/fdc58d9bd449_.py
+++ b/web/migrations/versions/fdc58d9bd449_.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgAdmin4.py b/web/pgAdmin4.py
index 81ef6c396..5cfd61253 100644
--- a/web/pgAdmin4.py
+++ b/web/pgAdmin4.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -13,6 +13,7 @@ to start a web server."""
import os
import sys
+from cheroot.wsgi import Server as CherootServer
if sys.version_info[0] >= 3:
import builtins
@@ -190,15 +191,29 @@ if __name__ == '__main__':
# Reference:
# https://github.com/pallets/werkzeug/issues/220#issuecomment-11176538
try:
- app.run(
- host=config.DEFAULT_SERVER,
- port=server_port,
- use_reloader=(
- (not PGADMIN_RUNTIME) and app.debug and
- os.environ.get("WERKZEUG_RUN_MAIN") is not None
- ),
- threaded=config.THREADED_MODE
- )
-
+ if config.DEBUG:
+ app.run(
+ host=config.DEFAULT_SERVER,
+ port=server_port,
+ use_reloader=(
+ (not PGADMIN_RUNTIME) and app.debug and
+ os.environ.get("WERKZEUG_RUN_MAIN") is not None
+ ),
+ threaded=config.THREADED_MODE
+ )
+ else:
+ # Can use cheroot instead of flask dev server when not in debug
+ # 10 is default thread count in CherootServer
+ num_threads = 10 if config.THREADED_MODE else 1
+ prod_server = CherootServer(
+ (config.DEFAULT_SERVER, server_port),
+ wsgi_app=app,
+ numthreads=num_threads,
+ server_name=config.APP_NAME)
+ try:
+ print("Using production server...")
+ prod_server.start()
+ except KeyboardInterrupt:
+ prod_server.stop()
except IOError:
app.logger.error("Error starting the app server: %s", sys.exc_info())
diff --git a/web/pgAdmin4.wsgi b/web/pgAdmin4.wsgi
index cf3ad0c21..6daaefbeb 100644
--- a/web/pgAdmin4.wsgi
+++ b/web/pgAdmin4.wsgi
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/__init__.py b/web/pgadmin/__init__.py
index 820c8015a..f60ddf374 100644
--- a/web/pgadmin/__init__.py
+++ b/web/pgadmin/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/about/__init__.py b/web/pgadmin/about/__init__.py
index fd545b09e..18b634818 100644
--- a/web/pgadmin/about/__init__.py
+++ b/web/pgadmin/about/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/about/static/js/about.js b/web/pgadmin/about/static/js/about.js
index 5b711d4cc..9186f65c3 100644
--- a/web/pgadmin/about/static/js/about.js
+++ b/web/pgadmin/about/static/js/about.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/__init__.py b/web/pgadmin/browser/__init__.py
index 5aee341fd..63753c64e 100644
--- a/web/pgadmin/browser/__init__.py
+++ b/web/pgadmin/browser/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/collection.py b/web/pgadmin/browser/collection.py
index 309e914a5..658f23a42 100644
--- a/web/pgadmin/browser/collection.py
+++ b/web/pgadmin/browser/collection.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/register_browser_preferences.py b/web/pgadmin/browser/register_browser_preferences.py
index 09f472795..48857b202 100644
--- a/web/pgadmin/browser/register_browser_preferences.py
+++ b/web/pgadmin/browser/register_browser_preferences.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/__init__.py b/web/pgadmin/browser/server_groups/__init__.py
index e10c1949b..25addfd0e 100644
--- a/web/pgadmin/browser/server_groups/__init__.py
+++ b/web/pgadmin/browser/server_groups/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/__init__.py b/web/pgadmin/browser/server_groups/servers/__init__.py
index a93e70a86..9117a4cc4 100644
--- a/web/pgadmin/browser/server_groups/servers/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -28,6 +28,7 @@ from pgadmin.model import db, Server, ServerGroup, User
from pgadmin.utils.driver import get_driver
from pgadmin.utils.master_password import get_crypt_key
from pgadmin.utils.exception import CryptKeyMissing
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
from psycopg2 import Error as psycopg2_Error, OperationalError
@@ -1627,4 +1628,5 @@ class ServerNode(PGChildNodeView):
)
+SchemaDiffRegistry(blueprint.node_type, ServerNode)
ServerNode.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/__init__.py
index 29eb7721e..ca046d08c 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -30,6 +30,8 @@ from pgadmin.utils.ajax import make_json_response, \
make_response as ajax_response, internal_server_error, unauthorized
from pgadmin.utils.driver import get_driver
from pgadmin.tools.sqleditor.utils.query_history import QueryHistory
+
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
from pgadmin.model import Server
@@ -1111,4 +1113,5 @@ class DatabaseView(PGChildNodeView):
)
+SchemaDiffRegistry(blueprint.node_type, DatabaseView)
DatabaseView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/casts/__init__.py
index 582bac163..eec197e42 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/casts/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/casts/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/static/js/cast.js b/web/pgadmin/browser/server_groups/servers/databases/casts/static/js/cast.js
index bc266260a..711d3ad33 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/casts/static/js/cast.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/casts/static/js/cast.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/__init__.py
index d80fccdc6..be323b387 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/casts/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_add.py b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_add.py
index 19228afcb..b11c096b1 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_delete.py b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_delete.py
index d67273472..9afd37556 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_delete_multiple.py
index 6f4146b5f..87c3a76a8 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_get.py b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_get.py
index b168a7318..13b0141af 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_put.py b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_put.py
index 402e288eb..9d7321e0a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/utils.py
index 97b788850..f18b5d494 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/casts/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py
index 4206f47cf..6e2fd1a5a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js
index 8a9b5b71e..8f8c2ad8d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/__init__.py
index ed15d66bf..4ba0dafe9 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_add.py b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_add.py
index a671fd353..616dad5f6 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_delete.py b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_delete.py
index 8122c15a8..4882efe94 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_delete_multiple.py
index 8893b78a9..e4b8747a4 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_get.py b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_get.py
index fcd695803..695ce27da 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_put.py b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_put.py
index 467ceab1c..09bec020c 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/utils.py
index 1e147123f..ca9171764 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/extensions/__init__.py
index 525243add..89b1a1183 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/extensions/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/static/js/extension.js b/web/pgadmin/browser/server_groups/servers/databases/extensions/static/js/extension.js
index 3c6adddad..8fcb442f2 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/extensions/static/js/extension.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/static/js/extension.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/__init__.py
index dc2d34275..2a57f398e 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_add.py b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_add.py
index a18d4f223..23b538f46 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_delete.py b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_delete.py
index 03c897f4d..3f7f4559e 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_delete_multiple.py
index c9770eea5..a88b0a627 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_get.py b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_get.py
index baf2ae9f9..9b0e486dc 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_put.py b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_put.py
index 7f60d94db..e95c7f487 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/utils.py
index b0eb66020..9aa0d1b63 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/external_tables/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/external_tables/__init__.py
index 6bb6a415e..979d278d1 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/external_tables/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/external_tables/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/external_tables/mapping_utils.py b/web/pgadmin/browser/server_groups/servers/databases/external_tables/mapping_utils.py
index 53a472331..92388f73c 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/external_tables/mapping_utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/external_tables/mapping_utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/external_tables/properties.py b/web/pgadmin/browser/server_groups/servers/databases/external_tables/properties.py
index 88f20a15d..ec0221b90 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/external_tables/properties.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/external_tables/properties.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/external_tables/reverse_engineer_ddl.py b/web/pgadmin/browser/server_groups/servers/databases/external_tables/reverse_engineer_ddl.py
index 9daa2cce3..68df11795 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/external_tables/reverse_engineer_ddl.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/external_tables/reverse_engineer_ddl.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/external_tables/tests/test_external_tables_module.py b/web/pgadmin/browser/server_groups/servers/databases/external_tables/tests/test_external_tables_module.py
index 97e873ee0..a666aded2 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/external_tables/tests/test_external_tables_module.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/external_tables/tests/test_external_tables_module.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/external_tables/tests/test_external_tables_view.py b/web/pgadmin/browser/server_groups/servers/databases/external_tables/tests/test_external_tables_view.py
index 570767e7d..762c33ef2 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/external_tables/tests/test_external_tables_view.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/external_tables/tests/test_external_tables_view.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/external_tables/tests/test_mapping_utils.py b/web/pgadmin/browser/server_groups/servers/databases/external_tables/tests/test_mapping_utils.py
index 023be143f..84a141248 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/external_tables/tests/test_mapping_utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/external_tables/tests/test_mapping_utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/external_tables/tests/test_properties.py b/web/pgadmin/browser/server_groups/servers/databases/external_tables/tests/test_properties.py
index b8eed3696..989c95c6b 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/external_tables/tests/test_properties.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/external_tables/tests/test_properties.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/external_tables/tests/test_reverse_engineer_ddl.py b/web/pgadmin/browser/server_groups/servers/databases/external_tables/tests/test_reverse_engineer_ddl.py
index 2d41cb327..87c698ed6 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/external_tables/tests/test_reverse_engineer_ddl.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/external_tables/tests/test_reverse_engineer_ddl.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py
index 94ac89b0e..f9966975e 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/__init__.py
index 90487dff3..3ab1f4dd4 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/static/js/foreign_server.js b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/static/js/foreign_server.js
index 5ac9f0b34..e392cc413 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/static/js/foreign_server.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/static/js/foreign_server.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/__init__.py
index 088aadfd7..92cbd6a64 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_add.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_add.py
index 7b07e01f6..fc1b02eab 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_delete.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_delete.py
index e7ee2c90f..d7850331d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_delete_multiple.py
index a4074a430..6a0136276 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_get.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_get.py
index ee19b536e..880455c63 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_put.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_put.py
index b7a1cc663..003ad6f83 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/utils.py
index 596c95792..871944117 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/__init__.py
index ee7648fd4..ed7de23ac 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/static/js/user_mapping.js b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/static/js/user_mapping.js
index b7df1158c..b3b66f710 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/static/js/user_mapping.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/static/js/user_mapping.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/__init__.py
index c3aefd2e3..3a7590170 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/test_user_mapping_add.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/test_user_mapping_add.py
index a208f93e0..10321f139 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/test_user_mapping_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/test_user_mapping_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/test_user_mapping_delete.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/test_user_mapping_delete.py
index fbd9f98dd..9766d14f0 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/test_user_mapping_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/test_user_mapping_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/test_user_mapping_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/test_user_mapping_delete_multiple.py
index 726a9ba0d..2d046c8b1 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/test_user_mapping_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/test_user_mapping_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/test_user_mapping_get.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/test_user_mapping_get.py
index 980d58f0f..77a47c4c5 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/test_user_mapping_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/test_user_mapping_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/test_user_mapping_put.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/test_user_mapping_put.py
index f008442fc..92ba4f5d3 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/test_user_mapping_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/test_user_mapping_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/utils.py
index ef767fc8a..17a432818 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/static/js/foreign_data_wrapper.js b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/static/js/foreign_data_wrapper.js
index 6fd09f0bd..2fd5c915f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/static/js/foreign_data_wrapper.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/static/js/foreign_data_wrapper.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/__init__.py
index b4d9ce707..4d0c00d15 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_fdw_add.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_fdw_add.py
index ec6f09216..dec5df810 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_fdw_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_fdw_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_fdw_delete.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_fdw_delete.py
index f4fea98de..a5e95ef6d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_fdw_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_fdw_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_fdw_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_fdw_delete_multiple.py
index f707f0123..4b6d9213d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_fdw_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_fdw_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_fdw_get.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_fdw_get.py
index cd0212fab..b90033a13 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_fdw_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_fdw_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_fdw_put.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_fdw_put.py
index 238d98550..bfd47263a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_fdw_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_fdw_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/utils.py
index dac2ba209..b4fe00822 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/languages/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/languages/__init__.py
index 341743c57..2b03d5c60 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/languages/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/languages/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/languages/static/js/language.js b/web/pgadmin/browser/server_groups/servers/databases/languages/static/js/language.js
index 6ca60391d..0d7cea194 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/languages/static/js/language.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/languages/static/js/language.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/languages/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/__init__.py
index a69b8844c..58c1b3cf9 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/languages/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_add.py b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_add.py
index ed285477a..6ab8d731e 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_delete.py b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_delete.py
index 487595267..1354d6cbe 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_delete_multiple.py
index 95f8574e8..084e57a41 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_get.py b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_get.py
index f6a70c01d..405d5b870 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_put.py b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_put.py
index babf00a80..8df25bb5f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/languages/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/utils.py
index 660d2750c..6d8fa0a56 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/languages/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py
index 3d223f4f3..4ef560b61 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -23,6 +23,7 @@ from pgadmin.browser.utils import PGChildNodeView
from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone, bad_request
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
"""
This module is responsible for generating two nodes
@@ -1023,5 +1024,6 @@ It may have been removed by another user.
return ajax_response(response=SQL.strip("\n"))
+SchemaDiffRegistry(schema_blueprint.node_type, SchemaView)
SchemaView.register_node_view(schema_blueprint)
CatalogView.register_node_view(catalog_blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/__init__.py
index 1bf2a4af3..e56f488e5 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/columns/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/columns/__init__.py
index add698f6a..75bce58b7 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/columns/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/columns/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/columns/static/js/catalog_object_column.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/columns/static/js/catalog_object_column.js
index a9df3a7eb..1682b04d5 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/columns/static/js/catalog_object_column.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/columns/static/js/catalog_object_column.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/static/js/catalog_object.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/static/js/catalog_object.js
index 225934541..efdafbb96 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/static/js/catalog_object.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/static/js/catalog_object.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py
index 6611a52d8..fac184fd5 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -25,6 +25,8 @@ from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.compile_template_name import compile_template_path
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -92,7 +94,7 @@ class CollationModule(SchemaChildModule):
blueprint = CollationModule(__name__)
-class CollationView(PGChildNodeView):
+class CollationView(PGChildNodeView, SchemaDiffObjectCompare):
"""
This class is responsible for generating routes for Collation node
@@ -144,6 +146,10 @@ class CollationView(PGChildNodeView):
* dependent(gid, sid, did, scid):
- This function will generate dependent list to show it in dependent
pane for the selected Collation node.
+
+ * compare(**kwargs):
+ - This function will compare the collation nodes from two different
+ schemas.
"""
node_type = blueprint.node_type
@@ -172,7 +178,8 @@ class CollationView(PGChildNodeView):
'dependency': [{'get': 'dependencies'}],
'dependent': [{'get': 'dependents'}],
'get_collations': [{'get': 'get_collation'},
- {'get': 'get_collation'}]
+ {'get': 'get_collation'}],
+ 'compare': [{'get': 'compare'}, {'get': 'compare'}]
})
def check_precondition(f):
@@ -318,23 +325,36 @@ class CollationView(PGChildNodeView):
JSON of selected collation node
"""
+ status, res = self._fetch_properties(scid, coid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, coid):
+ """
+ This function fetch the properties for the specified object.
+
+ :param scid: Schema ID
+ :param coid: Collation ID
+ """
+
SQL = render_template("/".join([self.template_path,
'properties.sql']),
scid=scid, coid=coid)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(
- gettext("Could not find the collation object in the database.")
- )
+ return False, gone(gettext("Could not find the collation "
+ "object in the database."))
- return ajax_response(
- response=res['rows'][0],
- status=200
- )
+ return True, res['rows'][0]
@check_precondition
def get_collation(self, gid, sid, did, scid, coid=None):
@@ -748,5 +768,30 @@ class CollationView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the collations for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
CollationView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/static/js/collation.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/static/js/collation.js
index 5ee1a5787..407f82f08 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/static/js/collation.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/static/js/collation.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/__init__.py
index 1939f0989..b2e45097d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_add.py
index 68616b10d..63a879ba2 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_delete.py
index 57db8a323..c56d64769 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_delete_multiple.py
index 310a8e437..a68656e42 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_get.py
index 3c9dbed70..c9f64b730 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_put.py
index a4324bd4c..7466ffd61 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/utils.py
index 2259e7da2..0f28c4c35 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py
index 8de988ccf..6fdcace84 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -27,6 +27,8 @@ from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.compile_template_name import compile_template_path
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -79,7 +81,7 @@ class DomainModule(SchemaChildModule):
blueprint = DomainModule(__name__)
-class DomainView(PGChildNodeView, DataTypeReader):
+class DomainView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare):
"""
class DomainView
@@ -138,6 +140,10 @@ class DomainView(PGChildNodeView, DataTypeReader):
* types(gid, sid, did, scid, fnid=None):
- Returns Data Types.
+
+ * compare(**kwargs):
+ - This function will compare the domain nodes from two different
+ schemas.
"""
node_type = blueprint.node_type
@@ -169,7 +175,8 @@ class DomainView(PGChildNodeView, DataTypeReader):
'get_collations': [
{'get': 'get_collations'},
{'get': 'get_collations'}
- ]
+ ],
+ 'compare': [{'get': 'compare'}, {'get': 'compare'}]
})
def validate_request(f):
@@ -369,15 +376,31 @@ class DomainView(PGChildNodeView, DataTypeReader):
scid: Schema Id
doid: Domain Id
"""
+ status, res = self._fetch_properties(did, scid, doid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+ def _fetch_properties(self, did, scid, doid):
+ """
+ This function is used to fecth the properties of specified object.
+ :param did:
+ :param scid:
+ :param doid:
+ :return:
+ """
SQL = render_template("/".join([self.template_path, 'properties.sql']),
scid=scid, doid=doid)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(gettext("""
+ return False, gone(gettext("""
Could not find the domain in the database.
It may have been removed by another user or moved to another schema.
"""))
@@ -393,7 +416,7 @@ It may have been removed by another user or moved to another schema.
doid=doid)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
data['constraints'] = res['rows']
@@ -406,10 +429,7 @@ It may have been removed by another user or moved to another schema.
if doid <= self.manager.db_info[did]['datlastsysoid']:
data['sysdomain'] = True
- return ajax_response(
- response=data,
- status=200
- )
+ return True, data
def _parse_type(self, basetype):
"""
@@ -664,7 +684,7 @@ AND relkind != 'c'))"""
)
@check_precondition
- def sql(self, gid, sid, did, scid, doid=None):
+ def sql(self, gid, sid, did, scid, doid=None, return_ajax_response=True):
"""
Returns the SQL for the Domain object.
@@ -674,6 +694,7 @@ AND relkind != 'c'))"""
did: Database Id
scid: Schema Id
doid: Domain Id
+ return_ajax_response:
"""
SQL = render_template("/".join([self.template_path,
@@ -716,6 +737,9 @@ AND relkind != 'c'))"""
""".format(self.qtIdent(self.conn, data['basensp'], data['name']))
SQL = sql_header + SQL
+ if not return_ajax_response:
+ return SQL.strip('\n')
+
return ajax_response(response=SQL.strip('\n'))
@check_precondition
@@ -846,5 +870,40 @@ AND relkind != 'c'))"""
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the domains for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'node.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(did, scid, row['oid'])
+
+ if status:
+ if 'constraints' in data and len(data['constraints']) > 0:
+ for item in data['constraints']:
+ # Remove keys that should not be the part
+ # of comparision.
+ if 'conoid' in item:
+ item.pop('conoid')
+ if 'nspname' in item:
+ item.pop('nspname')
+
+ res[row['name']] = data
+
+ return res
+
DomainView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/__init__.py
index 38c686a3b..f402a79e7 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js
index 704353bbf..a7f0a91d6 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/static/js/domain.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/static/js/domain.js
index a4cb9b220..14a48f3cf 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/static/js/domain.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/static/js/domain.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/9.2_plus/get_constraints.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/9.2_plus/get_constraints.sql
index df956bf9a..676c5a6e2 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/9.2_plus/get_constraints.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/9.2_plus/get_constraints.sql
@@ -8,7 +8,7 @@ JOIN
JOIN
pg_namespace nl ON nl.oid=typnamespace
LEFT OUTER JOIN
- pg_description des ON (des.objoid=t.oid AND des.classoid='pg_constraint'::regclass)
+ pg_description des ON (des.objoid=c.oid AND des.classoid='pg_constraint'::regclass)
WHERE
contype = 'c' AND contypid = {{doid}}::oid
ORDER BY
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/default/get_constraints.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/default/get_constraints.sql
index 897fb2477..b99f855a8 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/default/get_constraints.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/default/get_constraints.sql
@@ -8,7 +8,7 @@ JOIN
JOIN
pg_namespace nl ON nl.oid=typnamespace
LEFT OUTER JOIN
- pg_description des ON (des.objoid=t.oid AND des.classoid='pg_constraint'::regclass)
+ pg_description des ON (des.objoid=c.oid AND des.classoid='pg_constraint'::regclass)
WHERE
contype = 'c'
AND contypid = {{doid}}::oid
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/__init__.py
index 2cb00a3ec..740967bea 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_add.py
index 2208181b3..6d081119f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_delete.py
index ec2ce6690..c3192b19d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_delete_multiple.py
index fef60ddab..8121e8f69 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_get.py
index e3d2f6286..0672c2d2b 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_put.py
index 2701a9c16..ba51bbf70 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_sql.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_sql.py
index 8f106dbd0..7d41ed183 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_sql.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_sql.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/utils.py
index 342bd6552..3bd9a27f8 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py
index 8541e1b7b..1be76c906 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -32,6 +32,8 @@ from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.compile_template_name import compile_template_path
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -93,7 +95,8 @@ class ForeignTableModule(SchemaChildModule):
blueprint = ForeignTableModule(__name__)
-class ForeignTableView(PGChildNodeView, DataTypeReader):
+class ForeignTableView(PGChildNodeView, DataTypeReader,
+ SchemaDiffObjectCompare):
"""
class ForeignTableView(PGChildNodeView)
@@ -174,6 +177,9 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
* delete_sql(gid, sid, did, scid, foid):
- Returns sql for Script
+ * compare(**kwargs):
+ - This function will compare the foreign table nodes from two different
+ schemas.
"""
node_type = blueprint.node_type
@@ -213,7 +219,8 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
'select_sql': [{'get': 'select_sql'}],
'insert_sql': [{'get': 'insert_sql'}],
'update_sql': [{'get': 'update_sql'}],
- 'delete_sql': [{'get': 'delete_sql'}]
+ 'delete_sql': [{'get': 'delete_sql'}],
+ 'compare': [{'get': 'compare'}, {'get': 'compare'}]
})
def validate_request(f):
@@ -447,11 +454,9 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
scid: Schema Id
foid: Foreign Table Id
"""
- data = self._fetch_properties(gid, sid, did, scid, foid)
- if data is False:
- return gone(
- gettext("Could not find the foreign table on the server.")
- )
+ status, data = self._fetch_properties(gid, sid, did, scid, foid)
+ if not status:
+ return data
return ajax_response(
response=data,
@@ -814,11 +819,10 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
scid: Schema Id
foid: Foreign Table Id
"""
- data = self._fetch_properties(gid, sid, did, scid, foid, inherits=True)
- if data is False:
- return gone(
- gettext("Could not find the foreign table on the server.")
- )
+ status, data = self._fetch_properties(gid, sid, did, scid, foid,
+ inherits=True)
+ if not status:
+ return data
col_data = []
for c in data['columns']:
@@ -891,12 +895,10 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
foid: Foreign Table Id
"""
if foid is not None:
- old_data = self._fetch_properties(gid, sid, did, scid, foid,
- inherits=True)
- if old_data is False:
- return gone(
- gettext("Could not find the foreign table on the server.")
- )
+ status, old_data = self._fetch_properties(gid, sid, did, scid,
+ foid, inherits=True)
+ if not status:
+ return old_data
# Prepare dict of columns with key = column's attnum
# Will use this in the update template when any column is
@@ -1051,10 +1053,10 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
scid=scid, foid=foid)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return False
+ return False, False
data = res['rows'][0]
@@ -1064,7 +1066,7 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
foid=foid)
status, aclres = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=aclres)
+ return False, internal_server_error(errormsg=aclres)
# Get Formatted Privileges
data.update(self._format_proacl_from_db(aclres['rows']))
@@ -1082,7 +1084,7 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
'get_constraints.sql']), foid=foid)
status, cons = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=cons)
+ return False, internal_server_error(errormsg=cons)
if cons and 'rows' in cons:
data['constraints'] = cons['rows']
@@ -1091,7 +1093,7 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
'get_columns.sql']), foid=foid)
status, cols = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=cols)
+ return False, internal_server_error(errormsg=cols)
# The Length and the precision of the Datatype should be separated.
# The Format we getting from database is: numeric(1,1)
@@ -1128,12 +1130,12 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if 'inherits' in res['rows'][0]:
data['inherits'] = res['rows'][0]['inherits']
- return data
+ return True, data
@staticmethod
def convert_precision_to_int(typlen):
@@ -1222,11 +1224,9 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
Returns:
SELECT Script sql for the object
"""
- data = self._fetch_properties(gid, sid, did, scid, foid)
- if data is False:
- return gone(
- gettext("Could not find the foreign table on the server.")
- )
+ status, data = self._fetch_properties(gid, sid, did, scid, foid)
+ if not status:
+ return data
columns = []
for c in data['columns']:
@@ -1259,11 +1259,9 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
Returns:
INSERT Script sql for the object
"""
- data = self._fetch_properties(gid, sid, did, scid, foid)
- if data is False:
- return gone(
- gettext("Could not find the foreign table on the server.")
- )
+ status, data = self._fetch_properties(gid, sid, did, scid, foid)
+ if not status:
+ return data
columns = []
values = []
@@ -1301,11 +1299,9 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
Returns:
UPDATE Script sql for the object
"""
- data = self._fetch_properties(gid, sid, did, scid, foid)
- if data is False:
- return gone(
- gettext("Could not find the foreign table on the server.")
- )
+ status, data = self._fetch_properties(gid, sid, did, scid, foid)
+ if not status:
+ return data
columns = []
@@ -1346,11 +1342,9 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
Returns:
DELETE Script sql for the object
"""
- data = self._fetch_properties(gid, sid, did, scid, foid)
- if data is False:
- return gone(
- gettext("Could not find the foreign table on the server.")
- )
+ status, data = self._fetch_properties(gid, sid, did, scid, foid)
+ if not status:
+ return data
sql = u"DELETE FROM {0}\n\tWHERE <condition>;".format(
self.qtIdent(self.conn, data['basensp'], data['name'])
@@ -1358,5 +1352,37 @@ class ForeignTableView(PGChildNodeView, DataTypeReader):
return ajax_response(response=sql)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the foreign tables for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'node.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(0, sid, did, scid,
+ row['oid'])
+ if status:
+ if 'constraints' in data and data['constraints'] is not None \
+ and len(data['constraints']) > 0:
+ for item in data['constraints']:
+ if 'conoid' in item:
+ item.pop('conoid')
+
+ res[row['name']] = data
+
+ return res
+
ForeignTableView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js
index d20d43f60..d34fa8384 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/__init__.py
index 08a55e1f5..23915a897 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_add.py
index c989b0caa..2e5ee60f7 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_delete.py
index 9f8f84fb6..1b1871c73 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_delete_multiple.py
index 9b3289e6e..f07a9bb34 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_get.py
index 4449892e7..c42ec3538 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_put.py
index 17beda009..cbf160ade 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/utils.py
index 078baceca..b78670be1 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py
index ada12c419..4e65961de 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -24,6 +24,8 @@ from pgadmin.utils import IS_PY2
from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -93,7 +95,7 @@ class FtsConfigurationModule(SchemaChildModule):
blueprint = FtsConfigurationModule(__name__)
-class FtsConfigurationView(PGChildNodeView):
+class FtsConfigurationView(PGChildNodeView, SchemaDiffObjectCompare):
"""
class FtsConfigurationView(PGChildNodeView)
@@ -167,6 +169,9 @@ class FtsConfigurationView(PGChildNodeView):
* dependencies(self, gid, sid, did, scid, cfgid):
- This function get the dependencies and return ajax response for node.
+ * compare(**kwargs):
+ - This function will compare the fts configuration nodes from two
+ different schemas.
"""
node_type = blueprint.node_type
@@ -202,6 +207,7 @@ class FtsConfigurationView(PGChildNodeView):
{'get': 'copyConfig'}],
'tokens': [{'get': 'tokens'}, {'get': 'tokens'}],
'dictionaries': [{}, {'get': 'dictionaries'}],
+ 'compare': [{'get': 'compare'}, {'get': 'compare'}]
})
def _init_(self, **kwargs):
@@ -343,7 +349,22 @@ class FtsConfigurationView(PGChildNodeView):
scid: Schema Id
cfgid: fts Configuration id
"""
+ status, res = self._fetch_properties(scid, cfgid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+ def _fetch_properties(self, scid, cfgid):
+ """
+ This function is used to fetch property of specified object.
+ :param scid:
+ :param cfgid:
+ :return:
+ """
sql = render_template(
"/".join([self.template_path, 'properties.sql']),
scid=scid,
@@ -352,10 +373,10 @@ class FtsConfigurationView(PGChildNodeView):
status, res = self.conn.execute_dict(sql)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(
+ return False, gone(
_(
"Could not find the FTS Configuration node in the "
"database node.")
@@ -370,14 +391,11 @@ class FtsConfigurationView(PGChildNodeView):
status, rset = self.conn.execute_dict(sql)
if not status:
- return internal_server_error(errormsg=rset)
+ return False, internal_server_error(errormsg=rset)
res['rows'][0]['tokens'] = rset['rows']
- return ajax_response(
- response=res['rows'][0],
- status=200
- )
+ return True, res['rows'][0]
@check_precondition
def create(self, gid, sid, did, scid):
@@ -927,5 +945,30 @@ class FtsConfigurationView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the fts configurations for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), scid=scid)
+ status, fts_cfg = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in fts_cfg['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
FtsConfigurationView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/static/js/fts_configuration.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/static/js/fts_configuration.js
index 3c37cd592..5b526903c 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/static/js/fts_configuration.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/static/js/fts_configuration.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/__init__.py
index a5bb9899d..7bf1ce3c4 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/test_fts_configuration_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/test_fts_configuration_add.py
index 2ca767cbc..e9bdf47f1 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/test_fts_configuration_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/test_fts_configuration_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/test_fts_configuration_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/test_fts_configuration_delete.py
index 0a06b626f..48fb3b82b 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/test_fts_configuration_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/test_fts_configuration_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/test_fts_configuration_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/test_fts_configuration_delete_multiple.py
index 3afaf7b36..46cd96be3 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/test_fts_configuration_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/test_fts_configuration_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/test_fts_configuration_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/test_fts_configuration_get.py
index 52d447616..17e820d99 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/test_fts_configuration_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/test_fts_configuration_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/test_fts_configuration_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/test_fts_configuration_put.py
index 3faa0678a..98e20153f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/test_fts_configuration_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/test_fts_configuration_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/utils.py
index 0e4b5503d..5a333ba40 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py
index 7b0fab5f9..358882cdb 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -24,6 +24,8 @@ from pgadmin.utils import IS_PY2
from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -91,7 +93,7 @@ class FtsDictionaryModule(SchemaChildModule):
blueprint = FtsDictionaryModule(__name__)
-class FtsDictionaryView(PGChildNodeView):
+class FtsDictionaryView(PGChildNodeView, SchemaDiffObjectCompare):
"""
class FtsDictionaryView(PGChildNodeView)
@@ -159,6 +161,9 @@ class FtsDictionaryView(PGChildNodeView):
* dependencies(self, gid, sid, did, scid, dcid):
- This function get the dependencies and return ajax response for node.
+ * compare(**kwargs):
+ - This function will compare the fts dictionaries nodes from two
+ different schemas.
"""
node_type = blueprint.node_type
@@ -189,7 +194,7 @@ class FtsDictionaryView(PGChildNodeView):
'dependency': [{'get': 'dependencies'}],
'dependent': [{'get': 'dependents'}],
'fetch_templates': [{'get': 'fetch_templates'},
- {'get': 'fetch_templates'}],
+ {'get': 'fetch_templates'}]
})
def _init_(self, **kwargs):
@@ -353,7 +358,23 @@ class FtsDictionaryView(PGChildNodeView):
scid: Schema Id
dcid: fts dictionary id
"""
+ status, res = self._fetch_properties(scid, dcid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, dcid):
+ """
+ This function is used to fetch the properties of specified object.
+ :param scid:
+ :param dcid:
+ :return:
+ """
sql = render_template(
"/".join([self.template_path, 'properties.sql']),
scid=scid,
@@ -362,10 +383,10 @@ class FtsDictionaryView(PGChildNodeView):
status, res = self.conn.execute_dict(sql)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(_(
+ return False, gone(_(
"Could not find the FTS Dictionary node in the database node."
))
@@ -382,10 +403,7 @@ class FtsDictionaryView(PGChildNodeView):
res['rows'][0]['options']
)
- return ajax_response(
- response=res['rows'][0],
- status=200
- )
+ return True, res['rows'][0]
@check_precondition
def create(self, gid, sid, did, scid):
@@ -854,5 +872,30 @@ class FtsDictionaryView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the fts dictionaries for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
FtsDictionaryView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/static/js/fts_dictionary.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/static/js/fts_dictionary.js
index 5f807cc1d..1fbdf8e2b 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/static/js/fts_dictionary.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/static/js/fts_dictionary.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/__init__.py
index f20314d4a..47f6754fb 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/test_fts_dictionaries_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/test_fts_dictionaries_add.py
index a3eb527ff..30c95c50e 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/test_fts_dictionaries_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/test_fts_dictionaries_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/test_fts_dictionaries_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/test_fts_dictionaries_delete.py
index dcf12bb1e..274f12132 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/test_fts_dictionaries_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/test_fts_dictionaries_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/test_fts_dictionaries_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/test_fts_dictionaries_delete_multiple.py
index f8a78724e..883b5c3ef 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/test_fts_dictionaries_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/test_fts_dictionaries_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/test_fts_dictionaries_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/test_fts_dictionaries_get.py
index 270385c99..20feb070e 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/test_fts_dictionaries_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/test_fts_dictionaries_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/test_fts_dictionaries_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/test_fts_dictionaries_put.py
index d4487ea5e..70764c2e2 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/test_fts_dictionaries_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/test_fts_dictionaries_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/utils.py
index 61a0448a5..635ad61cf 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py
index 0500ce161..09a445723 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -24,6 +24,8 @@ from pgadmin.utils import IS_PY2
from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -84,7 +86,7 @@ class FtsParserModule(SchemaChildModule):
blueprint = FtsParserModule(__name__)
-class FtsParserView(PGChildNodeView):
+class FtsParserView(PGChildNodeView, SchemaDiffObjectCompare):
"""
class FtsParserView(PGChildNodeView)
@@ -161,6 +163,9 @@ class FtsParserView(PGChildNodeView):
- This function get the dependencies and return ajax response for
FTS Parser node.
+ * compare(**kwargs):
+ - This function will compare the fts parser nodes from two
+ different schemas.
"""
node_type = blueprint.node_type
@@ -198,7 +203,7 @@ class FtsParserView(PGChildNodeView):
'lextype_functions': [{'get': 'lextype_functions'},
{'get': 'lextype_functions'}],
'headline_functions': [{'get': 'headline_functions'},
- {'get': 'headline_functions'}],
+ {'get': 'headline_functions'}]
})
def _init_(self, **kwargs):
@@ -303,6 +308,32 @@ class FtsParserView(PGChildNodeView):
@check_precondition
def properties(self, gid, sid, did, scid, pid):
+ """
+
+ :param gid:
+ :param sid:
+ :param did:
+ :param scid:
+ :param pid:
+ :return:
+ """
+ status, res = self._fetch_properties(scid, pid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, pid):
+ """
+ This function is used to fetch the properties of specified object.
+
+ :param scid:
+ :param pid:
+ :return:
+ """
sql = render_template(
"/".join([self.template_path, 'properties.sql']),
scid=scid,
@@ -311,16 +342,13 @@ class FtsParserView(PGChildNodeView):
status, res = self.conn.execute_dict(sql)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(
+ return False, gone(
_("Could not find the FTS Parser node in the database node."))
- return ajax_response(
- response=res['rows'][0],
- status=200
- )
+ return True, res['rows'][0]
@check_precondition
def create(self, gid, sid, did, scid):
@@ -862,5 +890,30 @@ class FtsParserView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the fts parsers for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
FtsParserView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/static/js/fts_parser.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/static/js/fts_parser.js
index 6f94e70d4..e1bb184a5 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/static/js/fts_parser.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/static/js/fts_parser.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/__init__.py
index f20314d4a..47f6754fb 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/test_fts_parser_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/test_fts_parser_add.py
index 350179c36..dff662a85 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/test_fts_parser_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/test_fts_parser_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/test_fts_parser_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/test_fts_parser_delete.py
index 3ab813cc3..8ddf8ea7b 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/test_fts_parser_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/test_fts_parser_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/test_fts_parser_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/test_fts_parser_delete_multiple.py
index fc32a9097..9d861c477 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/test_fts_parser_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/test_fts_parser_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/test_fts_parser_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/test_fts_parser_get.py
index 593b4132c..3833581a1 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/test_fts_parser_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/test_fts_parser_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/test_fts_parser_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/test_fts_parser_put.py
index d9e21f9c0..51ec2e437 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/test_fts_parser_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/test_fts_parser_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/utils.py
index 89bff20dc..074194c2d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py
index d51b4e5fb..6b7627db0 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -24,6 +24,8 @@ from pgadmin.utils import IS_PY2
from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -90,7 +92,7 @@ class FtsTemplateModule(SchemaChildModule):
blueprint = FtsTemplateModule(__name__)
-class FtsTemplateView(PGChildNodeView):
+class FtsTemplateView(PGChildNodeView, SchemaDiffObjectCompare):
"""
class FtsTemplateView(PGChildNodeView)
@@ -154,6 +156,9 @@ class FtsTemplateView(PGChildNodeView):
- This function get the dependencies and return ajax response for the
FTS Template node.
+ * compare(**kwargs):
+ - This function will compare the fts template nodes from two
+ different schemas.
"""
node_type = blueprint.node_type
@@ -184,7 +189,7 @@ class FtsTemplateView(PGChildNodeView):
'dependency': [{'get': 'dependencies'}],
'dependent': [{'get': 'dependents'}],
'get_lexize': [{'get': 'get_lexize'}, {'get': 'get_lexize'}],
- 'get_init': [{'get': 'get_init'}, {'get': 'get_init'}],
+ 'get_init': [{'get': 'get_init'}, {'get': 'get_init'}]
})
def _init_(self, **kwargs):
@@ -281,25 +286,47 @@ class FtsTemplateView(PGChildNodeView):
@check_precondition
def properties(self, gid, sid, did, scid, tid):
+ """
+
+ :param gid:
+ :param sid:
+ :param did:
+ :param scid:
+ :param tid:
+ :return:
+ """
+ status, res = self._fetch_properties(scid, tid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, tid):
+ """
+ This function is used to fetch the properties of specified object.
+
+ :param scid:
+ :param pid:
+ :return:
+ """
sql = render_template(
"/".join([self.template_path, 'properties.sql']),
scid=scid,
tid=tid
)
status, res = self.conn.execute_dict(sql)
-
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(
+ return False, gone(
gettext("Could not find the requested FTS template.")
)
- return ajax_response(
- response=res['rows'][0],
- status=200
- )
+ return True, res['rows'][0]
@check_precondition
def create(self, gid, sid, did, scid):
@@ -734,5 +761,30 @@ class FtsTemplateView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the fts templates for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
FtsTemplateView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/static/js/fts_template.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/static/js/fts_template.js
index c3c225e45..2d89f9957 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/static/js/fts_template.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/static/js/fts_template.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/__init__.py
index f20314d4a..47f6754fb 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/test_fts_templates_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/test_fts_templates_add.py
index 0314c3f21..494332075 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/test_fts_templates_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/test_fts_templates_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/test_fts_templates_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/test_fts_templates_delete.py
index 56e245566..cbd8d771e 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/test_fts_templates_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/test_fts_templates_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/test_fts_templates_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/test_fts_templates_delete_multiple.py
index 0f61ef9b9..9223715d7 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/test_fts_templates_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/test_fts_templates_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/test_fts_templates_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/test_fts_templates_get.py
index e741bda9a..c43425d50 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/test_fts_templates_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/test_fts_templates_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/test_fts_templates_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/test_fts_templates_put.py
index b404ba4a0..2977663f9 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/test_fts_templates_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/test_fts_templates_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/utils.py
index d384fd31c..28495ae33 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py
index 53b88f1e3..ca8d50c8d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -21,7 +21,7 @@ from flask import render_template, make_response, request, jsonify, \
current_app
from flask_babelex import gettext
from pgadmin.browser.server_groups.servers.databases.schemas.utils import \
- SchemaChildModule, DataTypeReader
+ SchemaChildModule, DataTypeReader, get_schema
from pgadmin.browser.server_groups.servers.databases.utils import \
parse_sec_labels_from_db, parse_variables_from_db
from pgadmin.browser.server_groups.servers.utils import parse_priv_from_db, \
@@ -30,8 +30,10 @@ from pgadmin.browser.utils import PGChildNodeView
from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.driver import get_driver
-
from config import PG_DEFAULT_DRIVER
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.model import SchemaDiffModel
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
class FunctionModule(SchemaChildModule):
@@ -115,7 +117,7 @@ class FunctionModule(SchemaChildModule):
blueprint = FunctionModule(__name__)
-class FunctionView(PGChildNodeView, DataTypeReader):
+class FunctionView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare):
"""
class FunctionView(PGChildNodeView)
@@ -177,6 +179,10 @@ class FunctionView(PGChildNodeView, DataTypeReader):
* exec_sql(gid, sid, did, scid, fnid):
- Returns sql for Script
+
+ * compare(**kwargs):
+ - This function will compare the function nodes from two
+ different schemas.
"""
node_type = blueprint.node_type
@@ -213,6 +219,9 @@ class FunctionView(PGChildNodeView, DataTypeReader):
{'get': 'get_support_functions'}]
})
+ keys_to_ignore = ['oid', 'proowner', 'typnsp', 'xmin', 'prokind',
+ 'proisagg', 'pronamespace', 'proargdefaults']
+
@property
def required_args(self):
"""
@@ -790,7 +799,7 @@ class FunctionView(PGChildNodeView, DataTypeReader):
)
@check_precondition
- def delete(self, gid, sid, did, scid, fnid=None):
+ def delete(self, gid, sid, did, scid, fnid=None, only_sql=False):
"""
Drop the Function.
@@ -841,6 +850,8 @@ class FunctionView(PGChildNodeView, DataTypeReader):
func_args=res['rows'][0]['func_args'],
nspname=res['rows'][0]['nspname'],
cascade=cascade)
+ if only_sql:
+ return SQL
status, res = self.conn.execute_scalar(SQL)
if not status:
return internal_server_error(errormsg=res)
@@ -915,7 +926,8 @@ class FunctionView(PGChildNodeView, DataTypeReader):
)
@check_precondition
- def sql(self, gid, sid, did, scid, fnid=None):
+ def sql(self, gid, sid, did, scid, fnid=None, diff_schema=None,
+ json_resp=True):
"""
Returns the SQL for the Function object.
@@ -989,6 +1001,8 @@ class FunctionView(PGChildNodeView, DataTypeReader):
if not status:
return internal_server_error(errormsg=res)
+ if diff_schema:
+ res['rows'][0]['nspname'] = diff_schema
name_with_default_args = self.qtIdent(
self.conn,
res['rows'][0]['nspname'],
@@ -1040,6 +1054,10 @@ class FunctionView(PGChildNodeView, DataTypeReader):
if not status:
return internal_server_error(errormsg=res)
+ if diff_schema:
+ res['rows'][0]['nspname'] = diff_schema
+ resp_data['pronamespace'] = diff_schema
+
name_with_default_args = self.qtIdent(
self.conn,
res['rows'][0]['nspname'],
@@ -1071,6 +1089,9 @@ class FunctionView(PGChildNodeView, DataTypeReader):
resp_data['proname']),
resp_data['proargtypenames'].lstrip('(').rstrip(')'))
+ if not json_resp:
+ return re.sub('\n{2,}', '\n\n', func_def)
+
SQL = sql_header + func_def
SQL = re.sub('\n{2,}', '\n\n', SQL)
@@ -1597,7 +1618,66 @@ class FunctionView(PGChildNodeView, DataTypeReader):
status=200
)
+ def get_sql_from_diff(self, gid, sid, did, scid, oid, data=None,
+ diff_schema=None, drop_sql=False):
+ sql = ''
+ if data:
+ if diff_schema:
+ data['schema'] = diff_schema
+ status, sql = self._get_sql(gid, sid, did, scid, data, oid)
+ else:
+ if drop_sql:
+ sql = self.delete(gid=gid, sid=sid, did=did,
+ scid=scid, fnid=oid, only_sql=True)
+ elif diff_schema:
+ sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, fnid=oid,
+ diff_schema=diff_schema, json_resp=False)
+ else:
+ sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, fnid=oid,
+ json_resp=False)
+ return sql
+
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid, oid=None):
+ """
+ This function will fetch the list of all the functions for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ server_type = self.manager.server_type
+ server_version = self.manager.sversion
+
+ if server_type == 'pg' and self.blueprint.min_ver is not None and \
+ server_version < self.blueprint.min_ver:
+ return res
+ if server_type == 'ppas' and self.blueprint.min_ppasver is not None \
+ and server_version < self.blueprint.min_ppasver:
+ return res
+
+ if not oid:
+ SQL = render_template("/".join([self.sql_template_path,
+ 'node.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ data = self._fetch_properties(0, sid, did, scid, row['oid'])
+ if isinstance(data, dict):
+ res[row['name']] = data
+ else:
+ data = self._fetch_properties(0, sid, did, scid, oid)
+ res = data
+
+ return res
+
+SchemaDiffRegistry(blueprint.node_type, FunctionView)
FunctionView.register_node_view(blueprint)
@@ -1698,6 +1778,7 @@ class ProcedureView(FunctionView):
'prosrc']
+SchemaDiffRegistry(procedure_blueprint.node_type, ProcedureView)
ProcedureView.register_node_view(procedure_blueprint)
@@ -1796,4 +1877,5 @@ class TriggerFunctionView(FunctionView):
'prosrc']
+SchemaDiffRegistry(trigger_function_blueprint.node_type, TriggerFunctionView)
TriggerFunctionView.register_node_view(trigger_function_blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js
index e828adc79..ee7fa02fa 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js
index 5f93d9788..1dc8988f2 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js
index 9888ad979..25dc5171a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/__init__.py
index 5c464f025..c505ba66b 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_add.py
index 0f308f37f..15adf5ebe 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_delete.py
index 6dd6bf806..a6c45f32d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_delete_multiple.py
index d822e4e21..61d0e8c10 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get.py
index a44a22f81..555411f8a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_put.py
index 8c3ca5f1e..870528dfa 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_add.py
index c3940f566..1f833ee7c 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_delete.py
index cc6c189ee..9622cbcf5 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_delete_multiple.py
index 0402a0dbc..7c415c27d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_exec_sql.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_exec_sql.py
index a9b4eb0a8..4424b4a8d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_exec_sql.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_exec_sql.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_get.py
index 678346878..1d654d99f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_put.py
index 9c17a8795..e21f67f77 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_procedure_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_add.py
index c90453d2b..7efb14873 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_delete.py
index 261488dfb..a07baac4a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_delete_multiple.py
index d6d1cd037..4e8924bab 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_get.py
index 30cca310f..689e741cc 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_put.py
index 7bbe3c2d9..722567f3d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/utils.py
index 5ee0892b2..a1d3c2850 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py
index 0a8f20f47..05bcbceb1 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -27,6 +27,8 @@ from pgadmin.utils.ajax import make_json_response, \
make_response as ajax_response, internal_server_error, \
precondition_required, gone
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -83,7 +85,7 @@ class PackageModule(SchemaChildModule):
blueprint = PackageModule(__name__)
-class PackageView(PGChildNodeView):
+class PackageView(PGChildNodeView, SchemaDiffObjectCompare):
node_type = blueprint.node_type
parent_ids = [
@@ -111,6 +113,8 @@ class PackageView(PGChildNodeView):
'dependent': [{'get': 'dependents'}]
})
+ keys_to_ignore = ['oid', 'schema', 'xmin']
+
def check_precondition(action=None):
"""
This function will behave as a decorator which will checks
@@ -297,16 +301,32 @@ class PackageView(PGChildNodeView):
Returns:
+ """
+ status, res = self._fetch_properties(scid, pkgid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, pkgid):
+ """
+ This function is used to fetch the properties of specified object.
+ :param scid:
+ :param pkgid:
+ :return:
"""
SQL = render_template("/".join([self.template_path, 'properties.sql']),
scid=scid, pkgid=pkgid)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(
+ return False, gone(
errormsg=_("Could not find the package in the database.")
)
@@ -321,16 +341,13 @@ class PackageView(PGChildNodeView):
status, rset1 = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=rset1)
+ return False, internal_server_error(errormsg=rset1)
for row in rset1['rows']:
priv = parse_priv_from_db(row)
res['rows'][0].setdefault(row['deftype'], []).append(priv)
- return ajax_response(
- response=res['rows'][0],
- status=200
- )
+ return True, res['rows'][0]
@check_precondition(action="create")
def create(self, gid, sid, did, scid):
@@ -396,7 +413,7 @@ class PackageView(PGChildNodeView):
)
@check_precondition(action='delete')
- def delete(self, gid, sid, did, scid, pkgid=None):
+ def delete(self, gid, sid, did, scid, pkgid=None, only_sql=False):
"""
This function will drop the object
@@ -453,6 +470,9 @@ class PackageView(PGChildNodeView):
data=res['rows'][0],
cascade=cascade)
+ if only_sql:
+ return SQL
+
status, res = self.conn.execute_scalar(SQL)
if not status:
return internal_server_error(errormsg=res)
@@ -552,7 +572,8 @@ class PackageView(PGChildNodeView):
status=200
)
- def getSQL(self, gid, sid, did, data, scid, pkgid=None, sqltab=False):
+ def getSQL(self, gid, sid, did, data, scid, pkgid=None, sqltab=False,
+ diff_schema=None):
"""
This function will generate sql from model data.
@@ -621,6 +642,9 @@ class PackageView(PGChildNodeView):
if arg not in data:
data[arg] = old_data[arg]
+ if diff_schema:
+ data['schema'] = diff_schema
+
SQL = render_template("/".join([self.template_path, 'update.sql']),
data=data, o_data=old_data, conn=self.conn)
return SQL, data['name'] if 'name' in data else old_data['name']
@@ -635,7 +659,8 @@ class PackageView(PGChildNodeView):
return SQL, data['name']
@check_precondition(action="sql")
- def sql(self, gid, sid, did, scid, pkgid):
+ def sql(self, gid, sid, did, scid, pkgid, diff_schema=None,
+ json_resp=True):
"""
This function will generate sql for sql panel
@@ -645,6 +670,8 @@ class PackageView(PGChildNodeView):
did: Database ID
scid: Schema ID
pkgid: Package ID
+ diff_schema: Schema diff target schema name
+ json_resp: json response or plain text response
"""
try:
SQL = render_template(
@@ -676,13 +703,18 @@ class PackageView(PGChildNodeView):
res['rows'][0].setdefault(row['deftype'], []).append(priv)
result = res['rows'][0]
- sql, name = self.getSQL(gid, sid, did, result, scid, pkgid, True)
+ sql, name = self.getSQL(gid, sid, did, result, scid, pkgid, True,
+ diff_schema)
# Most probably this is due to error
if not isinstance(sql, (str, unicode)):
return sql
sql = sql.strip('\n').strip(' ')
+ # Return sql for schema diff
+ if not json_resp:
+ return sql
+
sql_header = u"-- Package: {}\n\n-- ".format(
self.qtIdent(self.conn, self.schema, result['name'])
)
@@ -756,5 +788,54 @@ class PackageView(PGChildNodeView):
return sql[start:end].strip("\n")
+ @check_precondition(action="fetch_objects_to_compare")
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the packages for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ if self.manager.server_type != 'ppas':
+ return res
+
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
+ def get_sql_from_diff(self, gid, sid, did, scid, oid, data=None,
+ diff_schema=None, drop_sql=False):
+ sql = ''
+ if data:
+ if diff_schema:
+ data['schema'] = diff_schema
+ status, sql = self.getSQL(gid, sid, did, data, scid, oid)
+ else:
+ if drop_sql:
+ sql = self.delete(gid=gid, sid=sid, did=did,
+ scid=scid, pkgid=oid, only_sql=True)
+
+ elif diff_schema:
+ sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, pkgid=oid,
+ diff_schema=diff_schema, json_resp=False)
+ else:
+ sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, pkgid=oid,
+ json_resp=False)
+ return sql
+
+SchemaDiffRegistry(blueprint.node_type, PackageView)
PackageView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py
index 48ba5a938..f97994468 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -161,6 +161,8 @@ class EdbFuncView(PGChildNodeView, DataTypeReader):
* dependencies(gid, sid, did, scid, pkgid, edbfnid):
- Returns the dependencies for the Functions object.
+ * compare(**kwargs):
+ - This function will compare the nodes from two different schemas.
"""
node_type = blueprint.node_type
@@ -184,7 +186,8 @@ class EdbFuncView(PGChildNodeView, DataTypeReader):
'nodes': [{'get': 'nodes'}, {'get': 'nodes'}],
'sql': [{'get': 'sql'}],
'dependency': [{'get': 'dependencies'}],
- 'dependent': [{'get': 'dependents'}]
+ 'dependent': [{'get': 'dependents'}],
+ 'compare': [{'get': 'compare'}, {'get': 'compare'}]
})
def check_precondition(f):
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js
index 7af9a12e2..6b9ed6484 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbproc.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbproc.js
index e9cc0ae8f..df791dca3 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbproc.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbproc.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/tests/__init__.py
index 53f01ba67..0ddf14f90 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/tests/test_package_edbfuncs_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/tests/test_package_edbfuncs_get.py
index 87a6ed16d..c89daa646 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/tests/test_package_edbfuncs_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/tests/test_package_edbfuncs_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbvars/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbvars/__init__.py
index 37410aa11..e82660dde 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbvars/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbvars/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -137,6 +137,8 @@ class EdbVarView(PGChildNodeView, DataTypeReader):
* sql(gid, sid, did, scid, pkgid, varid):
- Returns the SQL for the Functions object.
+ * compare(**kwargs):
+ - This function will compare the nodes from two different schemas.
"""
node_type = blueprint.node_type
@@ -158,7 +160,8 @@ class EdbVarView(PGChildNodeView, DataTypeReader):
{'get': 'list'}
],
'nodes': [{'get': 'nodes'}, {'get': 'nodes'}],
- 'sql': [{'get': 'sql'}]
+ 'sql': [{'get': 'sql'}],
+ 'compare': [{'get': 'compare'}, {'get': 'compare'}]
})
def check_precondition(f):
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbvars/static/js/edbvar.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbvars/static/js/edbvar.js
index 8e3fd02a1..8d38baedc 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbvars/static/js/edbvar.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbvars/static/js/edbvar.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/static/js/package.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/static/js/package.js
index 5ead6f2be..b1cd08227 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/static/js/package.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/static/js/package.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/__init__.py
index 1713dfc7f..f93e9cf6c 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/test_package_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/test_package_add.py
index 2e55c29a3..6906d363b 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/test_package_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/test_package_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/test_package_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/test_package_delete.py
index 9df1c2b4a..5db7514d7 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/test_package_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/test_package_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/test_package_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/test_package_delete_multiple.py
index de0ccdaca..9393d8776 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/test_package_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/test_package_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/test_package_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/test_package_get.py
index 27ba4d89b..3cd371c92 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/test_package_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/test_package_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/test_package_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/test_package_put.py
index 831bf944c..4aaac21cc 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/test_package_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/test_package_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/utils.py
index e92a40194..290a8c3c6 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py
index 7e10d989d..3dbe7422e 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -24,6 +24,9 @@ from pgadmin.utils.ajax import make_json_response, internal_server_error, \
from pgadmin.utils.driver import get_driver
from config import PG_DEFAULT_DRIVER
from pgadmin.utils import IS_PY2
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
+
# If we are in Python3
if not IS_PY2:
unicode = str
@@ -88,7 +91,7 @@ class SequenceModule(SchemaChildModule):
blueprint = SequenceModule(__name__)
-class SequenceView(PGChildNodeView):
+class SequenceView(PGChildNodeView, SchemaDiffObjectCompare):
node_type = blueprint.node_type
parent_ids = [
@@ -273,6 +276,23 @@ class SequenceView(PGChildNodeView):
Returns:
"""
+ status, res = self._fetch_properties(scid, seid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, seid):
+ """
+ This function is used to fetch the properties of the specified object.
+ :param scid:
+ :param seid:
+ :return:
+ """
+
SQL = render_template(
"/".join([self.template_path, 'properties.sql']),
scid=scid, seid=seid
@@ -280,10 +300,11 @@ class SequenceView(PGChildNodeView):
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(_("Could not find the sequence in the database."))
+ return False, gone(
+ _("Could not find the sequence in the database."))
for row in res['rows']:
SQL = render_template(
@@ -292,7 +313,7 @@ class SequenceView(PGChildNodeView):
)
status, rset1 = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=rset1)
+ return False, internal_server_error(errormsg=rset1)
row['current_value'] = rset1['rows'][0]['last_value']
row['minimum'] = rset1['rows'][0]['min_value']
@@ -319,7 +340,7 @@ class SequenceView(PGChildNodeView):
)
status, dataclres = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
for row in dataclres['rows']:
priv = parse_priv_from_db(row)
@@ -328,10 +349,7 @@ class SequenceView(PGChildNodeView):
else:
res['rows'][0][row['deftype']] = [priv]
- return ajax_response(
- response=res['rows'][0],
- status=200
- )
+ return True, res['rows'][0]
@check_precondition(action="create")
def create(self, gid, sid, did, scid):
@@ -869,5 +887,30 @@ class SequenceView(PGChildNodeView):
status=200
)
+ @check_precondition(action="fetch_objects_to_compare")
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the sequences for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
SequenceView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js
index bcc8c088a..abe88aaa3 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/__init__.py
index 512b71da3..2f139058d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_add.py
index 7c1e8aaac..90891c83a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_delete.py
index 294bc4d63..52652ffc5 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_delete_multiple.py
index f5cadd8d5..71b68de52 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_get.py
index 9120a8900..73260b6ba 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_put.py
index 1eeedd106..f121e6206 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/utils.py
index ebf64ea2b..7eef8cbd0 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog.js
index 1052b5de6..f9c88489b 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/child.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/child.js
index e499053ff..429654d0d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/child.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/child.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
/////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js
index 5b98d51b0..5f4be0e32 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema_child_tree_node.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema_child_tree_node.js
index 658a0d99b..c3dd4fb1f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema_child_tree_node.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema_child_tree_node.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
/////////////////////////////////////////////////////////////
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 ce7e31c3c..145ccf69b 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
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -24,6 +24,8 @@ from pgadmin.utils.ajax import precondition_required
from pgadmin.utils.driver import get_driver
from config import PG_DEFAULT_DRIVER
from pgadmin.utils import IS_PY2
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -91,7 +93,7 @@ class SynonymModule(SchemaChildModule):
blueprint = SynonymModule(__name__)
-class SynonymView(PGChildNodeView):
+class SynonymView(PGChildNodeView, SchemaDiffObjectCompare):
"""
This class is responsible for generating routes for Synonym node
@@ -143,6 +145,10 @@ class SynonymView(PGChildNodeView):
* dependent(gid, sid, did, scid):
- This function will generate dependent list to show it in dependent
pane for the selected Synonym node.
+
+ * compare(**kwargs):
+ - This function will compare the synonyms nodes from two
+ different schemas.
"""
node_type = blueprint.node_type
@@ -385,26 +391,36 @@ class SynonymView(PGChildNodeView):
Returns:
JSON of selected synonym node
"""
+ status, res = self._fetch_properties(scid, syid)
+ if not status:
+ return res
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, syid):
+ """
+ This function is used to fetch the properties of the specified object
+ :param scid:
+ :param syid:
+ :return:
+ """
try:
SQL = render_template("/".join([self.template_path,
'properties.sql']),
scid=scid, syid=syid)
status, res = self.conn.execute_dict(SQL)
-
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
- if len(res['rows']) > 0:
- return ajax_response(
- response=res['rows'][0],
- status=200
- )
- else:
- return gone(
+ if len(res['rows']) == 0:
+ return False, gone(
gettext('The specified synonym could not be found.')
)
+ return True, res['rows'][0]
except Exception as e:
return internal_server_error(errormsg=str(e))
@@ -707,5 +723,33 @@ class SynonymView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the synonyms for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ if self.manager.server_type != 'ppas':
+ return res
+
+ SQL = render_template("/".join([self.template_path,
+ 'properties.sql']), scid=scid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(scid, row['name'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
SynonymView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js
index 2c301b0ec..0104ce753 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/__init__.py
index f7426acd9..24a1790d5 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/test_synonym_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/test_synonym_add.py
index 986435bec..644237f2b 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/test_synonym_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/test_synonym_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/test_synonym_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/test_synonym_delete.py
index 88d749aec..43501d2e0 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/test_synonym_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/test_synonym_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/test_synonym_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/test_synonym_delete_multiple.py
index e5b17469f..f07108321 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/test_synonym_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/test_synonym_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/test_synonym_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/test_synonym_get.py
index 60f565b35..579771fde 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/test_synonym_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/test_synonym_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/test_synonym_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/test_synonym_put.py
index df0ab0000..b6f7ddfc3 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/test_synonym_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/test_synonym_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/utils.py
index a62cd706e..ef273325b 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
index f5368c36a..4337dc44a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -11,9 +11,11 @@
import simplejson as json
import re
+import copy
+import random
import pgadmin.browser.server_groups.servers.databases as database
-from flask import render_template, request, jsonify, url_for
+from flask import render_template, request, jsonify, url_for, current_app
from flask_babelex import gettext
from pgadmin.browser.server_groups.servers.databases.schemas.utils \
import SchemaChildModule, DataTypeReader, VacuumSettings
@@ -22,8 +24,15 @@ from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from .utils import BaseTableView
from pgadmin.utils.preferences import Preferences
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.directory_compare import compare_dictionaries,\
+ directory_diff
+from pgadmin.tools.schema_diff.model import SchemaDiffModel
+from pgadmin.utils.driver import get_driver
+from config import PG_DEFAULT_DRIVER
from pgadmin.browser.server_groups.servers.databases.schemas.tables.\
constraints.foreign_key import utils as fkey_utils
+from .schema_diff_utils import SchemaDiffTableCompare
from pgadmin.browser.server_groups.servers.databases.schemas.tables.\
columns import utils as column_utils
from pgadmin.browser.server_groups.servers.databases.schemas.tables.\
@@ -132,7 +141,8 @@ class TableModule(SchemaChildModule):
blueprint = TableModule(__name__)
-class TableView(BaseTableView, DataTypeReader, VacuumSettings):
+class TableView(BaseTableView, DataTypeReader, VacuumSettings,
+ SchemaDiffTableCompare):
"""
This class is responsible for generating routes for Table node
@@ -229,6 +239,10 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
* delete_sql(gid, sid, did, scid, foid):
- Returns sql for Script
+
+ * compare(**kwargs):
+ - This function will compare the table nodes from two
+ different schemas.
"""
node_type = blueprint.node_type
@@ -277,7 +291,8 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
'insert_sql': [{'get': 'insert_sql'}],
'update_sql': [{'get': 'update_sql'}],
'delete_sql': [{'get': 'delete_sql'}],
- 'count_rows': [{'get': 'count_rows'}]
+ 'count_rows': [{'get': 'count_rows'}],
+ 'compare': [{'get': 'compare'}, {'get': 'compare'}]
})
@BaseTableView.check_precondition
@@ -464,9 +479,9 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
- setting
values
"""
- res = self.get_vacuum_table_settings(self.conn)
+ res = self.get_vacuum_table_settings(self.conn, sid)
return ajax_response(
- response=res['rows'],
+ response=res,
status=200
)
@@ -480,9 +495,9 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
- setting
values
"""
- res = self.get_vacuum_toast_settings(self.conn)
+ res = self.get_vacuum_toast_settings(self.conn, sid)
return ajax_response(
- response=res['rows'],
+ response=res,
status=200
)
@@ -582,7 +597,22 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
Returns:
JSON of selected table node
"""
+ status, res = self._fetch_properties(did, scid, tid)
+ if not status:
+ return res
+ return super(TableView, self).properties(
+ gid, sid, did, scid, tid, res
+ )
+
+ def _fetch_properties(self, did, scid, tid):
+ """
+ This function is used to fetch the properties of the specified object
+ :param did:
+ :param scid:
+ :param tid:
+ :return:
+ """
SQL = render_template(
"/".join([self.table_template_path, 'properties.sql']),
did=did, scid=scid, tid=tid,
@@ -590,10 +620,11 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(gettext("The specified table could not be found."))
+ return False, gone(
+ gettext("The specified table could not be found."))
# We will check the threshold set by user before executing
# the query because that can cause performance issues
@@ -620,7 +651,7 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
status, count = self.conn.execute_scalar(SQL)
if not status:
- return internal_server_error(errormsg=count)
+ return False, internal_server_error(errormsg=count)
res['rows'][0]['rows_cnt'] = count
@@ -628,9 +659,7 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
elif not estimated_row_count:
res['rows'][0]['rows_cnt'] = estimated_row_count
- return super(TableView, self).properties(
- gid, sid, did, scid, tid, res
- )
+ return True, res
@BaseTableView.check_precondition
def types(self, gid, sid, did, scid, tid=None, clid=None):
@@ -1168,6 +1197,69 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
"""
return BaseTableView.reset_statistics(self, scid, tid)
+ @BaseTableView.check_precondition
+ def get_sql_from_table_diff(self, **kwargs):
+ """
+ This function will create sql on the basis the difference of 2 tables
+ """
+ data = dict()
+ res = None
+ sid = kwargs['sid']
+ did = kwargs['did']
+ scid = kwargs['scid']
+ tid = kwargs['tid']
+ diff_data = kwargs['diff_data'] if 'diff_data' in kwargs else None
+ json_resp = kwargs['json_resp'] if 'json_resp' in kwargs else True
+ diff_schema = kwargs['diff_schema'] if 'diff_schema' in kwargs else\
+ None
+ schema_diff_table = kwargs['schema_diff_table'] if\
+ 'schema_diff_table' in kwargs else None
+
+ if diff_data:
+ return self._fetch_sql(did, scid, tid, diff_data, json_resp)
+ else:
+ main_sql = []
+
+ SQL = render_template(
+ "/".join([self.table_template_path, 'properties.sql']),
+ did=did, scid=scid, tid=tid,
+ datlastsysoid=self.datlastsysoid
+ )
+ status, res = self.conn.execute_dict(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ if len(res['rows']) == 0:
+ return gone(gettext("The specified table could not be found."
+ ))
+
+ if status:
+ data = res['rows'][0]
+
+ if diff_schema:
+ data['schema'] = diff_schema
+
+ if schema_diff_table:
+ data['orig_name'] = data['name']
+ data['name'] = 'schema_diff_temp_{0}'.format(
+ random.randint(1, 9999999))
+
+ sql, partition_sql = BaseTableView.get_reverse_engineered_sql(
+ self, did, scid, tid, main_sql, data, json_resp,
+ diff_partition_sql=True)
+ else:
+ sql, partition_sql = BaseTableView.get_reverse_engineered_sql(
+ self, did, scid, tid, main_sql, data, json_resp)
+
+ if schema_diff_table:
+ # If partition tables have different partitions
+ sql += render_template(
+ "/".join([self.table_template_path, 'schema_diff.sql']),
+ conn=self.conn, data=data, partition_sql=partition_sql
+ )
+
+ return sql
+
@BaseTableView.check_precondition
def msql(self, gid, sid, did, scid, tid=None):
"""
@@ -1181,7 +1273,7 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
tid: Table ID
"""
data = dict()
- res = None
+ SQL = ''
for k, v in request.args.items():
try:
# comments should be taken as is because if user enters a
@@ -1193,6 +1285,11 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
except (ValueError, TypeError, KeyError):
data[k] = v
+ return self._fetch_sql(did, scid, tid, data)
+
+ def _fetch_sql(self, did, scid, tid, data, json_resp=True):
+ res = None
+
if tid is not None:
SQL = render_template(
"/".join([self.table_template_path, 'properties.sql']),
@@ -1201,13 +1298,18 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return internal_server_error(errormsg=SQL)
SQL, name = self.get_sql(did, scid, tid, data, res)
SQL = re.sub('\n{2,}', '\n\n', SQL)
SQL = SQL.strip('\n')
+
+ if not json_resp:
+ return SQL
+
if SQL == '':
SQL = "--modified SQL"
+
return make_json_response(
data=SQL,
status=200
@@ -1419,7 +1521,7 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
return ajax_response(response=sql)
@BaseTableView.check_precondition
- def delete_sql(self, gid, sid, did, scid, tid):
+ def delete_sql(self, gid, sid, did, scid, tid, json_resp=True):
"""
DELETE script sql for the object
@@ -1448,6 +1550,9 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
self.qtIdent(self.conn, data['schema'], data['name'])
)
+ if not json_resp:
+ return sql
+
return ajax_response(response=sql)
@BaseTableView.check_precondition
@@ -1502,5 +1607,60 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings):
data={'total_rows': count}
)
+ def get_delete_sql(self, res):
+ self.cmd = 'delete'
+ sql = super(TableView, self).get_delete_sql(res)
+ self.cmd = None
+ return sql
+
+ @BaseTableView.check_precondition
+ def fetch_tables(self, sid, did, scid, tid=None, keys_to_remove=None):
+ """
+ This function will fetch the list of all the tables
+ and will be used by schema diff.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :param tid: Table Id
+ :param keys_to_remove: Table columns to be removed from the dataset
+ :return: Table dataset
+ """
+ if tid:
+ status, data = self._fetch_properties(did, scid, tid)
+
+ if not status:
+ current_app.logger.error(data)
+ return False
+
+ data = super(TableView, self).properties(
+ 0, sid, did, scid, tid, data, False
+ )
+ self.remove_keys_for_comparision(data, keys_to_remove)
+ return data
+
+ else:
+ res = dict()
+ SQL = render_template("/".join([self.table_template_path,
+ 'nodes.sql']), scid=scid)
+ status, tables = self.conn.execute_2darray(SQL)
+ if not status:
+ current_app.logger.error(tables)
+ return False
+
+ for row in tables['rows']:
+ status, data = self._fetch_properties(did, scid, row['oid'])
+
+ if status:
+ data = super(TableView, self).properties(
+ 0, sid, did, scid, row['oid'], data, False
+ )
+
+ self.remove_keys_for_comparision(data, keys_to_remove)
+ res[row['name']] = data
+
+ return res
+
+SchemaDiffRegistry(blueprint.node_type, TableView)
TableView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/base_partition_table.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/base_partition_table.py
index d210b8672..5885a8c84 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/base_partition_table.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/base_partition_table.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py
index 9891d00c4..3346af8d8 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -29,6 +29,7 @@ from pgadmin.utils.driver import get_driver
from config import PG_DEFAULT_DRIVER
from pgadmin.utils import IS_PY2
from pgadmin.utils.ajax import ColParamsJSONDecoder
+
# If we are in Python3
if not IS_PY2:
unicode = str
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js
index 6f8721b12..62086583d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/__init__.py
index 8a99957e2..edeb01b23 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_add.py
index e7094cb9f..756fb510c 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_delete.py
index aa03afd51..c70fba9d0 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_delete_multiple.py
index 07e27c651..b769e1218 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_get.py
index 34e696934..200a88878 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_msql.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_msql.py
index ef832a340..6a6dd1ac9 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_msql.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_msql.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_put.py
index bfdcef2eb..8bb89b649 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/utils.py
index 828076cab..27f9a4300 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/utils.py
index 5b2aa4236..6593a7a0c 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py
index 08b0be68c..5e91569a5 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -26,6 +26,10 @@ from pgadmin.browser.server_groups.servers.databases.schemas.utils \
from pgadmin.utils.driver import get_driver
from config import PG_DEFAULT_DRIVER
from pgadmin.utils import IS_PY2
+from pgadmin.utils.compile_template_name import compile_template_path
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
+
# If we are in Python3
if not IS_PY2:
unicode = str
@@ -155,7 +159,7 @@ class CompoundTriggerModule(CollectionNodeModule):
blueprint = CompoundTriggerModule(__name__)
-class CompoundTriggerView(PGChildNodeView):
+class CompoundTriggerView(PGChildNodeView, SchemaDiffObjectCompare):
"""
This class is responsible for generating routes for Compound Trigger node
@@ -245,6 +249,10 @@ class CompoundTriggerView(PGChildNodeView):
'enable': [{'put': 'enable_disable_trigger'}]
})
+ # Schema Diff: Keys to ignore while comparing
+ keys_to_ignore = ['oid', 'xmin', 'nspname', 'tfunction',
+ 'tgrelid', 'tgfoid']
+
def check_precondition(f):
"""
This function will behave as a decorator which will checks
@@ -267,6 +275,12 @@ class CompoundTriggerView(PGChildNodeView):
]['datlastsysoid'] if self.manager.db_info is not None and \
kwargs['did'] in self.manager.db_info else 0
+ self.table_template_path = compile_template_path(
+ 'tables/sql',
+ self.manager.server_type,
+ self.manager.version
+ )
+
# we will set template path for sql scripts
self.template_path = 'compound_triggers/sql/{0}/#{1}#'.format(
self.manager.server_type, self.manager.version)
@@ -417,6 +431,18 @@ class CompoundTriggerView(PGChildNodeView):
JSON of selected compound trigger node
"""
+ data = self._fetch_properties(tid, trid)
+
+ if not status:
+ return data
+
+ return ajax_response(
+ response=data,
+ status=200
+ )
+
+ def _fetch_properties(self, tid, trid):
+
SQL = render_template("/".join([self.template_path,
'properties.sql']),
tid=tid, trid=trid,
@@ -440,10 +466,7 @@ class CompoundTriggerView(PGChildNodeView):
data = trigger_definition(data)
- return ajax_response(
- response=data,
- status=200
- )
+ return True, data
@check_precondition
def create(self, gid, sid, did, scid, tid):
@@ -519,7 +542,7 @@ class CompoundTriggerView(PGChildNodeView):
return internal_server_error(errormsg=str(e))
@check_precondition
- def delete(self, gid, sid, did, scid, tid, trid=None):
+ def delete(self, gid, sid, did, scid, tid, trid=None, only_sql=False):
"""
This function will updates existing the compound trigger object
@@ -579,6 +602,9 @@ class CompoundTriggerView(PGChildNodeView):
conn=self.conn,
cascade=cascade
)
+ if only_sql:
+ return SQL
+
status, res = self.conn.execute_scalar(SQL)
if not status:
return internal_server_error(errormsg=res)
@@ -846,5 +872,109 @@ class CompoundTriggerView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def get_sql_from_diff(self, gid, sid, did, scid, tid, oid,
+ data=None, diff_schema=None, drop_sql=False):
+ if data:
+ sql, name = self.get_sql(scid, tid, oid, data)
+ if not isinstance(sql, (str, unicode)):
+ return sql
+ sql = sql.strip('\n').strip(' ')
+ else:
+ if drop_sql:
+ SQL = self.delete(gid=gid, sid=sid, did=did,
+ scid=scid, tid=tid,
+ trid=oid, only_sql=True)
+ else:
+ SQL = render_template("/".join([self.template_path,
+ 'properties.sql']),
+ tid=tid, trid=oid,
+ datlastsysoid=self.datlastsysoid)
+
+ status, res = self.conn.execute_dict(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+ if len(res['rows']) == 0:
+ return gone(gettext("""Could not find the compound
+ trigger in the table."""))
+
+ data = dict(res['rows'][0])
+ # Adding parent into data dict,
+ # will be using it while creating sql
+ data['schema'] = self.schema
+ data['table'] = self.table
+
+ if len(data['tgattr']) >= 1:
+ columns = ', '.join(data['tgattr'].split(' '))
+ data['columns'] = self._column_details(tid, columns)
+
+ data = self._trigger_definition(data)
+
+ if diff_schema:
+ data['schema'] = diff_schema
+
+ SQL, name = self.get_sql(scid, tid, None, data)
+
+ sql_header = u"-- Compound Trigger: {0}\n\n-- ".format(
+ data['name'])
+
+ sql_header += render_template("/".join([self.template_path,
+ 'delete.sql']),
+ data=data, conn=self.conn)
+
+ SQL = sql_header + '\n\n' + SQL.strip('\n')
+
+ # If compound trigger is disbaled then add sql
+ # code for the same
+ if not data['is_enable_trigger']:
+ SQL += '\n\n'
+ SQL += render_template("/".join([
+ self.template_path,
+ 'enable_disable_trigger.sql']),
+ data=data, conn=self.conn)
+
+ return SQL
+
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid, tid, oid=None,
+ ignore_keys=False):
+ """
+ This function will fetch the list of all the triggers for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :param tid: Table Id
+ :return:
+ """
+ res = dict()
+
+ if oid:
+ status, data = self._fetch_properties(tid, oid)
+ if not status:
+ current_app.logger.error(data)
+ return False
+ res = data
+ else:
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), tid=tid)
+ status, triggers = self.conn.execute_2darray(SQL)
+ if not status:
+ current_app.logger.error(triggers)
+ return False
+
+ for row in triggers['rows']:
+ status, data = self._fetch_properties(tid, row['oid'])
+ if status:
+ if ignore_keys:
+ for key in self.keys_to_ignore:
+ if key in data:
+ del data[key]
+ res[row['name']] = data
+
+ return res
+
+SchemaDiffRegistry(blueprint.node_type, CompoundTriggerView, 'table')
CompoundTriggerView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js
index f9fac6d7a..1d7efeb45 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/tests/__init__.py
index 1bf2bca6a..e9206708f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/tests/test_compound_triggers_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/tests/test_compound_triggers_add.py
index 2fafcfdba..ed0b4bf87 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/tests/test_compound_triggers_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/tests/test_compound_triggers_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/tests/test_compound_triggers_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/tests/test_compound_triggers_delete.py
index 0e874eb50..e55698566 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/tests/test_compound_triggers_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/tests/test_compound_triggers_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/tests/test_compound_triggers_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/tests/test_compound_triggers_delete_multiple.py
index 1fd6b90d6..d7019224b 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/tests/test_compound_triggers_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/tests/test_compound_triggers_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/tests/test_compound_triggers_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/tests/test_compound_triggers_put.py
index 90135bb5f..296f99757 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/tests/test_compound_triggers_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/tests/test_compound_triggers_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/tests/utils.py
index dacdf2ecd..483d172d8 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/utils.py
index ea1984920..70117528f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/__init__.py
index 3205bb58c..ebc96454a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py
index 484e7dcce..5af6da7e5 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js
index 8ddcb8ba2..fed717ac2 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/tests/__init__.py
index 1fe3f0b85..3dcb7b892 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/tests/test_check_constraint_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/tests/test_check_constraint_add.py
index b9d0e70c8..15473d725 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/tests/test_check_constraint_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/tests/test_check_constraint_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/tests/test_check_constraint_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/tests/test_check_constraint_delete.py
index 90cedf5d1..ffc861522 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/tests/test_check_constraint_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/tests/test_check_constraint_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/tests/test_check_constraint_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/tests/test_check_constraint_get.py
index a2c6721bb..fa2878ca9 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/tests/test_check_constraint_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/tests/test_check_constraint_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/tests/test_check_constraint_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/tests/test_check_constraint_put.py
index 8ebe5f4e9..adaa015ec 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/tests/test_check_constraint_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/tests/test_check_constraint_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/tests/utils.py
index 1ec26a290..6172ea64d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/utils.py
index c1f274a14..ca6b9ef93 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/__init__.py
index 96045bac1..8362cdb04 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js
index 1e1381a27..db1286f88 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/tests/__init__.py
index 7af45b1b5..168bc2e9b 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/tests/test_exclusion_constraint_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/tests/test_exclusion_constraint_add.py
index a521b49c5..d69d1e5bd 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/tests/test_exclusion_constraint_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/tests/test_exclusion_constraint_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/tests/test_exclusion_constraint_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/tests/test_exclusion_constraint_delete.py
index dca48e036..20cd7f71d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/tests/test_exclusion_constraint_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/tests/test_exclusion_constraint_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/tests/test_exclusion_constraint_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/tests/test_exclusion_constraint_get.py
index 62b9f59cc..d775eb3b1 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/tests/test_exclusion_constraint_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/tests/test_exclusion_constraint_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/tests/test_exclusion_constraint_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/tests/test_exclusion_constraint_put.py
index 924d64088..d875a85c2 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/tests/test_exclusion_constraint_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/tests/test_exclusion_constraint_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/tests/utils.py
index 9dbf2fb23..96a996220 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/utils.py
index 1db68c81b..0f38889cc 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/__init__.py
index 6a3d70afe..e4a74a93a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js
index 2e75562f9..12a940e34 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/tests/__init__.py
index d94f8603b..1775bd8ff 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/tests/test_foreign_key_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/tests/test_foreign_key_add.py
index b3eef6ea9..835616053 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/tests/test_foreign_key_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/tests/test_foreign_key_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/tests/test_foreign_key_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/tests/test_foreign_key_delete.py
index 63260043a..56e9cf432 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/tests/test_foreign_key_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/tests/test_foreign_key_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/tests/test_foreign_key_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/tests/test_foreign_key_get.py
index 8ee86d889..780413683 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/tests/test_foreign_key_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/tests/test_foreign_key_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/tests/test_foreign_key_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/tests/test_foreign_key_put.py
index b887323b8..5b392cd8a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/tests/test_foreign_key_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/tests/test_foreign_key_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/tests/utils.py
index 836b3bc00..852dedfc5 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/utils.py
index b1cd2829c..546865055 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py
index 2984a58e4..3e32d1be1 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js
index a7dd27d22..ee0206d99 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js
index c2baa4059..fbec7b8fc 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/__init__.py
index 42009ac95..60555f4b3 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/test_index_constraint_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/test_index_constraint_add.py
index 3cd6b3b86..7b076cad0 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/test_index_constraint_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/test_index_constraint_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/test_index_constraint_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/test_index_constraint_delete.py
index 7eea5e9bb..030922e6b 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/test_index_constraint_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/test_index_constraint_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/test_index_constraint_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/test_index_constraint_get.py
index c08c2acb3..8ddf5079e 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/test_index_constraint_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/test_index_constraint_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/test_index_constraint_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/test_index_constraint_put.py
index 87289a620..74939a418 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/test_index_constraint_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/test_index_constraint_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/utils.py
index d175de5c6..0122e1d10 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/utils.py
index 1360a16ce..04237d645 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -152,7 +152,8 @@ def get_index_constraint_sql(conn, did, tid, data, template_path=None):
modified_sql, name = get_sql(conn, c, did, tid, ctype,
c['oid'])
- sql.append(modified_sql.strip('\n'))
+ if modified_sql:
+ sql.append(modified_sql.strip('\n'))
if 'added' in constraint:
for c in constraint['added']:
@@ -183,6 +184,7 @@ def get_sql(conn, data, did, tid, ctype, cid=None, template_path=None):
:return:
"""
name = data['name'] if 'name' in data else None
+ sql = None
if cid is not None:
sql = render_template("/".join([template_path, 'properties.sql']),
did=did, tid=tid, cid=cid,
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js
index 9239085ee..7634f7a92 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/tests/__init__.py
index 057fd5112..fd23f6786 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/type.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/type.py
index e6357dcd3..83625f7ee 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/type.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/type.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/__init__.py
index be868d7b6..6a896e079 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -13,7 +13,7 @@ import simplejson as json
from functools import wraps
import pgadmin.browser.server_groups.servers.databases as database
-from flask import render_template, request, jsonify
+from flask import render_template, request, jsonify, current_app
from flask_babelex import gettext
from pgadmin.browser.collection import CollectionNodeModule
from pgadmin.browser.server_groups.servers.databases.schemas.tables.\
@@ -25,8 +25,14 @@ from pgadmin.utils.compile_template_name import compile_template_path
from pgadmin.utils.driver import get_driver
from config import PG_DEFAULT_DRIVER
from pgadmin.utils import IS_PY2
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.directory_compare import compare_dictionaries,\
+ directory_diff
+from pgadmin.tools.schema_diff.model import SchemaDiffModel
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
from pgadmin.browser.server_groups.servers.databases.schemas. \
tables.indexes import utils as index_utils
+
# If we are in Python3
if not IS_PY2:
unicode = str
@@ -135,7 +141,7 @@ class IndexesModule(CollectionNodeModule):
blueprint = IndexesModule(__name__)
-class IndexesView(PGChildNodeView):
+class IndexesView(PGChildNodeView, SchemaDiffObjectCompare):
"""
This class is responsible for generating routes for Index node
@@ -227,6 +233,11 @@ class IndexesView(PGChildNodeView):
{'get': 'get_op_class'}]
})
+ # Schema Diff: Keys to ignore while comparing
+ keys_to_ignore = ['oid', 'relowner', 'schema',
+ 'indrelid', 'nspname'
+ ]
+
def check_precondition(f):
"""
This function will behave as a decorator which will checks
@@ -248,6 +259,12 @@ class IndexesView(PGChildNodeView):
]['datlastsysoid'] if self.manager.db_info is not None and \
kwargs['did'] in self.manager.db_info else 0
+ self.table_template_path = compile_template_path(
+ 'tables/sql',
+ self.manager.server_type,
+ self.manager.version
+ )
+
# we will set template path for sql scripts
self.template_path = compile_template_path(
'indexes/sql/',
@@ -485,19 +502,35 @@ class IndexesView(PGChildNodeView):
Returns:
JSON of selected schema node
"""
+ status, data = self._fetch_properties(did, tid, idx)
+ if not status:
+ return data
+ return ajax_response(
+ response=data,
+ status=200
+ )
+
+ def _fetch_properties(self, did, tid, idx):
+ """
+ This function is used to fetch the properties of specified object.
+ :param did:
+ :param tid:
+ :param idx:
+ :return:
+ """
SQL = render_template(
"/".join([self.template_path, 'properties.sql']),
did=did, tid=tid, idx=idx, datlastsysoid=self.datlastsysoid
)
status, res = self.conn.execute_dict(SQL)
-
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(gettext("""Could not find the index in the table."""))
+ return False, gone(
+ gettext("""Could not find the index in the table."""))
# Making copy of output for future use
data = dict(res['rows'][0])
@@ -509,10 +542,7 @@ class IndexesView(PGChildNodeView):
if self.manager.version >= 110000:
data = index_utils.get_include_details(self.conn, idx, data)
- return ajax_response(
- response=data,
- status=200
- )
+ return True, data
@check_precondition
def create(self, gid, sid, did, scid, tid):
@@ -620,7 +650,8 @@ class IndexesView(PGChildNodeView):
return internal_server_error(errormsg=str(e))
@check_precondition
- def delete(self, gid, sid, did, scid, tid, idx=None):
+ def delete(self, gid, sid, did, scid, tid, idx=None,
+ only_sql=False):
"""
This function will updates existing the schema object
@@ -676,6 +707,9 @@ class IndexesView(PGChildNodeView):
"/".join([self.template_path, 'delete.sql']),
data=data, conn=self.conn, cascade=cascade
)
+
+ if only_sql:
+ return SQL
status, res = self.conn.execute_scalar(SQL)
if not status:
return internal_server_error(errormsg=res)
@@ -792,6 +826,32 @@ class IndexesView(PGChildNodeView):
return ajax_response(response=SQL)
+ @check_precondition
+ def get_sql_from_index_diff(self, sid, did, scid, tid, idx, data=None,
+ diff_schema=None, drop_req=False):
+
+ tmp_idx = idx
+ schema = ''
+ if data:
+ schema = self.schema
+ elif diff_schema:
+ schema = diff_schema
+
+ sql = index_utils.get_reverse_engineered_sql(
+ self.conn, schema,
+ self.table, did, tid, idx,
+ self.datlastsysoid,
+ template_path=None, with_header=False)
+
+ drop_sql = ''
+ if drop_req:
+ drop_sql = '\n' + render_template(
+ "/".join([self.template_path, 'delete.sql']),
+ data=data, conn=self.conn
+ )
+
+ return drop_sql + '\n\n' + sql
+
@check_precondition
def dependents(self, gid, sid, did, scid, tid, idx):
"""
@@ -914,5 +974,129 @@ class IndexesView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid, tid, oid=None,
+ ignore_keys=False):
+ """
+ This function will fetch the list of all the indexes for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+
+ res = dict()
+
+ if not oid:
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), tid=tid)
+ status, indexes = self.conn.execute_2darray(SQL)
+ if not status:
+ current_app.logger.error(indexes)
+ return False
+
+ for row in indexes['rows']:
+ status, data = self._fetch_properties(did, tid,
+ row['oid'])
+ if status:
+ if ignore_keys:
+ for key in self.keys_to_ignore:
+ if key in data:
+ del data[key]
+ res[row['name']] = data
+ else:
+ status, data = self._fetch_properties(did, tid,
+ oid)
+ if not status:
+ current_app.logger.error(data)
+ return False
+ res = data
+
+ return res
+
+ def ddl_compare(self, **kwargs):
+ """
+ This function will compare index properties and
+ return the difference of SQL
+ """
+
+ src_sid = kwargs.get('source_sid')
+ src_did = kwargs.get('source_did')
+ src_scid = kwargs.get('source_scid')
+ src_tid = kwargs.get('source_tid')
+ src_oid = kwargs.get('source_oid')
+ tar_sid = kwargs.get('target_sid')
+ tar_did = kwargs.get('target_did')
+ tar_scid = kwargs.get('target_scid')
+ tar_tid = kwargs.get('target_tid')
+ tar_oid = kwargs.get('target_oid')
+ comp_status = kwargs.get('comp_status')
+
+ source = ''
+ target = ''
+ diff = ''
+
+ status, target_schema = self.get_schema(tar_sid,
+ tar_did,
+ tar_scid
+ )
+ if not status:
+ return internal_server_error(errormsg=target_schema)
+
+ if comp_status == SchemaDiffModel.COMPARISON_STATUS['source_only']:
+ diff = self.get_sql_from_index_diff(sid=src_sid,
+ did=src_did, scid=src_scid,
+ tid=src_tid, idx=src_oid,
+ diff_schema=target_schema)
+
+ elif comp_status == SchemaDiffModel.COMPARISON_STATUS['target_only']:
+ diff = self.delete(gid=1, sid=tar_sid, did=tar_did,
+ scid=tar_scid, tid=tar_tid,
+ idx=tar_oid, only_sql=True)
+
+ else:
+ source = self.fetch_objects_to_compare(sid=src_sid, did=src_did,
+ scid=src_scid, tid=src_tid,
+ oid=src_oid)
+ target = self.fetch_objects_to_compare(sid=tar_sid, did=tar_did,
+ scid=tar_scid, tid=tar_tid,
+ oid=tar_oid)
+
+ if not (source or target):
+ return None
+
+ diff_dict = directory_diff(
+ source, target, ignore_keys=self.keys_to_ignore,
+ difference={}
+ )
+
+ required_create_keys = ['columns']
+ create_req = False
+
+ for key in required_create_keys:
+ if key in diff_dict:
+ create_req = True
+
+ if create_req:
+ diff = self.get_sql_from_index_diff(sid=src_sid,
+ did=src_did,
+ scid=src_scid,
+ tid=src_tid,
+ idx=src_oid,
+ diff_schema=target_schema,
+ drop_req=True)
+ else:
+ diff = self.get_sql_from_index_diff(sid=tar_sid,
+ did=tar_did,
+ scid=tar_scid,
+ tid=tar_tid,
+ idx=tar_oid,
+ data=diff_dict)
+
+ return diff
+
+SchemaDiffRegistry(blueprint.node_type, IndexesView, 'table')
IndexesView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js
index 186b73e7d..df2a7184a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/__init__.py
index 953d0f7f7..e7025ce7c 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/test_indexes_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/test_indexes_add.py
index 328e67302..9fef4b67a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/test_indexes_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/test_indexes_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/test_indexes_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/test_indexes_delete.py
index 29ea46912..35652a7ef 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/test_indexes_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/test_indexes_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/test_indexes_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/test_indexes_delete_multiple.py
index b5855983a..22e6f9f87 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/test_indexes_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/test_indexes_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/test_indexes_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/test_indexes_get.py
index 5a5cf4169..b03647283 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/test_indexes_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/test_indexes_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/test_indexes_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/test_indexes_put.py
index 2c807ee16..5fdaea24d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/test_indexes_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/test_indexes_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/utils.py
index 2ba5a3aeb..9c853c9b9 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/utils.py
index ab49ab8e9..eb9001f0a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -26,7 +26,7 @@ def get_template_path(f):
def wrap(*args, **kwargs):
# Here args[0] will hold the connection object
conn_obj = args[0]
- if 'template_path' not in kwargs:
+ if 'template_path' not in kwargs or kwargs['template_path'] is None:
kwargs['template_path'] = \
'indexes/sql/#{0}#'.format(conn_obj.manager.version)
@@ -229,7 +229,7 @@ def get_sql(conn, data, did, tid, idx, datlastsysoid,
@get_template_path
def get_reverse_engineered_sql(conn, schema, table, did, tid, idx,
datlastsysoid,
- template_path=None):
+ template_path=None, with_header=True):
"""
This function will return reverse engineered sql for specified trigger.
@@ -240,6 +240,8 @@ def get_reverse_engineered_sql(conn, schema, table, did, tid, idx,
:param idx: Index ID
:param datlastsysoid:
:param template_path: Optional template path
+ :param with_header: Optional parameter to decide whether the SQL will be
+ returned with header or not
:return:
"""
SQL = render_template("/".join([template_path, 'properties.sql']),
@@ -267,11 +269,12 @@ def get_reverse_engineered_sql(conn, schema, table, did, tid, idx,
SQL, name = get_sql(conn, data, did, tid, None, datlastsysoid)
- sql_header = u"-- Index: {0}\n\n-- ".format(data['name'])
+ if with_header:
+ sql_header = u"-- Index: {0}\n\n-- ".format(data['name'])
- sql_header += render_template("/".join([template_path, 'delete.sql']),
- data=data, conn=conn)
+ sql_header += render_template("/".join([template_path, 'delete.sql']),
+ data=data, conn=conn)
- SQL = sql_header + '\n\n' + SQL
+ SQL = sql_header + '\n\n' + SQL
return SQL
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/__init__.py
index f32b878cf..2794bbf09 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -24,6 +24,11 @@ from pgadmin.browser.collection import CollectionNodeModule
from pgadmin.utils.ajax import make_json_response, precondition_required
from config import PG_DEFAULT_DRIVER
from pgadmin.browser.utils import PGChildModule
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.directory_compare import compare_dictionaries,\
+ directory_diff
+from pgadmin.tools.schema_diff.model import SchemaDiffModel
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
def backend_supported(module, manager, **kwargs):
@@ -152,7 +157,8 @@ class PartitionsModule(CollectionNodeModule):
blueprint = PartitionsModule(__name__)
-class PartitionsView(BaseTableView, DataTypeReader, VacuumSettings):
+class PartitionsView(BaseTableView, DataTypeReader, VacuumSettings,
+ SchemaDiffObjectCompare):
"""
This class is responsible for generating routes for Partition node
@@ -200,27 +206,56 @@ class PartitionsView(BaseTableView, DataTypeReader, VacuumSettings):
})
- def get_children_nodes(self, manager, **kwargs):
- nodes = []
- # treat partition table as normal table.
- # replace tid with ptid and pop ptid from kwargs
- if 'ptid' in kwargs:
- ptid = kwargs.pop('ptid')
- kwargs['tid'] = ptid
+ # Schema Diff: Keys to ignore while comparing
+ keys_to_ignore = ['oid', 'schema', 'vacuum_table',
+ 'vacuum_toast', 'edit_types']
+
+ def children(self, **kwargs):
+ """Build a list of treeview nodes from the child nodes."""
+
+ if 'sid' not in kwargs:
+ return precondition_required(
+ gettext('Required properties are missing.')
+ )
+
+ from pgadmin.utils.driver import get_driver
+ manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(
+ sid=kwargs['sid']
+ )
+
+ did = None
+ if 'did' in kwargs:
+ did = kwargs['did']
+
+ conn = manager.connection(did=did)
+
+ if not conn.connected():
+ return precondition_required(
+ gettext(
+ "Connection to the server has been lost."
+ )
+ )
+ nodes = []
for module in self.blueprint.submodules:
if isinstance(module, PGChildModule):
if manager is not None and \
module.BackendSupported(manager, **kwargs):
+ # treat partition table as normal table.
+ # replace tid with ptid and pop ptid from kwargs
+ if 'ptid' in kwargs:
+ ptid = kwargs.pop('ptid')
+ kwargs['tid'] = ptid
nodes.extend(module.get_nodes(**kwargs))
else:
nodes.extend(module.get_nodes(**kwargs))
- if manager is not None and \
- self.blueprint.BackendSupported(manager, **kwargs):
- nodes.extend(self.blueprint.get_nodes(**kwargs))
-
- return nodes
+ # Return sorted nodes based on label
+ return make_json_response(
+ data=sorted(
+ nodes, key=lambda c: c['label']
+ )
+ )
@BaseTableView.check_precondition
def list(self, gid, sid, did, scid, tid):
@@ -270,7 +305,7 @@ class PartitionsView(BaseTableView, DataTypeReader, VacuumSettings):
"""
SQL = render_template(
"/".join([self.partition_template_path, 'nodes.sql']),
- scid=scid, tid=tid, ptid=ptid
+ scid=scid, tid=tid
)
status, rset = self.conn.execute_2darray(SQL)
if not status:
@@ -342,6 +377,63 @@ class PartitionsView(BaseTableView, DataTypeReader, VacuumSettings):
return super(PartitionsView, self).properties(
gid, sid, did, scid, ptid, res)
+ @BaseTableView.check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid, tid, ptid=None):
+ """
+ This function will fetch the list of all the tables for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :param tid: Table Id
+ :param ptif: Partition table Id
+ :return:
+ """
+ res = {}
+
+ if ptid:
+ SQL = render_template("/".join([self.partition_template_path,
+ 'properties.sql']),
+ did=did, scid=scid, tid=tid,
+ ptid=ptid, datlastsysoid=self.datlastsysoid)
+ status, result = self.conn.execute_dict(SQL)
+ if not status:
+ current_app.logger.error(result)
+ return False
+
+ res = super(PartitionsView, self).properties(
+ 0, sid, did, scid, ptid, result)
+
+ else:
+ SQL = render_template(
+ "/".join([self.partition_template_path, 'nodes.sql']),
+ scid=scid, tid=tid
+ )
+ status, partitions = self.conn.execute_2darray(SQL)
+ if not status:
+ current_app.logger.error(partitions)
+ return False
+
+ for row in partitions['rows']:
+ SQL = render_template("/".join([self.partition_template_path,
+ 'properties.sql']),
+ did=did, scid=scid, tid=tid,
+ ptid=row['oid'],
+ datlastsysoid=self.datlastsysoid)
+ status, result = self.conn.execute_dict(SQL)
+
+ if not status:
+ current_app.logger.error(result)
+ return False
+
+ data = super(PartitionsView, self).properties(
+ 0, sid, did, scid, row['oid'], result, False
+ )
+ res[row['name']] = data
+
+ return res
+
@BaseTableView.check_precondition
def sql(self, gid, sid, did, scid, tid, ptid):
"""
@@ -375,6 +467,62 @@ class PartitionsView(BaseTableView, DataTypeReader, VacuumSettings):
return BaseTableView.get_reverse_engineered_sql(self, did, scid, ptid,
main_sql, data)
+ @BaseTableView.check_precondition
+ def get_sql_from_diff(self, **kwargs):
+ """
+ This function will create sql on the basis the difference of 2 tables
+ """
+ data = dict()
+ res = None
+ sid = kwargs['sid']
+ did = kwargs['did']
+ scid = kwargs['scid']
+ tid = kwargs['tid']
+ ptid = kwargs['ptid']
+ diff_data = kwargs['diff_data'] if 'diff_data' in kwargs else None
+ json_resp = kwargs['json_resp'] if 'json_resp' in kwargs else True
+ diff_schema = kwargs['diff_schema'] if 'diff_schema' in kwargs else\
+ None
+
+ if diff_data:
+ SQL = render_template("/".join([self.partition_template_path,
+ 'properties.sql']),
+ did=did, scid=scid, tid=tid,
+ ptid=ptid, datlastsysoid=self.datlastsysoid)
+ status, res = self.conn.execute_dict(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ SQL, name = self.get_sql(did, scid, ptid, diff_data, res)
+ SQL = re.sub('\n{2,}', '\n\n', SQL)
+ SQL = SQL.strip('\n')
+ return SQL
+ else:
+ main_sql = []
+
+ SQL = render_template("/".join([self.partition_template_path,
+ 'properties.sql']),
+ did=did, scid=scid, tid=tid,
+ ptid=ptid, datlastsysoid=self.datlastsysoid)
+ status, res = self.conn.execute_dict(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ if len(res['rows']) == 0:
+ return gone(gettext(
+ "The specified partitioned table could not be found."))
+
+ data = res['rows'][0]
+
+ if diff_schema:
+ data['schema'] = diff_schema
+ data['parent_schema'] = diff_schema
+
+ return BaseTableView.get_reverse_engineered_sql(self, did,
+ scid, ptid,
+ main_sql, data,
+ False)
+
@BaseTableView.check_precondition
def detach(self, gid, sid, did, scid, tid, ptid):
"""
@@ -576,7 +724,7 @@ class PartitionsView(BaseTableView, DataTypeReader, VacuumSettings):
return internal_server_error(errormsg=str(e))
@BaseTableView.check_precondition
- def delete(self, gid, sid, did, scid, tid, ptid=None):
+ def delete(self, gid, sid, did, scid, tid, ptid=None, only_sql=False):
"""
This function will delete the table object
@@ -631,5 +779,61 @@ class PartitionsView(BaseTableView, DataTypeReader, VacuumSettings):
except Exception as e:
return internal_server_error(errormsg=str(e))
+ def ddl_compare(self, **kwargs):
+ """
+ This function will compare index properties and
+ return the difference of SQL
+ """
+
+ src_sid = kwargs.get('source_sid')
+ src_did = kwargs.get('source_did')
+ src_scid = kwargs.get('source_scid')
+ src_tid = kwargs.get('source_tid')
+ src_oid = kwargs.get('source_oid')
+ tar_sid = kwargs.get('target_sid')
+ tar_did = kwargs.get('target_did')
+ tar_scid = kwargs.get('target_scid')
+ tar_tid = kwargs.get('target_tid')
+ tar_oid = kwargs.get('target_oid')
+ comp_status = kwargs.get('comp_status')
+
+ source = ''
+ target = ''
+ diff = ''
+
+ status, target_schema = self.get_schema_for_schema_diff(tar_sid,
+ tar_did,
+ tar_scid
+ )
+ if not status:
+ return internal_server_error(errormsg=target_schema)
+
+ if comp_status == SchemaDiffModel.COMPARISON_STATUS['source_only']:
+ diff = self.get_sql_from_diff(sid=src_sid,
+ did=src_did, scid=src_scid,
+ tid=src_tid, ptid=src_oid,
+ diff_schema=target_schema)
+
+ elif comp_status == SchemaDiffModel.COMPARISON_STATUS['target_only']:
+ SQL = render_template("/".join([self.partition_template_path,
+ 'properties.sql']),
+ did=did, scid=scid, tid=tid,
+ ptid=ptid, datlastsysoid=self.datlastsysoid)
+ status, res = self.conn.execute_dict(SQL)
+
+ SQL = render_template(
+ "/".join([self.table_template_path, 'properties.sql']),
+ did=tar_did, scid=tar_scid, tid=tar_oid,
+ datlastsysoid=self.datlastsysoid
+ )
+ status, res = self.conn.execute_dict(SQL)
+ if status:
+ self.cmd = 'delete'
+ diff = super(PartitionsView, self).get_delete_sql(res)
+ self.cmd = None
+
+ return diff
+
+SchemaDiffRegistry(blueprint.node_type, PartitionsView, 'table')
PartitionsView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js
index 04a693ead..a10b39768 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
@@ -49,7 +49,8 @@ function(
sqlCreateHelp: 'sql-createtable.html',
dialogHelp: url_for('help.static', {'filename': 'table_dialog.html'}),
hasScriptTypes: ['create'],
- width: '650px',
+ height: '95%',
+ width: '85%',
Init: function() {
/* Avoid mulitple registration of menus */
if (this.initialized)
@@ -864,7 +865,7 @@ function(
canEdit: false, canDelete: true,
customDeleteTitle: gettext('Detach Partition'),
customDeleteMsg: gettext('Are you sure you wish to detach this partition?'),
- columns:['is_attach', 'partition_name', 'is_default', 'values_from', 'values_to', 'values_in', 'values_modulus', 'values_remainder'],
+ columns:['is_attach', 'partition_name', 'values_from', 'values_to', 'values_in'],
control: Backform.SubNodeCollectionControl.extend({
row: Backgrid.PartitionRow,
initialize: function() {
@@ -929,30 +930,10 @@ function(
},{
id: 'partition_note', label: gettext('Partition'),
type: 'note', group: 'partition',
- text: [
- '<ul><li>',
- '<strong>', gettext('Create a table: '), '</strong>',
- gettext('User can create multiple partitions while creating new partitioned table. Operation switch is disabled in this scenario.'),
- '</li><li>',
- '<strong>', gettext('Edit existing table: '), '</strong>',
- gettext('User can create/attach/detach multiple partitions. In attach operation user can select table from the list of suitable tables to be attached.'),
- '</li><li>',
- '<strong>', gettext('Default: '), '</strong>',
- gettext('The default partition can store rows that do not fall into any existing partition’s range or list.'),
- '</li><li>',
- '<strong>', gettext('From/To/In input: '), '</strong>',
- gettext('From/To/In input: Values for these fields must be quoted with single quote. For more than one partition key values must be comma(,) separated.'),
- '</li><li>',
- '<strong>', gettext('Example: From/To: '), '</strong>',
- gettext('Enabled for range partition. Consider partitioned table with multiple keys of type Integer, then values should be specified like \'100\',\'200\'.'),
- '</li><li>',
- '<strong>', gettext('In: '), '</strong>',
- gettext('Enabled for list partition. Values must be comma(,) separated and quoted with single quote.'),
- '</li><li>',
- '<strong>', gettext('Modulus/Remainder: '), '</strong>',
- gettext('Enabled for hash partition.'),
- '</li></ul>',
- ].join(''),
+ text: gettext('The control above is used to Create/Attach/Detach partitions.<br>' +
+ '<ul><li>Create Mode: User will be able to create N number of partitions. Mode switch control is disabled in this scenario.</li>' +
+ '<li>Edit Mode: User will be able to create/attach/detach N number of partitions. ' +
+ 'In attach mode there will be list of suitable tables to be attached.</li></ul>'),
visible: function(m) {
if(!_.isUndefined(m.node_info) && !_.isUndefined(m.node_info.server)
&& !_.isUndefined(m.node_info.server.version) &&
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/tests/test_backend_supported.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/tests/test_backend_supported.py
index bf92e5f01..d0a3b98ee 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/tests/test_backend_supported.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/tests/test_backend_supported.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/__init__.py
index 5e2d5af89..2b9f476f3 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -13,7 +13,8 @@ import simplejson as json
from functools import wraps
import pgadmin.browser.server_groups.servers.databases.schemas as schemas
-from flask import render_template, make_response, request, jsonify
+from flask import render_template, make_response, request, jsonify,\
+ current_app
from flask_babelex import gettext
from pgadmin.browser.collection import CollectionNodeModule
from pgadmin.browser.server_groups.servers.databases.schemas.utils import \
@@ -23,7 +24,11 @@ from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.driver import get_driver
from config import PG_DEFAULT_DRIVER
+from pgadmin.utils.compile_template_name import compile_template_path
from pgadmin.utils import IS_PY2
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
+
# If we are in Python3
if not IS_PY2:
unicode = str
@@ -134,7 +139,7 @@ class RuleModule(CollectionNodeModule):
blueprint = RuleModule(__name__)
-class RuleView(PGChildNodeView):
+class RuleView(PGChildNodeView, SchemaDiffObjectCompare):
"""
This is a class for rule node which inherits the
properties and methods from PGChildNodeView class and define
@@ -178,6 +183,9 @@ class RuleView(PGChildNodeView):
'configs': [{'get': 'configs'}]
})
+ # Schema Diff: Keys to ignore while comparing
+ keys_to_ignore = ['oid', 'schema', 'definition']
+
def check_precondition(f):
"""
This function will behave as a decorator which will check the
@@ -197,6 +205,12 @@ class RuleView(PGChildNodeView):
]['datlastsysoid'] if self.manager.db_info is not None and \
kwargs['did'] in self.manager.db_info else 0
self.template_path = 'rules/sql'
+ self.table_template_path = compile_template_path(
+ 'tables/sql',
+ self.manager.server_type,
+ self.manager.version
+ )
+
return f(*args, **kwargs)
return wrap
@@ -278,6 +292,21 @@ class RuleView(PGChildNodeView):
"""
Fetch the properties of an individual rule and render in properties tab
+ """
+ status, data = self._fetch_properties(rid)
+ if not status:
+ return data
+
+ return ajax_response(
+ response=data,
+ status=200
+ )
+
+ def _fetch_properties(self, rid):
+ """
+ This function is used to fetch the properties of the specified object
+ :param rid:
+ :return:
"""
SQL = render_template("/".join(
[self.template_path, 'properties.sql']
@@ -285,15 +314,13 @@ class RuleView(PGChildNodeView):
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(gettext("""Could not find the rule in the table."""))
+ return False, gone(
+ gettext("""Could not find the rule in the table."""))
- return ajax_response(
- response=parse_rule_definition(res),
- status=200
- )
+ return True, parse_rule_definition(res)
@check_precondition
def create(self, gid, sid, did, scid, tid):
@@ -369,7 +396,7 @@ class RuleView(PGChildNodeView):
return internal_server_error(errormsg=str(e))
@check_precondition
- def delete(self, gid, sid, did, scid, tid, rid=None):
+ def delete(self, gid, sid, did, scid, tid, rid=None, only_sql=False):
"""
This function will drop a rule object
"""
@@ -412,6 +439,8 @@ class RuleView(PGChildNodeView):
nspname=rset['nspname'],
cascade=cascade
)
+ if only_sql:
+ return SQL
status, res = self.conn.execute_scalar(SQL)
if not status:
return internal_server_error(errormsg=res)
@@ -489,6 +518,44 @@ class RuleView(PGChildNodeView):
[self.template_path, 'create.sql']), data=data)
return SQL, data['name'] if 'name' in data else old_data['name']
+ @check_precondition
+ def get_sql_from_diff(self, gid, sid, did, scid, tid, oid, data=None,
+ diff_schema=None, drop_sql=False):
+
+ if drop_sql:
+ SQL = self.delete(gid=gid, sid=sid, did=did,
+ scid=scid, tid=tid,
+ rid=oid, only_sql=True)
+ else:
+ SQL = render_template("/".join(
+ [self.template_path, 'properties.sql']), rid=oid)
+ status, res = self.conn.execute_dict(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+ if len(res['rows']) == 0:
+ return gone(
+ gettext("""Could not find the rule in the table.""")
+ )
+ res_data = parse_rule_definition(res)
+
+ SQL = ''
+
+ if data:
+ old_data = res_data
+ SQL = render_template(
+ "/".join([self.template_path, 'update.sql']),
+ data=data, o_data=old_data
+ )
+ else:
+ if diff_schema:
+ res_data['schema'] = diff_schema
+
+ SQL = render_template("/".join(
+ [self.template_path, 'create.sql']),
+ data=res_data, display_comments=True)
+
+ return SQL
+
@check_precondition
def dependents(self, gid, sid, did, scid, tid, rid):
"""
@@ -527,5 +594,47 @@ class RuleView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid, tid, oid=None,
+ ignore_keys=False):
+ """
+ This function will fetch the list of all the rules for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :param tid: Table Id
+ :return:
+ """
+
+ res = {}
+ if oid:
+ status, data = self._fetch_properties(oid)
+ if not status:
+ current_app.logger.error(data)
+ return False
+
+ res = data
+ else:
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']),
+ tid=tid)
+ status, rules = self.conn.execute_2darray(SQL)
+ if not status:
+ current_app.logger.error(rules)
+ return False
+
+ for row in rules['rows']:
+ status, data = self._fetch_properties(row['oid'])
+ if status:
+ if ignore_keys:
+ for key in self.keys_to_ignore:
+ if key in data:
+ del data[key]
+ res[row['name']] = data
+ return res
+
+SchemaDiffRegistry(blueprint.node_type, RuleView, 'table')
RuleView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js
index 4cc65297a..624b98806 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/__init__.py
index 27cd89067..f4e2ae26a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/test_rules_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/test_rules_add.py
index 0ae6f857d..1918f0751 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/test_rules_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/test_rules_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/test_rules_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/test_rules_delete.py
index adcf8f339..4f7d570e9 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/test_rules_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/test_rules_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/test_rules_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/test_rules_delete_multiple.py
index db58cb514..fad6ea7a0 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/test_rules_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/test_rules_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/test_rules_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/test_rules_get.py
index 1a03dab2f..067c67a7f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/test_rules_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/test_rules_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/test_rules_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/test_rules_put.py
index db4c426e1..867354aa3 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/test_rules_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/test_rules_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/utils.py
index 322756afb..c521987ae 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/schema_diff_utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/schema_diff_utils.py
new file mode 100644
index 000000000..7a9cff6fa
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/schema_diff_utils.py
@@ -0,0 +1,507 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+""" Implements Utility class for Table and Partitioned Table. """
+
+import copy
+
+from flask import render_template
+from pgadmin.utils.driver import get_driver
+from config import PG_DEFAULT_DRIVER
+from pgadmin.tools.schema_diff.directory_compare import compare_dictionaries,\
+ directory_diff
+from pgadmin.tools.schema_diff.model import SchemaDiffModel
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+
+
+class SchemaDiffTableCompare(SchemaDiffObjectCompare):
+
+ keys_to_ignore = ['oid', 'schema', 'vacuum_table',
+ 'vacuum_toast', 'edit_types', 'attnum', 'col_type',
+ 'references', 'reltuples', 'rows_cnt']
+
+ keys_to_ignore_ddl_comp = ['oid',
+ 'schema',
+ 'columns',
+ 'edit_types',
+ 'primary_key',
+ 'exclude_constraint',
+ 'check_constraint',
+ 'foreign_key',
+ 'reltuples',
+ 'rows_cnt'
+ ]
+
+ keys_to_remove = {
+ 'columns': ['relname', 'nspname', 'parent_tbl', 'attrelid', 'adrelid'],
+ 'primary_key': ['oid'],
+ 'unique_constraint': ['oid'],
+ 'check_constraint': ['oid', 'nspname'],
+ 'foreign_key': ['oid', 'fknsp', 'confrelid'],
+ 'exclude_constraint': ['oid'],
+ 'partitions': ['oid'],
+ }
+
+ keys_to_remove_ddl_comp = {
+ 'columns': ['relname', 'nspname', 'parent_tbl', 'attrelid', 'adrelid'],
+ 'check_constraint': ['nspname'],
+ 'foreign_key': ['fknsp', 'confrelid']
+ }
+
+ def compare(self, **kwargs):
+ """
+ This function is used to compare all the table objects
+ from two different schemas.
+
+ :return: Comparison Dictionary
+ """
+ src_sid = kwargs.get('source_sid')
+ src_did = kwargs.get('source_did')
+ src_scid = kwargs.get('source_scid')
+ tar_sid = kwargs.get('target_sid')
+ tar_did = kwargs.get('target_did')
+ tar_scid = kwargs.get('target_scid')
+ sub_modules = ['index', 'rule', 'trigger']
+
+ source_tables = self.fetch_tables(sid=src_sid, did=src_did,
+ scid=src_scid)
+
+ target_tables = self.fetch_tables(sid=tar_sid, did=tar_did,
+ scid=tar_scid)
+
+ if self.manager.version >= 120000:
+ sub_modules.append('compound_trigger')
+
+ # If both the dict have no items then return None.
+ if not (source_tables or target_tables) or (
+ len(source_tables) <= 0 and len(target_tables) <= 0):
+ return None
+
+ src_server_type, tar_server_type = self.get_server_type(src_sid,
+ tar_sid)
+ for module in sub_modules:
+
+ module_view = SchemaDiffRegistry.get_node_view(
+ module)
+
+ # Get sub module data for source tables
+ if module_view.blueprint.server_type is None or \
+ src_server_type in module_view.blueprint.server_type:
+ for key, val in source_tables.items():
+ source = module_view.fetch_objects_to_compare(
+ sid=src_sid,
+ did=src_did,
+ scid=src_scid,
+ tid=val['oid'],
+ oid=None,
+ ignore_keys=True
+ )
+ source_tables[key][module] = source
+
+ # Get sub module data for target tables
+ if module_view.blueprint.server_type is None or \
+ tar_server_type in module_view.blueprint.server_type:
+ for key, val in target_tables.items():
+ target = module_view.fetch_objects_to_compare(
+ sid=tar_sid,
+ did=tar_did,
+ scid=tar_scid,
+ tid=val['oid'],
+ oid=None,
+ ignore_keys=True
+ )
+ target_tables[key][module] = target
+
+ return compare_dictionaries(source_tables, target_tables,
+ self.node_type,
+ self.blueprint.COLLECTION_LABEL,
+ self.keys_to_ignore)
+
+ @staticmethod
+ def get_server_type(src_id, tar_id):
+ """Get server types of source and target servers."""
+ driver = get_driver(PG_DEFAULT_DRIVER)
+ src_manager = driver.connection_manager(src_id)
+ tar_manager = driver.connection_manager(tar_id)
+
+ return src_manager.server_type, tar_manager.server_type
+
+ def ddl_compare(self, **kwargs):
+ """
+ This function will compare properties of 2 tables and
+ return the source DDL, target DDL and Difference of them.
+ """
+
+ src_sid = kwargs.get('source_sid')
+ src_did = kwargs.get('source_did')
+ src_scid = kwargs.get('source_scid')
+ src_oid = kwargs.get('source_oid')
+ tar_sid = kwargs.get('target_sid')
+ tar_did = kwargs.get('target_did')
+ tar_scid = kwargs.get('target_scid')
+ tar_oid = kwargs.get('target_oid')
+ comp_status = kwargs.get('comp_status')
+ generate_script = False
+
+ if 'generate_script' in kwargs and kwargs['generate_script']:
+ generate_script = True
+
+ source = ''
+ target = ''
+ diff = ''
+ ignore_sub_modules = ['column', 'constraints']
+
+ src_server_type, tar_server_type = self.get_server_type(src_sid,
+ tar_sid)
+
+ status, target_schema = self.get_schema(tar_sid,
+ tar_did,
+ tar_scid
+ )
+
+ if not status:
+ return internal_server_error(errormsg=target_schema)
+
+ if comp_status == SchemaDiffModel.COMPARISON_STATUS['source_only']:
+ if not generate_script:
+ source = self.get_sql_from_table_diff(sid=src_sid,
+ did=src_did,
+ scid=src_scid,
+ tid=src_oid,
+ json_resp=False)
+ diff = self.get_sql_from_table_diff(sid=src_sid, did=src_did,
+ scid=src_scid, tid=src_oid,
+ diff_schema=target_schema,
+ json_resp=False)
+
+ elif comp_status == SchemaDiffModel.COMPARISON_STATUS['target_only']:
+ if not generate_script:
+ target = self.get_sql_from_table_diff(sid=tar_sid,
+ did=tar_did,
+ scid=tar_scid,
+ tid=tar_oid,
+ json_resp=False)
+ SQL = render_template(
+ "/".join([self.table_template_path, 'properties.sql']),
+ did=tar_did, scid=tar_scid, tid=tar_oid,
+ datlastsysoid=self.datlastsysoid
+ )
+ status, res = self.conn.execute_dict(SQL)
+
+ if status:
+ diff = self.get_delete_sql(res)
+
+ elif comp_status == SchemaDiffModel.COMPARISON_STATUS['different']:
+ source = self.fetch_tables(
+ sid=src_sid, did=src_did,
+ scid=src_scid, tid=src_oid,
+ keys_to_remove=self.keys_to_remove_ddl_comp
+ )
+ target = self.fetch_tables(
+ sid=tar_sid, did=tar_did,
+ scid=tar_scid, tid=tar_oid,
+ keys_to_remove=self.keys_to_remove_ddl_comp
+ )
+
+ if self.manager.version < 100000:
+ ignore_sub_modules.append('partition')
+
+ if self.manager.version < 120000:
+ ignore_sub_modules.append('compound_trigger')
+
+ # In case of error return None
+ if not (source or target):
+ return None
+
+ diff_dict = directory_diff(
+ source, target, ignore_keys=self.keys_to_ignore_ddl_comp,
+ difference={}
+ )
+
+ # Column comparison
+ col_diff = self.table_col_ddl_comp(source, target)
+ diff_dict.update(col_diff)
+
+ # Constraint comparison
+ pk_diff = self.constraint_ddl_comp(source, target)
+ diff_dict.update(pk_diff)
+
+ diff_dict['relacl'] = self.parce_acl(source, target)
+
+ if not generate_script:
+ source = self.get_sql_from_table_diff(sid=src_sid,
+ did=src_did,
+ scid=src_scid,
+ tid=src_oid,
+ json_resp=False)
+ target = self.get_sql_from_table_diff(sid=tar_sid,
+ did=tar_did,
+ scid=tar_scid,
+ tid=tar_oid,
+ json_resp=False)
+ diff = self.get_sql_from_table_diff(sid=tar_sid, did=tar_did,
+ scid=tar_scid, tid=tar_oid,
+ diff_data=diff_dict,
+ json_resp=False)
+
+ for module in self.blueprint.submodules:
+ if module.NODE_TYPE not in ignore_sub_modules:
+ module_view = SchemaDiffRegistry.get_node_view(
+ module.NODE_TYPE)
+
+ if module_view.blueprint.server_type and (
+ src_server_type not in
+ module_view.blueprint.server_type and
+ tar_server_type not in
+ module_view.blueprint.server_type
+ ):
+ continue
+
+ if module_view.blueprint.server_type and (
+ (src_server_type in
+ module_view.blueprint.server_type and
+ tar_server_type not in
+ module_view.blueprint.server_type) or (
+ src_server_type not in
+ module_view.blueprint.server_type and
+ tar_server_type in
+ module_view.blueprint.server_type)
+ ):
+ continue
+
+ result = module_view.compare(
+ source_sid=src_sid, source_did=src_did,
+ source_scid=src_scid, source_tid=src_oid,
+ target_sid=tar_sid, target_did=tar_did,
+ target_scid=tar_scid, target_tid=tar_oid
+ )
+ if result and module.NODE_TYPE != 'partition':
+ child_diff = ''
+ for res in result:
+ if res['status'] == \
+ SchemaDiffModel.COMPARISON_STATUS[
+ 'different']:
+ source_oid = res['source_oid']
+ target_oid = res['target_oid']
+ else:
+ source_oid = res['oid']
+ target_oid = res['oid']
+
+ if res['status'] != \
+ SchemaDiffModel.COMPARISON_STATUS[
+ 'identical']:
+ child_diff = module_view.ddl_compare(
+ source_sid=src_sid, source_did=src_did,
+ source_scid=src_scid,
+ source_oid=source_oid,
+ source_tid=src_oid, target_sid=tar_sid,
+ target_did=tar_did, target_scid=tar_scid,
+ target_tid=tar_oid, target_oid=target_oid,
+ comp_status=res['status']
+
+ )
+ if child_diff:
+ diff += child_diff
+ elif result:
+ # For partition module
+ identical = False
+ source_only = False
+ target_only = False
+ different = False
+ for res in result:
+ if res['status'] == \
+ SchemaDiffModel.COMPARISON_STATUS[
+ 'identical']:
+ identical = True
+ elif res['status'] == \
+ SchemaDiffModel.COMPARISON_STATUS[
+ 'source_only']:
+ source_only = True
+ elif res['status'] == \
+ SchemaDiffModel.COMPARISON_STATUS[
+ 'target_only']:
+ target_only = True
+ else:
+ different = True
+
+ if identical:
+ pass
+ elif (source_only or target_only) and not different:
+ for res in result:
+ source_oid = res['oid']
+ target_oid = res['oid']
+
+ child_diff = module_view.ddl_compare(
+ source_sid=src_sid, source_did=src_did,
+ source_scid=src_scid,
+ source_oid=source_oid,
+ source_tid=src_oid, target_sid=tar_sid,
+ target_did=tar_did, target_scid=tar_scid,
+ target_tid=tar_oid, target_oid=target_oid,
+ comp_status=res['status']
+
+ )
+ if ddl_compare:
+ diff += child_diff
+ else:
+ diff = self.get_sql_from_table_diff(
+ sid=src_sid,
+ did=src_did,
+ scid=src_scid,
+ tid=src_oid,
+ diff_schema=target_schema,
+ json_resp=False,
+ schema_diff_table=True
+ )
+ else:
+ source = self.get_sql_from_table_diff(sid=src_sid, did=src_did,
+ scid=src_scid, tid=src_oid,
+ json_resp=False)
+ target = self.get_sql_from_table_diff(sid=tar_sid, did=tar_did,
+ scid=tar_scid, tid=tar_oid,
+ json_resp=False)
+
+ return {'source_ddl': source,
+ 'target_ddl': target,
+ 'diff_ddl': diff
+ }
+
+ @staticmethod
+ def table_col_ddl_comp(source, target):
+ """
+ Table Column comparison
+ :param source: Source columns
+ :param target: Target columns
+ :return: Difference of the columns
+ """
+ source_cols = source['columns']
+ target_cols = copy.deepcopy(target['columns'])
+ added = []
+ updated = []
+ different = {'columns': {}}
+
+ for source in source_cols:
+ if 'name' in source:
+ if type(target_cols) is list and len(
+ target_cols) > 0:
+ tmp = None
+ for item in target_cols:
+ if item['name'] == source['name']:
+ tmp = copy.deepcopy(item)
+ if tmp and source != tmp:
+ tmp_updated = copy.deepcopy(source)
+ # Preserve the column number
+ tmp_updated['attnum'] = tmp['attnum']
+ if item['typname'] not in tmp_updated['edit_types']:
+ tmp_updated['col_type_conversion'] = False
+ updated.append(tmp_updated)
+ target_cols.remove(tmp)
+ elif tmp and source == tmp:
+ target_cols.remove(tmp)
+ elif tmp is None:
+ added.append(source)
+ else:
+ added.append(source)
+ different['columns']['added'] = added
+ different['columns']['changed'] = updated
+
+ if target_cols and len(target_cols) > 0:
+ different['columns']['deleted'] = target_cols
+
+ return different
+
+ @staticmethod
+ def constraint_ddl_comp(source_table, target_table):
+ """
+ Table Constraint DDL comparison
+ :param source: Source Table
+ :param target: Target Table
+ :return: Difference of constraints
+ """
+ different = {}
+ non_editable_keys = {}
+
+ non_editable_keys = {'primary_key': ['col_count',
+ 'condeferrable',
+ 'condeffered',
+ 'columns'],
+ 'check_constraint': ['consrc'],
+ 'exclude_constraint': ['amname',
+ 'indconstraint',
+ 'columns']
+ }
+
+ for constraint in ['primary_key', 'check_constraint',
+ 'exclude_constraint']:
+ source_cols = source_table[constraint] if \
+ constraint in source_table else []
+ target_cols = copy.deepcopy(target_table[constraint]) if\
+ constraint in target_table else []
+ added = []
+ updated = []
+ deleted = []
+
+ different[constraint] = {}
+ for source in source_cols:
+ if 'name' in source:
+ if type(target_cols) is list and len(
+ target_cols) > 0:
+ tmp_src = copy.deepcopy(source)
+ tmp_src.pop('oid')
+ tmp_tar = None
+ tmp = None
+ for item in target_cols:
+ if item['name'] == source['name']:
+ tmp_tar = copy.deepcopy(item)
+ tmp = copy.deepcopy(item)
+ tmp_tar.pop('oid')
+ if tmp_tar and tmp_src != tmp_tar:
+ tmp_updated = copy.deepcopy(source)
+ for key in non_editable_keys[constraint]:
+ if key in tmp_updated and \
+ tmp_updated[key] != tmp_tar[key]:
+ added.append(source)
+ deleted.append(tmp_updated)
+ tmp_updated = None
+ break
+ if tmp_updated:
+ tmp_updated['oid'] = tmp_tar['oid']
+ updated.append(tmp_updated)
+ target_cols.remove(tmp)
+ elif tmp_tar and tmp_src == tmp_tar:
+ target_cols.remove(tmp)
+ elif tmp_tar is None:
+ added.append(source)
+ else:
+ added.append(source)
+ different[constraint]['added'] = added
+ different[constraint]['changed'] = updated
+ different[constraint]['deleted'] = deleted
+
+ if target_cols and len(target_cols) > 0:
+ different[constraint]['deleted'] = target_cols
+
+ return different
+
+ def remove_keys_for_comparision(self, data, keys=None):
+ """
+ This function is used to remove specific keys from data
+ """
+
+ keys_to_remove = keys if keys else self.keys_to_remove
+
+ for p_key, p_val in keys_to_remove.items():
+ if p_key in data and data[p_key] is not None \
+ and len(data[p_key]) > 0:
+ for item in data[p_key]:
+ # Remove keys that should not be the part of comparision.
+ for key in p_val:
+ if key in item:
+ item.pop(key)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/enable_disable_triggers.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/enable_disable_triggers.js
index 1abce8a77..ddf296ad0 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/enable_disable_triggers.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/enable_disable_triggers.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js
index 49a47e2ec..54c29619e 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/show_advanced_tab.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/show_advanced_tab.js
index a5e807ea9..b4f466343 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/show_advanced_tab.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/show_advanced_tab.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js
index 8fd203e41..61cefdc15 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
@@ -349,11 +349,23 @@ define('pgadmin.node.table', [
return (!(d && d.label.match(/pg_global/)));
},
deps: ['is_partitioned'],
- disabled: function() {
+ disabled: function(m) {
if(this.node_info && 'catalog' in this.node_info) {
return true;
}
+ if(!_.isUndefined(m.node_info) && !_.isUndefined(m.node_info.server)
+ && !_.isUndefined(m.node_info.server.version) &&
+ m.node_info.server.version >= 120000 &&
+ m.get('is_partitioned')) {
+
+ setTimeout( function() {
+ m.set('spcname', undefined);
+ }, 10);
+
+ return true;
+ }
+
return false;
},
},{
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/create.sql
index 36eb7ff8e..c189a7488 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/create.sql
@@ -21,7 +21,7 @@ CACHE {{data.seqcache|int}} {% endif %}
{% endif %}{% endif %};
{### Add comments ###}
-{% if data and data.description %}
+{% if data and data.description and data.description != None %}
COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.table, data.name)}}
IS {{data.description|qtLiteral}};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/update.sql
index 4b943defb..4e8b982fd 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/update.sql
@@ -10,8 +10,14 @@ ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
{% endif %}
{### Alter column type and collation ###}
{% if (data.cltype and data.cltype != o_data.cltype) or (data.attlen is defined and data.attlen != o_data.attlen) or (data.attprecision is defined and data.attprecision != o_data.attprecision) or (data.collspcname and data.collspcname != o_data.collspcname)%}
-ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
- ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} TYPE {{ GET_TYPE.UPDATE_TYPE_SQL(conn, data, o_data) }}{% if data.collspcname and data.collspcname != o_data.collspcname %}
+{% if data.col_type_conversion is defined and data.col_type_conversion == False %}
+-- WARNING:
+-- The SQL statement below would normally be used to alter the datatype for the {{o_data.name}} column, however,
+-- the current datatype cannot be cast to the target datatype so this conversion cannot be made automatically.
+
+{% endif %}
+{% if data.col_type_conversion is defined and data.col_type_conversion == False %} -- {% endif %}ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
+{% if data.col_type_conversion is defined and data.col_type_conversion == False %} -- {% endif %} ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} TYPE {{ GET_TYPE.UPDATE_TYPE_SQL(conn, data, o_data) }}{% if data.collspcname and data.collspcname != o_data.collspcname %}
COLLATE {{data.collspcname}}{% elif o_data.collspcname %} COLLATE {{o_data.collspcname}}{% endif %};
{% endif %}
{### Alter column default value ###}
@@ -95,7 +101,7 @@ COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.table, o_data.name)}}
{% endif %}
{### Update column variables ###}
-{% if 'attoptions' in data and data.attoptions|length > 0 %}
+{% if 'attoptions' in data and data.attoptions and data.attoptions|length > 0 %}
{% set variables = data.attoptions %}
{% if 'deleted' in variables and variables.deleted|length > 0 %}
ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/12_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/12_plus/create.sql
index 71de43658..19e26f2c2 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/12_plus/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/12_plus/create.sql
@@ -21,7 +21,7 @@ CACHE {{data.seqcache|int}} {% endif %}
{% endif %}{% endif %}{% if data.colconstype == 'g' and data.genexpr and data.genexpr != '' %} GENERATED ALWAYS AS ({{data.genexpr}}) STORED{% endif %};
{### Add comments ###}
-{% if data and data.description %}
+{% if data and data.description and data.description != None %}
COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.table, data.name)}}
IS {{data.description|qtLiteral}};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/9.2_plus/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/9.2_plus/update.sql
index d27734401..dfb7555c1 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/9.2_plus/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/9.2_plus/update.sql
@@ -6,6 +6,12 @@
{% if data.name and data.name != o_data.name %}
ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
RENAME {{conn|qtIdent(o_data.name)}} TO {{conn|qtIdent(data.name)}};
+{% endif %}
+{% if data.col_type_conversion is defined and data.col_type_conversion == False %}
+-- WARNING:
+-- The SQL statement below would normally be used to alter the datatype for the {{o_data.name}} column, however,
+-- the current datatype cannot be cast to the target datatype so this conversion cannot be made automatically.
+
{% endif %}
{### Alter column type and collation ###}
{% if (data.cltype and data.cltype != o_data.cltype) or (data.attlen is defined and data.attlen != o_data.attlen) or (data.attprecision is defined and data.attprecision != o_data.attprecision) or (data.collspcname and data.collspcname != o_data.collspcname)%}
@@ -45,7 +51,7 @@ PLAIN{% elif data.attstorage == 'm'%}MAIN{% elif data.attstorage == 'e'%}
EXTERNAL{% elif data.attstorage == 'x'%}EXTENDED{% endif %};
{% endif %}
-{% if data.description is defined %}
+{% if data.description is defined and data.description != None %}
{% if data.name %}
COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.table, data.name)}}
{% else %}
@@ -55,7 +61,7 @@ COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.table, o_data.name)}}
{% endif %}
{### Update column variables ###}
-{% if 'attoptions' in data and data.attoptions|length > 0 %}
+{% if 'attoptions' in data and data.attoptions != None and data.attoptions|length > 0 %}
{% set variables = data.attoptions %}
{% if 'deleted' in variables and variables.deleted|length > 0 %}
ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/create.sql
index affd88906..ed7f5f1c6 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/create.sql
@@ -12,7 +12,7 @@ ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
{% endif %}
{### Add comments ###}
-{% if data and data.description %}
+{% if data and data.description and data.description != None %}
COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.table, data.name)}}
IS {{data.description|qtLiteral}};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/update.sql
index ac0afe8d1..3c6ae0a91 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/update.sql
@@ -9,9 +9,15 @@ ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
{% endif %}
{### Alter column type and collation ###}
-{% if (data.cltype and data.cltype != o_data.cltype) or (data.attlen is defined and data.attlen != o_data.attlen) or (data.attprecision is defined and data.attprecision != o_data.attprecision) or (data.collspcname and data.collspcname != o_data.collspcname) %}
-ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
- ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} TYPE {{ GET_TYPE.UPDATE_TYPE_SQL(conn, data, o_data) }}{% if data.collspcname and data.collspcname != o_data.collspcname %}
+{% if (data.cltype and data.cltype != o_data.cltype) or (data.attlen is defined and data.attlen != o_data.attlen) or (data.attprecision is defined and data.attprecision != o_data.attprecision) or (data.collspcname and data.collspcname != o_data.collspcname)%}
+{% if data.col_type_conversion is defined and data.col_type_conversion == False %}
+-- WARNING:
+-- The SQL statement below would normally be used to alter the datatype for the XXX column, however,
+-- the current datatype cannot be cast to the target datatype so this conversion cannot be made automatically.
+
+{% endif %}
+{% if data.col_type_conversion is defined and data.col_type_conversion == False %} -- {% endif %}ALTER TABLE {{conn|qtIdent(data.schema, data.table)}}
+{% if data.col_type_conversion is defined and data.col_type_conversion == False %} -- {% endif %} ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} TYPE {{ GET_TYPE.UPDATE_TYPE_SQL(conn, data, o_data) }}{% if data.collspcname and data.collspcname != o_data.collspcname %}
COLLATE {{data.collspcname}}{% elif o_data.collspcname %} COLLATE {{o_data.collspcname}}{% endif %};
{% endif %}
{### Alter column default value ###}
@@ -46,7 +52,7 @@ PLAIN{% elif data.attstorage == 'm'%}MAIN{% elif data.attstorage == 'e'%}
EXTERNAL{% elif data.attstorage == 'x'%}EXTENDED{% endif %};
{% endif %}
-{% if data.description is defined %}
+{% if data.description is defined and data.description != None %}
{% if data.name %}
COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.table, data.name)}}
{% else %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/foreign_key/sql/tests/test_foreign_key_properties.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/foreign_key/sql/tests/test_foreign_key_properties.py
index 818921616..bc4f35f0c 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/foreign_key/sql/tests/test_foreign_key_properties.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/foreign_key/sql/tests/test_foreign_key_properties.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/partitions/sql/pg/10_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/partitions/sql/pg/10_plus/create.sql
index 6db5452b5..01f9bfbab 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/partitions/sql/pg/10_plus/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/partitions/sql/pg/10_plus/create.sql
@@ -3,6 +3,7 @@
{#====== MAIN TABLE TEMPLATE STARTS HERE ======#}
{#===========================================#}
{### CREATE TABLE STATEMENT FOR partitions ###}
+
CREATE {% if data.relpersistence %}UNLOGGED {% endif %}TABLE {{conn|qtIdent(data.schema, data.name)}}{% if data.relispartition is defined and data.relispartition %} PARTITION OF {{conn|qtIdent(data.parent_schema, data.partitioned_table_name)}}{% endif %}
{# Macro to render for constraints #}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/10_plus/schema_diff.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/10_plus/schema_diff.sql
new file mode 100644
index 000000000..ebd4ae6e5
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/10_plus/schema_diff.sql
@@ -0,0 +1,14 @@
+
+
+INSERT INTO {{conn|qtIdent(data.schema, data.name)}}(
+{% if data.columns and data.columns|length > 0 %}
+{% for c in data.columns %}{{c.name}}{% if not loop.last %},{% endif %}{% endfor %}{% endif %})
+SELECT {% if data.columns and data.columns|length > 0 %}{% for c in data.columns %}{{c.name}}{% if not loop.last %},{% endif %}{% endfor %}{% endif %}
+ FROM {{conn|qtIdent(data.schema, data.orig_name)}};
+
+DROP TABLE {{conn|qtIdent(data.schema, data.orig_name)}};
+
+{{partition_sql}}
+
+ALTER TABLE {{conn|qtIdent(data.schema, data.name)}}
+ RENAME TO {{conn|qtIdent(data.orig_name)}};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/12_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/12_plus/create.sql
index c52861b0c..7abe52ab6 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/12_plus/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/12_plus/create.sql
@@ -75,7 +75,7 @@ CACHE {{c.seqcache|int}} {% endif %}
{% if data.like_relation or data.coll_inherits or data.columns|length > 0 or data.primary_key|length > 0 or data.unique_constraint|length > 0 or data.foreign_key|length > 0 or data.check_constraint|length > 0 or data.exclude_constraint|length > 0 %}
){% endif %}{% if data.relkind is defined and data.relkind == 'p' %} PARTITION BY {{ data.partition_scheme }} {% endif %}
-{% if not data.coll_inherits and not data.spcname and not with_clause %};{% endif %}
+{% if not data.coll_inherits and (not data.spcname or (data.spcname and data.is_partitioned)) and not with_clause %};{% endif %}
{### If we are inheriting it from another table(s) ###}
{% if data.coll_inherits %}
@@ -103,11 +103,11 @@ WITH (
toast.{{opt.name}} = {{opt.value}}{% endif %}
{% endfor %}{% endif %}
-{% if data.spcname %}){% else %});{% endif %}
+{% if data.spcname and not data.is_partitioned %}){% else %});{% endif %}
{% endif %}
{### SQL for Tablespace ###}
-{% if data.spcname %}
+{% if data.spcname and not data.is_partitioned %}
TABLESPACE {{ conn|qtIdent(data.spcname) }};
{% endif %}
{### Alter SQL for Owner ###}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/12_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/12_plus/properties.sql
index e7d19055d..b0d48c61a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/12_plus/properties.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/12_plus/properties.sql
@@ -1,5 +1,5 @@
SELECT rel.oid, rel.relname AS name, rel.reltablespace AS spcoid,rel.relacl AS relacl_str,
- (CASE WHEN length(spc.spcname) > 0 OR rel.relkind = 'p' THEN spc.spcname ELSE
+ (CASE WHEN length(spc.spcname) > 0 THEN spc.spcname ELSE
(SELECT sp.spcname FROM pg_database dtb
JOIN pg_tablespace sp ON dtb.dattablespace=sp.oid
WHERE dtb.oid = {{ did }}::oid)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/__init__.py
index 31869e18b..76566640c 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_base_partition_table.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_base_partition_table.py
index 062a03777..dae4ba23a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_base_partition_table.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_base_partition_table.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_column_acl_sql.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_column_acl_sql.py
index 2500261dc..efb1986e4 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_column_acl_sql.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_column_acl_sql.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_column_privileges_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_column_privileges_put.py
index 2a26a61ce..1c5877861 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_column_privileges_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_column_privileges_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_column_properties_sql.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_column_properties_sql.py
index d820ba625..8da8f12e4 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_column_properties_sql.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_column_properties_sql.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_add.py
index 06d96448d..599eaec77 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -170,10 +170,6 @@ class TableAddTestCase(BaseTestGenerator):
self.table_name = "test_table_add_%s" % (str(uuid.uuid4())[1:8])
# Get the common data
data = tables_utils.get_table_common_data()
- if self.server_information and \
- 'server_version' in self.server_information and \
- self.server_information['server_version'] >= 120000:
- data['spcname'] = None
data.update({
"name": self.table_name,
"relowner": db_user,
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_delete.py
index 9ebdcac1b..c702b2943 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_delete_multiple.py
index f3adfb155..4189744e3 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_get.py
index 14a80cd76..e34f9747b 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_parameters.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_parameters.py
index bbed26998..428bd1e56 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_parameters.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_parameters.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_put.py
index 74e23868b..3d02ad24c 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_tables_acl_sql.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_tables_acl_sql.py
index fbea605cf..f35235912 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_tables_acl_sql.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_tables_acl_sql.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_tables_node_sql.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_tables_node_sql.py
index 7c0ffb5e1..9ef0e76ff 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_tables_node_sql.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_tables_node_sql.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_tables_properties_sql.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_tables_properties_sql.py
index fd0c55f78..fc349bd3c 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_tables_properties_sql.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_tables_properties_sql.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_template_create.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_template_create.py
index 54338fd8f..ef9fda32d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_template_create.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_template_create.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_trigger_get_oid_sql.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_trigger_get_oid_sql.py
index 925418d28..083acef74 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_trigger_get_oid_sql.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_trigger_get_oid_sql.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_trigger_nodes_sql.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_trigger_nodes_sql.py
index 600da47e5..fef6e667b 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_trigger_nodes_sql.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_trigger_nodes_sql.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_utils.py
index 96985d016..5ac6f7b25 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/utils.py
index 5a0b3826f..148e15cfe 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/__init__.py
index 2c5b87423..0344fcbd0 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -13,7 +13,7 @@ import simplejson as json
from functools import wraps
import pgadmin.browser.server_groups.servers.databases as database
-from flask import render_template, request, jsonify
+from flask import render_template, request, jsonify, current_app
from flask_babelex import gettext
from pgadmin.browser.collection import CollectionNodeModule
from pgadmin.browser.utils import PGChildNodeView
@@ -25,7 +25,11 @@ from pgadmin.browser.server_groups.servers.databases.schemas.utils \
import trigger_definition
from pgadmin.utils.driver import get_driver
from config import PG_DEFAULT_DRIVER
+from pgadmin.utils.compile_template_name import compile_template_path
from pgadmin.utils import IS_PY2
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
+
# If we are in Python3
if not IS_PY2:
unicode = str
@@ -151,7 +155,7 @@ class TriggerModule(CollectionNodeModule):
blueprint = TriggerModule(__name__)
-class TriggerView(PGChildNodeView):
+class TriggerView(PGChildNodeView, SchemaDiffObjectCompare):
"""
This class is responsible for generating routes for Trigger node
@@ -244,6 +248,10 @@ class TriggerView(PGChildNodeView):
'enable': [{'put': 'enable_disable_trigger'}]
})
+ # Schema Diff: Keys to ignore while comparing
+ keys_to_ignore = ['oid', 'xmin', 'nspname', 'tfunction',
+ 'tgrelid', 'tgfoid', 'prosrc']
+
def check_precondition(f):
"""
This function will behave as a decorator which will checks
@@ -267,6 +275,11 @@ class TriggerView(PGChildNodeView):
kwargs['did'] in self.manager.db_info else 0
# we will set template path for sql scripts
+ self.table_template_path = compile_template_path(
+ 'tables/sql',
+ self.manager.server_type,
+ self.manager.version
+ )
self.template_path = 'triggers/sql/{0}/#{1}#'.format(
self.manager.server_type, self.manager.version)
# Store server type
@@ -450,7 +463,22 @@ class TriggerView(PGChildNodeView):
Returns:
JSON of selected trigger node
"""
+ status, data = self._fetch_properties(tid, trid)
+ if not status:
+ return data
+
+ return ajax_response(
+ response=data,
+ status=200
+ )
+ def _fetch_properties(self, tid, trid):
+ """
+ This function is used to fetch the properties of the specified object
+ :param tid:
+ :param trid:
+ :return:
+ """
SQL = render_template("/".join([self.template_path,
'properties.sql']),
tid=tid, trid=trid,
@@ -459,10 +487,10 @@ class TriggerView(PGChildNodeView):
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(
+ return False, gone(
gettext("""Could not find the trigger in the table."""))
# Making copy of output for future use
@@ -472,10 +500,7 @@ class TriggerView(PGChildNodeView):
data = trigger_definition(data)
- return ajax_response(
- response=data,
- status=200
- )
+ return True, data
@check_precondition
def create(self, gid, sid, did, scid, tid):
@@ -552,7 +577,7 @@ class TriggerView(PGChildNodeView):
return internal_server_error(errormsg=str(e))
@check_precondition
- def delete(self, gid, sid, did, scid, tid, trid=None):
+ def delete(self, gid, sid, did, scid, tid, trid=None, only_sql=False):
"""
This function will updates existing the trigger object
@@ -610,6 +635,8 @@ class TriggerView(PGChildNodeView):
conn=self.conn,
cascade=cascade
)
+ if only_sql:
+ return SQL
status, res = self.conn.execute_scalar(SQL)
if not status:
return internal_server_error(errormsg=res)
@@ -761,6 +788,36 @@ class TriggerView(PGChildNodeView):
return ajax_response(response=SQL)
+ @check_precondition
+ def get_sql_from_diff(self, gid, sid, did, scid, tid, oid,
+ data=None, diff_schema=None, drop_sql=False):
+ if data:
+ SQL, name = trigger_utils.get_sql(
+ self.conn, data, tid, oid,
+ self.datlastsysoid,
+ self.blueprint.show_system_objects)
+
+ if not isinstance(SQL, (str, unicode)):
+ return SQL
+ SQL = SQL.strip('\n').strip(' ')
+ else:
+ if drop_sql:
+ SQL = self.delete(gid=gid, sid=sid, did=did,
+ scid=scid, tid=tid, trid=oid,
+ only_sql=True)
+ else:
+ schema = self.schema
+ if diff_schema:
+ schema = diff_schema
+ SQL = trigger_utils.get_reverse_engineered_sql(
+ self.conn, schema,
+ self.table, tid, oid,
+ self.datlastsysoid,
+ self.blueprint.show_system_objects,
+ template_path=None, with_header=False)
+
+ return SQL
+
@check_precondition
def enable_disable_trigger(self, gid, sid, did, scid, tid, trid):
"""
@@ -875,5 +932,46 @@ class TriggerView(PGChildNodeView):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid, tid, oid=None,
+ ignore_keys=False):
+ """
+ This function will fetch the list of all the triggers for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :param tid: Table Id
+ :return:
+ """
+ res = dict()
+
+ if oid:
+ status, data = self._fetch_properties(tid, oid)
+ if not status:
+ current_app.logger.error(data)
+ return False
+ res = data
+ else:
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']), tid=tid)
+ status, triggers = self.conn.execute_2darray(SQL)
+ if not status:
+ current_app.logger.error(triggers)
+ return False
+
+ for row in triggers['rows']:
+ status, data = self._fetch_properties(tid, row['oid'])
+ if status:
+ if ignore_keys:
+ for key in self.keys_to_ignore:
+ if key in data:
+ del data[key]
+ res[row['name']] = data
+
+ return res
+
+SchemaDiffRegistry(blueprint.node_type, TriggerView, 'table')
TriggerView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js
index 4885baeda..c390a8350 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/__init__.py
index ac92ff100..7fb714a3d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/test_triggers_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/test_triggers_add.py
index f9b0ce9ce..3cd8f7475 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/test_triggers_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/test_triggers_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/test_triggers_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/test_triggers_delete.py
index 56c83a34e..3fa01025b 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/test_triggers_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/test_triggers_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/test_triggers_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/test_triggers_delete_multiple.py
index 921579fa3..17232862b 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/test_triggers_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/test_triggers_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/test_triggers_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/test_triggers_get.py
index 733073a25..af7a71b27 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/test_triggers_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/test_triggers_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/test_triggers_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/test_triggers_put.py
index 0a75b2a0d..fbcd02b65 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/test_triggers_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/test_triggers_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/utils.py
index c1723cab2..44f0bdc53 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/utils.py
index 53d59c080..221f48d52 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -30,7 +30,7 @@ def get_template_path(f):
def wrap(*args, **kwargs):
# Here args[0] will hold the connection object
conn_obj = args[0]
- if 'template_path' not in kwargs:
+ if 'template_path' not in kwargs or kwargs['template_path'] is None:
kwargs['template_path'] = 'triggers/sql/{0}/#{1}#'.format(
conn_obj.manager.server_type, conn_obj.manager.version)
@@ -201,7 +201,7 @@ def get_sql(conn, data, tid, trid, datlastsysoid,
@get_template_path
def get_reverse_engineered_sql(conn, schema, table, tid, trid,
datlastsysoid, show_system_objects,
- template_path=None):
+ template_path=None, with_header=True):
"""
This function will return reverse engineered sql for specified trigger.
@@ -213,6 +213,8 @@ def get_reverse_engineered_sql(conn, schema, table, tid, trid,
:param datlastsysoid:
:param show_system_objects: Show System Object value True or False
:param template_path: Optional template path
+ :param with_header: Optional parameter to decide whether the SQL will be
+ returned with header or not
:return:
"""
SQL = render_template("/".join([template_path, 'properties.sql']),
@@ -240,12 +242,15 @@ def get_reverse_engineered_sql(conn, schema, table, tid, trid,
SQL, name = get_sql(conn, data, tid, None, datlastsysoid,
show_system_objects)
- sql_header = u"-- Trigger: {0}\n\n-- ".format(data['name'])
+ if with_header:
+ sql_header = u"-- Trigger: {0}\n\n-- ".format(data['name'])
- sql_header += render_template("/".join([template_path, 'delete.sql']),
- data=data, conn=conn)
+ sql_header += render_template("/".join([template_path, 'delete.sql']),
+ data=data, conn=conn)
- SQL = sql_header + '\n\n' + SQL.strip('\n')
+ SQL = sql_header + '\n\n' + SQL.strip('\n')
+ else:
+ SQL = SQL.strip('\n')
# If trigger is disabled then add sql code for the same
if data['is_enable_trigger'] != 'O':
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/utils.py
index 8c9bd7b9f..3247d2fc7 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -10,6 +10,7 @@
""" Implements Utility class for Table and Partitioned Table. """
import re
+import copy
from functools import wraps
import simplejson as json
from flask import render_template, jsonify, request
@@ -179,8 +180,10 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
data[row['deftype']] = [priv]
# We will add Auto vacuum defaults with out result for grid
- data['vacuum_table'] = self.parse_vacuum_data(self.conn, data, 'table')
- data['vacuum_toast'] = self.parse_vacuum_data(self.conn, data, 'toast')
+ data['vacuum_table'] = copy.deepcopy(
+ self.parse_vacuum_data(self.conn, data, 'table'))
+ data['vacuum_toast'] = copy.deepcopy(
+ self.parse_vacuum_data(self.conn, data, 'toast'))
# Fetch columns for the table logic
#
@@ -405,7 +408,8 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
status=200
)
- def get_reverse_engineered_sql(self, did, scid, tid, main_sql, data):
+ def get_reverse_engineered_sql(self, did, scid, tid, main_sql, data,
+ json_resp=True, diff_partition_sql=False):
"""
This function will creates reverse engineered sql for
the table object
@@ -416,6 +420,9 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
tid: Table ID
main_sql: List contains all the reversed engineered sql
data: Table's Data
+ json_resp: Json response or plain SQL
+ diff_partition_sql: In Schema diff, the Partition sql should be
+ return separately to perform further task
"""
"""
#####################################
@@ -427,6 +434,7 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
schema = data['schema']
table = data['name']
is_partitioned = 'is_partitioned' in data and data['is_partitioned']
+ sql_header = ''
data = self._formatter(did, scid, tid, data)
@@ -444,18 +452,20 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
c['cltype'], c['hasSqrBracket'] = \
column_utils.type_formatter(c['cltype'])
- sql_header = u"-- Table: {0}\n\n-- ".format(
- self.qtIdent(self.conn, data['schema'], data['name']))
+ if json_resp:
+ sql_header = u"-- Table: {0}\n\n-- ".format(
+ self.qtIdent(self.conn, data['schema'], data['name']))
- sql_header += render_template("/".join([self.table_template_path,
- 'delete.sql']),
- data=data, conn=self.conn)
+ sql_header += render_template("/".join([self.table_template_path,
+ 'delete.sql']),
+ data=data, conn=self.conn)
- sql_header = sql_header.strip('\n')
- sql_header += '\n'
+ sql_header = sql_header.strip('\n')
+ sql_header += '\n'
- # Add into main sql
- main_sql.append(sql_header)
+ # Add into main sql
+ main_sql.append(sql_header)
+ partition_main_sql = ""
# Parse privilege data
if 'relacl' in data:
@@ -493,12 +503,14 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
for row in rset['rows']:
index_sql = index_utils.get_reverse_engineered_sql(
self.conn, schema, table, did, tid, row['oid'],
- self.datlastsysoid)
+ self.datlastsysoid,
+ template_path=None, with_header=json_resp)
index_sql = u"\n" + index_sql
# Add into main sql
index_sql = re.sub('\n{2,}', '\n\n', index_sql)
- main_sql.append(index_sql)
+
+ main_sql.append(index_sql.strip('\n'))
"""
########################################
@@ -514,7 +526,8 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
for row in rset['rows']:
trigger_sql = trigger_utils.get_reverse_engineered_sql(
self.conn, schema, table, tid, row['oid'],
- self.datlastsysoid, self.blueprint.show_system_objects)
+ self.datlastsysoid, self.blueprint.show_system_objects,
+ template_path=None, with_header=json_resp)
trigger_sql = u"\n" + trigger_sql
# Add into main sql
@@ -571,10 +584,13 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
if not status:
return internal_server_error(errormsg=res)
+ display_comments = True
+ if not json_resp:
+ display_comments = False
res_data = parse_rule_definition(res)
rules_sql += render_template("/".join(
[self.rules_template_path, 'create.sql']),
- data=res_data, display_comments=True)
+ data=res_data, display_comments=display_comments)
# Add into main sql
rules_sql = re.sub('\n{2,}', '\n\n', rules_sql)
@@ -594,13 +610,17 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
return internal_server_error(errormsg=rset)
if len(rset['rows']):
- sql_header = u"\n-- Partitions SQL"
+ if json_resp:
+ sql_header = u"\n-- Partitions SQL"
partition_sql = ''
for row in rset['rows']:
part_data = dict()
- part_data['partitioned_table_name'] = table
- part_data['parent_schema'] = schema
- part_data['schema'] = row['schema_name']
+ part_data['partitioned_table_name'] = data['name']
+ part_data['parent_schema'] = data['schema']
+ if not json_resp:
+ part_data['schema'] = data['schema']
+ else:
+ part_data['schema'] = row['schema_name']
part_data['relispartition'] = True
part_data['name'] = row['name']
part_data['partition_value'] = row['partition_value']
@@ -612,13 +632,18 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
data=part_data, conn=self.conn)
# Add into main sql
- partition_sql = re.sub('\n{2,}', '\n\n', partition_sql)
- main_sql.append(
- sql_header + '\n\n' + partition_sql.strip('\n')
- )
+ partition_sql = re.sub('\n{2,}', '\n\n', partition_sql
+ ).strip('\n')
+ partition_main_sql = partition_sql.strip('\n')
+ if not diff_partition_sql:
+ main_sql.append(
+ sql_header + '\n\n' + partition_main_sql
+ )
sql = '\n'.join(main_sql)
+ if not json_resp:
+ return sql, partition_main_sql
return ajax_response(response=sql.strip('\n'))
def reset_statistics(self, scid, tid):
@@ -907,7 +932,8 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
conn=self.conn).strip('\n') + '\n\n'
# If partition(s) is/are added
- if 'added' in partitions:
+ if 'added' in partitions and 'partition_scheme' in old_data\
+ and old_data['partition_scheme'] != '':
temp_data = dict()
temp_data['schema'] = data['schema']
temp_data['name'] = data['name']
@@ -1133,7 +1159,8 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
except Exception as e:
return internal_server_error(errormsg=str(e))
- def properties(self, gid, sid, did, scid, tid, res):
+ def properties(self, gid, sid, did, scid, tid, res,
+ return_ajax_response=True):
"""
This function will show the properties of the selected table node.
@@ -1145,6 +1172,7 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
scid: Schema ID
tid: Table ID
res: Table/Partition table properties
+ return_ajax_response: If True then return the ajax response
Returns:
JSON of selected table node
@@ -1242,6 +1270,9 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
data['partitions'] = partitions
+ if not return_ajax_response:
+ return data
+
return ajax_response(
response=data,
status=200
@@ -1359,18 +1390,7 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
}
)
- def delete(self, gid, sid, did, scid, tid, res):
- """
- This function will delete the table object
-
- Args:
- gid: Server Group ID
- sid: Server ID
- did: Database ID
- scid: Schema ID
- tid: Table ID
- """
-
+ def get_delete_sql(self, res):
# Below will decide if it's simple drop or drop with cascade call
if self.cmd == 'delete':
# This is a cascade operation
@@ -1380,11 +1400,26 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
data = res['rows'][0]
- SQL = render_template(
+ return render_template(
"/".join([self.table_template_path, 'delete.sql']),
data=data, cascade=cascade,
conn=self.conn
)
+
+ def delete(self, gid, sid, did, scid, tid, res):
+ """
+ This function will delete the table object
+
+ Args:
+ gid: Server Group ID
+ sid: Server ID
+ did: Database ID
+ scid: Schema ID
+ tid: Table ID
+ """
+
+ SQL = self.get_delete_sql(res)
+
status, res = self.conn.execute_scalar(SQL)
if not status:
return status, res
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/__init__.py
index 2ac65bbf4..a84309b97 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_add.py
index afa4cb712..b36b9b66b 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_delete.py
index 53f33c2d4..6a25d0c8d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_delete_multiple.py
index 58dfd6291..47bd6e501 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_get.py
index eea3a0c68..6b21ccf05 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_put.py
index 405d2a20a..2bb4100f7 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_utils.py
index 375ebd012..eac52a44a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/utils.py
index c5ffc8329..ae49402a3 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py
index d803a3e83..b173a4058 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -26,6 +26,8 @@ from pgadmin.utils import IS_PY2
from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
# If we are in Python3
if not IS_PY2:
@@ -94,7 +96,7 @@ class TypeModule(SchemaChildModule):
blueprint = TypeModule(__name__)
-class TypeView(PGChildNodeView, DataTypeReader):
+class TypeView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare):
"""
This class is responsible for generating routes for Type node
@@ -173,6 +175,10 @@ class TypeView(PGChildNodeView, DataTypeReader):
* get_external_functions_list(gid, sid, did, scid, tid):
- This function will return list of external functions
in ajax response
+
+ * compare(**kwargs):
+ - This function will compare the type nodes from two
+ different schemas.
"""
node_type = blueprint.node_type
@@ -559,6 +565,22 @@ class TypeView(PGChildNodeView, DataTypeReader):
Returns:
JSON of selected type node
"""
+ status, res = self._fetch_properties(scid, tid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, tid):
+ """
+ This function is used to fecth the properties of the specified object.
+ :param scid:
+ :param tid:
+ :return:
+ """
SQL = render_template(
"/".join([self.template_path,
@@ -569,10 +591,10 @@ class TypeView(PGChildNodeView, DataTypeReader):
)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(
+ return False, gone(
gettext("""Could not find the type in the database."""))
# Making copy of output for future use
@@ -583,7 +605,7 @@ class TypeView(PGChildNodeView, DataTypeReader):
scid=scid, tid=tid)
status, acl = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=acl)
+ return False, internal_server_error(errormsg=acl)
# We will set get privileges from acl sql so we don't need
# it from properties sql
@@ -599,10 +621,7 @@ class TypeView(PGChildNodeView, DataTypeReader):
# Calling function to check and additional properties if available
copy_dict.update(self.additional_properties(copy_dict, tid))
- return ajax_response(
- response=copy_dict,
- status=200
- )
+ return True, copy_dict
@check_precondition
def get_collations(self, gid, sid, did, scid, tid=None):
@@ -1428,5 +1447,31 @@ class TypeView(PGChildNodeView, DataTypeReader):
status=200
)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid):
+ """
+ This function will fetch the list of all the types for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'nodes.sql']),
+ scid=scid, datlastsysoid=self.datlastsysoid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
TypeView.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js
index 2b09bfcc8..0ac8ad73a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/tests/__init__.py
index 1744c3828..62afcc2ea 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/tests/test_types_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/tests/test_types_add.py
index 4891e04a2..329acd3a7 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/tests/test_types_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/tests/test_types_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/tests/test_types_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/tests/test_types_delete.py
index e242c0705..2a6c9c84c 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/tests/test_types_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/tests/test_types_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/tests/test_types_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/tests/test_types_get.py
index 3100301f4..7089ccb34 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/tests/test_types_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/tests/test_types_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/tests/test_types_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/tests/test_types_put.py
index 791780b02..9cce36ada 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/tests/test_types_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/tests/test_types_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/tests/utils.py
index 7c39756b7..4ce1c8f17 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py
index 09ffa9ec5..ee87d9694 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -15,6 +15,8 @@ from flask import render_template
from pgadmin.browser.collection import CollectionNodeModule
from pgadmin.utils.ajax import internal_server_error
+from pgadmin.utils.driver import get_driver
+from config import PG_DEFAULT_DRIVER
class SchemaChildModule(CollectionNodeModule):
@@ -485,44 +487,50 @@ class VacuumSettings:
* type - table/toast vacuum type
"""
+ vacuum_settings = dict()
def __init__(self):
pass
- def get_vacuum_table_settings(self, conn):
+ def fetch_default_vacuum_settings(self, conn, sid, setting_type):
"""
- Fetch the default values for autovacuum
- fields, return an array of
- - label
- - name
- - setting
- values
+ This function is used to fetch and cached the default vacuum settings
+ for specified server id.
+ :param conn: Connection Object
+ :param sid: Server ID
+ :param setting_type: Type (table or toast)
+ :return:
"""
+ if sid in VacuumSettings.vacuum_settings:
+ if setting_type in VacuumSettings.vacuum_settings[sid]:
+ return VacuumSettings.vacuum_settings[sid][setting_type]
+ else:
+ VacuumSettings.vacuum_settings[sid] = dict()
# returns an array of name & label values
vacuum_fields = render_template("vacuum_settings/vacuum_fields.json")
-
vacuum_fields = json.loads(vacuum_fields)
# returns an array of setting & name values
vacuum_fields_keys = "'" + "','".join(
- vacuum_fields['table'].keys()) + "'"
+ vacuum_fields[setting_type].keys()) + "'"
SQL = render_template('vacuum_settings/sql/vacuum_defaults.sql',
columns=vacuum_fields_keys)
- status, res = conn.execute_dict(SQL)
+ status, res = conn.execute_dict(SQL)
if not status:
return internal_server_error(errormsg=res)
for row in res['rows']:
row_name = row['name']
- row['name'] = vacuum_fields['table'][row_name][0]
- row['label'] = vacuum_fields['table'][row_name][1]
- row['column_type'] = vacuum_fields['table'][row_name][2]
+ row['name'] = vacuum_fields[setting_type][row_name][0]
+ row['label'] = vacuum_fields[setting_type][row_name][1]
+ row['column_type'] = vacuum_fields[setting_type][row_name][2]
- return res
+ VacuumSettings.vacuum_settings[sid][setting_type] = res['rows']
+ return VacuumSettings.vacuum_settings[sid][setting_type]
- def get_vacuum_toast_settings(self, conn):
+ def get_vacuum_table_settings(self, conn, sid):
"""
Fetch the default values for autovacuum
fields, return an array of
@@ -531,29 +539,18 @@ class VacuumSettings:
- setting
values
"""
+ return self.fetch_default_vacuum_settings(conn, sid, 'table')
- # returns an array of name & label values
- vacuum_fields = render_template("vacuum_settings/vacuum_fields.json")
-
- vacuum_fields = json.loads(vacuum_fields)
-
- # returns an array of setting & name values
- vacuum_fields_keys = "'" + "','".join(
- vacuum_fields['toast'].keys()) + "'"
- SQL = render_template('vacuum_settings/sql/vacuum_defaults.sql',
- columns=vacuum_fields_keys)
- status, res = conn.execute_dict(SQL)
-
- if not status:
- return internal_server_error(errormsg=res)
-
- for row in res['rows']:
- row_name = row['name']
- row['name'] = vacuum_fields['toast'][row_name][0]
- row['label'] = vacuum_fields['toast'][row_name][1]
- row['column_type'] = vacuum_fields['table'][row_name][2]
-
- return res
+ def get_vacuum_toast_settings(self, conn, sid):
+ """
+ Fetch the default values for autovacuum
+ fields, return an array of
+ - label
+ - name
+ - setting
+ values
+ """
+ return self.fetch_default_vacuum_settings(conn, sid, 'toast')
def parse_vacuum_data(self, conn, result, type):
"""
@@ -567,47 +564,46 @@ class VacuumSettings:
* type - table/toast vacuum type
"""
- # returns an array of name & label values
- vacuum_fields = render_template("vacuum_settings/vacuum_fields.json")
+ vacuum_settings_tmp = self.fetch_default_vacuum_settings(
+ conn, self.manager.sid, type)
- vacuum_fields = json.loads(vacuum_fields)
+ for row in vacuum_settings_tmp:
+ row_name = row['name']
+ if type is 'toast':
+ row_name = 'toast_{0}'.format(row['name'])
+ if row_name in result and result[row_name] is not None:
+ if row['column_type'] == 'number':
+ value = float(result[row_name])
+ else:
+ value = int(result[row_name])
+ row['value'] = value
+ else:
+ if 'value' in row:
+ row.pop('value')
- # returns an array of setting & name values
- vacuum_fields_keys = "'" + "','".join(
- vacuum_fields[type].keys()) + "'"
- SQL = render_template('vacuum_settings/sql/vacuum_defaults.sql',
- columns=vacuum_fields_keys)
- status, res = conn.execute_dict(SQL)
+ return vacuum_settings_tmp
- if not status:
- return internal_server_error(errormsg=res)
- if type is 'table':
- for row in res['rows']:
- row_name = row['name']
- row['name'] = vacuum_fields[type][row_name][0]
- row['label'] = vacuum_fields[type][row_name][1]
- row['column_type'] = vacuum_fields[type][row_name][2]
- if result[row['name']] is not None:
- if row['column_type'] == 'number':
- value = float(result[row['name']])
- else:
- value = int(result[row['name']])
- row['value'] = row['setting'] = value
-
- elif type is 'toast':
- for row in res['rows']:
- row_old_name = row['name']
- row_name = 'toast_{0}'.format(
- vacuum_fields[type][row_old_name][0])
- row['name'] = vacuum_fields[type][row_old_name][0]
- row['label'] = vacuum_fields[type][row_old_name][1]
- row['column_type'] = vacuum_fields[type][row_old_name][2]
- if result[row_name] and result[row_name] is not None:
- if row['column_type'] == 'number':
- value = float(result[row_name])
- else:
- value = int(result[row_name])
- row['value'] = row['setting'] = value
+def get_schema(sid, did, scid):
+ """
+ This function will return the schema name.
+ """
+
+ driver = get_driver(PG_DEFAULT_DRIVER)
+ manager = driver.connection_manager(sid)
+ conn = manager.connection(did=did)
+
+ ver = manager.version
+ server_type = manager.server_type
+
+ # Fetch schema name
+ status, schema_name = conn.execute_scalar(
+ render_template("/".join(['schemas',
+ '{0}/#{1}#'.format(server_type,
+ ver),
+ 'sql/get_name.sql']),
+ conn=conn, scid=scid
+ )
+ )
- return res['rows']
+ return status, schema_name
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 7e37c0357..b03136891 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
@@ -2,13 +2,14 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
"""Implements View and Materialized View Node"""
+import copy
from functools import wraps
import simplejson as json
@@ -18,13 +19,16 @@ from flask_babelex import gettext
import pgadmin.browser.server_groups.servers.databases as databases
from config import PG_DEFAULT_DRIVER
from pgadmin.browser.server_groups.servers.databases.schemas.utils import \
- SchemaChildModule, parse_rule_definition, VacuumSettings
+ SchemaChildModule, parse_rule_definition, VacuumSettings, get_schema
from pgadmin.browser.server_groups.servers.utils import parse_priv_from_db, \
parse_priv_to_db
from pgadmin.browser.utils import PGChildNodeView
from pgadmin.utils.ajax import make_json_response, internal_server_error, \
make_response as ajax_response, gone
from pgadmin.utils.driver import get_driver
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
+
"""
This module is responsible for generating two nodes
@@ -197,7 +201,7 @@ def check_precondition(f):
return wrap
-class ViewNode(PGChildNodeView, VacuumSettings):
+class ViewNode(PGChildNodeView, VacuumSettings, SchemaDiffObjectCompare):
"""
This class is responsible for generating routes for view node.
@@ -250,6 +254,10 @@ class ViewNode(PGChildNodeView, VacuumSettings):
* dependent(gid, sid, did, scid):
- This function will generate dependent list to show it in dependent
pane for the selected view node.
+
+ * compare(**kwargs):
+ - This function will compare the view nodes from two
+ different schemas.
"""
node_type = view_blueprint.node_type
@@ -290,6 +298,8 @@ class ViewNode(PGChildNodeView, VacuumSettings):
{'get': 'get_toast_table_vacuum'}]
})
+ keys_to_ignore = ['oid', 'schema', 'xmin']
+
def __init__(self, *args, **kwargs):
"""
Initialize the variables used by methods of ViewNode.
@@ -400,21 +410,37 @@ class ViewNode(PGChildNodeView, VacuumSettings):
Fetches the properties of an individual view
and render in the properties tab
"""
+ status, res = self._fetch_properties(scid, vid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, scid, vid):
+ """
+ This function is used to fetch the properties of the specified object
+ :param scid:
+ :param vid:
+ :return:
+ """
SQL = render_template("/".join(
[self.template_path, 'sql/properties.sql']
), vid=vid, datlastsysoid=self.datlastsysoid)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(gettext("""Could not find the view."""))
+ return False, gone(gettext("""Could not find the view."""))
SQL = render_template("/".join(
[self.template_path, 'sql/acl.sql']), vid=vid)
status, dataclres = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
for row in dataclres['rows']:
priv = parse_priv_from_db(row)
@@ -428,10 +454,7 @@ class ViewNode(PGChildNodeView, VacuumSettings):
# merging formated result with main result again
result.update(frmtd_reslt)
- return ajax_response(
- response=result,
- status=200
- )
+ return True, result
@staticmethod
def formatter(result):
@@ -556,7 +579,7 @@ class ViewNode(PGChildNodeView, VacuumSettings):
return internal_server_error(errormsg=str(e))
@check_precondition
- def delete(self, gid, sid, did, scid, vid=None):
+ def delete(self, gid, sid, did, scid, vid=None, only_sql=False):
"""
This function will drop a view object
"""
@@ -604,6 +627,10 @@ class ViewNode(PGChildNodeView, VacuumSettings):
nspname=res_data['rows'][0]['schema'],
name=res_data['rows'][0]['name'], cascade=cascade
)
+
+ if only_sql:
+ return SQL
+
status, res = self.conn.execute_scalar(SQL)
if not status:
return internal_server_error(errormsg=res)
@@ -840,7 +867,7 @@ class ViewNode(PGChildNodeView, VacuumSettings):
return columns
- def get_rule_sql(self, vid):
+ def get_rule_sql(self, vid, display_comments=True):
"""
Get all non system rules of view node,
generate their sql and render
@@ -869,12 +896,12 @@ class ViewNode(PGChildNodeView, VacuumSettings):
res = parse_rule_definition(res)
SQL = render_template("/".join(
[self.rule_temp_path, 'sql/create.sql']),
- data=res, display_comments=True)
+ data=res, display_comments=display_comments)
SQL_data += '\n'
SQL_data += SQL
return SQL_data
- def get_compound_trigger_sql(self, vid):
+ def get_compound_trigger_sql(self, vid, display_comments=True):
"""
Get all compound trigger nodes associated with view node,
generate their sql and render into sql tab
@@ -945,13 +972,13 @@ class ViewNode(PGChildNodeView, VacuumSettings):
[self.ct_trigger_temp_path,
'sql/{0}/#{1}#/create.sql'.format(
self.manager.server_type, self.manager.version)]),
- data=res_rows, display_comments=True)
+ data=res_rows, display_comments=display_comments)
SQL_data += '\n'
SQL_data += SQL
return SQL_data
- def get_trigger_sql(self, vid):
+ def get_trigger_sql(self, vid, display_comments=True):
"""
Get all trigger nodes associated with view node,
generate their sql and render
@@ -1038,13 +1065,13 @@ class ViewNode(PGChildNodeView, VacuumSettings):
[self.trigger_temp_path,
'sql/{0}/#{1}#/create.sql'.format(
self.manager.server_type, self.manager.version)]),
- data=res_rows, display_comments=True)
+ data=res_rows, display_comments=display_comments)
SQL_data += '\n'
SQL_data += SQL
return SQL_data
- def get_index_sql(self, did, vid):
+ def get_index_sql(self, did, vid, display_comments=True):
"""
Get all index associated with view node,
generate their sql and render
@@ -1084,17 +1111,23 @@ class ViewNode(PGChildNodeView, VacuumSettings):
SQL = render_template("/".join(
[self.index_temp_path,
'sql/#{0}#/create.sql'.format(self.manager.version)]),
- data=data, display_comments=True)
+ data=data, display_comments=display_comments)
SQL_data += '\n'
SQL_data += SQL
return SQL_data
@check_precondition
- def sql(self, gid, sid, did, scid, vid):
+ def sql(self, gid, sid, did, scid, vid, diff_schema=None,
+ json_resp=True):
"""
This function will generate sql to render into the sql panel
"""
+ display_comments = True
+
+ if not json_resp:
+ display_comments = False
+
SQL_data = ''
SQL = render_template("/".join(
[self.template_path, 'sql/properties.sql']),
@@ -1111,6 +1144,9 @@ class ViewNode(PGChildNodeView, VacuumSettings):
)
result = res['rows'][0]
+ if diff_schema:
+ result['schema'] = diff_schema
+
# sending result to formtter
frmtd_reslt = self.formatter(result)
@@ -1152,18 +1188,20 @@ class ViewNode(PGChildNodeView, VacuumSettings):
[self.template_path, 'sql/create.sql']),
data=result,
conn=self.conn,
- display_comments=True
+ display_comments=display_comments
)
SQL += "\n"
SQL += render_template("/".join(
[self.template_path, 'sql/grant.sql']), data=result)
SQL_data += SQL
- SQL_data += self.get_rule_sql(vid)
- SQL_data += self.get_trigger_sql(vid)
- SQL_data += self.get_compound_trigger_sql(vid)
- SQL_data += self.get_index_sql(did, vid)
+ SQL_data += self.get_rule_sql(vid, display_comments)
+ SQL_data += self.get_trigger_sql(vid, display_comments)
+ SQL_data += self.get_compound_trigger_sql(vid, display_comments)
+ SQL_data += self.get_index_sql(did, vid, display_comments)
+ if not json_resp:
+ return SQL_data
return ajax_response(response=SQL_data)
@check_precondition
@@ -1357,6 +1395,60 @@ class ViewNode(PGChildNodeView, VacuumSettings):
return ajax_response(response=sql)
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid, oid=None):
+ """
+ This function will fetch the list of all the views for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+
+ if not oid:
+ SQL = render_template("/".join([self.template_path,
+ 'sql/nodes.sql']), did=did,
+ scid=scid, datlastsysoid=self.datlastsysoid)
+ status, views = self.conn.execute_2darray(SQL)
+ if not status:
+ current_app.logger.error(views)
+ return False
+
+ for row in views['rows']:
+ status, data = self._fetch_properties(scid, row['oid'])
+ if status:
+ res[row['name']] = data
+ else:
+ status, data = self._fetch_properties(scid, oid)
+ if not status:
+ current_app.logger.error(data)
+ return False
+ res = data
+
+ return res
+
+ def get_sql_from_diff(self, gid, sid, did, scid, oid, data=None,
+ diff_schema=None, drop_sql=False):
+ sql = ''
+ if data:
+ if diff_schema:
+ data['schema'] = diff_schema
+ sql, nameOrError = self.getSQL(gid, sid, did, data, oid)
+ else:
+ if drop_sql:
+ sql = self.delete(gid=gid, sid=sid, did=did,
+ scid=scid, vid=oid, only_sql=True)
+ elif diff_schema:
+ sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, vid=oid,
+ diff_schema=diff_schema, json_resp=False)
+ else:
+ sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, vid=oid,
+ json_resp=False)
+ return sql
+
# Override the operations for materialized view
mview_operations = {
@@ -1631,11 +1723,17 @@ class MViewNode(ViewNode, VacuumSettings):
return SQL, data['name'] if 'name' in data else old_data['name']
@check_precondition
- def sql(self, gid, sid, did, scid, vid):
+ def sql(self, gid, sid, did, scid, vid, diff_schema=None,
+ json_resp=True):
"""
This function will generate sql to render into the sql panel
"""
+ display_comments = True
+
+ if not json_resp:
+ display_comments = False
+
SQL_data = ''
SQL = render_template("/".join(
[self.template_path, 'sql/properties.sql']),
@@ -1654,6 +1752,9 @@ class MViewNode(ViewNode, VacuumSettings):
result = res['rows'][0]
+ if diff_schema:
+ result['schema'] = diff_schema
+
# sending result to formtter
frmtd_reslt = self.formatter(result)
@@ -1732,17 +1833,20 @@ class MViewNode(ViewNode, VacuumSettings):
[self.template_path, 'sql/create.sql']),
data=result,
conn=self.conn,
- display_comments=True
+ display_comments=display_comments
)
SQL += "\n"
SQL += render_template("/".join(
[self.template_path, 'sql/grant.sql']), data=result)
SQL_data += SQL
- SQL_data += self.get_rule_sql(vid)
- SQL_data += self.get_trigger_sql(vid)
- SQL_data += self.get_index_sql(did, vid)
+ SQL_data += self.get_rule_sql(vid, display_comments)
+ SQL_data += self.get_trigger_sql(vid, display_comments)
+ SQL_data += self.get_index_sql(did, vid, display_comments)
SQL_data = SQL_data.strip('\n')
+
+ if not json_resp:
+ return SQL_data
return ajax_response(response=SQL_data)
@check_precondition
@@ -1756,9 +1860,9 @@ class MViewNode(ViewNode, VacuumSettings):
values
"""
- res = self.get_vacuum_table_settings(self.conn)
+ res = self.get_vacuum_table_settings(self.conn, sid)
return ajax_response(
- response=res['rows'],
+ response=res,
status=200
)
@@ -1772,10 +1876,10 @@ class MViewNode(ViewNode, VacuumSettings):
- setting
values
"""
- res = self.get_vacuum_toast_settings(self.conn)
+ res = self.get_vacuum_toast_settings(self.conn, sid)
return ajax_response(
- response=res['rows'],
+ response=res,
status=200
)
@@ -1785,21 +1889,39 @@ class MViewNode(ViewNode, VacuumSettings):
Fetches the properties of an individual view
and render in the properties tab
"""
+ status, res = self._fetch_properties(did, scid, vid)
+ if not status:
+ return res
+
+ return ajax_response(
+ response=res,
+ status=200
+ )
+
+ def _fetch_properties(self, did, scid, vid):
+ """
+ This function is used to fetch the properties of the specified object
+ :param did:
+ :param scid:
+ :param vid:
+ :return:
+ """
SQL = render_template("/".join(
[self.template_path, 'sql/properties.sql']
), did=did, vid=vid, datlastsysoid=self.datlastsysoid)
status, res = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
if len(res['rows']) == 0:
- return gone(gettext("""Could not find the materialized view."""))
+ return False, gone(
+ gettext("""Could not find the materialized view."""))
SQL = render_template("/".join(
[self.template_path, 'sql/acl.sql']), vid=vid)
status, dataclres = self.conn.execute_dict(SQL)
if not status:
- return internal_server_error(errormsg=res)
+ return False, internal_server_error(errormsg=res)
for row in dataclres['rows']:
priv = parse_priv_from_db(row)
@@ -1818,10 +1940,7 @@ class MViewNode(ViewNode, VacuumSettings):
result['vacuum_toast'] = self.parse_vacuum_data(
self.conn, result, 'toast')
- return ajax_response(
- response=result,
- status=200
- )
+ return True, result
@check_precondition
def refresh_data(self, gid, sid, did, scid, vid):
@@ -1873,6 +1992,34 @@ class MViewNode(ViewNode, VacuumSettings):
current_app.logger.exception(e)
return internal_server_error(errormsg=str(e))
+ @check_precondition
+ def fetch_objects_to_compare(self, sid, did, scid, oid=None):
+ """
+ This function will fetch the list of all the mviews for
+ specified schema id.
+
+ :param sid: Server Id
+ :param did: Database Id
+ :param scid: Schema Id
+ :return:
+ """
+ res = dict()
+ SQL = render_template("/".join([self.template_path,
+ 'sql/nodes.sql']), did=did,
+ scid=scid, datlastsysoid=self.datlastsysoid)
+ status, rset = self.conn.execute_2darray(SQL)
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ for row in rset['rows']:
+ status, data = self._fetch_properties(did, scid, row['oid'])
+ if status:
+ res[row['name']] = data
+
+ return res
+
+SchemaDiffRegistry(view_blueprint.node_type, ViewNode)
ViewNode.register_node_view(view_blueprint)
+SchemaDiffRegistry(mview_blueprint.node_type, MViewNode)
MViewNode.register_node_view(mview_blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js
index d5e2d74a3..77f5d6b60 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js
index 1b357fa97..e85bd7f15 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.2_plus/sql/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.2_plus/sql/update.sql
index 38606cc0b..d49f7fb9f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.2_plus/sql/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.2_plus/sql/update.sql
@@ -19,7 +19,7 @@ ALTER TABLE {{ conn|qtIdent(view_schema, view_name) }}
{% endif %}
{% if def and def != o_data.definition.rstrip(';') %}
CREATE OR REPLACE VIEW {{ conn|qtIdent(view_schema, view_name) }}
- WITH (security_barrier={{ data.security_barrier|lower if data.security_barrier else o_data.security_barrier|default('false', 'true')|lower }})
+ WITH (security_barrier={{ data.security_barrier|lower if data.security_barrier is defined else o_data.security_barrier|default('false', 'true')|lower }})
AS
{{ def }};
{% else %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.3_plus/sql/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.3_plus/sql/update.sql
index 38606cc0b..d49f7fb9f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.3_plus/sql/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.3_plus/sql/update.sql
@@ -19,7 +19,7 @@ ALTER TABLE {{ conn|qtIdent(view_schema, view_name) }}
{% endif %}
{% if def and def != o_data.definition.rstrip(';') %}
CREATE OR REPLACE VIEW {{ conn|qtIdent(view_schema, view_name) }}
- WITH (security_barrier={{ data.security_barrier|lower if data.security_barrier else o_data.security_barrier|default('false', 'true')|lower }})
+ WITH (security_barrier={{ data.security_barrier|lower if data.security_barrier is defined else o_data.security_barrier|default('false', 'true')|lower }})
AS
{{ def }};
{% else %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.4_plus/sql/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.4_plus/sql/update.sql
index 4235f5c90..805c658d1 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.4_plus/sql/update.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.4_plus/sql/update.sql
@@ -19,7 +19,7 @@ ALTER TABLE {{ conn|qtIdent(view_schema, view_name) }}
{% endif %}
{% if def and def != o_data.definition.rstrip(';') %}
CREATE OR REPLACE VIEW {{ conn|qtIdent(view_schema, view_name) }}
- WITH ({% if (data.check_option or o_data.check_option) %}check_option={{ data.check_option if data.check_option else o_data.check_option }}{{', ' }}{% endif %}security_barrier={{ data.security_barrier|lower if data.security_barrier else o_data.security_barrier|default('false', 'true')|lower }})
+ WITH ({% if (data.check_option or o_data.check_option) %}check_option={{ data.check_option if data.check_option else o_data.check_option }}{{', ' }}{% endif %}security_barrier={{ data.security_barrier|lower if data.security_barrier is defined else o_data.security_barrier|default('false', 'true')|lower }})
AS
{{ def }};
{% else %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/__init__.py
index 770879943..23caf9dd8 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mviews_parameters.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mviews_parameters.py
index c84276ef6..6cfb2c075 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mviews_parameters.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mviews_parameters.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_views_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_views_add.py
index af911d4e9..554eff78c 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_views_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_views_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_views_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_views_delete.py
index bcc22c8f8..27f844281 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_views_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_views_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_views_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_views_delete_multiple.py
index 6a22a7157..12443c1d8 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_views_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_views_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_views_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_views_get.py
index 71279127b..895ba078e 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_views_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_views_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_views_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_views_put.py
index f99a7972d..762ce6968 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_views_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_views_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/utils.py
index d6180c4fc..e06584977 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js b/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js
index f74dbd9a2..12e519ec4 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/css/database.css b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/css/database.css
index f0b12e306..0c9ae10dd 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/css/database.css
+++ b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/css/database.css
@@ -11,4 +11,9 @@
background-image: url('{{ url_for('NODE-database.static', filename='img/databasebad.svg') }}') !important;
border-radius: 10px;
background-size: 20px !important;
+ background-repeat: no-repeat;
+ vertical-align: middle;
+ align-content: center;
+ height: 1.3em;
+
}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py
index 37fe32c60..c7e031e50 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py
index fc62bed38..3b4c4d75e 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py
index 22225b968..32bfcf671 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete_multiple.py
index 51e477603..b5b614c87 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py
index dd314154e..ddd3bff1b 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py
index ae861b165..7e3fcd14f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/tests/utils.py
index 8eeedf779..bc5d5ac01 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/databases/utils.py b/web/pgadmin/browser/server_groups/servers/databases/utils.py
index 8926f3046..65375d772 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/gpdb.py b/web/pgadmin/browser/server_groups/servers/gpdb.py
index 048cd58ab..3a3047f4a 100644
--- a/web/pgadmin/browser/server_groups/servers/gpdb.py
+++ b/web/pgadmin/browser/server_groups/servers/gpdb.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/__init__.py b/web/pgadmin/browser/server_groups/servers/pgagent/__init__.py
index 08ca3dc99..8cdab8f88 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/schedules/__init__.py b/web/pgadmin/browser/server_groups/servers/pgagent/schedules/__init__.py
index ad3e7e920..7b6a5a710 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/schedules/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/schedules/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js b/web/pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js
index 377da574d..f1af97e9d 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js b/web/pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js
index f5c8ddc6b..6bf01c9ba 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/steps/__init__.py b/web/pgadmin/browser/server_groups/servers/pgagent/steps/__init__.py
index aa4f7f407..1f9a3ab42 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/steps/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/steps/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js b/web/pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js
index e48ce9e9c..39ded81bd 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/pgagent/tests/__init__.py
index 83e0f5717..b300ce141 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/tests/test_pgagent_add.py b/web/pgadmin/browser/server_groups/servers/pgagent/tests/test_pgagent_add.py
index 8c19506f4..084249815 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/tests/test_pgagent_add.py
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/tests/test_pgagent_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/tests/test_pgagent_delete.py b/web/pgadmin/browser/server_groups/servers/pgagent/tests/test_pgagent_delete.py
index 4e7ef9a80..60c94e747 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/tests/test_pgagent_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/tests/test_pgagent_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/tests/test_pgagent_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/pgagent/tests/test_pgagent_delete_multiple.py
index 89b1f6dc4..e7dee1213 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/tests/test_pgagent_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/tests/test_pgagent_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/tests/test_pgagent_put.py b/web/pgadmin/browser/server_groups/servers/pgagent/tests/test_pgagent_put.py
index dc55dda39..ac46b6a29 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/tests/test_pgagent_put.py
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/tests/test_pgagent_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_add_schedule.py b/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_add_schedule.py
index ab8da587e..f79afba00 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_add_schedule.py
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_add_schedule.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_add_steps.py b/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_add_steps.py
index e0f3dfdac..2b92ca299 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_add_steps.py
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_add_steps.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_delete_multiple_schedules.py b/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_delete_multiple_schedules.py
index 5398fe96a..f9432c179 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_delete_multiple_schedules.py
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_delete_multiple_schedules.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_delete_multiple_steps.py b/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_delete_multiple_steps.py
index 3290557e7..a9db9e85f 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_delete_multiple_steps.py
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_delete_multiple_steps.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_delete_schedule.py b/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_delete_schedule.py
index e08ea49ab..718410b9f 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_delete_schedule.py
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_delete_schedule.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_delete_steps.py b/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_delete_steps.py
index 9ca26268e..c0c2d2816 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_delete_steps.py
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_delete_steps.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_get.py b/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_get.py
index 99ec4b267..57cb76945 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_get.py
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_put_schedule.py b/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_put_schedule.py
index 0e189b6f9..8d19f177d 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_put_schedule.py
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_put_schedule.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_put_step.py b/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_put_step.py
index f01d23bf3..df44c0a04 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_put_step.py
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_put_step.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_stats.py b/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_stats.py
index 5428a1cc1..6f64621f3 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_stats.py
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/tests/tests_pgagent_stats.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/tests/utils.py b/web/pgadmin/browser/server_groups/servers/pgagent/tests/utils.py
index fef196089..af071d927 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/utils.py b/web/pgadmin/browser/server_groups/servers/pgagent/utils.py
index 72701ef3c..3fdcf7f97 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/ppas.py b/web/pgadmin/browser/server_groups/servers/ppas.py
index 4d0fe123c..11befd0f8 100644
--- a/web/pgadmin/browser/server_groups/servers/ppas.py
+++ b/web/pgadmin/browser/server_groups/servers/ppas.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/resource_groups/__init__.py b/web/pgadmin/browser/server_groups/servers/resource_groups/__init__.py
index b65f6d9b6..193e93e38 100644
--- a/web/pgadmin/browser/server_groups/servers/resource_groups/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/resource_groups/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/resource_groups/static/js/resource_group.js b/web/pgadmin/browser/server_groups/servers/resource_groups/static/js/resource_group.js
index 3808cadfc..de02f3850 100644
--- a/web/pgadmin/browser/server_groups/servers/resource_groups/static/js/resource_group.js
+++ b/web/pgadmin/browser/server_groups/servers/resource_groups/static/js/resource_group.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/resource_groups/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/resource_groups/tests/__init__.py
index aa1519def..84995c0da 100644
--- a/web/pgadmin/browser/server_groups/servers/resource_groups/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/resource_groups/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/resource_groups/tests/test_resource_groups_add.py b/web/pgadmin/browser/server_groups/servers/resource_groups/tests/test_resource_groups_add.py
index 913414e8d..58d60cd3a 100644
--- a/web/pgadmin/browser/server_groups/servers/resource_groups/tests/test_resource_groups_add.py
+++ b/web/pgadmin/browser/server_groups/servers/resource_groups/tests/test_resource_groups_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/resource_groups/tests/test_resource_groups_delete.py b/web/pgadmin/browser/server_groups/servers/resource_groups/tests/test_resource_groups_delete.py
index 8ea87e518..c33e0ba98 100644
--- a/web/pgadmin/browser/server_groups/servers/resource_groups/tests/test_resource_groups_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/resource_groups/tests/test_resource_groups_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/resource_groups/tests/test_resource_groups_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/resource_groups/tests/test_resource_groups_delete_multiple.py
index 542593e4c..0b49ffb0d 100644
--- a/web/pgadmin/browser/server_groups/servers/resource_groups/tests/test_resource_groups_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/resource_groups/tests/test_resource_groups_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/resource_groups/tests/test_resource_groups_put.py b/web/pgadmin/browser/server_groups/servers/resource_groups/tests/test_resource_groups_put.py
index 10c3aa2db..a943d86d2 100644
--- a/web/pgadmin/browser/server_groups/servers/resource_groups/tests/test_resource_groups_put.py
+++ b/web/pgadmin/browser/server_groups/servers/resource_groups/tests/test_resource_groups_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/resource_groups/tests/tests_resource_groups_get.py b/web/pgadmin/browser/server_groups/servers/resource_groups/tests/tests_resource_groups_get.py
index a92a4fc2e..b201ed53f 100644
--- a/web/pgadmin/browser/server_groups/servers/resource_groups/tests/tests_resource_groups_get.py
+++ b/web/pgadmin/browser/server_groups/servers/resource_groups/tests/tests_resource_groups_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/resource_groups/tests/utils.py b/web/pgadmin/browser/server_groups/servers/resource_groups/tests/utils.py
index 22a265a13..e3d320e6e 100644
--- a/web/pgadmin/browser/server_groups/servers/resource_groups/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/resource_groups/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/roles/__init__.py b/web/pgadmin/browser/server_groups/servers/roles/__init__.py
index fe1ba684f..8dbaf2a6a 100644
--- a/web/pgadmin/browser/server_groups/servers/roles/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/roles/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/roles/static/js/role.js b/web/pgadmin/browser/server_groups/servers/roles/static/js/role.js
index 10cafe260..932532809 100644
--- a/web/pgadmin/browser/server_groups/servers/roles/static/js/role.js
+++ b/web/pgadmin/browser/server_groups/servers/roles/static/js/role.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/roles/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/roles/tests/__init__.py
index 98fd6580d..fda393c7d 100644
--- a/web/pgadmin/browser/server_groups/servers/roles/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/roles/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_add.py b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_add.py
index 0098ff0a3..015769827 100644
--- a/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_add.py
+++ b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_delete.py b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_delete.py
index c10856134..cc3e40fc1 100644
--- a/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_delete_multiple.py b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_delete_multiple.py
index 39f6e5ec8..6ca5b1606 100644
--- a/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_delete_multiple.py
+++ b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_delete_multiple.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_get.py b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_get.py
index d57d1e6b2..6d8272850 100644
--- a/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_get.py
+++ b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_put.py b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_put.py
index 18ad56d0a..691d4b5f6 100644
--- a/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_put.py
+++ b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/roles/tests/utils.py b/web/pgadmin/browser/server_groups/servers/roles/tests/utils.py
index 4bd627b46..e8172d4c2 100644
--- a/web/pgadmin/browser/server_groups/servers/roles/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/roles/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/static/js/privilege.js b/web/pgadmin/browser/server_groups/servers/static/js/privilege.js
index 8243540b7..24386be09 100644
--- a/web/pgadmin/browser/server_groups/servers/static/js/privilege.js
+++ b/web/pgadmin/browser/server_groups/servers/static/js/privilege.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/static/js/server.js b/web/pgadmin/browser/server_groups/servers/static/js/server.js
index 1ddf0e878..78c854a70 100644
--- a/web/pgadmin/browser/server_groups/servers/static/js/server.js
+++ b/web/pgadmin/browser/server_groups/servers/static/js/server.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/static/js/variable.js b/web/pgadmin/browser/server_groups/servers/static/js/variable.js
index 5d47ff0b3..fad5553b4 100644
--- a/web/pgadmin/browser/server_groups/servers/static/js/variable.js
+++ b/web/pgadmin/browser/server_groups/servers/static/js/variable.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/__init__.py b/web/pgadmin/browser/server_groups/servers/tablespaces/__init__.py
index fe227d7ab..426ead52b 100644
--- a/web/pgadmin/browser/server_groups/servers/tablespaces/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/tablespaces/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js b/web/pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js
index ad5c2b58e..5ba3682ba 100644
--- a/web/pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js
+++ b/web/pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/__init__.py
index e9e049d45..518dd61cc 100644
--- a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_backend_supported.py b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_backend_supported.py
index 60880f215..a943f51d7 100644
--- a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_backend_supported.py
+++ b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_backend_supported.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_add.py b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_add.py
index e2db72cd1..fae07b57c 100644
--- a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_add.py
+++ b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_delete.py b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_delete.py
index ecdacf582..8d49dbfc3 100644
--- a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_get.py b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_get.py
index f6a7fa407..266359fba 100644
--- a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_get.py
+++ b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_put.py b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_put.py
index 8c0252689..6cf6ad88c 100644
--- a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_put.py
+++ b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/utils.py b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/utils.py
index 7b42ef90c..d9ecbc27f 100644
--- a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/templates/servers/supported_servers.js b/web/pgadmin/browser/server_groups/servers/templates/servers/supported_servers.js
index 9b57d2506..1fbf7b48f 100644
--- a/web/pgadmin/browser/server_groups/servers/templates/servers/supported_servers.js
+++ b/web/pgadmin/browser/server_groups/servers/templates/servers/supported_servers.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/servers/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/tests/__init__.py
index 614aea61d..98cecdb1b 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_add_server_with_connect_timeout.py b/web/pgadmin/browser/server_groups/servers/tests/test_add_server_with_connect_timeout.py
index cce03041a..2d3260688 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_add_server_with_connect_timeout.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_add_server_with_connect_timeout.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_add_server_with_service_id.py b/web/pgadmin/browser/server_groups/servers/tests/test_add_server_with_service_id.py
index 9d8da94fd..eca046932 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_add_server_with_service_id.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_add_server_with_service_id.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_add_server_with_ssh_tunnel.py b/web/pgadmin/browser/server_groups/servers/tests/test_add_server_with_ssh_tunnel.py
index e8b48c0fc..49e792271 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_add_server_with_ssh_tunnel.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_add_server_with_ssh_tunnel.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_check_ssl_connection.py b/web/pgadmin/browser/server_groups/servers/tests/test_check_ssl_connection.py
index 3f212f37a..887c02a38 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_check_ssl_connection.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_check_ssl_connection.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_dependencies_sql.py b/web/pgadmin/browser/server_groups/servers/tests/test_dependencies_sql.py
index 0e48ab3d4..cf49437a1 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_dependencies_sql.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_dependencies_sql.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_dependents_sql.py b/web/pgadmin/browser/server_groups/servers/tests/test_dependents_sql.py
index 1bb0e0052..fce2e910c 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_dependents_sql.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_dependents_sql.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_role_dependencies_sql.py b/web/pgadmin/browser/server_groups/servers/tests/test_role_dependencies_sql.py
index 4c5dacb95..f6a74550f 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_role_dependencies_sql.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_role_dependencies_sql.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
index fd554af94..5ea9a8660 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
index c2b184295..f970cb043 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
index 9f92ffcce..d0025c8b1 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
index 8a69558e9..2fcafabde 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/types.py b/web/pgadmin/browser/server_groups/servers/types.py
index ba7d23fbe..5e4ff4510 100644
--- a/web/pgadmin/browser/server_groups/servers/types.py
+++ b/web/pgadmin/browser/server_groups/servers/types.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/servers/utils.py b/web/pgadmin/browser/server_groups/servers/utils.py
index c402d08f5..f9aeea170 100644
--- a/web/pgadmin/browser/server_groups/servers/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/static/js/server_group.js b/web/pgadmin/browser/server_groups/static/js/server_group.js
index 9bd7df0f3..8457db658 100644
--- a/web/pgadmin/browser/server_groups/static/js/server_group.js
+++ b/web/pgadmin/browser/server_groups/static/js/server_group.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/server_groups/tests/__init__.py b/web/pgadmin/browser/server_groups/tests/__init__.py
index 8b25e04f3..ad6b4e826 100644
--- a/web/pgadmin/browser/server_groups/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/server_groups/tests/test_sg_get.py b/web/pgadmin/browser/server_groups/tests/test_sg_get.py
index d45dbd153..73d69b2f9 100644
--- a/web/pgadmin/browser/server_groups/tests/test_sg_get.py
+++ b/web/pgadmin/browser/server_groups/tests/test_sg_get.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/static/js/browser.js b/web/pgadmin/browser/static/js/browser.js
index 2ef881b9a..1dc9c24e1 100644
--- a/web/pgadmin/browser/static/js/browser.js
+++ b/web/pgadmin/browser/static/js/browser.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/static/js/collection.js b/web/pgadmin/browser/static/js/collection.js
index 5b7ab0d08..4b11e6bda 100644
--- a/web/pgadmin/browser/static/js/collection.js
+++ b/web/pgadmin/browser/static/js/collection.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/static/js/datamodel.js b/web/pgadmin/browser/static/js/datamodel.js
index 974eda6a4..564f7f2c9 100644
--- a/web/pgadmin/browser/static/js/datamodel.js
+++ b/web/pgadmin/browser/static/js/datamodel.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/static/js/error.js b/web/pgadmin/browser/static/js/error.js
index 07bfe43ac..81e9ab04d 100644
--- a/web/pgadmin/browser/static/js/error.js
+++ b/web/pgadmin/browser/static/js/error.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/static/js/frame.js b/web/pgadmin/browser/static/js/frame.js
index 2ced09867..5e5e7df16 100644
--- a/web/pgadmin/browser/static/js/frame.js
+++ b/web/pgadmin/browser/static/js/frame.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/static/js/keyboard.js b/web/pgadmin/browser/static/js/keyboard.js
index 5cd00e6a3..8b85ecefc 100644
--- a/web/pgadmin/browser/static/js/keyboard.js
+++ b/web/pgadmin/browser/static/js/keyboard.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/static/js/layout.js b/web/pgadmin/browser/static/js/layout.js
index 6a1ee79fd..366697830 100644
--- a/web/pgadmin/browser/static/js/layout.js
+++ b/web/pgadmin/browser/static/js/layout.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/static/js/menu.js b/web/pgadmin/browser/static/js/menu.js
index f40c06e30..3f3dba411 100644
--- a/web/pgadmin/browser/static/js/menu.js
+++ b/web/pgadmin/browser/static/js/menu.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/static/js/node.js b/web/pgadmin/browser/static/js/node.js
index e3fac91f5..b29c98ad3 100644
--- a/web/pgadmin/browser/static/js/node.js
+++ b/web/pgadmin/browser/static/js/node.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/static/js/node.ui.js b/web/pgadmin/browser/static/js/node.ui.js
index 476fd2ec2..6e5060791 100644
--- a/web/pgadmin/browser/static/js/node.ui.js
+++ b/web/pgadmin/browser/static/js/node.ui.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
@@ -93,6 +93,57 @@ define([
);
});
+ /* Define on demand loading of dropdown items.
+ * This also requires ajax option of select2 to be set.
+ * The trick is, ajax: {} will also work even if you're actually not
+ * using ajax.
+ */
+ $.fn.select2.amd.define('select2/onDemandDataAdapter', [
+ 'select2/utils',
+ 'select2/data/select',
+ ], function (Utils, SelectAdapter) {
+
+ function onDemandDataAdapter ($element, options) {
+ this.$element = $element;
+ this.options = options;
+ }
+ Utils.Extend(onDemandDataAdapter, SelectAdapter);
+ onDemandDataAdapter.prototype.query = function (params, callback) {
+ var data = [];
+ var self = this;
+ if (!params.page) {
+ params.page = 1;
+ }
+ var pageSize = 20;
+
+ var $options = this.$element.children();
+ $options.each(function () {
+ var $option = $(this);
+
+ if (!$option.is('option') && !$option.is('optgroup')) {
+ return;
+ }
+
+ var option = self.item($option);
+
+ var matches = self.matches(params, option);
+
+ if (matches !== null) {
+ data.push(matches);
+ }
+ });
+
+ callback({
+ results: data.slice((params.page - 1) * pageSize, params.page * pageSize),
+ pagination: {
+ more: data.length >= params.page * pageSize,
+ },
+ });
+ };
+
+ return onDemandDataAdapter;
+ });
+
/*
* NodeAjaxOptionsControl
* This control will fetch the options required to render the select
diff --git a/web/pgadmin/browser/static/js/panel.js b/web/pgadmin/browser/static/js/panel.js
index 5d77af71f..f2e363ba3 100644
--- a/web/pgadmin/browser/static/js/panel.js
+++ b/web/pgadmin/browser/static/js/panel.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/static/js/preferences.js b/web/pgadmin/browser/static/js/preferences.js
index 74fec42c3..00f566fc3 100644
--- a/web/pgadmin/browser/static/js/preferences.js
+++ b/web/pgadmin/browser/static/js/preferences.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/static/js/toolbar.js b/web/pgadmin/browser/static/js/toolbar.js
index 0442d7526..ff7c7321d 100644
--- a/web/pgadmin/browser/static/js/toolbar.js
+++ b/web/pgadmin/browser/static/js/toolbar.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/static/js/wizard.js b/web/pgadmin/browser/static/js/wizard.js
index 879f07d9c..de7032cf2 100644
--- a/web/pgadmin/browser/static/js/wizard.js
+++ b/web/pgadmin/browser/static/js/wizard.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/templates/browser/js/endpoints.js b/web/pgadmin/browser/templates/browser/js/endpoints.js
index 70909bea3..bc33896f0 100644
--- a/web/pgadmin/browser/templates/browser/js/endpoints.js
+++ b/web/pgadmin/browser/templates/browser/js/endpoints.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/templates/browser/js/messages.js b/web/pgadmin/browser/templates/browser/js/messages.js
index 6e16776bb..41301c4fc 100644
--- a/web/pgadmin/browser/templates/browser/js/messages.js
+++ b/web/pgadmin/browser/templates/browser/js/messages.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/templates/browser/js/utils.js b/web/pgadmin/browser/templates/browser/js/utils.js
index 79e812033..e089a243c 100644
--- a/web/pgadmin/browser/templates/browser/js/utils.js
+++ b/web/pgadmin/browser/templates/browser/js/utils.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/browser/tests/__init__.py b/web/pgadmin/browser/tests/__init__.py
index 315189600..598bbeb97 100644
--- a/web/pgadmin/browser/tests/__init__.py
+++ b/web/pgadmin/browser/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/tests/test_change_password.py b/web/pgadmin/browser/tests/test_change_password.py
index 04c49a23e..ab329dbe9 100644
--- a/web/pgadmin/browser/tests/test_change_password.py
+++ b/web/pgadmin/browser/tests/test_change_password.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/tests/test_gravatar_image_display.py b/web/pgadmin/browser/tests/test_gravatar_image_display.py
index 59f611dec..b63549f2d 100644
--- a/web/pgadmin/browser/tests/test_gravatar_image_display.py
+++ b/web/pgadmin/browser/tests/test_gravatar_image_display.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/tests/test_internal_version.py b/web/pgadmin/browser/tests/test_internal_version.py
index 5a4aa4684..901ef1f61 100644
--- a/web/pgadmin/browser/tests/test_internal_version.py
+++ b/web/pgadmin/browser/tests/test_internal_version.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/tests/test_login.py b/web/pgadmin/browser/tests/test_login.py
index dbfbcfcb5..fad2dd56b 100644
--- a/web/pgadmin/browser/tests/test_login.py
+++ b/web/pgadmin/browser/tests/test_login.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/tests/test_logout.py b/web/pgadmin/browser/tests/test_logout.py
index fbc1a507b..33dc1bf0e 100644
--- a/web/pgadmin/browser/tests/test_logout.py
+++ b/web/pgadmin/browser/tests/test_logout.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/tests/test_master_password.py b/web/pgadmin/browser/tests/test_master_password.py
index 5812b4dea..535dccd73 100644
--- a/web/pgadmin/browser/tests/test_master_password.py
+++ b/web/pgadmin/browser/tests/test_master_password.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/tests/test_reset_password.py b/web/pgadmin/browser/tests/test_reset_password.py
index 7ec2c1778..4fd1fecf6 100644
--- a/web/pgadmin/browser/tests/test_reset_password.py
+++ b/web/pgadmin/browser/tests/test_reset_password.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/tests/test_version_in_range.py b/web/pgadmin/browser/tests/test_version_in_range.py
index 8ff1394aa..a8870e795 100644
--- a/web/pgadmin/browser/tests/test_version_in_range.py
+++ b/web/pgadmin/browser/tests/test_version_in_range.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/tests/utils.py b/web/pgadmin/browser/tests/utils.py
index 458ed6117..895db991a 100644
--- a/web/pgadmin/browser/tests/utils.py
+++ b/web/pgadmin/browser/tests/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/browser/utils.py b/web/pgadmin/browser/utils.py
index 0fda71a0e..67dce0942 100644
--- a/web/pgadmin/browser/utils.py
+++ b/web/pgadmin/browser/utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -343,8 +343,10 @@ class NodeView(with_metaclass(MethodViewType, View)):
def children(self, *args, **kwargs):
"""Build a list of treeview nodes from the child nodes."""
- children = self.get_children_nodes(*args, **kwargs)
+ children = []
+ for module in self.blueprint.submodules:
+ children.extend(module.get_nodes(*args, **kwargs))
# Return sorted nodes based on label
return make_json_response(
data=sorted(
@@ -352,46 +354,8 @@ class NodeView(with_metaclass(MethodViewType, View)):
)
)
- def get_children_nodes(self, *args, **kwargs):
- """
- Returns the list of children nodes for the current nodes. Override this
- function for special cases only.
-
- :param args:
- :param kwargs: Parameters to generate the correct set of tree node.
- :return: List of the children nodes
- """
- children = []
-
- for module in self.blueprint.submodules:
- children.extend(module.get_nodes(*args, **kwargs))
-
- return children
-
class PGChildNodeView(NodeView):
-
- def get_children_nodes(self, manager, **kwargs):
- """
- Returns the list of children nodes for the current nodes.
-
- :param manager: Server Manager object
- :param kwargs: Parameters to generate the correct set of browser tree
- node
- :return:
- """
- nodes = []
- for module in self.blueprint.submodules:
- if isinstance(module, PGChildModule):
- if (
- manager is not None and
- module.BackendSupported(manager, **kwargs)
- ):
- nodes.extend(module.get_nodes(**kwargs))
- else:
- nodes.extend(module.get_nodes(**kwargs))
- return nodes
-
def children(self, **kwargs):
"""Build a list of treeview nodes from the child nodes."""
@@ -424,11 +388,21 @@ class PGChildNodeView(NodeView):
)
)
+ nodes = []
+ for module in self.blueprint.submodules:
+ if isinstance(module, PGChildModule):
+ if (
+ manager is not None and
+ module.BackendSupported(manager, **kwargs)
+ ):
+ nodes.extend(module.get_nodes(**kwargs))
+ else:
+ nodes.extend(module.get_nodes(**kwargs))
+
# Return sorted nodes based on label
return make_json_response(
data=sorted(
- self.get_children_nodes(manager, **kwargs),
- key=lambda c: c['label']
+ nodes, key=lambda c: c['label']
)
)
diff --git a/web/pgadmin/dashboard/__init__.py b/web/pgadmin/dashboard/__init__.py
index a08944d8f..46380463b 100644
--- a/web/pgadmin/dashboard/__init__.py
+++ b/web/pgadmin/dashboard/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/dashboard/static/js/charting.js b/web/pgadmin/dashboard/static/js/charting.js
index 4d40421f0..6b1395507 100644
--- a/web/pgadmin/dashboard/static/js/charting.js
+++ b/web/pgadmin/dashboard/static/js/charting.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/dashboard/static/js/dashboard.js b/web/pgadmin/dashboard/static/js/dashboard.js
index 1255ca807..c412a5c68 100644
--- a/web/pgadmin/dashboard/static/js/dashboard.js
+++ b/web/pgadmin/dashboard/static/js/dashboard.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/dashboard/tests/__init__.py b/web/pgadmin/dashboard/tests/__init__.py
index 7af45b1b5..168bc2e9b 100644
--- a/web/pgadmin/dashboard/tests/__init__.py
+++ b/web/pgadmin/dashboard/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/dashboard/tests/test_dashboard_graphs.py b/web/pgadmin/dashboard/tests/test_dashboard_graphs.py
index 0baf02b48..b9371a5ac 100644
--- a/web/pgadmin/dashboard/tests/test_dashboard_graphs.py
+++ b/web/pgadmin/dashboard/tests/test_dashboard_graphs.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/feature_tests/browser_tool_bar_test.py b/web/pgadmin/feature_tests/browser_tool_bar_test.py
index 9d3c15ad2..a05278a1b 100644
--- a/web/pgadmin/feature_tests/browser_tool_bar_test.py
+++ b/web/pgadmin/feature_tests/browser_tool_bar_test.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/feature_tests/copy_selected_query_results_feature_test.py b/web/pgadmin/feature_tests/copy_selected_query_results_feature_test.py
index 7091ffa42..9ac8be6f4 100644
--- a/web/pgadmin/feature_tests/copy_selected_query_results_feature_test.py
+++ b/web/pgadmin/feature_tests/copy_selected_query_results_feature_test.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/feature_tests/file_manager_test.py b/web/pgadmin/feature_tests/file_manager_test.py
index 6d012869b..6e4f52e1d 100644
--- a/web/pgadmin/feature_tests/file_manager_test.py
+++ b/web/pgadmin/feature_tests/file_manager_test.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/feature_tests/keyboard_shortcut_test.py b/web/pgadmin/feature_tests/keyboard_shortcut_test.py
index ea381b44f..9ed841337 100644
--- a/web/pgadmin/feature_tests/keyboard_shortcut_test.py
+++ b/web/pgadmin/feature_tests/keyboard_shortcut_test.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/feature_tests/pg_datatype_validation_test.py b/web/pgadmin/feature_tests/pg_datatype_validation_test.py
index dba4ead66..6bac34737 100644
--- a/web/pgadmin/feature_tests/pg_datatype_validation_test.py
+++ b/web/pgadmin/feature_tests/pg_datatype_validation_test.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py b/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py
index e7e912d36..4c311c08e 100644
--- a/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py
+++ b/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py b/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py
index bd28dd9a1..0e6586d0e 100644
--- a/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py
+++ b/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/feature_tests/query_tool_auto_complete_tests.py b/web/pgadmin/feature_tests/query_tool_auto_complete_tests.py
index 7de94b38d..63246f999 100644
--- a/web/pgadmin/feature_tests/query_tool_auto_complete_tests.py
+++ b/web/pgadmin/feature_tests/query_tool_auto_complete_tests.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/feature_tests/query_tool_journey_test.py b/web/pgadmin/feature_tests/query_tool_journey_test.py
index 2d7c4ef98..216de6926 100644
--- a/web/pgadmin/feature_tests/query_tool_journey_test.py
+++ b/web/pgadmin/feature_tests/query_tool_journey_test.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/feature_tests/query_tool_tests.py b/web/pgadmin/feature_tests/query_tool_tests.py
index e6091aec5..bcb74ddb4 100644
--- a/web/pgadmin/feature_tests/query_tool_tests.py
+++ b/web/pgadmin/feature_tests/query_tool_tests.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/feature_tests/table_ddl_feature_test.py b/web/pgadmin/feature_tests/table_ddl_feature_test.py
index 13b3a88bd..7430ca95c 100644
--- a/web/pgadmin/feature_tests/table_ddl_feature_test.py
+++ b/web/pgadmin/feature_tests/table_ddl_feature_test.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/feature_tests/view_data_dml_queries.py b/web/pgadmin/feature_tests/view_data_dml_queries.py
index 0155cdc32..62aa09858 100644
--- a/web/pgadmin/feature_tests/view_data_dml_queries.py
+++ b/web/pgadmin/feature_tests/view_data_dml_queries.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/feature_tests/xss_checks_panels_and_query_tool_test.py b/web/pgadmin/feature_tests/xss_checks_panels_and_query_tool_test.py
index 9efad8a36..71b58c013 100644
--- a/web/pgadmin/feature_tests/xss_checks_panels_and_query_tool_test.py
+++ b/web/pgadmin/feature_tests/xss_checks_panels_and_query_tool_test.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py b/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py
index fa5028b82..6af1af82e 100644
--- a/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py
+++ b/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/feature_tests/xss_checks_roles_control_test.py b/web/pgadmin/feature_tests/xss_checks_roles_control_test.py
index 4b1edaabf..3a6e09adb 100644
--- a/web/pgadmin/feature_tests/xss_checks_roles_control_test.py
+++ b/web/pgadmin/feature_tests/xss_checks_roles_control_test.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/help/__init__.py b/web/pgadmin/help/__init__.py
index 1cc7a5a92..1312d5d32 100644
--- a/web/pgadmin/help/__init__.py
+++ b/web/pgadmin/help/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/help/static/js/help.js b/web/pgadmin/help/static/js/help.js
index 02ad06c07..32257ab11 100644
--- a/web/pgadmin/help/static/js/help.js
+++ b/web/pgadmin/help/static/js/help.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/messages.pot b/web/pgadmin/messages.pot
index 29347fad7..cff26da07 100644
--- a/web/pgadmin/messages.pot
+++ b/web/pgadmin/messages.pot
@@ -1,14 +1,14 @@
# Translations template for PROJECT.
-# Copyright (C) 2020 ORGANIZATION
+# Copyright (C) 2019 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-01-03 19:02+0530\n"
+"POT-Creation-Date: 2019-12-06 19:29+0530\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <[email protected]>\n"
@@ -46,13 +46,13 @@ msgstr ""
#: pgadmin/static/js/slickgrid/editors.js:50
#: pgadmin/static/js/slickgrid/editors.js:60
#: pgadmin/static/js/slickgrid/editors.js:61
-#: pgadmin/static/js/sqleditor/filter_dialog.js:84
-#: pgadmin/tools/datagrid/static/js/show_data.js:143
-#: pgadmin/tools/datagrid/static/js/show_data.js:218
+#: pgadmin/static/js/sqleditor/filter_dialog.js:83
+#: pgadmin/tools/datagrid/static/js/show_data.js:142
+#: pgadmin/tools/datagrid/static/js/show_data.js:217
#: pgadmin/tools/import_export/static/js/import_export.js:500
-#: pgadmin/tools/maintenance/static/js/maintenance.js:302
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2005
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2035
+#: pgadmin/tools/maintenance/static/js/maintenance.js:301
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1999
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2029
msgid "OK"
msgstr ""
@@ -455,7 +455,7 @@ msgstr ""
#: pgadmin/browser/utils.py:386
#: pgadmin/static/js/alertify.pgadmin.defaults.js:102
#: pgadmin/static/js/alertify.pgadmin.defaults.js:163
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:305
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:303
#: pgadmin/tools/grant_wizard/__init__.py:129 pgadmin/utils/exception.py:35
msgid "Connection to the server has been lost."
msgstr ""
@@ -572,7 +572,7 @@ msgid "No parameters were changed."
msgstr ""
#: pgadmin/browser/server_groups/servers/__init__.py:767
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:567
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:562
#: pgadmin/browser/server_groups/servers/databases/casts/__init__.py:370
#: pgadmin/browser/server_groups/servers/databases/extensions/__init__.py:264
#: pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py:395
@@ -594,7 +594,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:365
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:569
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/__init__.py:436
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:888
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:922
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:393
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py:484
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py:478
@@ -762,33 +762,33 @@ msgstr ""
msgid "PostgreSQL"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:38
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:37
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:21
msgid "Databases"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:375
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:391
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:654
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:724
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:849
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:1021
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:374
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:390
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:649
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:719
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:844
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:1016
msgid "Could not find the database on the server."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:469
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:468
msgid "Database connected."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:488
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:485
msgid "Database could not be disconnected."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:492
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:489
msgid "Database disconnected."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:777
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:772
#: pgadmin/browser/server_groups/servers/databases/casts/__init__.py:483
#: pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py:522
#: pgadmin/browser/server_groups/servers/databases/extensions/__init__.py:357
@@ -803,10 +803,10 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py:548
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py:488
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py:453
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:830
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:829
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py:441
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:462
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1051
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1085
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:474
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py:565
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py:591
@@ -824,11 +824,11 @@ msgstr ""
msgid "Error: Object not found."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:780
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:775
msgid "The specified database could not be found.\n"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:876
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:871
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:728
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:1561
msgid " -- definition incomplete"
@@ -921,19 +921,19 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:93
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:39
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:210
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:182
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:107
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:670
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:712
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:119
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:105
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:53
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:292
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:181
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:106
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:669
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:710
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:118
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:104
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:52
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:289
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:358
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:131
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:130
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:265
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:324
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:184
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:183
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:324
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:148
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:112
@@ -985,22 +985,22 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:114
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog.js:65
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:393
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:185
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:110
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:673
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:716
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:123
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:109
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:295
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:184
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:109
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:672
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:714
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:122
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:108
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:292
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:361
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:146
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:145
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:254
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:327
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:187
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:186
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:328
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:151
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:115
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:312
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:309
#: pgadmin/browser/server_groups/servers/resource_groups/static/js/resource_group.js:87
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:391
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:344
@@ -1115,56 +1115,56 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:654
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:658
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:662
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:137
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:158
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:692
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:702
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:747
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:750
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:758
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:781
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:735
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:748
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:772
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:789
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:805
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:853
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:144
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:416
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:513
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:538
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:561
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:576
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:604
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:130
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:402
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:499
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:523
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:550
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:565
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:593
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:315
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:346
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:349
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:136
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:157
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:691
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:701
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:746
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:749
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:757
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:780
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:733
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:746
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:770
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:787
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:803
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:851
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:143
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:415
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:512
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:537
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:560
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:575
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:603
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:129
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:401
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:498
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:522
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:549
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:564
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:592
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:311
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:342
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:345
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:384
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:388
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:392
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:396
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:400
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:404
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:407
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:411
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:415
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:418
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:440
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:166
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:179
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:191
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:207
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:250
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:268
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:292
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:318
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:323
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:414
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:436
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:165
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:190
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:249
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:267
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:291
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:317
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:322
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:350
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:375
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:385
@@ -1176,14 +1176,14 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:173
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:136
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:140
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:338
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:343
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:367
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:376
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:381
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:335
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:340
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:364
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:373
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:378
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:383
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:386
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:389
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:393
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:390
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:395
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:408
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:412
@@ -1238,22 +1238,22 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog.js:74
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:403
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:674
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:306
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:113
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:676
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:719
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:127
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:113
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:59
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:477
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:305
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:112
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:675
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:717
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:126
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:112
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:58
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:473
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:411
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:203
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:202
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:397
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:515
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:514
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:762
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:169
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:132
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:334
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:331
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:465
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:140
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:206
@@ -1336,7 +1336,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:331
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:154
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:118
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:315
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:312
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:355
#: pgadmin/dashboard/static/js/dashboard.js:1129
#: pgadmin/dashboard/static/js/dashboard.js:1387
@@ -1348,7 +1348,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:111
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:155
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:242
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:199
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:198
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:286
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:103
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:144
@@ -1357,28 +1357,28 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:120
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:39
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:316
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:315
msgid "Trigger function"
msgstr ""
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:124
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:205
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:267
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:272
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:347
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:387
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:391
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:404
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:417
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:429
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:459
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:464
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:204
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:266
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:271
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:346
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:386
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:390
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:403
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:416
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:428
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:458
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:463
msgid "Events"
msgstr ""
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:132
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:264
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:456
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:263
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:455
msgid "When"
msgstr ""
@@ -1397,7 +1397,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:784
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:222
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:169
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:409
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:406
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:514
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:378
msgid "Security labels"
@@ -1430,14 +1430,14 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1124
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:167
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:130
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:317
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:320
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:323
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:326
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:329
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:332
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:400
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:412
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:467
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:397
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:409
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:464
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:516
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:360
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:372
@@ -1544,11 +1544,11 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:189
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:479
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:195
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:321
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:495
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:530
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:320
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:491
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:529
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:811
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:455
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:452
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:473
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:163
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:221
@@ -1748,8 +1748,8 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:214
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:129
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:161
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:319
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:396
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:316
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:393
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:420
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:427
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:440
@@ -1927,7 +1927,7 @@ msgid "Schema dropped"
msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/__init__.py:781
-#: pgadmin/static/js/backform.pgadmin.js:1837
+#: pgadmin/static/js/backform.pgadmin.js:1833
msgid "Definition incomplete."
msgstr ""
@@ -1946,23 +1946,23 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:594
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:60
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:23
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:269
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:268
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:786
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:787
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:788
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:909
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:898
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:899
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:143
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:344
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:417
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:908
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:896
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:897
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:142
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:340
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:413
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:421
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:427
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:428
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:401
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:495
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:496
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:461
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:460
#: pgadmin/tools/import_export/static/js/import_export.js:179
#: pgadmin/tools/import_export/static/js/import_export.js:199
#: pgadmin/tools/import_export/static/js/import_export.js:237
@@ -2011,7 +2011,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:85
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:171
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:449
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:375
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:372
msgid "Collation"
msgstr ""
@@ -2125,7 +2125,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/static/js/domain.js:65
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:415
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:21
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:127
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:614
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:679
msgid "Check"
@@ -2133,7 +2133,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js:97
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:419
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:136
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:135
msgid "No inherit?"
msgstr ""
@@ -2144,7 +2144,7 @@ msgid "Validate?"
msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:177
msgid "Check cannot be empty."
msgstr ""
@@ -2249,8 +2249,8 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py:1285
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py:1330
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1367
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1417
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1401
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1451
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:1356
msgid "-- Please create column(s) first..."
msgstr ""
@@ -2259,8 +2259,6 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:487
#: pgadmin/browser/static/js/browser.js:213
#: pgadmin/misc/static/explain/js/explain.js:1219
-#: pgadmin/misc/static/explain/js/explain.js:1348
-#: pgadmin/misc/static/explain/js/explain.js:1349
#: pgadmin/misc/statistics/static/js/statistics.js:129
msgid "Statistics"
msgstr ""
@@ -2270,7 +2268,7 @@ msgid "Inherited From"
msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:259
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:176
msgid "Column Name cannot be empty."
msgstr ""
@@ -2467,7 +2465,7 @@ msgid "FTS Dictionary..."
msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/static/js/fts_dictionary.js:153
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:342
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:339
msgid "Template"
msgstr ""
@@ -2613,7 +2611,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:59
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:21
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:457
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:434
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:431
msgid "Functions"
msgstr ""
@@ -2626,29 +2624,29 @@ msgstr ""
msgid "Could not find the function node in the database."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:833
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:832
msgid "The specified function could not be found.\n"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:850
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:849
msgid "Function dropped."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1141
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1320
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1140
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1319
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:334
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:511
msgid "Could not find the function in the database."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1628
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1627
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js:24
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:621
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbproc.js:24
msgid "Procedures"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1728
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1727
msgid "Trigger Functions"
msgstr ""
@@ -2688,7 +2686,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:327
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:150
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:79
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:322
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:321
msgid "Arguments"
msgstr ""
@@ -2712,8 +2710,8 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:182
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:98
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:100
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:289
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:493
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:288
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:492
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:154
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:155
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:209
@@ -2781,7 +2779,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:338
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:245
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1119
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:405
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:402
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:508
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:366
#: pgadmin/tools/debugger/static/js/direct.js:1707
@@ -2821,7 +2819,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:406
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js:200
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:314
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:338
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:337
msgid "Code cannot be empty."
msgstr ""
@@ -3011,7 +3009,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:56
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:25
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:450
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:428
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:425
msgid "Sequences"
msgstr ""
@@ -3174,22 +3172,22 @@ msgid "System schema?"
msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:409
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:322
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:319
msgid "Default TABLE privileges"
msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:412
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:325
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:322
msgid "Default SEQUENCE privileges"
msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:415
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:328
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:325
msgid "Default FUNCTION privileges"
msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:418
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:331
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:328
msgid "Default TYPE privileges"
msgstr ""
@@ -3198,9 +3196,9 @@ msgid "Default privileges"
msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:443
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:53
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:29
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:422
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:419
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:130
msgid "Tables"
msgstr ""
@@ -3208,7 +3206,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:464
#: pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py:58
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:24
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:445
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:442
msgid "Types"
msgstr ""
@@ -3269,8 +3267,8 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:185
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:221
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:527
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:791
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:808
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:789
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:806
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:275
#: pgadmin/browser/static/js/browser.js:630
#: pgadmin/browser/static/js/node.js:1283
@@ -3279,17 +3277,17 @@ msgstr ""
#: pgadmin/misc/file_manager/templates/file_manager/index.html:78
#: pgadmin/static/js/backform.pgadmin.js:538
#: pgadmin/static/js/backgrid.pgadmin.js:621
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1741
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1786
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2385
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1735
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1780
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2379
msgid "Yes"
msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:185
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:221
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:527
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:792
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:809
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:790
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:807
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:275
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:147
#: pgadmin/browser/static/js/browser.js:631
@@ -3299,9 +3297,9 @@ msgstr ""
#: pgadmin/misc/file_manager/templates/file_manager/index.html:77
#: pgadmin/static/js/backform.pgadmin.js:539
#: pgadmin/static/js/backgrid.pgadmin.js:622
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1742
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1787
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2386
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1736
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1781
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2380
msgid "No"
msgstr ""
@@ -3313,32 +3311,32 @@ msgstr ""
msgid "Target object cannot be empty."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:359
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:357
msgid "Could not find the table."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:596
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1271
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:630
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1305
msgid "The specified table could not be found."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1054
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1088
msgid "The specified table could not be found.\n"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1067
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1101
msgid "Table dropped"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1145
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1179
msgid "Trigger(s) have been disabled"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1147
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1181
msgid "Trigger(s) have been enabled"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1501
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1535
#, python-format
msgid "Table rows counted: %s"
msgstr ""
@@ -3391,7 +3389,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:608
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:704
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:856
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:853
msgid "Could not find the column on the server."
msgstr ""
@@ -3537,70 +3535,70 @@ msgstr ""
msgid "Compound Trigger"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:56
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:62
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:68
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:74
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:90
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:61
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:67
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:73
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:89
msgid "Compound Trigger..."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:80
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:79
msgid "Enable compound trigger"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:85
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:84
msgid "Disable compound trigger"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:169
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:168
msgid "Disable compound trigger failed"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:188
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:190
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:187
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:189
msgid "Trigger enabled?"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:205
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:209
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:222
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:235
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:248
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:204
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:208
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:221
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:234
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:247
msgid "FOR Events"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:207
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:389
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:388
msgid "INSERT"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:220
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:402
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:219
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:401
msgid "UPDATE"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:233
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:415
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:232
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:414
msgid "DELETE"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:246
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:428
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:245
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:427
msgid "TRUNCATE"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:303
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:512
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:302
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:511
msgid "System trigger?"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:328
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:543
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:327
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:542
msgid "Specify at least one event."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:347
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:346
msgid ""
"-- Enter any global declarations below:\n"
"\n"
@@ -3670,15 +3668,15 @@ msgstr ""
msgid "Check constraint updated."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:40
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:39
msgid "Check..."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:46
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:45
msgid "Validate check constraint"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:157
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:156
msgid "Don't validate?"
msgstr ""
@@ -3714,7 +3712,7 @@ msgid "Exclusion constraint dropped."
msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:38
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:97
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:96
msgid "Operator class"
msgstr ""
@@ -3742,10 +3740,10 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:453
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:381
#: pgadmin/browser/server_groups/servers/static/js/variable.js:341
-#: pgadmin/static/js/backform.pgadmin.js:1260
-#: pgadmin/static/js/backform.pgadmin.js:1370
-#: pgadmin/static/js/backform.pgadmin.js:1550
-#: pgadmin/static/js/backform.pgadmin.js:1669
+#: pgadmin/static/js/backform.pgadmin.js:1259
+#: pgadmin/static/js/backform.pgadmin.js:1366
+#: pgadmin/static/js/backform.pgadmin.js:1546
+#: pgadmin/static/js/backform.pgadmin.js:1665
msgid "Add new row"
msgstr ""
@@ -3757,7 +3755,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:28
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:28
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:29
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:236
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:234
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/exclusion_constraint/sql/default/stats.sql:7
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/exclusion_constraint/sql/default/stats.sql:12
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/index_constraint/sql/default/stats.sql:7
@@ -3767,87 +3765,87 @@ msgstr ""
msgid "Index size"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:642
msgid "Exclusion constraint..."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:691
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:512
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:498
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:298
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:690
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:511
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:497
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:295
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:378
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:344
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:196
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:366
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:363
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:40
#: pgadmin/tools/backup/static/js/backup.js:366
#: pgadmin/tools/restore/static/js/restore.js:255
msgid "Tablespace"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:701
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:700
msgid "Access method"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:716
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:326
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:715
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:322
msgid "Changing access method will clear columns collection"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:746
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:560
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:549
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:386
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:745
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:559
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:548
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:382
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:716
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:790
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:204
msgid "Fill factor"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:749
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:734
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:575
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:564
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:267
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:748
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:732
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:574
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:563
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:266
msgid "Deferrable?"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:757
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:747
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:603
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:592
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:291
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:756
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:745
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:602
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:591
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:290
msgid "Deferred?"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:779
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:413
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:778
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:409
msgid "Constraint"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:908
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:415
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:401
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:348
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:439
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:907
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:414
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:400
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:344
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:435
msgid "Include columns"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:931
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:242
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:438
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:228
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:424
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:370
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:461
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:930
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:241
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:437
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:227
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:423
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:366
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:457
msgid "Select the column(s)"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1012
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1011
msgid "Please specify name for exclusion constraint."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1018
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1017
msgid "Please specify columns for exclusion constraint."
msgstr ""
@@ -3905,53 +3903,53 @@ msgstr ""
msgid "Referencing"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:616
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:615
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:585
msgid "Foreign key"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:637
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:635
msgid "Foreign key..."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:641
msgid "Validate foreign key"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:771
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:769
msgid "Match type"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:788
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:786
msgid "Validated?"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:804
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:802
msgid "Auto FK index?"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:852
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:850
msgid "Covering index"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1002
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1000
msgid "On update"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1003
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1023
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1001
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1021
msgid "Action"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1022
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1020
msgid "On delete"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1050
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1048
msgid "Please specify columns for Foreign key."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1059
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1057
msgid "Please specify covering index name."
msgstr ""
@@ -3996,7 +3994,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py:996
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:20
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:43
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:42
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:557
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:729
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:811
@@ -4005,7 +4003,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py:1006
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:20
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:43
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:42
msgid "Unique constraint"
msgstr ""
@@ -4013,19 +4011,19 @@ msgstr ""
msgid "Could not find the constraint in the table."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:536
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:522
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:231
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:535
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:521
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:229
msgid "Index"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:644
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:633
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:632
#, python-format
msgid "Please specify columns for %s"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:56
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:55
msgid "Oid"
msgstr ""
@@ -4052,7 +4050,7 @@ msgid "Index is dropped"
msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:29
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:236
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:234
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:45
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:33
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:49
@@ -4069,59 +4067,63 @@ msgstr ""
msgid "Size"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:130
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:128
msgid "Sort order"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:151
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:149
msgid "NULLs"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:248
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:254
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:260
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:266
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:272
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:245
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:251
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:257
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:263
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:269
msgid "Index..."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:311
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:308
msgid "Access Method"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:390
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:386
msgid "Unique?"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:394
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:390
msgid "Clustered?"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:398
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:394
msgid "Valid?"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:402
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:398
msgid "Primary?"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:406
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:402
msgid "System index?"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:409
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:405
msgid "Concurrent build?"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:501
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:497
+msgid "Tablespace cannot be empty."
+msgstr ""
+
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:503
msgid "Access method cannot be empty."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:509
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:511
msgid "You must specify column name."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:514
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:516
msgid "You must specify at least one column."
msgstr ""
@@ -4512,39 +4514,39 @@ msgstr ""
msgid "rule"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:93
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:99
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:105
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:111
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:117
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:92
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:98
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:104
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:110
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:116
msgid "Rule..."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:165
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:164
#: pgadmin/static/js/sqleditor/query_tool_notifications.js:32
#: pgadmin/static/js/sqleditor/query_tool_notifications.js:80
msgid "Event"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:179
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:178
msgid "Do instead?"
msgstr ""
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:182
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:183
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:184
msgid "Condition"
msgstr ""
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:188
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:189
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:190
msgid "Commands"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:195
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:194
msgid "System rule?"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:215
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:214
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:241
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:183
msgid "Please specify name."
@@ -5106,56 +5108,56 @@ msgstr ""
msgid "Trigger"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:56
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:62
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:68
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:74
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:90
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:61
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:67
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:73
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:89
msgid "Trigger..."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:80
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:79
msgid "Enable trigger"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:85
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:84
msgid "Disable trigger"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:169
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:168
msgid "Disable trigger failed"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:205
msgid "Row trigger?"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:247
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:246
msgid "Constraint trigger?"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:346
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:345
msgid "Fires"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:481
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:480
msgid "Old table"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:482
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:488
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:481
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:487
msgid "Transition"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:487
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:486
msgid "New table"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:536
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:535
msgid "Trigger function cannot be empty."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:556
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:555
msgid "Trigger code cannot be empty."
msgstr ""
@@ -5539,7 +5541,7 @@ msgid "Size of temporary files"
msgstr ""
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:45
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:309
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:306
#: pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.2_plus/stats.sql:2
#: pgadmin/browser/server_groups/servers/databases/templates/databases/sql/default/stats.sql:2
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:176
@@ -5593,35 +5595,35 @@ msgstr ""
msgid "Are you sure you want to disconnect the database - %s?"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:337
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:334
#: pgadmin/static/js/browser/server_groups/servers/databases/external_tables/external_tables.js:52
#: pgadmin/tools/backup/static/js/backup.js:192
#: pgadmin/tools/import_export/static/js/import_export.js:108
msgid "Encoding"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:380
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:377
msgid "Character type"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:385
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:382
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:413
msgid "Connection limit"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:388
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:385
msgid "Template?"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:392
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:389
msgid "Allow connections?"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:417
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:414
msgid "Default Privileges"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:499
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:496
msgid "Connect to database"
msgstr ""
@@ -6442,7 +6444,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:139
#: pgadmin/browser/static/js/browser.js:224
#: pgadmin/dashboard/static/js/dashboard.js:191
-#: pgadmin/static/js/backform.pgadmin.js:2032
+#: pgadmin/static/js/backform.pgadmin.js:2028
msgid "SQL"
msgstr ""
@@ -6954,7 +6956,7 @@ msgid "At least one privilege should be selected."
msgstr ""
#: pgadmin/browser/server_groups/servers/static/js/server.js:46
-msgid "Security label must be specified."
+msgid "Label must be specified."
msgstr ""
#: pgadmin/browser/server_groups/servers/static/js/server.js:79
@@ -7054,20 +7056,20 @@ msgstr ""
#: pgadmin/misc/file_manager/static/js/create_dialogue.js:188
#: pgadmin/misc/file_manager/static/js/select_dialogue.js:86
#: pgadmin/misc/file_manager/static/js/select_dialogue.js:129
-#: pgadmin/preferences/static/js/preferences.js:435
+#: pgadmin/preferences/static/js/preferences.js:434
#: pgadmin/static/js/slickgrid/editors.js:50
-#: pgadmin/static/js/sqleditor/filter_dialog.js:79
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:62
-#: pgadmin/tools/datagrid/static/js/show_data.js:139
+#: pgadmin/static/js/sqleditor/filter_dialog.js:78
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:61
+#: pgadmin/tools/datagrid/static/js/show_data.js:138
#: pgadmin/tools/debugger/static/js/debugger_ui.js:588
#: pgadmin/tools/debugger/static/js/debugger_ui.js:893
#: pgadmin/tools/import_export/static/js/import_export.js:495
-#: pgadmin/tools/maintenance/static/js/maintenance.js:297
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:56
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2010
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2164
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4222
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4289
+#: pgadmin/tools/maintenance/static/js/maintenance.js:296
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:55
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2004
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2158
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4216
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4283
msgid "Cancel"
msgstr ""
@@ -7288,7 +7290,7 @@ msgid "Connection timeout (seconds)"
msgstr ""
#: pgadmin/browser/server_groups/servers/static/js/server.js:1130
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2192
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2186
msgid "Connect to Server"
msgstr ""
@@ -7539,17 +7541,15 @@ msgid "Dependents"
msgstr ""
#: pgadmin/browser/static/js/browser.js:348
-#: pgadmin/browser/static/js/toolbar.js:30
-#: pgadmin/browser/static/js/toolbar.js:31
-#: pgadmin/browser/static/js/toolbar.js:91
+#: pgadmin/browser/static/js/toolbar.js:29
+#: pgadmin/browser/static/js/toolbar.js:88
#: pgadmin/tools/datagrid/static/js/datagrid.js:74
msgid "View Data"
msgstr ""
#: pgadmin/browser/static/js/browser.js:349
#: pgadmin/browser/static/js/toolbar.js:20
-#: pgadmin/browser/static/js/toolbar.js:21
-#: pgadmin/browser/static/js/toolbar.js:93
+#: pgadmin/browser/static/js/toolbar.js:90
#: pgadmin/tools/datagrid/static/js/datagrid.js:75
msgid "Filtered Rows"
msgstr ""
@@ -7789,10 +7789,10 @@ msgid "Changes will be lost. Are you sure you want to reset?"
msgstr ""
#: pgadmin/browser/static/js/node.js:1513
-#: pgadmin/preferences/static/js/preferences.js:439
-#: pgadmin/preferences/static/js/preferences.js:464
+#: pgadmin/preferences/static/js/preferences.js:438
+#: pgadmin/preferences/static/js/preferences.js:463
#: pgadmin/tools/datagrid/templates/datagrid/index.html:37
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4297
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4291
msgid "Save"
msgstr ""
@@ -7812,20 +7812,17 @@ msgstr ""
msgid "Unselect All"
msgstr ""
-#: pgadmin/browser/static/js/toolbar.js:40
-#: pgadmin/browser/static/js/toolbar.js:41
-#: pgadmin/browser/static/js/toolbar.js:89
+#: pgadmin/browser/static/js/toolbar.js:38
+#: pgadmin/browser/static/js/toolbar.js:86
#: pgadmin/tools/datagrid/static/js/datagrid.js:103
#: pgadmin/tools/datagrid/static/js/datagrid.js:115
#: pgadmin/tools/sqleditor/__init__.py:68
msgid "Query Tool"
msgstr ""
-#: pgadmin/browser/static/js/wizard.js:85
#: pgadmin/browser/static/js/wizard.js:86
#: pgadmin/static/js/alertify.pgadmin.defaults.js:261
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:263
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:457
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:455
#: pgadmin/templates/security/messages.html:7
#: pgadmin/tools/user_management/static/js/user_management.js:81
#: pgadmin/tools/user_management/static/js/user_management.js:174
@@ -7833,11 +7830,9 @@ msgstr ""
msgid "Close"
msgstr ""
-#: pgadmin/browser/static/js/wizard.js:88
#: pgadmin/browser/static/js/wizard.js:89
#: pgadmin/static/js/alertify.pgadmin.defaults.js:262
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:264
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:458
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:456
msgid "Maximize"
msgstr ""
@@ -7845,22 +7840,6 @@ msgstr ""
msgid "Left panel logo"
msgstr ""
-#: pgadmin/browser/static/js/wizard.js:124
-msgid "Close error bar"
-msgstr ""
-
-#: pgadmin/browser/static/js/wizard.js:131
-#: pgadmin/browser/templates/browser/index.html:135 pgadmin/help/__init__.py:59
-#: pgadmin/help/__init__.py:70 pgadmin/preferences/static/js/preferences.js:427
-#: pgadmin/static/js/sqleditor/filter_dialog.js:72
-#: pgadmin/static/js/sqleditor/filter_dialog.js:73
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:56
-#: pgadmin/tools/datagrid/static/js/show_data.js:133
-#: pgadmin/tools/maintenance/static/js/maintenance.js:289
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:50
-msgid "Help"
-msgstr ""
-
#: pgadmin/browser/static/js/wizard.js:139
#: pgadmin/misc/file_manager/templates/file_manager/index.html:15
msgid "Back"
@@ -7898,6 +7877,11 @@ msgstr ""
msgid "Tools"
msgstr ""
+#: pgadmin/browser/templates/browser/index.html:135 pgadmin/help/__init__.py:59
+#: pgadmin/help/__init__.py:70 pgadmin/static/js/sqleditor/filter_dialog.js:72
+msgid "Help"
+msgstr ""
+
#: pgadmin/browser/templates/browser/index.html:157
msgid "Logout"
msgstr ""
@@ -8286,7 +8270,7 @@ msgstr ""
#: pgadmin/dashboard/templates/dashboard/database_dashboard.html:88
#: pgadmin/dashboard/templates/dashboard/server_dashboard.html:92
#: pgadmin/misc/file_manager/templates/file_manager/index.html:27
-#: pgadmin/preferences/static/js/preferences.js:492
+#: pgadmin/preferences/static/js/preferences.js:491
msgid "Refresh"
msgstr ""
@@ -8802,33 +8786,13 @@ msgstr ""
msgid "Analysis"
msgstr ""
-#: pgadmin/misc/static/explain/js/explain.js:1286
-#: pgadmin/misc/static/explain/js/explain.js:1287
-msgid "Zoom in"
-msgstr ""
-
-#: pgadmin/misc/static/explain/js/explain.js:1295
-#: pgadmin/misc/static/explain/js/explain.js:1296
-msgid "Zoom to original"
-msgstr ""
-
-#: pgadmin/misc/static/explain/js/explain.js:1304
-#: pgadmin/misc/static/explain/js/explain.js:1305
-msgid "Zoom out"
-msgstr ""
-
-#: pgadmin/misc/static/explain/js/explain.js:1319
-#: pgadmin/misc/static/explain/js/explain.js:1320
-msgid "Download"
-msgstr ""
-
#: pgadmin/misc/statistics/static/js/statistics.js:214
msgid "No statistics are available for the selected object."
msgstr ""
#: pgadmin/preferences/__init__.py:55
#: pgadmin/preferences/static/js/preferences.js:426
-#: pgadmin/preferences/static/js/preferences.js:449
+#: pgadmin/preferences/static/js/preferences.js:448
msgid "Preferences"
msgstr ""
@@ -8853,17 +8817,17 @@ msgstr ""
msgid "Category is not selected."
msgstr ""
-#: pgadmin/preferences/static/js/preferences.js:483
+#: pgadmin/preferences/static/js/preferences.js:482
msgid "Refresh required"
msgstr ""
-#: pgadmin/preferences/static/js/preferences.js:484
+#: pgadmin/preferences/static/js/preferences.js:483
msgid ""
"A page refresh is required to apply the theme. Do you wish to refresh the"
" page now?"
msgstr ""
-#: pgadmin/preferences/static/js/preferences.js:493
+#: pgadmin/preferences/static/js/preferences.js:492
msgid "Later"
msgstr ""
@@ -8907,37 +8871,33 @@ msgstr ""
msgid "INTERNAL SERVER ERROR"
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:1550
-msgid "Add"
-msgstr ""
-
-#: pgadmin/static/js/backform.pgadmin.js:1841
+#: pgadmin/static/js/backform.pgadmin.js:1837
msgid "No updates."
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:1956
+#: pgadmin/static/js/backform.pgadmin.js:1952
msgid "General"
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:2157
+#: pgadmin/static/js/backform.pgadmin.js:2153
msgid "Preview not available..."
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:2618
+#: pgadmin/static/js/backform.pgadmin.js:2605
#: pgadmin/tools/backup/static/js/backup.js:95
#: pgadmin/tools/backup/static/js/backup.js:230
msgid "Note"
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:2974
+#: pgadmin/static/js/backform.pgadmin.js:2961
msgid "More"
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:2975
+#: pgadmin/static/js/backform.pgadmin.js:2962
msgid "Less"
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:3059
+#: pgadmin/static/js/backform.pgadmin.js:3046
msgid "Space"
msgstr ""
@@ -8966,7 +8926,7 @@ msgstr ""
msgid "Delete row"
msgstr ""
-#: pgadmin/static/js/backgrid.pgadmin.js:1098
+#: pgadmin/static/js/backgrid.pgadmin.js:1091
msgid "Array Values"
msgstr ""
@@ -9118,13 +9078,13 @@ msgstr ""
msgid "Sort/Filter options"
msgstr ""
-#: pgadmin/static/js/sqleditor/filter_dialog.js:239
+#: pgadmin/static/js/sqleditor/filter_dialog.js:238
msgid "Filter updated successfully"
msgstr ""
-#: pgadmin/static/js/sqleditor/filter_dialog.js:245
-#: pgadmin/tools/datagrid/static/js/show_data.js:238
-#: pgadmin/tools/datagrid/static/js/show_data.js:245
+#: pgadmin/static/js/sqleditor/filter_dialog.js:244
+#: pgadmin/tools/datagrid/static/js/show_data.js:237
+#: pgadmin/tools/datagrid/static/js/show_data.js:244
msgid "Validation Error"
msgstr ""
@@ -9205,7 +9165,6 @@ msgstr ""
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:40
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:41
-#: pgadmin/tools/datagrid/templates/datagrid/index.html:56
#: pgadmin/tools/datagrid/templates/datagrid/index.html:68
msgid "Find"
msgstr ""
@@ -9289,14 +9248,14 @@ msgstr ""
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:129
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:131
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4230
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4224
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:663
msgid "Commit"
msgstr ""
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:135
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:137
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4227
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4221
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:681
msgid "Rollback"
msgstr ""
@@ -9372,7 +9331,7 @@ msgstr ""
#: pgadmin/tools/backup/__init__.py:43
#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:46
#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:55
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:67
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:66
msgid "Backup"
msgstr ""
@@ -9652,8 +9611,8 @@ msgstr ""
#: pgadmin/tools/backup/static/js/backup_dialog.js:71
#: pgadmin/tools/import_export/static/js/import_export.js:685
#: pgadmin/tools/import_export/static/js/import_export.js:699
-#: pgadmin/tools/maintenance/static/js/maintenance.js:477
-#: pgadmin/tools/maintenance/static/js/maintenance.js:488
+#: pgadmin/tools/maintenance/static/js/maintenance.js:476
+#: pgadmin/tools/maintenance/static/js/maintenance.js:487
#: pgadmin/tools/restore/static/js/restore_dialog.js:51
#: pgadmin/tools/restore/static/js/restore_dialog.js:75
msgid "Utility not found"
@@ -9661,25 +9620,25 @@ msgstr ""
#: pgadmin/tools/backup/static/js/backup_dialog.js:72
#: pgadmin/tools/import_export/static/js/import_export.js:700
-#: pgadmin/tools/maintenance/static/js/maintenance.js:489
+#: pgadmin/tools/maintenance/static/js/maintenance.js:488
#: pgadmin/tools/restore/static/js/restore_dialog.js:76
msgid "Failed to fetch Utility information"
msgstr ""
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:159
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:158
msgid "Backup job created."
msgstr ""
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:163
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:162
msgid "Backup job creation failed."
msgstr ""
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:171
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:170
msgid "Backup job failed."
msgstr ""
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:242
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:229
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:241
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:228
msgid "Please provide a filename"
msgstr ""
@@ -9728,7 +9687,7 @@ msgstr ""
msgid "Data Filter"
msgstr ""
-#: pgadmin/tools/datagrid/static/js/show_data.js:161
+#: pgadmin/tools/datagrid/static/js/show_data.js:160
msgid "Use SHIFT + ENTER to apply filter..."
msgstr ""
@@ -10315,30 +10274,6 @@ msgstr ""
msgid "Debugger - "
msgstr ""
-#: pgadmin/tools/debugger/templates/debugger/direct.html:59
-msgid "Step into"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:67
-msgid "Step over"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:75
-msgid "Continue/Start"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:85
-msgid "Toggle breakpoint"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:93
-msgid "Clear all breakpoints"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:103
-msgid "Stop"
-msgstr ""
-
#: pgadmin/tools/grant_wizard/__init__.py:327
msgid "Unable to fetch the {} objects"
msgstr ""
@@ -10671,7 +10606,7 @@ msgstr ""
#: pgadmin/tools/maintenance/static/js/maintenance.js:167
#: pgadmin/tools/maintenance/static/js/maintenance.js:183
-#: pgadmin/tools/maintenance/static/js/maintenance.js:483
+#: pgadmin/tools/maintenance/static/js/maintenance.js:482
msgid "Maintenance..."
msgstr ""
@@ -10685,15 +10620,15 @@ msgid ""
"cannot be maintained using this utility."
msgstr ""
-#: pgadmin/tools/maintenance/static/js/maintenance.js:387
-#: pgadmin/tools/maintenance/static/js/maintenance.js:394
+#: pgadmin/tools/maintenance/static/js/maintenance.js:386
+#: pgadmin/tools/maintenance/static/js/maintenance.js:393
msgid "Maintenance job creation failed."
msgstr ""
#: pgadmin/tools/restore/__init__.py:41
#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:40
#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:49
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:62
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:61
msgid "Restore"
msgstr ""
@@ -10759,15 +10694,15 @@ msgstr ""
msgid "Restore (%s: %s)"
msgstr ""
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:149
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:148
msgid "Restore job created."
msgstr ""
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:153
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:152
msgid "Restore job creation failed."
msgstr ""
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:161
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:160
msgid "Restore job failed."
msgstr ""
@@ -10851,241 +10786,241 @@ msgstr ""
msgid "Geometry Viewer"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:832
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:826
msgid "Editable column"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:834
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:828
msgid "Read-only column"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1261
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1255
msgid "Fetching all records..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1730
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2369
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3314
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1724
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2363
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3308
msgid "Unsaved changes"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1731
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3315
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1725
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3309
msgid "Are you sure you wish to discard the current changes?"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1759
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1753
msgid "Clear history"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1760
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1754
msgid "Are you sure you wish to clear the history?"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1761
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1755
msgid ""
"This will remove all of your query history from this and other sessions "
"for this database."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2125
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2119
msgid "Connection Warning"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2132
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2126
msgid "The application has lost the database connection:"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2136
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2130
msgid "⁃ If the connection was idle it may have been forcibly disconnected."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2138
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2132
msgid "⁃ The application server or database server may have been restarted."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2140
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2134
msgid "⁃ The user session may have timed out."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2144
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2138
msgid "Do you want to continue and establish a new session?"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2163
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2157
msgid "Continue"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2299
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2293
#, python-format
msgid "Error fetching SQL for script: %s."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2370
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2364
msgid ""
"The data has been modified, but not saved. Are you sure you wish to "
"discard the changes?"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2414
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2408
msgid "Running query..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2422
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2416
msgid "Waiting for the query to complete..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2579
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2573
msgid "Loading data from the database server and rendering..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2588
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2582
#, python-format
msgid "Successfully run. Total query runtime: %s."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2589
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2583
#, python-format
msgid "%s rows affected."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2865
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2859
msgid ""
"This query was generated by pgAdmin as part of a \"View/Edit Data\" "
"operation"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2966
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2960
msgid "Row(s) deleted."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3040
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3034
msgid "Saving the updated data..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3156
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3150
msgid "Data saved successfully."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3159
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3153
msgid "Auto-commit is off. You still need to commit changes to the database."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3165
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3159
#, python-format
msgid "%s."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3170
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3164
msgid ""
"Saving data changes was rolled back but the current transaction is still "
"active; previous queries are unaffected."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3192
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3186
msgid "This query was generated by pgAdmin as part of a \"Save Data\" operation"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3353
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3347
msgid "Loading the file..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3404
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3398
msgid "Saving the queries in the file..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3416
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3410
msgid "File saved successfully."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3538
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3597
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3532
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3591
msgid "Applying the new filter..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3558
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3568
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3552
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3562
msgid "Filter By Selection Error"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3617
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3627
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3611
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3621
msgid "Filter Exclude Selection Error"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3637
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3631
msgid "Removing the filter..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3655
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3665
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3649
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3659
msgid "Remove Filter Error"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3768
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3762
msgid "Setting the limit on the result..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3787
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3796
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3781
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3790
msgid "Change limit Error"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3922
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3941
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3916
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3935
msgid "Cancel Query Error"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3960
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3954
msgid "Downloading CSV..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4014
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4008
msgid "CSV Download cancelled."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4017
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4011
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:395
msgid "Download CSV"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4020
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4014
msgid "Download CSV error"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4054
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4061
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4048
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4055
msgid "Auto Rollback Error"
msgstr ""
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4081
#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4087
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4093
msgid "Auto Commit Error"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4182
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4176
msgid "The data has changed. Do you want to save changes?"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4188
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4182
msgid "The text has changed. Do you want to save changes?"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4268
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4262
msgid ""
"The current transaction is not commited to the database.Do you want to "
"commit or rollback the transaction?"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4271
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4265
msgid "Commit transaction?"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4294
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4288
msgid "Don't save"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4337
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4331
msgid "Save changes?"
msgstr ""
diff --git a/web/pgadmin/misc/__init__.py b/web/pgadmin/misc/__init__.py
index a96df4674..d0bef8e15 100644
--- a/web/pgadmin/misc/__init__.py
+++ b/web/pgadmin/misc/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/misc/bgprocess/__init__.py b/web/pgadmin/misc/bgprocess/__init__.py
index bc5fe5900..be17a8309 100644
--- a/web/pgadmin/misc/bgprocess/__init__.py
+++ b/web/pgadmin/misc/bgprocess/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/misc/bgprocess/process_executor.py b/web/pgadmin/misc/bgprocess/process_executor.py
index 5e9b4d048..8f3c423d7 100755
--- a/web/pgadmin/misc/bgprocess/process_executor.py
+++ b/web/pgadmin/misc/bgprocess/process_executor.py
@@ -4,7 +4,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL License
#
##########################################################################
diff --git a/web/pgadmin/misc/bgprocess/processes.py b/web/pgadmin/misc/bgprocess/processes.py
index b48d4bf73..1996bfa80 100644
--- a/web/pgadmin/misc/bgprocess/processes.py
+++ b/web/pgadmin/misc/bgprocess/processes.py
@@ -3,7 +3,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL License
#
##########################################################################
diff --git a/web/pgadmin/misc/bgprocess/static/js/bgprocess.js b/web/pgadmin/misc/bgprocess/static/js/bgprocess.js
index e63466a0e..c6df35c92 100644
--- a/web/pgadmin/misc/bgprocess/static/js/bgprocess.js
+++ b/web/pgadmin/misc/bgprocess/static/js/bgprocess.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/misc/dependencies/__init__.py b/web/pgadmin/misc/dependencies/__init__.py
index 636539232..06ceebf4a 100644
--- a/web/pgadmin/misc/dependencies/__init__.py
+++ b/web/pgadmin/misc/dependencies/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/misc/dependencies/static/js/dependencies.js b/web/pgadmin/misc/dependencies/static/js/dependencies.js
index f59c2c565..09dbd6913 100644
--- a/web/pgadmin/misc/dependencies/static/js/dependencies.js
+++ b/web/pgadmin/misc/dependencies/static/js/dependencies.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/misc/dependents/__init__.py b/web/pgadmin/misc/dependents/__init__.py
index 6f4c040dd..cb6c56629 100644
--- a/web/pgadmin/misc/dependents/__init__.py
+++ b/web/pgadmin/misc/dependents/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/misc/dependents/static/js/dependents.js b/web/pgadmin/misc/dependents/static/js/dependents.js
index 357198084..ec00d6182 100644
--- a/web/pgadmin/misc/dependents/static/js/dependents.js
+++ b/web/pgadmin/misc/dependents/static/js/dependents.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/misc/file_manager/__init__.py b/web/pgadmin/misc/file_manager/__init__.py
index 19eecc1a6..160f3466f 100644
--- a/web/pgadmin/misc/file_manager/__init__.py
+++ b/web/pgadmin/misc/file_manager/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/misc/file_manager/static/js/create_dialogue.js b/web/pgadmin/misc/file_manager/static/js/create_dialogue.js
index a3c44ec88..0eeee4cec 100644
--- a/web/pgadmin/misc/file_manager/static/js/create_dialogue.js
+++ b/web/pgadmin/misc/file_manager/static/js/create_dialogue.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/misc/file_manager/static/js/file_manager.js b/web/pgadmin/misc/file_manager/static/js/file_manager.js
index d0a26a900..a3b66b9f1 100644
--- a/web/pgadmin/misc/file_manager/static/js/file_manager.js
+++ b/web/pgadmin/misc/file_manager/static/js/file_manager.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/misc/file_manager/static/js/helpers.js b/web/pgadmin/misc/file_manager/static/js/helpers.js
index 6467fa8b1..f36d09f6f 100644
--- a/web/pgadmin/misc/file_manager/static/js/helpers.js
+++ b/web/pgadmin/misc/file_manager/static/js/helpers.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/misc/file_manager/static/js/select_dialogue.js b/web/pgadmin/misc/file_manager/static/js/select_dialogue.js
index 219e6ba4f..e6ec14d10 100644
--- a/web/pgadmin/misc/file_manager/static/js/select_dialogue.js
+++ b/web/pgadmin/misc/file_manager/static/js/select_dialogue.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/misc/file_manager/static/js/utility.js b/web/pgadmin/misc/file_manager/static/js/utility.js
index 25aeaebe0..9b85290a9 100644
--- a/web/pgadmin/misc/file_manager/static/js/utility.js
+++ b/web/pgadmin/misc/file_manager/static/js/utility.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/misc/sql/__init__.py b/web/pgadmin/misc/sql/__init__.py
index 3a13bd84a..f8a167001 100644
--- a/web/pgadmin/misc/sql/__init__.py
+++ b/web/pgadmin/misc/sql/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/misc/sql/static/js/sql.js b/web/pgadmin/misc/sql/static/js/sql.js
index 0f826bff9..a5167d365 100644
--- a/web/pgadmin/misc/sql/static/js/sql.js
+++ b/web/pgadmin/misc/sql/static/js/sql.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/misc/static/explain/js/explain.js b/web/pgadmin/misc/static/explain/js/explain.js
index 5da60aa1d..acf284472 100644
--- a/web/pgadmin/misc/static/explain/js/explain.js
+++ b/web/pgadmin/misc/static/explain/js/explain.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/misc/static/explain/js/explain_statistics.js b/web/pgadmin/misc/static/explain/js/explain_statistics.js
index 51ff772c7..2a818bc5b 100644
--- a/web/pgadmin/misc/static/explain/js/explain_statistics.js
+++ b/web/pgadmin/misc/static/explain/js/explain_statistics.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/misc/static/explain/js/image_maper.js b/web/pgadmin/misc/static/explain/js/image_maper.js
index 98998b172..babd2a63c 100644
--- a/web/pgadmin/misc/static/explain/js/image_maper.js
+++ b/web/pgadmin/misc/static/explain/js/image_maper.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/misc/static/explain/js/svg_downloader.js b/web/pgadmin/misc/static/explain/js/svg_downloader.js
index 451912661..4bb37ed9a 100644
--- a/web/pgadmin/misc/static/explain/js/svg_downloader.js
+++ b/web/pgadmin/misc/static/explain/js/svg_downloader.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/misc/statistics/__init__.py b/web/pgadmin/misc/statistics/__init__.py
index 6880ca955..b2fbece0f 100644
--- a/web/pgadmin/misc/statistics/__init__.py
+++ b/web/pgadmin/misc/statistics/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/misc/statistics/static/js/statistics.js b/web/pgadmin/misc/statistics/static/js/statistics.js
index 50a460bb5..101ebd5f3 100644
--- a/web/pgadmin/misc/statistics/static/js/statistics.js
+++ b/web/pgadmin/misc/statistics/static/js/statistics.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/model/__init__.py b/web/pgadmin/model/__init__.py
index f588e401c..b22868fbb 100644
--- a/web/pgadmin/model/__init__.py
+++ b/web/pgadmin/model/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/preferences/__init__.py b/web/pgadmin/preferences/__init__.py
index b83731901..34c01879b 100644
--- a/web/pgadmin/preferences/__init__.py
+++ b/web/pgadmin/preferences/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/preferences/static/js/preferences.js b/web/pgadmin/preferences/static/js/preferences.js
index b28437a6f..08d5a688a 100644
--- a/web/pgadmin/preferences/static/js/preferences.js
+++ b/web/pgadmin/preferences/static/js/preferences.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/redirects/__init__.py b/web/pgadmin/redirects/__init__.py
index 8415be9b0..558dab236 100644
--- a/web/pgadmin/redirects/__init__.py
+++ b/web/pgadmin/redirects/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/settings/__init__.py b/web/pgadmin/settings/__init__.py
index b987d264a..b84a50723 100644
--- a/web/pgadmin/settings/__init__.py
+++ b/web/pgadmin/settings/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/settings/static/js/settings.js b/web/pgadmin/settings/static/js/settings.js
index 606693c3f..a79471a6c 100644
--- a/web/pgadmin/settings/static/js/settings.js
+++ b/web/pgadmin/settings/static/js/settings.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/setup/__init__.py b/web/pgadmin/setup/__init__.py
index 528b6a92d..486ccd2e3 100644
--- a/web/pgadmin/setup/__init__.py
+++ b/web/pgadmin/setup/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/setup/data_directory.py b/web/pgadmin/setup/data_directory.py
index 8433f994b..38fe1a458 100644
--- a/web/pgadmin/setup/data_directory.py
+++ b/web/pgadmin/setup/data_directory.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/setup/db_upgrade.py b/web/pgadmin/setup/db_upgrade.py
index 4b2b26368..80b6a1c2f 100644
--- a/web/pgadmin/setup/db_upgrade.py
+++ b/web/pgadmin/setup/db_upgrade.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/setup/db_version.py b/web/pgadmin/setup/db_version.py
index 52b237f50..c0867a85b 100644
--- a/web/pgadmin/setup/db_version.py
+++ b/web/pgadmin/setup/db_version.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/setup/tests/__init__.py b/web/pgadmin/setup/tests/__init__.py
index 7af45b1b5..168bc2e9b 100644
--- a/web/pgadmin/setup/tests/__init__.py
+++ b/web/pgadmin/setup/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/setup/tests/test_export_import_servers.py b/web/pgadmin/setup/tests/test_export_import_servers.py
index 8a1ffa103..b4d6d4e32 100644
--- a/web/pgadmin/setup/tests/test_export_import_servers.py
+++ b/web/pgadmin/setup/tests/test_export_import_servers.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/setup/tests/test_permissions.py b/web/pgadmin/setup/tests/test_permissions.py
index 9fdc0b0b6..e78abed5e 100644
--- a/web/pgadmin/setup/tests/test_permissions.py
+++ b/web/pgadmin/setup/tests/test_permissions.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/setup/user_info.py b/web/pgadmin/setup/user_info.py
index 3bc0f0dca..204b78400 100644
--- a/web/pgadmin/setup/user_info.py
+++ b/web/pgadmin/setup/user_info.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/static/bundle/app.js b/web/pgadmin/static/bundle/app.js
index 56e972176..71034c93e 100644
--- a/web/pgadmin/static/bundle/app.js
+++ b/web/pgadmin/static/bundle/app.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/bundle/browser.js b/web/pgadmin/static/bundle/browser.js
index 7ed9b725d..8fd744223 100644
--- a/web/pgadmin/static/bundle/browser.js
+++ b/web/pgadmin/static/bundle/browser.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/bundle/codemirror.js b/web/pgadmin/static/bundle/codemirror.js
index fda8f5af2..614fdc32f 100644
--- a/web/pgadmin/static/bundle/codemirror.js
+++ b/web/pgadmin/static/bundle/codemirror.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/bundle/slickgrid.js b/web/pgadmin/static/bundle/slickgrid.js
index 59755a511..20670b981 100644
--- a/web/pgadmin/static/bundle/slickgrid.js
+++ b/web/pgadmin/static/bundle/slickgrid.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
@@ -14,9 +14,12 @@ import 'slickgrid/slick.grid';
import 'slickgrid/slick.dataview';
import 'slickgrid/slick.editors';
import 'slickgrid/slick.formatters';
+import 'slickgrid/slick.groupitemmetadataprovider';
import 'slickgrid/plugins/slick.autotooltips';
import 'slickgrid/plugins/slick.cellrangedecorator';
import 'slickgrid/plugins/slick.cellrangeselector';
+import 'slickgrid/plugins/slick.checkboxselectcolumn';
+import 'slickgrid/plugins/slick.rowselectionmodel';
import 'sources/slickgrid/custom_header_buttons';
export default window.Slick;
diff --git a/web/pgadmin/static/js/alertify.pgadmin.defaults.js b/web/pgadmin/static/js/alertify.pgadmin.defaults.js
index 79a7632df..4d78ce331 100644
--- a/web/pgadmin/static/js/alertify.pgadmin.defaults.js
+++ b/web/pgadmin/static/js/alertify.pgadmin.defaults.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/alertify/dialog.js b/web/pgadmin/static/js/alertify/dialog.js
index 6f4933720..d243e6241 100644
--- a/web/pgadmin/static/js/alertify/dialog.js
+++ b/web/pgadmin/static/js/alertify/dialog.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/alertify/dialog_factory.js b/web/pgadmin/static/js/alertify/dialog_factory.js
index cb0ae1552..683fa756d 100644
--- a/web/pgadmin/static/js/alertify/dialog_factory.js
+++ b/web/pgadmin/static/js/alertify/dialog_factory.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/alertify/dialog_wrapper.js b/web/pgadmin/static/js/alertify/dialog_wrapper.js
index 83186e710..77663805d 100644
--- a/web/pgadmin/static/js/alertify/dialog_wrapper.js
+++ b/web/pgadmin/static/js/alertify/dialog_wrapper.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/backform.pgadmin.js b/web/pgadmin/static/js/backform.pgadmin.js
index 11b504566..6c47ae2a5 100644
--- a/web/pgadmin/static/js/backform.pgadmin.js
+++ b/web/pgadmin/static/js/backform.pgadmin.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
@@ -10,10 +10,10 @@
define([
'sources/gettext', 'underscore', 'jquery',
'backbone', 'backform', 'backgrid', 'codemirror', 'sources/sqleditor_utils',
- 'sources/keyboard_shortcuts', 'sources/window', 'sources/select2/configure_show_on_scroll',
+ 'sources/keyboard_shortcuts', 'sources/window',
'spectrum', 'pgadmin.backgrid', 'select2', 'bootstrap.toggle',
], function(gettext, _, $, Backbone, Backform, Backgrid, CodeMirror,
- SqlEditorUtils, keyboardShortcuts, pgWindow, configure_show_on_scroll) {
+ SqlEditorUtils, keyboardShortcuts, pgWindow) {
var pgAdmin = (window.pgAdmin = window.pgAdmin || {}),
pgBrowser = pgAdmin.Browser;
@@ -817,7 +817,7 @@ define([
},
});
- Backform.Accordian = Backform.Dialog.extend({
+ Backform.Accordian = Backform.Dialog.extend({
className: function() {
return 'set-group pg-el-12';
},
@@ -2129,7 +2129,9 @@ define([
formatter: Select2Formatter,
template: _.template([
- '<label class="<%=Backform.controlLabelClassName%>" for="<%=cId%>"><%=label%></label>',
+ '<% if(label == false) {} else {%>',
+ ' <label class="<%=Backform.controlLabelClassName%>" for="<%=cId%>"><%=label%></label>',
+ '<% }%>',
'<div class="<%=Backform.controlsClassName%>">',
' <select id="<%=cId%>" class="<%=Backform.controlClassName%> <%=extraClasses.join(\' \')%>"',
' name="<%=name%>" value="<%-value%>" <%=disabled ? "disabled" : ""%>',
@@ -2161,7 +2163,6 @@ define([
'</div>',
].join('\n')),
render: function() {
-
if (this.$sel && this.$sel.select2 &&
this.$sel.select2.hasOwnProperty('destroy')) {
this.$sel.select2('destroy');
@@ -2190,7 +2191,7 @@ define([
emptyOptions: false,
preserveSelectionOrder: false,
isDropdownParent: false,
- showOnScroll: true,
+ onDemandLoad: true,
});
// Evaluate the disabled, visible, and required option
@@ -2249,8 +2250,15 @@ define([
select2Opts.data = data.rawValue;
}
- /* Configure show on scroll if required */
- select2Opts = configure_show_on_scroll.default(select2Opts);
+ /* Set the pgadmin adapter for on demand load.
+ * Setting empty ajax option will enable infinite scrolling.
+ */
+ if(select2Opts.onDemandLoad) {
+ select2Opts.dataAdapter = $.fn.select2.amd.require('select2/onDemandDataAdapter');
+ if(_.isUndefined(select2Opts.ajax)) {
+ select2Opts.ajax = {};
+ }
+ }
this.$sel = this.$el.find('select').select2(select2Opts);
@@ -2467,7 +2475,7 @@ define([
self.sqlCtrl.setOption('autoCloseBrackets', sqlEditPreferences.insert_pair_brackets);
self.sqlCtrl.setOption('matchBrackets', sqlEditPreferences.brace_matching);
setTimeout(function() {
- self.sqlCtrl.refresh();
+ if (self.sqlCtrl) self.sqlCtrl.refresh();
}, 500);
}
},
diff --git a/web/pgadmin/static/js/backgrid.pgadmin.js b/web/pgadmin/static/js/backgrid.pgadmin.js
index 2ea0ec90e..2f0a8a018 100644
--- a/web/pgadmin/static/js/backgrid.pgadmin.js
+++ b/web/pgadmin/static/js/backgrid.pgadmin.js
@@ -2,18 +2,18 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
define([
'sources/gettext', 'underscore', 'jquery', 'backbone', 'backform', 'backgrid', 'alertify',
- 'moment', 'bignumber', 'sources/utils', 'sources/keyboard_shortcuts', 'sources/select2/configure_show_on_scroll',
+ 'moment', 'bignumber', 'sources/utils', 'sources/keyboard_shortcuts',
'bootstrap.datetimepicker', 'backgrid.filter', 'bootstrap.toggle',
], function(
gettext, _, $, Backbone, Backform, Backgrid, Alertify, moment, BigNumber,
- commonUtils, keyboardShortcuts, configure_show_on_scroll
+ commonUtils, keyboardShortcuts
) {
/*
* Add mechanism in backgrid to render different types of cells in
@@ -883,7 +883,7 @@ define([
select2_opts = _.extend({
openOnEnter: false,
multiple: false,
- showOnScroll: true,
+ onDemandLoad: true,
}, self.defaults.select2,
(col.select2 || {})
),
@@ -944,9 +944,12 @@ define([
select2_opts['placeholder'] = '';
}
- /* Configure show on scroll if required */
- select2_opts = configure_show_on_scroll.default(select2_opts);
-
+ if(select2_opts.onDemandLoad) {
+ select2_opts.dataAdapter = $.fn.select2.amd.require('select2/onDemandDataAdapter');
+ if(_.isUndefined(select2_opts.ajax)) {
+ select2_opts.ajax = {};
+ }
+ }
// Initialize select2 control.
this.$sel = this.$select.select2(select2_opts);
diff --git a/web/pgadmin/static/js/browser/generate_url.js b/web/pgadmin/static/js/browser/generate_url.js
index 5da54b983..bae495f17 100644
--- a/web/pgadmin/static/js/browser/generate_url.js
+++ b/web/pgadmin/static/js/browser/generate_url.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/browser/index.js b/web/pgadmin/static/js/browser/index.js
index 78e8aaf33..ea00b360a 100644
--- a/web/pgadmin/static/js/browser/index.js
+++ b/web/pgadmin/static/js/browser/index.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/browser/server_groups/index.js b/web/pgadmin/static/js/browser/server_groups/index.js
index 658a320e3..3597720d0 100644
--- a/web/pgadmin/static/js/browser/server_groups/index.js
+++ b/web/pgadmin/static/js/browser/server_groups/index.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/browser/server_groups/servers/databases/external_tables/external_tables.js b/web/pgadmin/static/js/browser/server_groups/servers/databases/external_tables/external_tables.js
index 204b73168..fc128a524 100644
--- a/web/pgadmin/static/js/browser/server_groups/servers/databases/external_tables/external_tables.js
+++ b/web/pgadmin/static/js/browser/server_groups/servers/databases/external_tables/external_tables.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/browser/server_groups/servers/databases/external_tables/index.js b/web/pgadmin/static/js/browser/server_groups/servers/databases/external_tables/index.js
index f44734ac8..ead3993da 100644
--- a/web/pgadmin/static/js/browser/server_groups/servers/databases/external_tables/index.js
+++ b/web/pgadmin/static/js/browser/server_groups/servers/databases/external_tables/index.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/browser/server_groups/servers/databases/index.js b/web/pgadmin/static/js/browser/server_groups/servers/databases/index.js
index 3694b1dd6..ea43fb1d8 100644
--- a/web/pgadmin/static/js/browser/server_groups/servers/databases/index.js
+++ b/web/pgadmin/static/js/browser/server_groups/servers/databases/index.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/browser/server_groups/servers/index.js b/web/pgadmin/static/js/browser/server_groups/servers/index.js
index 82eb05baa..e252e7b89 100644
--- a/web/pgadmin/static/js/browser/server_groups/servers/index.js
+++ b/web/pgadmin/static/js/browser/server_groups/servers/index.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/browser/server_groups/servers/model_validation.js b/web/pgadmin/static/js/browser/server_groups/servers/model_validation.js
index 5d61c27b3..4548bfffa 100644
--- a/web/pgadmin/static/js/browser/server_groups/servers/model_validation.js
+++ b/web/pgadmin/static/js/browser/server_groups/servers/model_validation.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/check_node_visibility.js b/web/pgadmin/static/js/check_node_visibility.js
index 7062f43e0..c172a6e8c 100644
--- a/web/pgadmin/static/js/check_node_visibility.js
+++ b/web/pgadmin/static/js/check_node_visibility.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/codemirror/addon/fold/pgadmin-sqlfoldcode.js b/web/pgadmin/static/js/codemirror/addon/fold/pgadmin-sqlfoldcode.js
index 06891e917..b5a3520cb 100644
--- a/web/pgadmin/static/js/codemirror/addon/fold/pgadmin-sqlfoldcode.js
+++ b/web/pgadmin/static/js/codemirror/addon/fold/pgadmin-sqlfoldcode.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/codemirror/extension/centre_on_line.js b/web/pgadmin/static/js/codemirror/extension/centre_on_line.js
index 8f4f88feb..2fea5547d 100644
--- a/web/pgadmin/static/js/codemirror/extension/centre_on_line.js
+++ b/web/pgadmin/static/js/codemirror/extension/centre_on_line.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/csrf.js b/web/pgadmin/static/js/csrf.js
index 77f85e5f4..0c8dfcbed 100644
--- a/web/pgadmin/static/js/csrf.js
+++ b/web/pgadmin/static/js/csrf.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/dialog_tab_navigator.js b/web/pgadmin/static/js/dialog_tab_navigator.js
index 85789cc2a..b3ffc996f 100644
--- a/web/pgadmin/static/js/dialog_tab_navigator.js
+++ b/web/pgadmin/static/js/dialog_tab_navigator.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/gettext.js b/web/pgadmin/static/js/gettext.js
index e4b6ce700..b75535fe2 100644
--- a/web/pgadmin/static/js/gettext.js
+++ b/web/pgadmin/static/js/gettext.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/history/index.js b/web/pgadmin/static/js/history/index.js
index 1329260d1..5852d702f 100644
--- a/web/pgadmin/static/js/history/index.js
+++ b/web/pgadmin/static/js/history/index.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/keyboard_shortcuts.js b/web/pgadmin/static/js/keyboard_shortcuts.js
index 5ba9b271a..695900510 100644
--- a/web/pgadmin/static/js/keyboard_shortcuts.js
+++ b/web/pgadmin/static/js/keyboard_shortcuts.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/misc/statistics/statistics.js b/web/pgadmin/static/js/misc/statistics/statistics.js
index 8323f266a..cc4ccacf5 100644
--- a/web/pgadmin/static/js/misc/statistics/statistics.js
+++ b/web/pgadmin/static/js/misc/statistics/statistics.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/modify_animation.js b/web/pgadmin/static/js/modify_animation.js
index 85328dbd7..f0e4494d5 100644
--- a/web/pgadmin/static/js/modify_animation.js
+++ b/web/pgadmin/static/js/modify_animation.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/nodes/dashboard.js b/web/pgadmin/static/js/nodes/dashboard.js
index 2ec33807e..783b65c9e 100644
--- a/web/pgadmin/static/js/nodes/dashboard.js
+++ b/web/pgadmin/static/js/nodes/dashboard.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/nodes/supported_database_node.js b/web/pgadmin/static/js/nodes/supported_database_node.js
index 55c9a6998..f0762d039 100644
--- a/web/pgadmin/static/js/nodes/supported_database_node.js
+++ b/web/pgadmin/static/js/nodes/supported_database_node.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/pgadmin.js b/web/pgadmin/static/js/pgadmin.js
index 68a86af8b..bbbd8ce4a 100644
--- a/web/pgadmin/static/js/pgadmin.js
+++ b/web/pgadmin/static/js/pgadmin.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/select2/configure_show_on_scroll.js b/web/pgadmin/static/js/select2/configure_show_on_scroll.js
deleted file mode 100644
index c98a41b77..000000000
--- a/web/pgadmin/static/js/select2/configure_show_on_scroll.js
+++ /dev/null
@@ -1,101 +0,0 @@
-import 'select2';
-import $ from 'jquery';
-import _ from 'underscore';
-
-export default function (options) {
- if(options.showOnScroll) {
- let Utils = $.fn.select2.amd.require('select2/utils');
-
- /* Define on scroll showing of dropdown items.
- * This also requires ajax option of select2 to be set.
- * The trick is, ajax: {} will also work even if you're actually not
- * using ajax.
- */
- let ScrollDataAdapter = function ($element, options) {
- this.$element = $element;
- this.options = options;
- this._dataToConvert = options.get('data') || [];
- };
-
- let BaseAdapter = null;
- if(options.data != null) {
- BaseAdapter = $.fn.select2.amd.require('select2/data/array');
- } else {
- BaseAdapter = $.fn.select2.amd.require('select2/data/select');
- }
- Utils.Extend(ScrollDataAdapter, BaseAdapter);
-
- ScrollDataAdapter.prototype.query = function (params, callback) {
- var data = [];
- var self = this;
- if (!params.page) {
- params.page = 1;
- }
- var pageSize = 20;
-
- var $options = this.$element.children();
- $options.each(function () {
- var $option = $(this);
-
- if (!$option.is('option') && !$option.is('optgroup')) {
- return;
- }
-
- var option = self.item($option);
-
- var matches = self.matches(params, option);
-
- if (matches !== null) {
- data.push(matches);
- }
- });
-
- callback({
- results: data.slice((params.page - 1) * pageSize, params.page * pageSize),
- pagination: {
- more: data.length >= params.page * pageSize,
- },
- });
- };
-
- if (options.minimumInputLength > 0) {
- ScrollDataAdapter = Utils.Decorate(
- ScrollDataAdapter,
- $.fn.select2.amd.require('select2/data/minimumInputLength')
- );
- }
-
- if (options.maximumInputLength > 0) {
- ScrollDataAdapter = Utils.Decorate(
- ScrollDataAdapter,
- $.fn.select2.amd.require('select2/data/maximumInputLength')
- );
- }
-
- if (options.maximumSelectionLength > 0) {
- ScrollDataAdapter = Utils.Decorate(
- ScrollDataAdapter,
- $.fn.select2.amd.require('select2/data/maximumSelectionLength')
- );
- }
-
- if (options.tags) {
- ScrollDataAdapter = Utils.Decorate(ScrollDataAdapter, $.fn.select2.amd.require('select2/data/tags'));
- }
-
- if (options.tokenSeparators != null || options.tokenizer != null) {
- ScrollDataAdapter = Utils.Decorate(
- ScrollDataAdapter,
- $.fn.select2.amd.require('select2/data/tokenizer')
- );
- }
-
- options.dataAdapter = ScrollDataAdapter;
-
- /* Setting empty ajax option will enable infinite scrolling. */
- if(_.isUndefined(options.ajax)) {
- options.ajax = {};
- }
- }
- return options;
-}
diff --git a/web/pgadmin/static/js/selection/active_cell_capture.js b/web/pgadmin/static/js/selection/active_cell_capture.js
index 1eb703e95..8592992e8 100644
--- a/web/pgadmin/static/js/selection/active_cell_capture.js
+++ b/web/pgadmin/static/js/selection/active_cell_capture.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/selection/clipboard.js b/web/pgadmin/static/js/selection/clipboard.js
index a5f35ab6b..ca690965d 100644
--- a/web/pgadmin/static/js/selection/clipboard.js
+++ b/web/pgadmin/static/js/selection/clipboard.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/selection/column_selector.js b/web/pgadmin/static/js/selection/column_selector.js
index 97fe0d946..7bb9411ea 100644
--- a/web/pgadmin/static/js/selection/column_selector.js
+++ b/web/pgadmin/static/js/selection/column_selector.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/selection/copy_data.js b/web/pgadmin/static/js/selection/copy_data.js
index 29946ecbf..2fc89485f 100644
--- a/web/pgadmin/static/js/selection/copy_data.js
+++ b/web/pgadmin/static/js/selection/copy_data.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/selection/grid_selector.js b/web/pgadmin/static/js/selection/grid_selector.js
index 1b5d2840f..c7f26b649 100644
--- a/web/pgadmin/static/js/selection/grid_selector.js
+++ b/web/pgadmin/static/js/selection/grid_selector.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/selection/range_boundary_navigator.js b/web/pgadmin/static/js/selection/range_boundary_navigator.js
index bad5a7395..f1416b987 100644
--- a/web/pgadmin/static/js/selection/range_boundary_navigator.js
+++ b/web/pgadmin/static/js/selection/range_boundary_navigator.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/selection/range_selection_helper.js b/web/pgadmin/static/js/selection/range_selection_helper.js
index 10d3227f2..c8c513c83 100644
--- a/web/pgadmin/static/js/selection/range_selection_helper.js
+++ b/web/pgadmin/static/js/selection/range_selection_helper.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/selection/row_selector.js b/web/pgadmin/static/js/selection/row_selector.js
index eeea6e491..913832a3a 100644
--- a/web/pgadmin/static/js/selection/row_selector.js
+++ b/web/pgadmin/static/js/selection/row_selector.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/selection/set_staged_rows.js b/web/pgadmin/static/js/selection/set_staged_rows.js
index 5ac934f66..6188d2961 100644
--- a/web/pgadmin/static/js/selection/set_staged_rows.js
+++ b/web/pgadmin/static/js/selection/set_staged_rows.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/selection/xcell_selection_model.js b/web/pgadmin/static/js/selection/xcell_selection_model.js
index 28dbabc71..cfb7bded7 100644
--- a/web/pgadmin/static/js/selection/xcell_selection_model.js
+++ b/web/pgadmin/static/js/selection/xcell_selection_model.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/size_prettify.js b/web/pgadmin/static/js/size_prettify.js
index 7f72346ce..4626aefad 100644
--- a/web/pgadmin/static/js/size_prettify.js
+++ b/web/pgadmin/static/js/size_prettify.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/slickgrid/cell_selector.js b/web/pgadmin/static/js/slickgrid/cell_selector.js
index cc3910672..cab79875e 100644
--- a/web/pgadmin/static/js/slickgrid/cell_selector.js
+++ b/web/pgadmin/static/js/slickgrid/cell_selector.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/slickgrid/custom_header_buttons.js b/web/pgadmin/static/js/slickgrid/custom_header_buttons.js
index 2818e6ae6..e02a57afa 100644
--- a/web/pgadmin/static/js/slickgrid/custom_header_buttons.js
+++ b/web/pgadmin/static/js/slickgrid/custom_header_buttons.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/slickgrid/editors.js b/web/pgadmin/static/js/slickgrid/editors.js
index 1dcc29d9b..9852d7398 100644
--- a/web/pgadmin/static/js/slickgrid/editors.js
+++ b/web/pgadmin/static/js/slickgrid/editors.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/slickgrid/event_handlers/handle_query_output_keyboard_event.js b/web/pgadmin/static/js/slickgrid/event_handlers/handle_query_output_keyboard_event.js
index 13d4aa6b9..234505743 100644
--- a/web/pgadmin/static/js/slickgrid/event_handlers/handle_query_output_keyboard_event.js
+++ b/web/pgadmin/static/js/slickgrid/event_handlers/handle_query_output_keyboard_event.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/slickgrid/formatters.js b/web/pgadmin/static/js/slickgrid/formatters.js
index c726ff66d..f5ae4ee2e 100644
--- a/web/pgadmin/static/js/slickgrid/formatters.js
+++ b/web/pgadmin/static/js/slickgrid/formatters.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/sqleditor/calculate_query_run_time.js b/web/pgadmin/static/js/sqleditor/calculate_query_run_time.js
index f66629e55..ba3905110 100644
--- a/web/pgadmin/static/js/sqleditor/calculate_query_run_time.js
+++ b/web/pgadmin/static/js/sqleditor/calculate_query_run_time.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/sqleditor/call_render_after_poll.js b/web/pgadmin/static/js/sqleditor/call_render_after_poll.js
index b5a38c4b8..23b1daa2b 100644
--- a/web/pgadmin/static/js/sqleditor/call_render_after_poll.js
+++ b/web/pgadmin/static/js/sqleditor/call_render_after_poll.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/sqleditor/execute_query.js b/web/pgadmin/static/js/sqleditor/execute_query.js
index c7626bd06..63ad7721b 100644
--- a/web/pgadmin/static/js/sqleditor/execute_query.js
+++ b/web/pgadmin/static/js/sqleditor/execute_query.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/sqleditor/filter_dialog.js b/web/pgadmin/static/js/sqleditor/filter_dialog.js
index b920af17f..a59c43f9b 100644
--- a/web/pgadmin/static/js/sqleditor/filter_dialog.js
+++ b/web/pgadmin/static/js/sqleditor/filter_dialog.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/sqleditor/filter_dialog_model.js b/web/pgadmin/static/js/sqleditor/filter_dialog_model.js
index a850d90aa..7d82f26c1 100644
--- a/web/pgadmin/static/js/sqleditor/filter_dialog_model.js
+++ b/web/pgadmin/static/js/sqleditor/filter_dialog_model.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/sqleditor/geometry_viewer.js b/web/pgadmin/static/js/sqleditor/geometry_viewer.js
index 54ba0073e..559f66f35 100644
--- a/web/pgadmin/static/js/sqleditor/geometry_viewer.js
+++ b/web/pgadmin/static/js/sqleditor/geometry_viewer.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/sqleditor/history/history_collection.js b/web/pgadmin/static/js/sqleditor/history/history_collection.js
index 3ce1b275b..a1654fdc9 100644
--- a/web/pgadmin/static/js/sqleditor/history/history_collection.js
+++ b/web/pgadmin/static/js/sqleditor/history/history_collection.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/sqleditor/history/query_sources.js b/web/pgadmin/static/js/sqleditor/history/query_sources.js
index 45bcb564c..c96f572df 100644
--- a/web/pgadmin/static/js/sqleditor/history/query_sources.js
+++ b/web/pgadmin/static/js/sqleditor/history/query_sources.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/sqleditor/query_tool_actions.js b/web/pgadmin/static/js/sqleditor/query_tool_actions.js
index 358db8d59..c804ff45b 100644
--- a/web/pgadmin/static/js/sqleditor/query_tool_actions.js
+++ b/web/pgadmin/static/js/sqleditor/query_tool_actions.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/sqleditor/query_tool_http_error_handler.js b/web/pgadmin/static/js/sqleditor/query_tool_http_error_handler.js
index 97575c1ea..7e47f6054 100644
--- a/web/pgadmin/static/js/sqleditor/query_tool_http_error_handler.js
+++ b/web/pgadmin/static/js/sqleditor/query_tool_http_error_handler.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/sqleditor/query_tool_notifications.js b/web/pgadmin/static/js/sqleditor/query_tool_notifications.js
index cc01aa17a..0037716ad 100644
--- a/web/pgadmin/static/js/sqleditor/query_tool_notifications.js
+++ b/web/pgadmin/static/js/sqleditor/query_tool_notifications.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/sqleditor/query_tool_preferences.js b/web/pgadmin/static/js/sqleditor/query_tool_preferences.js
index 01cddcb4e..b430d654a 100644
--- a/web/pgadmin/static/js/sqleditor/query_tool_preferences.js
+++ b/web/pgadmin/static/js/sqleditor/query_tool_preferences.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/sqleditor_utils.js b/web/pgadmin/static/js/sqleditor_utils.js
index bf1a5c8c5..d305f4779 100644
--- a/web/pgadmin/static/js/sqleditor_utils.js
+++ b/web/pgadmin/static/js/sqleditor_utils.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/tree/pgadmin_tree_node.js b/web/pgadmin/static/js/tree/pgadmin_tree_node.js
index 47897bd1f..f5a3e6e91 100644
--- a/web/pgadmin/static/js/tree/pgadmin_tree_node.js
+++ b/web/pgadmin/static/js/tree/pgadmin_tree_node.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/tree/pgadmin_tree_save_state.js b/web/pgadmin/static/js/tree/pgadmin_tree_save_state.js
index e42ec4ac1..999027e9e 100644
--- a/web/pgadmin/static/js/tree/pgadmin_tree_save_state.js
+++ b/web/pgadmin/static/js/tree/pgadmin_tree_save_state.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/tree/tree.js b/web/pgadmin/static/js/tree/tree.js
index 57b6207c8..e317aeb81 100644
--- a/web/pgadmin/static/js/tree/tree.js
+++ b/web/pgadmin/static/js/tree/tree.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/url_for.js b/web/pgadmin/static/js/url_for.js
index c0be22c20..ceca8c7e4 100644
--- a/web/pgadmin/static/js/url_for.js
+++ b/web/pgadmin/static/js/url_for.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/utils.js b/web/pgadmin/static/js/utils.js
index 9f9ef32c7..5b8dee11f 100644
--- a/web/pgadmin/static/js/utils.js
+++ b/web/pgadmin/static/js/utils.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/js/window.js b/web/pgadmin/static/js/window.js
index 253f95f78..5969b93a8 100644
--- a/web/pgadmin/static/js/window.js
+++ b/web/pgadmin/static/js/window.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/scss/resources/_default.variables.scss b/web/pgadmin/static/scss/resources/_default.variables.scss
index f769e50b3..e13cf08ba 100644
--- a/web/pgadmin/static/scss/resources/_default.variables.scss
+++ b/web/pgadmin/static/scss/resources/_default.variables.scss
@@ -256,4 +256,11 @@ $loading-bg : rgba($black,0.6);
$loading-fg : $white;
$loader-icon : url("data:image/svg+xml;charset=UTF-8,%3c?xml version='1.0' encoding='utf-8'?%3e%3csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 38 38' style='enable-background:new 0 0 38 38;' xml:space='preserve'%3e%3cstyle type='text/css'%3e .st0%7bfill:none;stroke:%23ebeef3;stroke-width:2;%7d .st1%7bfill:none;stroke:%23326690;stroke-width:2;%7d %3c/style%3e%3cg%3e%3cg transform='translate(1 1)'%3e%3ccircle class='st0' cx='18' cy='18' r='18'/%3e%3cpath class='st1' d='M36,18c0-9.9-8.1-18-18-18 '%3e%3canimateTransform accumulate='none' additive='replace' attributeName='transform' calcMode='linear' dur='0.7s' fill='remove' from='0 18 18' repeatCount='indefinite' restart='always' to='360 18 18' type='rotate'%3e%3c/animateTransform%3e%3c/path%3e%3c/g%3e%3c/g%3e%3c/svg%3e ") !default;
+
$loader-icon-small: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='utf-8'%3F%3E%3C!-- Generator: Adobe Illustrator 23.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --%3E%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 38 38' style='enable-background:new 0 0 38 38;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:none;stroke:%23EBEEF3;stroke-width:5;%7D .st1%7Bfill:none;stroke:%23326690;stroke-width:5;%7D%0A%3C/style%3E%3Cg%3E%3Cg transform='translate(1 1)'%3E%3Ccircle class='st0' cx='18' cy='18' r='16'/%3E%3Cpath class='st1' d='M34,18c0-8.8-7.2-16-16-16 '%3E%3CanimateTransform accumulate='none' additive='replace' attributeName='transform' calcMode='linear' dur='0.7s' fill='remove' from='0 18 18' repeatCount='indefinite' restart='always' to='360 18 18' type='rotate'%3E%3C/animateTransform%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E%0A") !default;
+
+/***************/
+
+$schemadiff-diff-row-color: #fff9c4;
+$schemadiff-source-row-color: #ffebee;
+$schemadiff-target-row-color: #fbe3bf;
diff --git a/web/pgadmin/static/vendor/backform/backform.js b/web/pgadmin/static/vendor/backform/backform.js
index ae9e78218..c4d44987b 100644
--- a/web/pgadmin/static/vendor/backform/backform.js
+++ b/web/pgadmin/static/vendor/backform/backform.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/vendor/require/require.js b/web/pgadmin/static/vendor/require/require.js
index f03d577fe..038fb3da3 100644
--- a/web/pgadmin/static/vendor/require/require.js
+++ b/web/pgadmin/static/vendor/require/require.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/static/vendor/require/require.min.js b/web/pgadmin/static/vendor/require/require.min.js
index 5da16c3d2..a31df1fdd 100644
--- a/web/pgadmin/static/vendor/require/require.min.js
+++ b/web/pgadmin/static/vendor/require/require.min.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/tools/__init__.py b/web/pgadmin/tools/__init__.py
index 8def81936..6764442c4 100644
--- a/web/pgadmin/tools/__init__.py
+++ b/web/pgadmin/tools/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/backup/__init__.py b/web/pgadmin/tools/backup/__init__.py
index ad438573a..2cc6f2979 100644
--- a/web/pgadmin/tools/backup/__init__.py
+++ b/web/pgadmin/tools/backup/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/backup/static/js/backup.js b/web/pgadmin/tools/backup/static/js/backup.js
index 96f88cdf2..ebc45a7c1 100644
--- a/web/pgadmin/tools/backup/static/js/backup.js
+++ b/web/pgadmin/tools/backup/static/js/backup.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/tools/backup/static/js/backup_dialog.js b/web/pgadmin/tools/backup/static/js/backup_dialog.js
index 355ca39e4..1aa545214 100644
--- a/web/pgadmin/tools/backup/static/js/backup_dialog.js
+++ b/web/pgadmin/tools/backup/static/js/backup_dialog.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/tools/backup/static/js/backup_dialog_wrapper.js b/web/pgadmin/tools/backup/static/js/backup_dialog_wrapper.js
index 5b55796bd..078792dc0 100644
--- a/web/pgadmin/tools/backup/static/js/backup_dialog_wrapper.js
+++ b/web/pgadmin/tools/backup/static/js/backup_dialog_wrapper.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/tools/backup/static/js/menu_utils.js b/web/pgadmin/tools/backup/static/js/menu_utils.js
index 4ed35b0a3..fb159d622 100644
--- a/web/pgadmin/tools/backup/static/js/menu_utils.js
+++ b/web/pgadmin/tools/backup/static/js/menu_utils.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/tools/backup/tests/test_backup_create_job_unit_test.py b/web/pgadmin/tools/backup/tests/test_backup_create_job_unit_test.py
index 5453a5b8f..dd3aa6de9 100644
--- a/web/pgadmin/tools/backup/tests/test_backup_create_job_unit_test.py
+++ b/web/pgadmin/tools/backup/tests/test_backup_create_job_unit_test.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/backup/tests/test_backup_message.py b/web/pgadmin/tools/backup/tests/test_backup_message.py
index 211fdf5f4..e81410baa 100644
--- a/web/pgadmin/tools/backup/tests/test_backup_message.py
+++ b/web/pgadmin/tools/backup/tests/test_backup_message.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/backup/tests/test_backup_utils.py b/web/pgadmin/tools/backup/tests/test_backup_utils.py
index ceda091a3..97b516ec9 100644
--- a/web/pgadmin/tools/backup/tests/test_backup_utils.py
+++ b/web/pgadmin/tools/backup/tests/test_backup_utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/backup/tests/test_batch_process.py b/web/pgadmin/tools/backup/tests/test_batch_process.py
index f4e8c5c17..15fb94481 100644
--- a/web/pgadmin/tools/backup/tests/test_batch_process.py
+++ b/web/pgadmin/tools/backup/tests/test_batch_process.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/backup/tests/test_check_utility_exists_route_backup.py b/web/pgadmin/tools/backup/tests/test_check_utility_exists_route_backup.py
index 5b77ca5e6..51c1c6919 100644
--- a/web/pgadmin/tools/backup/tests/test_check_utility_exists_route_backup.py
+++ b/web/pgadmin/tools/backup/tests/test_check_utility_exists_route_backup.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/backup/tests/test_create_backup_job.py b/web/pgadmin/tools/backup/tests/test_create_backup_job.py
index 4b5315515..c9673db56 100644
--- a/web/pgadmin/tools/backup/tests/test_create_backup_job.py
+++ b/web/pgadmin/tools/backup/tests/test_create_backup_job.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/datagrid/__init__.py b/web/pgadmin/tools/datagrid/__init__.py
index 02d5675d2..f4597fc47 100644
--- a/web/pgadmin/tools/datagrid/__init__.py
+++ b/web/pgadmin/tools/datagrid/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/datagrid/static/js/datagrid.js b/web/pgadmin/tools/datagrid/static/js/datagrid.js
index 640b325c4..ddac0c812 100644
--- a/web/pgadmin/tools/datagrid/static/js/datagrid.js
+++ b/web/pgadmin/tools/datagrid/static/js/datagrid.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/tools/datagrid/static/js/datagrid_panel_title.js b/web/pgadmin/tools/datagrid/static/js/datagrid_panel_title.js
index 057f9e4ae..d45aca55a 100644
--- a/web/pgadmin/tools/datagrid/static/js/datagrid_panel_title.js
+++ b/web/pgadmin/tools/datagrid/static/js/datagrid_panel_title.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/tools/datagrid/static/js/show_data.js b/web/pgadmin/tools/datagrid/static/js/show_data.js
index fd4aed3a4..0f4a8062a 100644
--- a/web/pgadmin/tools/datagrid/static/js/show_data.js
+++ b/web/pgadmin/tools/datagrid/static/js/show_data.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/tools/datagrid/static/js/show_query_tool.js b/web/pgadmin/tools/datagrid/static/js/show_query_tool.js
index a359303e9..24b44f3e3 100644
--- a/web/pgadmin/tools/datagrid/static/js/show_query_tool.js
+++ b/web/pgadmin/tools/datagrid/static/js/show_query_tool.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
@@ -11,6 +11,7 @@ import gettext from '../../../../static/js/gettext';
import url_for from '../../../../static/js/url_for';
import {getTreeNodeHierarchyFromIdentifier} from '../../../../static/js/tree/pgadmin_tree_node';
import {getPanelTitle} from './datagrid_panel_title';
+import {getRandomInt} from 'sources/utils';
function hasDatabaseInformation(parentData) {
return parentData.database;
@@ -66,3 +67,21 @@ export function showQueryTool(datagrid, pgBrowser, alertify, url, aciTreeIdentif
datagrid.launch_grid(transId, gridUrl, true, queryToolTitle, sURL);
}
+
+export function generateScript(parentData, datagrid) {
+ const queryToolTitle = `${parentData.database}/${parentData.user}@${parentData.server}`;
+ const transId = getRandomInt(1, 9999999);
+
+ let url_endpoint = url_for('datagrid.panel', {
+ 'trans_id': transId,
+ });
+
+ url_endpoint += `?is_query_tool=${true}`
+ +`&sgid=${parentData.sgid}`
+ +`&sid=${parentData.sid}`
+ +`&server_type=${parentData.stype}`
+ +`&did=${parentData.did}`;
+
+ datagrid.launch_grid(transId, url_endpoint, true, queryToolTitle, '');
+
+}
diff --git a/web/pgadmin/tools/datagrid/templates/datagrid/index.html b/web/pgadmin/tools/datagrid/templates/datagrid/index.html
index 621d88d15..8c7e62832 100644
--- a/web/pgadmin/tools/datagrid/templates/datagrid/index.html
+++ b/web/pgadmin/tools/datagrid/templates/datagrid/index.html
@@ -443,6 +443,15 @@ require(['sources/generated/browser_nodes', 'sources/generated/codemirror', 'sou
{{ url_params|safe}},
'{{ layout|safe }}'
);
+
+ // If opening from schema diff, set the generated script to the SQL Editor
+
+ var schema_ddl_diff = (window.opener !== null) ? window.opener.pgAdmin.ddl_diff : (window.parent !== null) ? window.parent.pgAdmin.ddl_diff : window.top.pgAdmin.ddl_diff;
+ sqlEditorController.set_value_to_editor(schema_ddl_diff);
+ if (window.opener !== null) window.opener.pgAdmin.ddl_diff = '';
+ else if (window.parent !== null) window.parent.pgAdmin.ddl_diff = '';
+ else if (window.top !== null) window.top.pgAdmin.ddl_diff = '';
+
});
});
{% endblock %}
diff --git a/web/pgadmin/tools/debugger/__init__.py b/web/pgadmin/tools/debugger/__init__.py
index e75e2eb70..d4365dcd2 100644
--- a/web/pgadmin/tools/debugger/__init__.py
+++ b/web/pgadmin/tools/debugger/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/debugger/static/js/debugger.js b/web/pgadmin/tools/debugger/static/js/debugger.js
index de8d08abc..4e5d1d889 100644
--- a/web/pgadmin/tools/debugger/static/js/debugger.js
+++ b/web/pgadmin/tools/debugger/static/js/debugger.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/tools/debugger/static/js/debugger_ui.js b/web/pgadmin/tools/debugger/static/js/debugger_ui.js
index cab459476..4c95d7c1b 100644
--- a/web/pgadmin/tools/debugger/static/js/debugger_ui.js
+++ b/web/pgadmin/tools/debugger/static/js/debugger_ui.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/tools/debugger/static/js/debugger_utils.js b/web/pgadmin/tools/debugger/static/js/debugger_utils.js
index 27b51ef1e..282acb018 100644
--- a/web/pgadmin/tools/debugger/static/js/debugger_utils.js
+++ b/web/pgadmin/tools/debugger/static/js/debugger_utils.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/tools/debugger/static/js/direct.js b/web/pgadmin/tools/debugger/static/js/direct.js
index 8e00091a5..992f3d7c6 100644
--- a/web/pgadmin/tools/debugger/static/js/direct.js
+++ b/web/pgadmin/tools/debugger/static/js/direct.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/tools/debugger/utils/debugger_instance.py b/web/pgadmin/tools/debugger/utils/debugger_instance.py
index 0f34fe6e5..66393801b 100644
--- a/web/pgadmin/tools/debugger/utils/debugger_instance.py
+++ b/web/pgadmin/tools/debugger/utils/debugger_instance.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/grant_wizard/__init__.py b/web/pgadmin/tools/grant_wizard/__init__.py
index 09c84c8c3..8b6bb644e 100644
--- a/web/pgadmin/tools/grant_wizard/__init__.py
+++ b/web/pgadmin/tools/grant_wizard/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/grant_wizard/static/js/grant_wizard.js b/web/pgadmin/tools/grant_wizard/static/js/grant_wizard.js
index b36f184da..4315889b7 100644
--- a/web/pgadmin/tools/grant_wizard/static/js/grant_wizard.js
+++ b/web/pgadmin/tools/grant_wizard/static/js/grant_wizard.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/tools/grant_wizard/static/js/menu_utils.js b/web/pgadmin/tools/grant_wizard/static/js/menu_utils.js
index ddce57104..3172bee38 100644
--- a/web/pgadmin/tools/grant_wizard/static/js/menu_utils.js
+++ b/web/pgadmin/tools/grant_wizard/static/js/menu_utils.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/tools/import_export/__init__.py b/web/pgadmin/tools/import_export/__init__.py
index 13b70fa87..19d1436a6 100644
--- a/web/pgadmin/tools/import_export/__init__.py
+++ b/web/pgadmin/tools/import_export/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/import_export/static/js/import_export.js b/web/pgadmin/tools/import_export/static/js/import_export.js
index c46a4e9d8..e31283bc3 100644
--- a/web/pgadmin/tools/import_export/static/js/import_export.js
+++ b/web/pgadmin/tools/import_export/static/js/import_export.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/tools/import_export/tests/__init__.py b/web/pgadmin/tools/import_export/tests/__init__.py
index 7af45b1b5..168bc2e9b 100644
--- a/web/pgadmin/tools/import_export/tests/__init__.py
+++ b/web/pgadmin/tools/import_export/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/import_export/tests/test_check_utility_exists_route_import_export.py b/web/pgadmin/tools/import_export/tests/test_check_utility_exists_route_import_export.py
index 8baa76675..32422b2ca 100644
--- a/web/pgadmin/tools/import_export/tests/test_check_utility_exists_route_import_export.py
+++ b/web/pgadmin/tools/import_export/tests/test_check_utility_exists_route_import_export.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/maintenance/__init__.py b/web/pgadmin/tools/maintenance/__init__.py
index 3b3651e9e..84869b2fb 100644
--- a/web/pgadmin/tools/maintenance/__init__.py
+++ b/web/pgadmin/tools/maintenance/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/maintenance/static/js/maintenance.js b/web/pgadmin/tools/maintenance/static/js/maintenance.js
index f2d1b9019..0a6bbda67 100644
--- a/web/pgadmin/tools/maintenance/static/js/maintenance.js
+++ b/web/pgadmin/tools/maintenance/static/js/maintenance.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/tools/maintenance/static/js/menu_utils.js b/web/pgadmin/tools/maintenance/static/js/menu_utils.js
index 31c4fe948..d9cba522d 100644
--- a/web/pgadmin/tools/maintenance/static/js/menu_utils.js
+++ b/web/pgadmin/tools/maintenance/static/js/menu_utils.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/tools/maintenance/tests/test_batch_process_maintenance.py b/web/pgadmin/tools/maintenance/tests/test_batch_process_maintenance.py
index d45ea02f1..242698a23 100644
--- a/web/pgadmin/tools/maintenance/tests/test_batch_process_maintenance.py
+++ b/web/pgadmin/tools/maintenance/tests/test_batch_process_maintenance.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/maintenance/tests/test_check_utility_exists_route_maintenance.py b/web/pgadmin/tools/maintenance/tests/test_check_utility_exists_route_maintenance.py
index 1bf50bc54..a22ce9ade 100644
--- a/web/pgadmin/tools/maintenance/tests/test_check_utility_exists_route_maintenance.py
+++ b/web/pgadmin/tools/maintenance/tests/test_check_utility_exists_route_maintenance.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/maintenance/tests/test_create_maintenance_job.py b/web/pgadmin/tools/maintenance/tests/test_create_maintenance_job.py
index f45a64bb9..b1ab500d2 100644
--- a/web/pgadmin/tools/maintenance/tests/test_create_maintenance_job.py
+++ b/web/pgadmin/tools/maintenance/tests/test_create_maintenance_job.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/maintenance/tests/test_maintenance_create_job_unit_test.py b/web/pgadmin/tools/maintenance/tests/test_maintenance_create_job_unit_test.py
index b3fe61ad0..94e7248ba 100644
--- a/web/pgadmin/tools/maintenance/tests/test_maintenance_create_job_unit_test.py
+++ b/web/pgadmin/tools/maintenance/tests/test_maintenance_create_job_unit_test.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/maintenance/tests/test_maintenance_message.py b/web/pgadmin/tools/maintenance/tests/test_maintenance_message.py
index dfaf94c03..7f17e0ab5 100644
--- a/web/pgadmin/tools/maintenance/tests/test_maintenance_message.py
+++ b/web/pgadmin/tools/maintenance/tests/test_maintenance_message.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/restore/__init__.py b/web/pgadmin/tools/restore/__init__.py
index 82eed4618..5b646a8bc 100644
--- a/web/pgadmin/tools/restore/__init__.py
+++ b/web/pgadmin/tools/restore/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/restore/static/js/menu_utils.js b/web/pgadmin/tools/restore/static/js/menu_utils.js
index 7b96076ff..8cc9dd022 100644
--- a/web/pgadmin/tools/restore/static/js/menu_utils.js
+++ b/web/pgadmin/tools/restore/static/js/menu_utils.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/tools/restore/static/js/restore.js b/web/pgadmin/tools/restore/static/js/restore.js
index 7ab6c593b..428e549d9 100644
--- a/web/pgadmin/tools/restore/static/js/restore.js
+++ b/web/pgadmin/tools/restore/static/js/restore.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/tools/restore/static/js/restore_dialog.js b/web/pgadmin/tools/restore/static/js/restore_dialog.js
index ea6ccf4b9..18028f8dd 100644
--- a/web/pgadmin/tools/restore/static/js/restore_dialog.js
+++ b/web/pgadmin/tools/restore/static/js/restore_dialog.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/tools/restore/static/js/restore_dialog_wrapper.js b/web/pgadmin/tools/restore/static/js/restore_dialog_wrapper.js
index 396eab0fe..22017e778 100644
--- a/web/pgadmin/tools/restore/static/js/restore_dialog_wrapper.js
+++ b/web/pgadmin/tools/restore/static/js/restore_dialog_wrapper.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/tools/restore/tests/test_batch_process.py b/web/pgadmin/tools/restore/tests/test_batch_process.py
index 13ee5cc65..39836133f 100644
--- a/web/pgadmin/tools/restore/tests/test_batch_process.py
+++ b/web/pgadmin/tools/restore/tests/test_batch_process.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/restore/tests/test_check_utility_exists_route_restore.py b/web/pgadmin/tools/restore/tests/test_check_utility_exists_route_restore.py
index 1a15490d5..110f2eefa 100644
--- a/web/pgadmin/tools/restore/tests/test_check_utility_exists_route_restore.py
+++ b/web/pgadmin/tools/restore/tests/test_check_utility_exists_route_restore.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/restore/tests/test_create_restore_job.py b/web/pgadmin/tools/restore/tests/test_create_restore_job.py
index 8f998aa27..6dc285437 100644
--- a/web/pgadmin/tools/restore/tests/test_create_restore_job.py
+++ b/web/pgadmin/tools/restore/tests/test_create_restore_job.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/restore/tests/test_restore_create_job_unit_test.py b/web/pgadmin/tools/restore/tests/test_restore_create_job_unit_test.py
index af2cf095b..af7b02397 100644
--- a/web/pgadmin/tools/restore/tests/test_restore_create_job_unit_test.py
+++ b/web/pgadmin/tools/restore/tests/test_restore_create_job_unit_test.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/restore/tests/test_restore_message.py b/web/pgadmin/tools/restore/tests/test_restore_message.py
index d11403dcf..641f20bcb 100644
--- a/web/pgadmin/tools/restore/tests/test_restore_message.py
+++ b/web/pgadmin/tools/restore/tests/test_restore_message.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/schema_diff/__init__.py b/web/pgadmin/tools/schema_diff/__init__.py
new file mode 100644
index 000000000..a8e2c5832
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/__init__.py
@@ -0,0 +1,601 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+"""A blueprint module implementing the schema_diff frame."""
+
+MODULE_NAME = 'schema_diff'
+
+import simplejson as json
+import pickle
+import random
+
+from flask import Response, session, url_for, request
+from flask import render_template, current_app as app
+from flask_security import current_user, login_required
+from flask_babelex import gettext
+from pgadmin.utils import PgAdminModule
+from pgadmin.utils.ajax import make_json_response, bad_request, \
+ make_response as ajax_response, not_implemented
+from pgadmin.model import Server
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.tools.schema_diff.model import SchemaDiffModel
+from config import PG_DEFAULT_DRIVER
+from pgadmin.utils.driver import get_driver
+
+
+class SchemaDiffModule(PgAdminModule):
+ """
+ class SchemaDiffModule(PgAdminModule)
+
+ A module class for Schema Diff derived from PgAdminModule.
+ """
+
+ LABEL = "Schema Diff"
+
+ def get_own_menuitems(self):
+ return {}
+
+ def get_own_javascripts(self):
+ return [{
+ 'name': 'pgadmin.schema_diff',
+ 'path': url_for('schema_diff.index') + "schema_diff",
+ 'when': None
+ }]
+
+ def get_panels(self):
+ return []
+
+ def get_exposed_url_endpoints(self):
+ """
+ Returns:
+ list: URL endpoints for Schema Diff module
+ """
+ return [
+ 'schema_diff.initialize',
+ 'schema_diff.panel',
+ 'schema_diff.servers',
+ 'schema_diff.databases',
+ 'schema_diff.schemas',
+ 'schema_diff.compare',
+ 'schema_diff.poll',
+ 'schema_diff.ddl_compare',
+ 'schema_diff.connect_server',
+ 'schema_diff.connect_database',
+ 'schema_diff.get_server',
+ 'schema_diff.generate_script'
+ ]
+
+ def register_preferences(self):
+ self.preference.register(
+ 'display', 'schema_diff_new_browser_tab',
+ gettext("Open in new browser tab"), 'boolean', False,
+ category_label=gettext('Display'),
+ help_str=gettext('If set to True, the Schema Diff '
+ 'will be opened in a new browser tab.')
+ )
+
+
+blueprint = SchemaDiffModule(MODULE_NAME, __name__, static_url_path='/static')
+
+
[email protected]("/")
+@login_required
+def index():
+ return bad_request(
+ errormsg=gettext('This URL cannot be requested directly.')
+ )
+
+
[email protected](
+ '/panel/<int:trans_id>/<path:editor_title>',
+ methods=["GET"],
+ endpoint='panel'
+)
+def panel(trans_id, editor_title):
+ """
+ This method calls index.html to render the schema diff.
+
+ Args:
+ editor_title: Title of the editor
+ """
+ # If title has slash(es) in it then replace it
+ if request.args and request.args['fslashes'] != '':
+ try:
+ fslashesList = request.args['fslashes'].split(',')
+ for idx in fslashesList:
+ idx = int(idx)
+ editor_title = editor_title[:idx] + '/' + editor_title[idx:]
+ except IndexError as e:
+ app.logger.exception(e)
+
+ return render_template(
+ "schema_diff/index.html",
+ _=gettext,
+ trans_id=trans_id,
+ editor_title=editor_title
+ )
+
+
[email protected]("/schema_diff.js")
+@login_required
+def script():
+ """render the required javascript"""
+ return Response(
+ response=render_template("schema_diff/js/schema_diff.js", _=gettext),
+ status=200,
+ mimetype="application/javascript"
+ )
+
+
+def check_transaction_status(trans_id):
+ """
+ This function is used to check the transaction id
+ is available in the session object.
+
+ Args:
+ trans_id:
+ """
+
+ if 'schemaDiff' not in session:
+ return False, gettext(
+ 'Transaction ID not found in the session.'
+ ), None, None
+
+ schema_diff_data = session['schemaDiff']
+
+ # Return from the function if transaction id not found
+ if str(trans_id) not in schema_diff_data:
+ return False, gettext(
+ 'Transaction ID not found in the session.'
+ ), None, None
+
+ # Fetch the object for the specified transaction id.
+ # Use pickle.loads function to get the model object
+ session_obj = schema_diff_data[str(trans_id)]
+ diff_model_obj = pickle.loads(session_obj['diff_model_obj'])
+
+ return True, None, diff_model_obj, session_obj
+
+
+def update_session_diff_transaction(trans_id, session_obj, diff_model_obj):
+ """
+ This function is used to update the diff model into the session.
+ :param trans_id:
+ :param session_obj:
+ :param diff_model_obj:
+ :return:
+ """
+ session_obj['diff_model_obj'] = pickle.dumps(diff_model_obj, -1)
+
+ if 'schemaDiff' in session:
+ schema_diff_data = session['schemaDiff']
+ schema_diff_data[str(trans_id)] = session_obj
+ session['schemaDiff'] = schema_diff_data
+
+
[email protected](
+ '/initialize',
+ methods=["GET"],
+ endpoint="initialize"
+)
+@login_required
+def initialize():
+ """
+ This function will initialize the schema diff and return the list
+ of all the server's.
+ """
+ trans_id = None
+ try:
+ # Create a unique id for the transaction
+ trans_id = str(random.randint(1, 9999999))
+
+ if 'schemaDiff' not in session:
+ schema_diff_data = dict()
+ else:
+ schema_diff_data = session['schemaDiff']
+
+ # Use pickle to store the Schema Diff Model which will be used
+ # later by the diff module.
+ schema_diff_data[trans_id] = {
+ 'diff_model_obj': pickle.dumps(SchemaDiffModel(), -1)
+ }
+
+ # Store the schema diff dictionary into the session variable
+ session['schemaDiff'] = schema_diff_data
+
+ except Exception as e:
+ app.logger.exception(e)
+
+ return make_json_response(
+ data={'schemaDiffTransId': trans_id})
+
+
[email protected](
+ '/servers',
+ methods=["GET"],
+ endpoint="servers"
+)
+@login_required
+def servers():
+ """
+ This function will return the list of servers for the specified
+ server id.
+ """
+ res = []
+ try:
+ """Return a JSON document listing the server groups for the user"""
+ driver = get_driver(PG_DEFAULT_DRIVER)
+
+ from pgadmin.browser.server_groups.servers import\
+ server_icon_and_background
+
+ for server in Server.query.filter_by(user_id=current_user.id):
+ manager = driver.connection_manager(server.id)
+ conn = manager.connection()
+ connected = conn.connected()
+
+ res.append({
+ "value": server.id,
+ "label": server.name,
+ "image": server_icon_and_background(connected, manager,
+ server),
+ "_id": server.id,
+ "connected": connected,
+ })
+
+ except Exception as e:
+ app.logger.exception(e)
+
+ return make_json_response(data=res)
+
+
[email protected](
+ '/get_server/<int:sid>/<int:did>',
+ methods=["GET"],
+ endpoint="get_server"
+)
+@login_required
+def get_server(sid, did):
+ """
+ This function will return the server details for the specified
+ server id.
+ """
+ try:
+ """Return a JSON document listing the server groups for the user"""
+ driver = get_driver(PG_DEFAULT_DRIVER)
+
+ server = Server.query.filter_by(id=sid).first()
+ manager = driver.connection_manager(sid)
+ conn = manager.connection(did=did)
+ connected = conn.connected()
+
+ res = {
+ "sid": sid,
+ "name": server.name,
+ "user": server.username,
+ "gid": server.servergroup_id,
+ "type": manager.server_type,
+ "connected": connected,
+ "database": conn.db
+ }
+
+ except Exception as e:
+ app.logger.exception(e)
+
+ return make_json_response(data=res)
+
+
[email protected](
+ '/server/connect/<int:sid>',
+ methods=["POST"],
+ endpoint="connect_server"
+)
+@login_required
+def connect_server(sid):
+ server = Server.query.filter_by(id=sid).first()
+ view = SchemaDiffRegistry.get_node_view('server')
+ return view.connect(server.servergroup_id, sid)
+
+
[email protected](
+ '/database/connect/<int:sid>/<int:did>',
+ methods=["POST"],
+ endpoint="connect_database"
+)
+@login_required
+def connect_database(sid, did):
+ server = Server.query.filter_by(id=sid).first()
+ view = SchemaDiffRegistry.get_node_view('database')
+ return view.connect(server.servergroup_id, sid, did)
+
+
[email protected](
+ '/databases/<int:sid>',
+ methods=["GET"],
+ endpoint="databases"
+)
+@login_required
+def databases(sid):
+ """
+ This function will return the list of databases for the specified
+ server id.
+ """
+ res = []
+ try:
+ view = SchemaDiffRegistry.get_node_view('database')
+
+ server = Server.query.filter_by(id=sid).first()
+ response = view.nodes(gid=server.servergroup_id, sid=sid)
+ databases = json.loads(response.data)['data']
+ for db in databases:
+ res.append({
+ "value": db['_id'],
+ "label": db['label'],
+ "_id": db['_id'],
+ "connected": db['connected'],
+ "allowConn": db['allowConn'],
+ "image": db['icon'],
+ "canDisconn": db['canDisconn']
+ })
+
+ except Exception as e:
+ app.logger.exception(e)
+
+ return make_json_response(data=res)
+
+
[email protected](
+ '/schemas/<int:sid>/<int:did>',
+ methods=["GET"],
+ endpoint="schemas"
+)
+@login_required
+def schemas(sid, did):
+ """
+ This function will return the list of schemas for the specified
+ server id and database id.
+ """
+ res = []
+ try:
+ view = SchemaDiffRegistry.get_node_view('schema')
+ server = Server.query.filter_by(id=sid).first()
+ response = view.nodes(gid=server.servergroup_id, sid=sid, did=did)
+ schemas = json.loads(response.data)['data']
+ for sch in schemas:
+ res.append({
+ "value": sch['_id'],
+ "label": sch['label'],
+ "_id": sch['_id'],
+ "image": sch['icon'],
+ })
+ except Exception as e:
+ app.logger.exception(e)
+
+ return make_json_response(data=res)
+
+
[email protected](
+ '/compare/<int:trans_id>/<int:source_sid>/<int:source_did>/'
+ '<int:source_scid>/<int:target_sid>/<int:target_did>/<int:target_scid>',
+ methods=["GET"],
+ endpoint="compare"
+)
+@login_required
+def compare(trans_id, source_sid, source_did, source_scid,
+ target_sid, target_did, target_scid):
+ """
+ This function will compare the two schemas.
+ """
+ # Check the transaction and connection status
+ status, error_msg, diff_model_obj, session_obj = \
+ check_transaction_status(trans_id)
+
+ if error_msg == gettext('Transaction ID not found in the session.'):
+ return make_json_response(success=0, errormsg=error_msg, status=404)
+
+ if not check_version_compatibility(source_sid, target_sid):
+ return not_implemented(errormsg=gettext("Version mismatch."))
+
+ comparison_result = []
+
+ diff_model_obj.set_comparison_info("Comparing objects...", 0)
+ update_session_diff_transaction(trans_id, session_obj,
+ diff_model_obj)
+
+ try:
+ all_registered_nodes = SchemaDiffRegistry.get_registered_nodes()
+ node_percent = round(100 / len(all_registered_nodes))
+ total_percent = 0
+
+ for node_name, node_view in all_registered_nodes.items():
+ view = SchemaDiffRegistry.get_node_view(node_name)
+ if hasattr(view, 'compare'):
+ msg = "Comparing " + view.blueprint.COLLECTION_LABEL + " ..."
+ diff_model_obj.set_comparison_info(msg, total_percent)
+ # Update the message and total percentage in session object
+ update_session_diff_transaction(trans_id, session_obj,
+ diff_model_obj)
+
+ res = view.compare(source_sid=source_sid,
+ source_did=source_did,
+ source_scid=source_scid,
+ target_sid=target_sid,
+ target_did=target_did,
+ target_scid=target_scid)
+
+ if res is not None:
+ comparison_result = comparison_result + res
+ total_percent = total_percent + node_percent
+
+ msg = "Successfully compare the specified schemas."
+ total_percent = 100
+ diff_model_obj.set_comparison_info(msg, total_percent)
+ # Update the message and total percentage done in session object
+ update_session_diff_transaction(trans_id, session_obj, diff_model_obj)
+
+ except Exception as e:
+ app.logger.exception(e)
+
+ return make_json_response(data=comparison_result)
+
+
[email protected](
+ '/poll/<int:trans_id>', methods=["GET"], endpoint="poll"
+)
+@login_required
+def poll(trans_id):
+ """
+ This function is used to check the schema comparison is completed or not.
+ :param trans_id:
+ :return:
+ """
+
+ # Check the transaction and connection status
+ status, error_msg, diff_model_obj, session_obj = \
+ check_transaction_status(trans_id)
+
+ if error_msg == gettext('Transaction ID not found in the session.'):
+ return make_json_response(success=0, errormsg=error_msg, status=404)
+
+ msg, diff_percentage = diff_model_obj.get_comparison_info()
+
+ if diff_percentage == 100:
+ diff_model_obj.set_comparison_info("Comparing objects...", 0)
+ update_session_diff_transaction(trans_id, session_obj,
+ diff_model_obj)
+
+ return make_json_response(data={'compare_msg': msg,
+ 'diff_percentage': diff_percentage})
+
+
[email protected](
+ '/generate_script/<int:trans_id>/',
+ methods=["POST"],
+ endpoint="generate_script"
+)
+def generate_script(trans_id):
+ """This function will generate the scripts for the selected objects."""
+ data = request.form if request.form else json.loads(
+ request.data, encoding='utf-8'
+ )
+
+ status, error_msg, diff_model_obj, session_obj = \
+ check_transaction_status(trans_id)
+
+ if error_msg == gettext('Transaction ID not found in the session.'):
+ return make_json_response(success=0, errormsg=error_msg, status=404)
+
+ source_sid = int(data['source_sid'])
+ source_did = int(data['source_did'])
+ source_scid = int(data['source_scid'])
+ target_sid = int(data['target_sid'])
+ target_did = int(data['target_did'])
+ target_scid = int(data['target_scid'])
+ diff_ddl = ''
+
+ for d in data['sel_rows']:
+ node_type = d['node_type']
+ source_oid = int(d['source_oid'])
+ target_oid = int(d['target_oid'])
+ comp_status = d['comp_status']
+
+ view = SchemaDiffRegistry.get_node_view(node_type)
+ if view and hasattr(view, 'ddl_compare') and \
+ comp_status != SchemaDiffModel.COMPARISON_STATUS['identical']:
+ sql = view.ddl_compare(source_sid=source_sid,
+ source_did=source_did,
+ source_scid=source_scid,
+ target_sid=target_sid,
+ target_did=target_did,
+ target_scid=target_scid,
+ source_oid=source_oid,
+ target_oid=target_oid,
+ comp_status=comp_status,
+ generate_script=True)
+
+ diff_ddl += sql['diff_ddl']
+
+ return ajax_response(
+ status=200,
+ response={'diff_ddl': diff_ddl}
+ )
+
+
[email protected](
+ '/ddl_compare/<int:trans_id>/<int:source_sid>/<int:source_did>/'
+ '<int:source_scid>/<int:target_sid>/<int:target_did>/<int:target_scid>/'
+ '<int:source_oid>/<int:target_oid>/<node_type>/<comp_status>/',
+ methods=["GET"],
+ endpoint="ddl_compare"
+)
+@login_required
+def ddl_compare(trans_id, source_sid, source_did, source_scid,
+ target_sid, target_did, target_scid, source_oid,
+ target_oid, node_type, comp_status):
+ """
+ This function is used to compare the specified object and return the
+ DDL comparison.
+ """
+ # Check the transaction and connection status
+ status, error_msg, diff_model_obj, session_obj = \
+ check_transaction_status(trans_id)
+
+ if error_msg == gettext('Transaction ID not found in the session.'):
+ return make_json_response(success=0, errormsg=error_msg, status=404)
+
+ source_ddl = ''
+ target_ddl = ''
+ diff_ddl = ''
+
+ view = SchemaDiffRegistry.get_node_view(node_type)
+ if view and hasattr(view, 'ddl_compare'):
+ sql = view.ddl_compare(source_sid=source_sid, source_did=source_did,
+ source_scid=source_scid, target_sid=target_sid,
+ target_did=target_did, target_scid=target_scid,
+ source_oid=source_oid, target_oid=target_oid,
+ comp_status=comp_status)
+ return ajax_response(
+ status=200,
+ response={'source_ddl': sql['source_ddl'],
+ 'target_ddl': sql['target_ddl'],
+ 'diff_ddl': sql['diff_ddl']}
+ )
+
+ msg = gettext('Selected object is not supported for DDL comparison.')
+
+ return ajax_response(
+ status=200,
+ response={'source_ddl': msg,
+ 'target_ddl': msg,
+ 'diff_ddl': msg
+ }
+ )
+
+
+def check_version_compatibility(sid, tid):
+ """Check the version compatibility of source and target servers."""
+
+ driver = get_driver(PG_DEFAULT_DRIVER)
+ src_server = Server.query.filter_by(id=sid).first()
+ src_manager = driver.connection_manager(src_server.id)
+
+ tar_server = Server.query.filter_by(id=tid).first()
+ tar_manager = driver.connection_manager(tar_server.id)
+
+ def get_round_val(x):
+ if x < 10000:
+ return x if x % 100 == 0 else x + 100 - x % 100
+ else:
+ return x if x % 10000 == 0 else x + 10000 - x % 10000
+
+ if get_round_val(src_manager.version) == \
+ get_round_val(tar_manager.version):
+ return True
+
+ return False
diff --git a/web/pgadmin/tools/schema_diff/compare.py b/web/pgadmin/tools/schema_diff/compare.py
new file mode 100644
index 000000000..3bc38a134
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/compare.py
@@ -0,0 +1,212 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+"""Schema diff object comparison."""
+
+import copy
+
+from flask import render_template
+from pgadmin.utils.compile_template_name import compile_template_path
+from pgadmin.utils.driver import get_driver
+from config import PG_DEFAULT_DRIVER
+from pgadmin.tools.schema_diff.directory_compare import compare_dictionaries,\
+ directory_diff
+from pgadmin.tools.schema_diff.model import SchemaDiffModel
+from abc import abstractmethod
+
+
+class SchemaDiffObjectCompare():
+
+ keys_to_ignore = ['oid', 'schema']
+
+ @staticmethod
+ def get_schema(sid, did, scid):
+ """
+ This function will return the schema name.
+ """
+
+ driver = get_driver(PG_DEFAULT_DRIVER)
+ manager = driver.connection_manager(sid)
+ conn = manager.connection(did=did)
+
+ ver = manager.version
+ server_type = manager.server_type
+
+ # Fetch schema name
+ status, schema_name = conn.execute_scalar(
+ render_template(
+ "/".join(['schemas',
+ '{0}/#{1}#'.format(server_type, ver),
+ 'sql/get_name.sql']),
+ conn=conn, scid=scid
+ )
+ )
+
+ return status, schema_name
+
+ def compare(self, **kwargs):
+ """
+ This function is used to compare all the objects
+ from two different schemas.
+
+ :param kwargs:
+ :return:
+ """
+
+ source_params = {'sid': kwargs.get('source_sid'),
+ 'did': kwargs.get('source_did'),
+ 'scid': kwargs.get('source_scid')
+ }
+
+ target_params = {'sid': kwargs.get('target_sid'),
+ 'did': kwargs.get('target_did'),
+ 'scid': kwargs.get('target_scid')
+ }
+
+ if 'source_tid' in kwargs:
+ source_params['tid'] = kwargs['source_tid']
+ if 'target_tid' in kwargs:
+ target_params['tid'] = kwargs['target_tid']
+
+ source = self.fetch_objects_to_compare(**source_params)
+
+ target = self.fetch_objects_to_compare(**target_params)
+
+ # If both the dict have no items then return None.
+ if not (source or target) or (
+ len(source) <= 0 and len(target) <= 0):
+ return None
+
+ return compare_dictionaries(source, target,
+ self.node_type,
+ self.blueprint.COLLECTION_LABEL,
+ self.keys_to_ignore)
+
+ def ddl_compare(self, **kwargs):
+ """
+ This function will compare object properties and
+ return the difference of SQL
+ """
+
+ source = ''
+ target = ''
+ diff = ''
+ comp_status = kwargs.get('comp_status')
+ only_diff = False
+ generate_script = False
+
+ source_params = {'gid': 1,
+ 'sid': kwargs.get('source_sid'),
+ 'did': kwargs.get('source_did'),
+ 'scid': kwargs.get('source_scid'),
+ 'oid': kwargs.get('source_oid')
+ }
+
+ target_params = {'gid': 1,
+ 'sid': kwargs.get('target_sid'),
+ 'did': kwargs.get('target_did'),
+ 'scid': kwargs.get('target_scid'),
+ 'oid': kwargs.get('target_oid')
+ }
+
+ if 'source_tid' in kwargs:
+ source_params['tid'] = kwargs['source_tid']
+ only_diff = True
+ if 'target_tid' in kwargs:
+ target_params['tid'] = kwargs['target_tid']
+ only_diff = True
+
+ if 'generate_script' in kwargs and kwargs['generate_script']:
+ generate_script = True
+
+ source_params_adv = copy.deepcopy(source_params)
+ target_params_adv = copy.deepcopy(target_params)
+
+ del source_params_adv['gid']
+ del target_params_adv['gid']
+
+ status, target_schema = self.get_schema(kwargs.get('target_sid'),
+ kwargs.get('target_did'),
+ kwargs.get('target_scid')
+ )
+ if not status:
+ return internal_server_error(errormsg=target_schema)
+
+ if comp_status == SchemaDiffModel.COMPARISON_STATUS['source_only']:
+ if not generate_script:
+ source = self.get_sql_from_diff(**source_params)
+ source_params.update({
+ 'diff_schema': target_schema
+ })
+ diff = self.get_sql_from_diff(**source_params)
+
+ elif comp_status == SchemaDiffModel.COMPARISON_STATUS['target_only']:
+ if not generate_script:
+ target = self.get_sql_from_diff(**target_params)
+ target_params.update(
+ {'drop_sql': True})
+ diff = self.get_sql_from_diff(**target_params)
+
+ elif comp_status == SchemaDiffModel.COMPARISON_STATUS['different']:
+ source = self.fetch_objects_to_compare(**source_params_adv)
+ target = self.fetch_objects_to_compare(**target_params_adv)
+
+ if not (source or target):
+ return None
+
+ diff_dict = directory_diff(source,
+ target,
+ ignore_keys=self.keys_to_ignore,
+ difference={}
+ )
+
+ diff_dict.update(self.parce_acl(source, target))
+
+ if not generate_script:
+ source = self.get_sql_from_diff(**source_params)
+ target = self.get_sql_from_diff(**target_params)
+
+ target_params.update(
+ {'data': diff_dict})
+ diff = self.get_sql_from_diff(**target_params)
+ else:
+ source = self.get_sql_from_diff(**source_params)
+ target = self.get_sql_from_diff(**target_params)
+
+ if only_diff:
+ return diff
+
+ return {'source_ddl': source,
+ 'target_ddl': target,
+ 'diff_ddl': diff
+ }
+
+ @staticmethod
+ def parce_acl(source, target):
+ key = 'acl'
+
+ if 'datacl' in source:
+ key = 'datacl'
+ elif 'relacl' in source:
+ key = 'relacl'
+
+ tmp_source = source[key] if\
+ key in source and source[key] is not None else []
+ tmp_target = copy.deepcopy(target[key]) if\
+ key in target and target[key] is not None else []
+
+ diff = {'added': [], 'deleted': []}
+ for acl in tmp_source:
+ if acl in tmp_target:
+ tmp_target.remove(acl)
+ elif acl not in tmp_target:
+ diff['added'].append(acl)
+ diff['deleted'] = tmp_target
+
+ return {key: diff}
diff --git a/web/pgadmin/tools/schema_diff/directory_compare.py b/web/pgadmin/tools/schema_diff/directory_compare.py
new file mode 100644
index 000000000..eeb495d36
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/directory_compare.py
@@ -0,0 +1,279 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+"""Directory comparison"""
+
+import copy
+from pgadmin.tools.schema_diff.model import SchemaDiffModel
+
+count = 1
+
+
+def compare_dictionaries(source_dict, target_dict, node, node_label,
+ ignore_keys=None):
+ """
+ This function will compare the two dictionaries.
+
+ :param source_dict: First Dictionary
+ :param target_dict: Second Dictionary
+ :param node: node type
+ :param ignore_keys: List of keys that will be ignored while comparing
+ :return:
+ """
+
+ dict1 = copy.deepcopy(source_dict)
+ dict2 = copy.deepcopy(target_dict)
+
+ # Find the duplicate keys in both the dictionaries
+ dict1_keys = set(dict1.keys())
+ dict2_keys = set(dict2.keys())
+ intersect_keys = dict1_keys.intersection(dict2_keys)
+
+ # Keys that are available in source and missing in target.
+ source_only = []
+ added = dict1_keys - dict2_keys
+ global count
+ for item in added:
+ source_only.append({
+ 'id': count,
+ 'type': node,
+ 'label': node_label,
+ 'title': item,
+ 'oid': source_dict[item]['oid'],
+ 'status': SchemaDiffModel.COMPARISON_STATUS['source_only']
+ })
+ count += 1
+
+ target_only = []
+ # Keys that are available in target and missing in source.
+ removed = dict2_keys - dict1_keys
+ for item in removed:
+ target_only.append({
+ 'id': count,
+ 'type': node,
+ 'label': node_label,
+ 'title': item,
+ 'oid': target_dict[item]['oid'],
+ 'status': SchemaDiffModel.COMPARISON_STATUS['target_only']
+ })
+ count += 1
+
+ # Compare the values of duplicates keys.
+ identical = []
+ different = []
+ for key in intersect_keys:
+ # ignore the keys if available.
+ for ig_key in ignore_keys:
+ if ig_key in dict1[key]:
+ dict1[key].pop(ig_key)
+ if ig_key in dict2[key]:
+ dict2[key].pop(ig_key)
+
+ # Recursively Compare the two dictionary
+ if are_dictionaries_identical(dict1[key], dict2[key], ignore_keys):
+ identical.append({
+ 'id': count,
+ 'type': node,
+ 'label': node_label,
+ 'title': key,
+ 'oid': source_dict[key]['oid'],
+ 'source_oid': source_dict[key]['oid'],
+ 'target_oid': target_dict[key]['oid'],
+ 'status': SchemaDiffModel.COMPARISON_STATUS['identical']
+ })
+ else:
+ different.append({
+ 'id': count,
+ 'type': node,
+ 'label': node_label,
+ 'title': key,
+ 'oid': source_dict[key]['oid'],
+ 'source_oid': source_dict[key]['oid'],
+ 'target_oid': target_dict[key]['oid'],
+ 'status': SchemaDiffModel.COMPARISON_STATUS['different']
+ })
+ count += 1
+
+ return source_only + target_only + different + identical
+
+
+def are_lists_identical(source_list, target_list, ignore_keys):
+ """
+ This function is used to compare two list.
+ :param source_list:
+ :param target_list:
+ :return:
+ """
+ if source_list is None or target_list is None or \
+ len(source_list) != len(target_list):
+ return False
+ else:
+ for index in range(len(source_list)):
+ # Check the type of the value if it is an dictionary then
+ # call are_dictionaries_identical() function.
+ if type(source_list[index]) is dict:
+ if not are_dictionaries_identical(source_list[index],
+ target_list[index],
+ ignore_keys):
+ return False
+ else:
+ if source_list[index] != target_list[index]:
+ return False
+ return True
+
+
+def are_dictionaries_identical(source_dict, target_dict, ignore_keys):
+ """
+ This function is used to recursively compare two dictionaries with
+ same keys.
+ :param source_dict:
+ :param target_dict:
+ :return:
+ """
+
+ src_keys = set(source_dict.keys())
+ tar_keys = set(target_dict.keys())
+
+ # ignore the keys if available.
+ for ig_key in ignore_keys:
+ if ig_key in src_keys:
+ source_dict.pop(ig_key)
+ if ig_key in target_dict:
+ target_dict.pop(ig_key)
+
+ # Keys that are available in source and missing in target.
+ src_only = src_keys - tar_keys
+ # Keys that are available in target and missing in source.
+ tar_only = tar_keys - src_keys
+
+ # If number of keys are different in source and target then
+ # return False
+ if len(src_only) != len(tar_only):
+ return False
+ else:
+ # If number of keys are same but key is not present in target then
+ # return False
+ for key in src_only:
+ if key not in tar_only:
+ return False
+
+ for key in source_dict.keys():
+ if type(source_dict[key]) is dict:
+ if not are_dictionaries_identical(source_dict[key],
+ target_dict[key], ignore_keys):
+ return False
+ elif type(source_dict[key]) is list:
+ if not are_lists_identical(source_dict[key], target_dict[key],
+ ignore_keys):
+ return False
+ else:
+ if source_dict[key] != target_dict[key]:
+ return False
+
+ return True
+
+
+def directory_diff(source_dict, target_dict, ignore_keys=[], difference={}):
+ """
+ This function is used to recursively compare two dictionaries and
+ return the difference.
+ The difference is from source to target
+ :param source_dict: source dict
+ :param target_dict: target dict
+ :param ignore_keys: ignore keys to compare
+ """
+
+ src_keys = set(source_dict.keys())
+ tar_keys = set(target_dict.keys())
+
+ # Keys that are available in source and missing in target.
+ src_only = src_keys - tar_keys
+ # Keys that are available in target and missing in source.
+ tar_only = tar_keys - src_keys
+
+ for key in source_dict.keys():
+ added = []
+ deleted = []
+ updated = []
+ source = None
+
+ # ignore the keys if available.
+ if key in ignore_keys:
+ pass
+ elif key in tar_only:
+ target_only[key] = target_dict[key]
+ # Target only values in deleted list
+ difference[key]['deleted'] = target_dict[key]
+ elif key in src_only:
+ # Source only values in the newly added list
+ if type(source_dict[key]) is list:
+ difference[key] = {}
+ difference[key]['added'] = source_dict[key]
+ elif type(source_dict[key]) is dict:
+ directory_diff(source_dict[key], target_dict[key],
+ ignore_keys, difference)
+ elif type(source_dict[key]) is list:
+ tmp_target = None
+ for index in range(len(source_dict[key])):
+ source = copy.deepcopy(source_dict[key][index])
+ if type(source) is list:
+ # TODO
+ pass
+ elif type(source) is dict:
+ if 'name' in source or 'colname' in source:
+ if type(target_dict[key]) is list and len(
+ target_dict[key]) > 0:
+ tmp = None
+ tmp_target = copy.deepcopy(target_dict[key])
+ for item in tmp_target:
+ if (
+ 'name' in item and
+ item['name'] == source['name']
+ ) or (
+ 'colname' in item and
+ item['colname'] == source['colname']
+ ):
+ tmp = copy.deepcopy(item)
+ if tmp and source != tmp:
+ updated.append(copy.deepcopy(source))
+ tmp_target.remove(tmp)
+ elif tmp and source == tmp:
+ tmp_target.remove(tmp)
+ elif tmp is None:
+ added.append(source)
+ else:
+ added.append(source)
+ difference[key] = {}
+ difference[key]['added'] = added
+ difference[key]['changed'] = updated
+ elif target_dict[key] is None or \
+ (type(target_dict[key]) is list and
+ len(target_dict[key]) < index and
+ source != target_dict[key][index]):
+ difference[key] = source
+ elif type(target_dict[key]) is list and\
+ len(target_dict[key]) > index:
+ difference[key] = source
+
+ if type(source) is dict and tmp_target and key in tmp_target and \
+ tmp_target[key] and len(tmp_target[key]) > 0:
+ if type(tmp_target[key]) is list and \
+ type(tmp_target[key][0]) is dict:
+ deleted = deleted + tmp_target[key]
+ else:
+ deleted.append({key: tmp_target[key]})
+ difference[key]['deleted'] = deleted
+ elif tmp_target and type(tmp_target) is list:
+ difference[key]['deleted'] = tmp_target
+
+ else:
+ if source_dict[key] != target_dict[key]:
+ difference[key] = source_dict[key]
+
+ return difference
diff --git a/web/pgadmin/tools/schema_diff/model.py b/web/pgadmin/tools/schema_diff/model.py
new file mode 100644
index 000000000..4fac21007
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/model.py
@@ -0,0 +1,76 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+
+class SchemaDiffModel(object):
+ """
+ SchemaDiffModel
+ """
+
+ COMPARISON_STATUS = {
+ 'source_only': 'Source Only',
+ 'target_only': 'Target Only',
+ 'different': 'Different',
+ 'identical': 'Identical'
+ }
+
+ def __init__(self, **kwargs):
+ """
+ This method is used to initialize the class and
+ create a proper object name which will be used
+ to fetch the data using namespace name and object name.
+
+ Args:
+ **kwargs : N number of parameters
+ """
+ self._comparison_result = dict()
+ self._comparison_msg = 'Comparision started...'
+ self._comparison_percentage = 0
+
+ def clear_data(self):
+ """
+ This function clear the model data.
+ """
+ self._comparison_result.clear()
+
+ def set_result(self, node_name, compare_result):
+ """
+ This method set the result of the comparision based on nodes.
+ """
+ self._comparison_result[node_name] = compare_result
+
+ def get_result(self, node_name=None):
+ """
+ This function will return the result for the node if specified
+ else return the complete result.
+ :param node_name: Name of the node ex: Database, Schema, etc..
+ :return:
+ """
+
+ if node_name is not None:
+ return self._comparison_result[node_name]
+
+ return self._comparison_result
+
+ def get_comparison_info(self):
+ """
+ This function is used to get the comparison information.
+ :return:
+ """
+ return self._comparison_msg, self._comparison_percentage
+
+ def set_comparison_info(self, msg, percentage):
+ """
+ This function is used to set the comparison information.
+ :param msg:
+ :param percentage:
+ :return:
+ """
+ self._comparison_msg = msg
+ self._comparison_percentage = percentage
diff --git a/web/pgadmin/tools/schema_diff/node_registry.py b/web/pgadmin/tools/schema_diff/node_registry.py
new file mode 100644
index 000000000..9e7e25533
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/node_registry.py
@@ -0,0 +1,61 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+
+class SchemaDiffRegistry(object):
+ """
+ SchemaDiffRegistry
+
+ It is more of a registry for different type of nodes for schema diff.
+ """
+ _registered_nodes = dict()
+
+ def __init__(self, node_name, node_view, parent_node='schema'):
+ if node_name not in SchemaDiffRegistry._registered_nodes:
+ SchemaDiffRegistry._registered_nodes[node_name] = {
+ 'view': node_view,
+ 'parent': parent_node
+ }
+
+ @classmethod
+ def get_registered_nodes(cls, node_name=None, parent_node='schema'):
+ """
+ This function will return the node's view object if node name
+ is specified or return the complete list of registered nodes.
+
+ :param node_name: Name of the node ex: Database, Schema, etc..
+ :return:
+ """
+ if node_name is not None:
+ if node_name in cls._registered_nodes:
+ return cls._registered_nodes[node_name]['view']
+ else:
+ return None
+
+ registered_nodes = {}
+ for key, value in cls._registered_nodes.items():
+ if value['parent'] == parent_node:
+ registered_nodes[key] = value['view']
+
+ return registered_nodes
+
+ @classmethod
+ def get_node_view(cls, node_name):
+ """
+ This function will return the view object for the "nodes"
+ command as per the specified node name.
+
+ :param node_name: Name of the node ex: Database, Schema, etc..
+ :return:
+ """
+ cmd = {"cmd": "nodes, compare, ddl_compare"}
+ module = SchemaDiffRegistry.get_registered_nodes(node_name)
+ if not module:
+ return None
+ return module(**cmd)
diff --git a/web/pgadmin/tools/schema_diff/static/css/schema_diff.css b/web/pgadmin/tools/schema_diff/static/css/schema_diff.css
new file mode 100644
index 000000000..93f7d32d3
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/css/schema_diff.css
@@ -0,0 +1,189 @@
+.icon-schema-diff {
+ display: inline-block;
+ align-content: center;
+ vertical-align: middle;
+ height: 18px;
+ width: 18px;
+ background-size: 20px !important;
+ background-repeat: no-repeat;
+ background-position-x: center;
+ background-position-y: center;
+ background-image: url('../img/compare.svg') !important;
+}
+
+.icon-schema-diff-white {
+ display: inline-block;
+ align-content: center;
+ vertical-align: middle;
+ height: 18px;
+ width: 18px;
+ background-size: 20px !important;
+ background-repeat: no-repeat;
+ background-position-x: center;
+ background-position-y: center;
+ background-image: url('../img/compare-white.svg') !important;
+}
+
+.icon-script {
+ display: inline-block;
+ align-content: center;
+ vertical-align: middle;
+ height: 18px;
+ width: 18px;
+ background-size: 20px !important;
+ background-repeat: no-repeat;
+ background-position-x: center;
+ background-position-y: center;
+ background-image: url('../img/script.svg') !important;
+}
+
+.really-hidden {
+ display: none !important;
+}
+
+#schema-diff-header {
+ margin-top: 2px;
+}
+
+#schema-diff-header .control-label {
+ width: 120px !important;
+ padding: 5px 5px !important;
+}
+
+.slick-header-column.ui-state-default {
+ height: 32px !important;
+}
+
+#schema-diff-grid .grid-header label {
+ display: inline-block;
+ font-weight: bold;
+ margin: auto auto auto 6px;
+}
+
+.grid-header .ui-icon {
+ margin: 4px 4px auto 6px;
+ background-color: transparent;
+ border-color: transparent;
+}
+
+.slick-row .cell-actions {
+ text-align: left;
+}
+
+/* Slick.Editors.Text, Slick.Editors.Date */
+#schema-diff-grid .slick-header > input.editor-text {
+ width: 100%;
+ height: 100%;
+ border: 0;
+ margin: 0;
+ background: transparent;
+ outline: 0;
+ padding: 0;
+}
+
+/* Slick.Editors.Checkbox */
+#schema-diff-grid .slick-header > input.editor-checkbox {
+ margin: 0;
+ height: 100%;
+ padding: 0;
+ border: 0;
+}
+
+.slick-row.selected .cell-selection {
+ background-color: transparent; /* show default selected row background */
+}
+
+#schema-diff-grid .slick-header .ui-state-default,
+#schema-diff-grid .slick-header .ui-widget-content.ui-state-default,
+#schema-diff-grid .slick-header .ui-widget-header .ui-state-default {
+ background: none;
+}
+
+#schema-diff-grid .slick-header .slick-header-column {
+ font-weight: bold;
+ display: block;
+}
+
+.slick-group-toggle.collapsed, .slick-group-toggle.expanded {
+ background: none !important;
+ width: 20px;
+}
+
+.slick-group-toggle.collapsed::before {
+ font-family: "FontAwesome";
+ content: "\f054";
+ font-size: 0.6rem;
+ border: none;
+}
+
+.slick-group-toggle.expanded::before {
+ font-family: "FontAwesome";
+ content: "\f078";
+ font-size: 0.6rem;
+ margin-left: 0rem;
+}
+
+.slick-group-toggle {
+ margin-right: 0px !important;
+ height: 11px !important;
+}
+
+#schema-diff-ddl-comp .badge .caret {
+ display: inline-block;
+ margin-left: 2px;
+ margin-right: 4px;
+ width: 0.7rem;
+}
+
+#schema-diff-ddl-comp .badge .caret::before {
+ font-family: "FontAwesome";
+ content: "\f078";
+ font-size: 0.7rem;
+ margin-left: 0rem;
+}
+
+#schema-diff-ddl-comp .badge {
+ font-size: inherit;
+ padding: 7px;
+}
+
+#schema-diff-ddl-comp .accordian-group {
+ padding: 0px;
+}
+
+#ddl_comp_fetching_data.pg-sp-container {
+ height: 100%;
+ bottom: 10px;
+
+ .pg-sp-content {
+ position: absolute;
+ width: 100%;
+ }
+}
+
+.ddl-copy {
+ z-index: 10;
+ position: absolute;
+ right: 1px;
+ top: 1px;
+}
+
+#schema-diff-grid .pg-panel-message {
+ font-size: 0.875rem;
+}
+
+
+#schema-diff-ddl-comp .sql_field_layout {
+ overflow: auto !important;
+ height: 100%;
+}
+
+#schema-diff-ddl-comp .source_ddl, #schema-diff-ddl-comp .target_ddl, #schema-diff-ddl-comp .diff_ddl {
+ height: 300px;
+ overflow: hidden;
+}
+
+.target-buttons {
+ flex-wrap: wrap;
+ max-width: 40% !important;
+}
diff --git a/web/pgadmin/tools/schema_diff/static/img/compare-white.svg b/web/pgadmin/tools/schema_diff/static/img/compare-white.svg
new file mode 100644
index 000000000..47b95be03
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/img/compare-white.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Слой_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 26 26" style="enable-background:new 0 0 26 26;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#FFFFFF;}
+</style>
+<path class="st0" d="M21.5,2h-9c-1.1,0-2,0.9-2,2v3h-6c-1.1,0-2,0.9-2,2v13c0,1.1,0.9,2,2,2h8c1.1,0,2-0.9,2-2v-3h7c1.1,0,2-0.9,2-2
+ V4C23.5,2.9,22.6,2,21.5,2z M12.5,14.8H8.9l1-1c0.1-0.1,0.1-0.2,0.1-0.3s0-0.2-0.1-0.3l-0.3-0.3c-0.1-0.1-0.2-0.1-0.3-0.1
+ c-0.1,0-0.2,0-0.3,0.1l-2.3,2.3c-0.1,0.1-0.1,0.2-0.1,0.3c0,0.1,0,0.2,0.1,0.3L9,18.1c0.1,0.1,0.2,0.1,0.3,0.1c0.1,0,0.2,0,0.3-0.1
+ l0.3-0.3c0.1-0.1,0.1-0.2,0.1-0.3c0-0.1,0-0.2-0.1-0.3l-1-1h3.6l0,5.8h-8V9h8L12.5,14.8z M21.5,9.8h-3.6l1-1
+ c0.1-0.1,0.1-0.2,0.1-0.3s0-0.2-0.1-0.3l-0.3-0.3c-0.1-0.1-0.2-0.1-0.3-0.1c-0.1,0-0.2,0-0.3,0.1l-2.3,2.3c-0.1,0.1-0.1,0.2-0.1,0.3
+ c0,0.1,0,0.2,0.1,0.3l2.3,2.3c0.1,0.1,0.2,0.1,0.3,0.1c0.1,0,0.2,0,0.3-0.1l0.3-0.3c0.1-0.1,0.1-0.2,0.1-0.3c0-0.1,0-0.2-0.1-0.3
+ l-1-1h3.6l0,5.8h-7V9c0-1.1-0.9-2-2-2V4h9L21.5,9.8z"/>
+</svg>
diff --git a/web/pgadmin/tools/schema_diff/static/img/compare.svg b/web/pgadmin/tools/schema_diff/static/img/compare.svg
new file mode 100644
index 000000000..1366f50a5
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/img/compare.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Слой_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 26 26" style="enable-background:new 0 0 26 26;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#222222;}
+</style>
+<path class="st0" d="M21.5,2h-9c-1.1,0-2,0.9-2,2v3h-6c-1.1,0-2,0.9-2,2v13c0,1.1,0.9,2,2,2h8c1.1,0,2-0.9,2-2v-3h7c1.1,0,2-0.9,2-2
+ V4C23.5,2.9,22.6,2,21.5,2z M12.5,14.8H8.9l1-1c0.1-0.1,0.1-0.2,0.1-0.3s0-0.2-0.1-0.3l-0.3-0.3c-0.1-0.1-0.2-0.1-0.3-0.1
+ c-0.1,0-0.2,0-0.3,0.1l-2.3,2.3c-0.1,0.1-0.1,0.2-0.1,0.3c0,0.1,0,0.2,0.1,0.3L9,18.1c0.1,0.1,0.2,0.1,0.3,0.1c0.1,0,0.2,0,0.3-0.1
+ l0.3-0.3c0.1-0.1,0.1-0.2,0.1-0.3c0-0.1,0-0.2-0.1-0.3l-1-1h3.6l0,5.8h-8V9h8L12.5,14.8z M21.5,9.8h-3.6l1-1
+ c0.1-0.1,0.1-0.2,0.1-0.3s0-0.2-0.1-0.3l-0.3-0.3c-0.1-0.1-0.2-0.1-0.3-0.1c-0.1,0-0.2,0-0.3,0.1l-2.3,2.3c-0.1,0.1-0.1,0.2-0.1,0.3
+ c0,0.1,0,0.2,0.1,0.3l2.3,2.3c0.1,0.1,0.2,0.1,0.3,0.1c0.1,0,0.2,0,0.3-0.1l0.3-0.3c0.1-0.1,0.1-0.2,0.1-0.3c0-0.1,0-0.2-0.1-0.3
+ l-1-1h3.6l0,5.8h-7V9c0-1.1-0.9-2-2-2V4h9L21.5,9.8z"/>
+</svg>
diff --git a/web/pgadmin/tools/schema_diff/static/img/script.svg b/web/pgadmin/tools/schema_diff/static/img/script.svg
new file mode 100644
index 000000000..488b911c7
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/img/script.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 50 50" style="enable-background:new 0 0 50 50;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#222222;}
+</style>
+<g>
+ <path class="st0" d="M40,35V11c0-3.9-3.1-7-7-7H7c-3.9,0-7,3.1-7,7c0,3.1,2.1,5.8,5,6.7V39c0,3.9,3.1,7,7,7h31c3.9,0,7-3.1,7-7v-4
+ H40z M43,42c-0.8,0-1.8-1.4-2.5-3h5C44.9,40.5,43.8,42,43,42z M7,8h19.6C26.2,8.9,26,9.9,26,11c0,1,0.2,2,0.7,3H7c-1.7,0-3-1.3-3-3
+ S5.3,8,7,8z M36.7,42H12c-1.7,0-3-1.3-3-3V18h25v-4h-1c-1.7,0-3-1.3-3-3s1.3-3,3-3s3,1.3,3,3v28C36,40,36.2,41,36.7,42z"/>
+ <rect x="13" y="21" class="st0" width="4" height="4"/>
+ <rect x="19" y="21" class="st0" width="13" height="4"/>
+ <rect x="13" y="28" class="st0" width="4" height="4"/>
+ <rect x="19" y="28" class="st0" width="13" height="4"/>
+ <rect x="13" y="35" class="st0" width="4" height="4"/>
+ <rect x="19" y="35" class="st0" width="13" height="4"/>
+</g>
+</svg>
diff --git a/web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js b/web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js
new file mode 100644
index 000000000..a67063e32
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js
@@ -0,0 +1,500 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+import $ from 'jquery';
+import Backbone from 'backbone';
+import Backform from 'pgadmin.backform';
+import gettext from 'sources/gettext';
+import clipboard from 'sources/selection/clipboard';
+
+var formatNode = function (opt) {
+ if (!opt.id) {
+ return opt.text;
+ }
+
+ var optimage = $(opt.element).data('image');
+
+ if (!optimage) {
+ return opt.text;
+ } else {
+ return $('<span></span>').append(
+ $('<span></span>', {
+ class: 'wcTabIcon ' + optimage,
+ })
+ ).append($('<span></span>').text(opt.text));
+ }
+};
+
+let SchemaDiffSqlControl =
+ Backform.SqlFieldControl.extend({
+ defaults: {
+ label: '',
+ extraClasses: [], // Add default control height
+ helpMessage: null,
+ maxlength: 4096,
+ rows: undefined,
+ copyRequired: false,
+ },
+
+ template: _.template([
+ '<% if (copyRequired) { %><button class="btn btn-secondary ddl-copy d-none">' + gettext('Copy') + '</button> <% } %>',
+ '<div class="pgadmin-controls pg-el-9 pg-el-12 sql_field_layout <%=extraClasses.join(\' \')%>">',
+ ' <textarea ',
+ ' class="<%=Backform.controlClassName%> " name="<%=name%>"',
+ ' maxlength="<%=maxlength%>" placeholder="<%-placeholder%>" <%=disabled ? "disabled" : ""%>',
+ ' rows=<%=rows%>',
+ ' <%=required ? "required" : ""%>><%-value%></textarea>',
+ ' <% if (helpMessage && helpMessage.length) { %>',
+ ' <span class="<%=Backform.helpMessageClassName%>"><%=helpMessage%></span>',
+ ' <% } %>',
+ '</div>',
+ ].join('\n')),
+ initialize: function() {
+ Backform.TextareaControl.prototype.initialize.apply(this, arguments);
+ this.sqlCtrl = null;
+
+ _.bindAll(this, 'onFocus', 'onBlur', 'refreshTextArea', 'copyData',);
+ },
+ render: function() {
+ let obj = Backform.SqlFieldControl.prototype.render.apply(this, arguments);
+ if(this.$el.find('.ddl-copy')) this.$el.find('.ddl-copy').on('click', this.copyData);
+ return obj;
+ },
+ copyData() {
+ event.stopPropagation();
+ clipboard.copyTextToClipboard(this.model.get('diff_ddl'));
+ return false;
+ },
+ onFocus: function() {
+ let $ctrl = this.$el.find('.pgadmin-controls').first(),
+ $copy = this.$el.find('.ddl-copy');
+ if (!$ctrl.hasClass('focused')) $ctrl.addClass('focused');
+ if ($copy.hasClass('d-none')) $copy.removeClass('d-none');
+
+ },
+ onBlur: function() {
+ let $copy = this.$el.find('.ddl-copy');
+ if (!$(event.relatedTarget).hasClass('ddl-copy')) {
+ if (!$copy.hasClass('d-none')) $copy.addClass('d-none');
+ this.$el.find('.pgadmin-controls').first().removeClass('focused');
+ }
+ },
+
+ });
+
+let SchemaDiffSelect2Control =
+ Backform.Select2Control.extend({
+ defaults: _.extend(Backform.Select2Control.prototype.defaults, {
+ url: undefined,
+ transform: undefined,
+ url_with_id: false,
+ select2: {
+ allowClear: true,
+ placeholder: gettext('Select an item...'),
+ width: 'style',
+ templateResult: formatNode,
+ templateSelection: formatNode,
+ },
+ controlsClassName: 'pgadmin-controls pg-el-sm-11 pg-el-12',
+ }),
+ className: function() {
+ return 'pgadmin-controls pg-el-sm-4';
+ },
+ events: {
+ 'focus select': 'clearInvalid',
+ 'keydown :input': 'processTab',
+ 'select2:select': 'onSelect',
+ 'select2:selecting': 'beforeSelect',
+ 'select2:clear': 'onChange',
+ },
+ template: _.template([
+ '<% if(label == false) {} else {%>',
+ ' <label class="<%=Backform.controlLabelClassName%>"><%=label%></label>',
+ '<% }%>',
+ '<div class="<%=controlsClassName%>">',
+ ' <select class="<%=Backform.controlClassName%> <%=extraClasses.join(\' \')%>"',
+ ' name="<%=name%>" value="<%-value%>" <%=disabled ? "disabled" : ""%>',
+ ' <%=required ? "required" : ""%><%= select2.multiple ? " multiple>" : ">" %>',
+ ' <%=select2.first_empty ? " <option></option>" : ""%>',
+ ' <% for (var i=0; i < options.length; i++) {%>',
+ ' <% var option = options[i]; %>',
+ ' <option ',
+ ' <% if (option.image) { %> data-image=<%=option.image%> <%}%>',
+ ' <% if (option.connected) { %> data-connected=connected <%}%>',
+ ' value=<%- formatter.fromRaw(option.value) %>',
+ ' <% if (option.selected) {%>selected="selected"<%} else {%>',
+ ' <% if (!select2.multiple && option.value === rawValue) {%>selected="selected"<%}%>',
+ ' <% if (select2.multiple && rawValue && rawValue.indexOf(option.value) != -1){%>selected="selected" data-index="rawValue.indexOf(option.value)"<%}%>',
+ ' <%}%>',
+ ' <%= disabled ? "disabled" : ""%>><%-option.label%></option>',
+ ' <%}%>',
+ ' </select>',
+ ' <% if (helpMessage && helpMessage.length) { %>',
+ ' <span class="<%=Backform.helpMessageClassName%>"><%=helpMessage%></span>',
+ ' <% } %>',
+ '</div>',
+ ].join('\n')),
+ beforeSelect: function() {
+ var selVal = arguments[0].params.args.data.id;
+
+ if(this.field.get('connect') && this.$el.find('option[value="'+selVal+'"]').attr('data-connected') !== 'connected') {
+ this.field.get('connect').apply(this, [selVal, this.changeIcon.bind(this)]);
+ } else {
+ $(this.$sel).trigger('change');
+ setTimeout(function(){ this.onChange.apply(this); }.bind(this), 200);
+ }
+ },
+ changeIcon: function(data) {
+ let span = this.$el.find('.select2-selection .select2-selection__rendered span.wcTabIcon'),
+ selSpan = this.$el.find('option:selected');
+
+ if (span.hasClass('icon-server-not-connected')) {
+ let icon = (data.icon) ? data.icon : 'icon-pg';
+ span.removeClass('icon-server-not-connected');
+ span.addClass(icon);
+ span.attr('data-connected', 'connected');
+
+ selSpan.data().image = icon;
+ selSpan.attr('data-connected', 'connected');
+
+ this.onChange.apply(this);
+ }
+ else if (span.hasClass('icon-database-not-connected')) {
+ let icon = (data.icon) ? data.icon : 'pg-icon-database';
+
+ span.removeClass('icon-database-not-connected');
+ span.addClass(icon);
+ span.attr('data-connected', 'connected');
+
+ selSpan.removeClass('icon-database-not-connected');
+ selSpan.data().image = icon;
+ selSpan.attr('data-connected', 'connected');
+
+ this.onChange.apply(this);
+ }
+ },
+ onChange: function() {
+ var model = this.model,
+ attrArr = this.field.get('name').split('.'),
+ name = attrArr.shift(),
+ path = attrArr.join('.'),
+ value = this.getValueFromDOM(),
+ changes = {},
+ that = this;
+
+ if (this.model.errorModel instanceof Backbone.Model) {
+ if (_.isEmpty(path)) {
+ this.model.errorModel.unset(name);
+ } else {
+ var nestedError = this.model.errorModel.get(name);
+ if (nestedError) {
+ this.keyPathSetter(nestedError, path, null);
+ this.model.errorModel.set(name, nestedError);
+ }
+ }
+ }
+
+ changes[name] = _.isEmpty(path) ? value : _.clone(model.get(name)) || {};
+
+ if (!_.isEmpty(path)) that.keyPathSetter(changes[name], path, value);
+ that.stopListening(that.model, 'change:' + name, that.render);
+ model.set(changes);
+ that.listenTo(that.model, 'change:' + name, that.render);
+
+ },
+ render: function() {
+ /*
+ * Initialization from the original control.
+ */
+ this.fetchData();
+ return Backform.Select2Control.prototype.render.apply(this, arguments);
+
+ },
+ fetchData: function() {
+ /*
+ * We're about to fetch the options required for this control.
+ */
+ var self = this,
+ url = self.field.get('url'),
+ m = self.model;
+
+ url = _.isFunction(url) ? url.apply(m) : url;
+
+ if (url && self.field.get('deps')) {
+ url = url.replace('sid', m.get(self.field.get('deps')[0]));
+ }
+
+ // Hmm - we found the url option.
+ // That means - we needs to fetch the options from that node.
+ if (url) {
+ var data;
+
+ m.trigger('pgadmin:view:fetching', m, self.field);
+ $.ajax({
+ async: false,
+ url: url,
+ })
+ .done(function(res) {
+ /*
+ * We will cache this data for short period of time for avoiding
+ * same calls.
+ */
+ data = res.data;
+ })
+ .fail(function() {
+ m.trigger('pgadmin:view:fetch:error', m, self.field);
+ });
+
+ m.trigger('pgadmin:view:fetched', m, self.field);
+ // To fetch only options from cache, we do not need time from 'at'
+ // attribute but only options.
+ //
+
+ /*
+ * Transform the data
+ */
+ var transform = this.field.get('transform') || self.defaults.transform;
+ if (transform && _.isFunction(transform)) {
+ // We will transform the data later, when rendering.
+ // It will allow us to generate different data based on the
+ // dependencies.
+ self.field.set('options', transform.bind(self, data));
+ } else {
+ self.field.set('options', data);
+ }
+ }
+ },
+ });
+
+
+let SchemaDiffHeaderView = Backform.Form.extend({
+ label: '',
+ className: function() {
+ return 'pg-el-sm-12 pg-el-md-12 pg-el-lg-12 pg-el-12';
+ },
+ tabPanelClassName: function() {
+ return Backform.tabClassName;
+ },
+ tabIndex: 0,
+ initialize: function(opts) {
+ this.label = opts.label;
+ Backform.Form.prototype.initialize.apply(this, arguments);
+ },
+ template: _.template(`
+ <div class="row pgadmin-control-group">
+ <div class="control-label">Select Source</div>
+ <div class="col-6 source row"></div>
+ </div>
+ <div class="row pgadmin-control-group">
+ <div class="control-label">Select Target</div>
+ <div class="col-6 target row"></div>
+ <div class="col-5 target-buttons">
+ <div class="action-btns d-flex">
+ <button class="btn btn-primary mr-auto"><i class="icon-schema-diff-white"></i> ` + gettext('Compare') + `</button>
+ <button id="generate-script" class="btn btn-secondary mr-1" disabled><i class="fa fa-file-code-o sql-icon-lg"></i> ` + gettext('Generate Script') + `</button>
+ <div class="btn-group mr-1" role="group" aria-label="">
+ <button id="btn-filter" type="button" class="btn btn-sm btn-secondary"
+ title=""
+ accesskey=""
+ tabindex="0">
+ <i class="fa fa-filter sql-icon-lg" aria-hidden="true"></i> ` + gettext('Filter') + `
+ </button>
+ <button id="btn-filter-dropdown" type="button" class="btn btn-sm btn-secondary dropdown-toggle dropdown-toggle-split"
+ data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"
+ title=""
+ accesskey=""
+ tabindex="0">
+ </button>` +
+ [
+ '<ul class="dropdown-menu filter">',
+ '<li>',
+ '<a class="dropdown-item" id="btn-identical" href="#" tabindex="0">',
+ '<i class="identical fa fa-check" aria-hidden="true"></i>',
+ '<span> ' + gettext('Identical') + ' </span>',
+ '</a>',
+ '</li>',
+ '<li>',
+ '<a class="dropdown-item" id="btn-differentt" href="#" tabindex="0">',
+ '<i class="different fa fa-check" aria-hidden="true"></i>',
+ '<span> ' + gettext('Different') + ' </span>',
+ '</a>',
+ '</li>',
+ '<li>',
+ '<a class="dropdown-item" id="btn-source-only" href="#" tabindex="0">',
+ '<i class="source-only fa fa-check" aria-hidden="true"></i>',
+ '<span> ' + gettext('Source Only') + ' </span>',
+ '</a>',
+ '</li>',
+ '<li>',
+ '<a class="dropdown-item" id="btn-target-only" href="#" tabindex="0">',
+ '<i class="target-only fa fa-check" aria-hidden="true"></i>',
+ '<span> ' + gettext('Target Only') + ' </span>',
+ '</a>',
+ '</li>',
+ '</ul>',
+ '</div>',
+ '</div>',
+ '</div>',
+ '</div>',
+ ].join('\n')
+ ),
+ render: function() {
+ this.cleanup();
+
+ var controls = this.controls,
+ m = this.model,
+ self = this,
+ idx = (this.tabIndex * 100);
+
+ this.$el.empty();
+
+ $(this.template()).appendTo(this.$el);
+
+ this.fields.each(function(f) {
+ var cntr = new(f.get('control'))({
+ field: f,
+ model: m,
+ dialog: self,
+ tabIndex: idx,
+ });
+
+ if (f.get('group') && f.get('group') == 'source') {
+ self.$el.find('.source').append(cntr.render().$el);
+ }
+ else {
+ self.$el.find('.target').append(cntr.render().$el);
+ }
+
+ controls.push(cntr);
+ });
+
+ return this;
+ },
+ remove: function(opts) {
+ if (opts && opts.data) {
+ if (this.model) {
+ if (this.model.reset) {
+ this.model.reset({
+ validate: false,
+ silent: true,
+ stop: true,
+ });
+ }
+ this.model.clear({
+ validate: false,
+ silent: true,
+ stop: true,
+ });
+ delete(this.model);
+ }
+ if (this.errorModel) {
+ this.errorModel.clear({
+ validate: false,
+ silent: true,
+ stop: true,
+ });
+ delete(this.errorModel);
+ }
+ }
+ this.cleanup();
+ Backform.Form.prototype.remove.apply(this, arguments);
+ },
+});
+
+let SchemaDiffFooterView = Backform.Form.extend({
+ className: function() {
+ return 'set-group pg-el-12';
+ },
+ tabPanelClassName: function() {
+ return Backform.tabClassName;
+ },
+ legendClass: 'badge',
+ contentClass: Backform.accordianContentClassName,
+ template: {
+ 'content': _.template(`
+ <div class="pg-el-sm-12 row <%=contentClass%>">
+ <div class="pg-el-sm-4 ddl-source">Source</div>
+ <div class="pg-el-sm-4 ddl-target">Target</div>
+ <div class="pg-el-sm-4 ddl-diff">Difference
+ </div>
+ </div>
+ </div>
+ `),
+ },
+ initialize: function(opts) {
+ this.label = opts.label;
+ Backform.Form.prototype.initialize.apply(this, arguments);
+ },
+ render: function() {
+ this.cleanup();
+
+ let m = this.model,
+ $el = this.$el,
+ tmpl = this.template,
+ controls = this.controls,
+ data = {
+ 'className': _.result(this, 'className'),
+ 'legendClass': _.result(this, 'legendClass'),
+ 'contentClass': _.result(this, 'contentClass'),
+ 'collapse': _.result(this, 'collapse'),
+ },
+ idx = (this.tabIndex * 100);
+
+ this.$el.empty();
+
+ let el = $((tmpl['content'])(data)).appendTo($el);
+
+ this.fields.each(function(f) {
+ let cntr = new(f.get('control'))({
+ field: f,
+ model: m,
+ dialog: self,
+ tabIndex: idx,
+ name: f.get('name'),
+ });
+
+ if (f.get('group') && f.get('group') == 'ddl-source') {
+ el.find('.ddl-source').append(cntr.render().$el);
+ }
+ else if (f.get('group') && f.get('group') == 'ddl-target') {
+ el.find('.ddl-target').append(cntr.render().$el);
+ }
+ else {
+ el.find('.ddl-diff').append(cntr.render().$el);
+ }
+ controls.push(cntr);
+ });
+
+ let $diff_sc = this.$el.find('.source_ddl'),
+ $diff_tr = this.$el.find('.target_ddl'),
+ $diff = this.$el.find('.diff_ddl'),
+ footer_height = this.$el.parent().height() - 50;
+ $diff_sc.height(footer_height);
+ $diff_sc.css({
+ 'height': footer_height + 'px',
+ });
+ $diff_tr.height(footer_height);
+ $diff_tr.css({
+ 'height': footer_height + 'px',
+ });
+ $diff.height(footer_height);
+ $diff.css({
+ 'height': footer_height + 'px',
+ });
+
+
+ return this;
+ },
+});
+export {
+ SchemaDiffSelect2Control,
+ SchemaDiffHeaderView,
+ SchemaDiffFooterView,
+ SchemaDiffSqlControl,
+};
diff --git a/web/pgadmin/tools/schema_diff/static/js/schema_diff.js b/web/pgadmin/tools/schema_diff/static/js/schema_diff.js
new file mode 100644
index 000000000..a565019bc
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/js/schema_diff.js
@@ -0,0 +1,145 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+define('pgadmin.schemadiff', [
+ 'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
+ 'sources/pgadmin', 'sources/csrf', 'pgadmin.browser.node',
+], function(
+ gettext, url_for, $, _, pgAdmin, csrfToken
+) {
+
+ var wcDocker = window.wcDocker,
+ pgBrowser = pgAdmin.Browser;
+ /* Return back, this has been called more than once */
+ if (pgBrowser.SchemaDiff)
+ return pgBrowser.SchemaDiff;
+
+ // Create an Object Restore of pgBrowser class
+ pgBrowser.SchemaDiff = {
+ init: function() {
+ if (this.initialized)
+ return;
+
+ this.initialized = true;
+ csrfToken.setPGCSRFToken(pgAdmin.csrf_token_header, pgAdmin.csrf_token);
+
+
+ // Define the nodes on which the menus to be appear
+ var menus = [{
+ name: 'schema_diff',
+ module: this,
+ applies: ['tools'],
+ callback: 'show_schema_diff_tool',
+ priority: 1,
+ label: gettext('Schema Diff'),
+ enable: true,
+ }];
+
+ pgBrowser.add_menus(menus);
+
+ // Creating a new pgBrowser frame to show the data.
+ var schemaDiffFrameType = new pgBrowser.Frame({
+ name: 'frm_schemadiff',
+ showTitle: true,
+ isCloseable: true,
+ isPrivate: true,
+ url: 'about:blank',
+ });
+
+ let self = this;
+ /* Cache may take time to load for the first time
+ * Keep trying till available
+ */
+ let cacheIntervalId = setInterval(function() {
+ if(pgBrowser.preference_version() > 0) {
+ self.preferences = pgBrowser.get_preferences_for_module('schema_diff');
+ clearInterval(cacheIntervalId);
+ }
+ },0);
+
+ pgBrowser.onPreferencesChange('schema_diff', function() {
+ self.preferences = pgBrowser.get_preferences_for_module('schema_diff');
+ });
+
+ // Load the newly created frame
+ schemaDiffFrameType.load(pgBrowser.docker);
+ return this;
+ },
+
+ // Callback to draw schema diff for objects
+ show_schema_diff_tool: function() {
+ var self = this,
+ baseUrl = url_for('schema_diff.initialize', null);
+
+ $.ajax({
+ url: baseUrl,
+ method: 'GET',
+ dataType: 'json',
+ contentType: 'application/json',
+ })
+ .done(function(res) {
+ self.trans_id = res.data.schemaDiffTransId;
+ res.data.panel_title = 'Schema Diff'; //TODO: Set the panel title
+ // TODO: Following function is used to test the fetching of the
+ // databases this should be moved to server selection event later.
+ self.launch_schema_diff(res.data);
+ })
+ .fail(function(xhr) {
+ self.raise_error_on_fail(gettext('Schema Diff initialize error') , xhr);
+ });
+ },
+
+ launch_schema_diff: function(data) {
+ var panel_title = data.panel_title,
+ trans_id = data.schemaDiffTransId,
+ panel_tooltip = '';
+
+ var url_params = {
+ 'trans_id': trans_id,
+ 'editor_title': panel_title,
+ },
+ baseUrl = url_for('schema_diff.panel', url_params);
+
+ if (this.preferences.schema_diff_new_browser_tab) {
+ window.open(baseUrl, '_blank');
+ } else {
+
+ var propertiesPanel = pgBrowser.docker.findPanels('properties'),
+ schemaDiffPanel = pgBrowser.docker.addPanel('frm_schemadiff', wcDocker.DOCK.STACKED, propertiesPanel[0]);
+
+ // Set panel title and icon
+ schemaDiffPanel.title('<span title="'+panel_tooltip+'">'+panel_title+'</span>');
+ schemaDiffPanel.icon('icon-schema-diff');
+ schemaDiffPanel.focus();
+
+ var openSchemaDiffURL = function(j) {
+ // add spinner element
+ $(j).data('embeddedFrame').$container.append(pgBrowser.SchemaDiff.spinner_el);
+ setTimeout(function() {
+ var frameInitialized = $(j).data('frameInitialized');
+ if (frameInitialized) {
+ var frame = $(j).data('embeddedFrame');
+ if (frame) {
+ frame.openURL(baseUrl);
+ frame.$container.find('.pg-sp-container').delay(1000).hide(1);
+ }
+ } else {
+ openSchemaDiffURL(j);
+ }
+ }, 100);
+ };
+
+ openSchemaDiffURL(schemaDiffPanel);
+ }
+
+ },
+ };
+
+ return pgBrowser.SchemaDiff;
+});
diff --git a/web/pgadmin/tools/schema_diff/static/js/schema_diff_hook.js b/web/pgadmin/tools/schema_diff/static/js/schema_diff_hook.js
new file mode 100644
index 000000000..571e5c8d5
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/js/schema_diff_hook.js
@@ -0,0 +1,38 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+define([
+ 'sources/url_for', 'jquery',
+ 'sources/pgadmin', 'pgadmin.tools.schema_diff_ui',
+], function(
+ url_for, $, pgAdmin, SchemaDiffUIModule
+) {
+ var pgTools = pgAdmin.Tools = pgAdmin.Tools || {};
+ var SchemaDiffUI = SchemaDiffUIModule.default;
+
+ /* Return back, this has been called more than once */
+ if (pgTools.SchemaDiffHook)
+ return pgTools.SchemaDiffHook;
+
+ pgTools.SchemaDiffHook = {
+ load: function(trans_id) {
+ window.onbeforeunload = function() {
+ $.ajax({
+ url: url_for('schemadiff.index') + 'close/'+trans_id,
+ method: 'DELETE',
+ });
+ };
+
+ let schemaUi = new SchemaDiffUI($('#schema-diff-container'), trans_id);
+ schemaUi.render();
+ },
+ };
+
+ return pgTools.SchemaDiffHook;
+});
diff --git a/web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js b/web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js
new file mode 100644
index 000000000..2e62c95fc
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js
@@ -0,0 +1,845 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+import url_for from 'sources/url_for';
+import $ from 'jquery';
+import gettext from 'sources/gettext';
+import Alertify from 'pgadmin.alertifyjs';
+import Backbone from 'backbone';
+import Slick from 'sources/../bundle/slickgrid';
+import pgAdmin from 'sources/pgadmin';
+import {setPGCSRFToken} from 'sources/csrf';
+import {generateScript} from 'tools/datagrid/static/js/show_query_tool';
+import 'pgadmin.sqleditor';
+import pgWindow from 'sources/window';
+
+import {SchemaDiffSelect2Control, SchemaDiffHeaderView,
+ SchemaDiffFooterView, SchemaDiffSqlControl} from './schema_diff.backform';
+
+var wcDocker = window.wcDocker;
+
+export default class SchemaDiffUI {
+ constructor(container, trans_id) {
+ var self = this;
+ this.$container = container;
+ this.header = null;
+ this.trans_id = trans_id;
+ this.filters = ['Identical', 'Different', 'Source Only', 'Target Only'];
+ this.sel_filters = ['Identical', 'Different', 'Source Only', 'Target Only'];
+ this.dataView = null;
+ this.grid = null,
+ this.selection = {};
+
+ this.model = new Backbone.Model({
+ source_sid: undefined,
+ source_did: undefined,
+ source_scid: undefined,
+ target_sid: undefined,
+ target_did: undefined,
+ target_scid: undefined,
+ source_ddl: undefined,
+ target_ddl: undefined,
+ diff_ddl: undefined,
+ });
+
+ setPGCSRFToken(pgAdmin.csrf_token_header, pgAdmin.csrf_token);
+
+ this.docker = new wcDocker(
+ this.$container, {
+ allowContextMenu: false,
+ allowCollapse: false,
+ loadingClass: 'pg-sp-icon',
+ themePath: url_for('static', {
+ 'filename': 'css',
+ }),
+ theme: 'webcabin.overrides.css',
+ }
+ );
+
+ this.header_panel = new pgAdmin.Browser.Panel({
+ name: 'schema_diff_header_panel',
+ showTitle: false,
+ isCloseable: false,
+ isPrivate: true,
+ content: '<div id="schema-diff-header" class="pg-el-container" el="sm"></div><div id="schema-diff-grid" class="pg-el-container" el="sm"></div>',
+ elContainer: true,
+ });
+
+ this.footer_panel = new pgAdmin.Browser.Panel({
+ name: 'schema_diff_footer_panel',
+ title: gettext('DDL Comparison'),
+ isCloseable: false,
+ isPrivate: true,
+ height: '60',
+ content: `<div id="schema-diff-ddl-comp" class="pg-el-container" el="sm">
+ <div id="ddl_comp_fetching_data" class="pg-sp-container schema-diff-busy-fetching d-none">
+ <div class="pg-sp-content">
+ <div class="row">
+ <div class="col-12 pg-sp-icon"></div>
+ </div>
+ <div class="row"><div class="col-12 pg-sp-text">` + gettext('Comparing objects...') + `</div></div>
+ </div>
+ </div></div>`,
+ });
+
+ this.header_panel.load(this.docker);
+ this.footer_panel.load(this.docker);
+
+
+ this.panel_obj = this.docker.addPanel('schema_diff_header_panel', wcDocker.DOCK.TOP, {w:'95%', h:'50%'});
+ this.footer_panel_obj = this.docker.addPanel('schema_diff_footer_panel', wcDocker.DOCK.BOTTOM, this.panel_obj, {w:'95%', h:'50%'});
+
+ self.footer_panel_obj.on(wcDocker.EVENT.VISIBILITY_CHANGED, function() {
+ setTimeout(function() {
+ this.resize_grid();
+ }.bind(self), 200);
+ });
+
+ self.footer_panel_obj.on(wcDocker.EVENT.RESIZE_ENDED, function() {
+ setTimeout(function() {
+ this.resize_panels();
+ }.bind(self), 200);
+ });
+
+ }
+
+
+ raise_error_on_fail(alert_title, xhr) {
+ try {
+ var err = JSON.parse(xhr.responseText);
+ Alertify.alert(alert_title, err.errormsg);
+ } catch (e) {
+ Alertify.alert(alert_title, e.statusText);
+ }
+ }
+
+ resize_panels() {
+ let $src_ddl = $('#schema-diff-ddl-comp .source_ddl'),
+ $tar_ddl = $('#schema-diff-ddl-comp .target_ddl'),
+ $diff_ddl = $('#schema-diff-ddl-comp .diff_ddl'),
+ footer_height = $('#schema-diff-ddl-comp').height() - 50;
+
+ $src_ddl.height(footer_height);
+ $src_ddl.css({
+ 'height': footer_height + 'px',
+ });
+ $tar_ddl.height(footer_height);
+ $tar_ddl.css({
+ 'height': footer_height + 'px',
+ });
+ $diff_ddl.height(footer_height);
+ $diff_ddl.css({
+ 'height': footer_height + 'px',
+ });
+
+ this.resize_grid();
+ }
+
+ compare_schemas() {
+ var self = this,
+ url_params = self.model.toJSON();
+
+ if (url_params['source_sid'] == '' || _.isUndefined(url_params['source_sid']) ||
+ url_params['source_did'] == '' || _.isUndefined(url_params['source_did']) ||
+ url_params['source_scid'] == '' || _.isUndefined(url_params['source_scid']) ||
+ url_params['target_sid'] == '' || _.isUndefined(url_params['target_sid']) ||
+ url_params['target_did'] == '' || _.isUndefined(url_params['target_did']) ||
+ url_params['target_scid'] == '' || _.isUndefined(url_params['target_scid'])
+ ) {
+ Alertify.alert(gettext('Selection Error'), gettext('Please select source and target.'));
+ return false;
+ }
+
+ this.selection = JSON.parse(JSON.stringify(url_params));
+
+ url_params['trans_id'] = self.trans_id;
+
+ _.each(url_params, function(key, val) {
+ url_params[key] = parseInt(val, 10);
+ });
+
+ var baseUrl = url_for('schema_diff.compare', url_params);
+
+ self.model.set({
+ 'source_ddl': undefined,
+ 'target_ddl': undefined,
+ 'diff_ddl': undefined,
+ });
+
+ self.render_grid([]);
+ self.footer.render();
+ self.startDiffPoller();
+
+ return $.ajax({
+ url: baseUrl,
+ method: 'GET',
+ dataType: 'json',
+ contentType: 'application/json',
+ })
+ .done(function (res) {
+ self.stopDiffPoller();
+ self.render_grid(res.data);
+ })
+ .fail(function (xhr) {
+ self.raise_error_on_fail(gettext('Schema compare error'), xhr);
+ self.stopDiffPoller();
+ });
+ }
+
+ generate_script() {
+ var self = this,
+ baseServerUrl = url_for('schema_diff.get_server', {'sid': self.selection['target_sid'],
+ 'did': self.selection['target_did']}),
+ sel_rows = self.grid ? self.grid.getSelectedRows() : [],
+ sel_rows_data = [],
+ url_params = self.selection,
+ generated_script = undefined,
+ open_query_tool;
+
+ _.each(url_params, function(key, val) {
+ url_params[key] = parseInt(val, 10);
+ });
+
+ $('#diff_fetching_data').removeClass('d-none');
+ $('#diff_fetching_data').find('.schema-diff-busy-text').text('Generating script...');
+
+
+ open_query_tool = function get_server_details() {
+ $.ajax({
+ url: baseServerUrl,
+ method: 'GET',
+ dataType: 'json',
+ contentType: 'application/json',
+ })
+ .done(function (res) {
+ let data = res.data;
+ let server_data = {};
+ if (data) {
+ server_data['sgid'] = data.gid;
+ server_data['sid'] = data.sid;
+ server_data['stype'] = data.type;
+ server_data['server'] = data.name;
+ server_data['user'] = data.user;
+ server_data['did'] = self.model.get('target_did');
+ server_data['database'] = data.database;
+
+ if (_.isUndefined(generated_script))
+ generated_script = 'BEGIN;' + '\n' + self.model.get('diff_ddl') + '\n' + 'END;';
+
+ let preferences = pgWindow.pgAdmin.Browser.get_preferences_for_module('schema_diff');
+ if (preferences.schema_diff_new_browser_tab) {
+ pgWindow.pgAdmin.ddl_diff = generated_script;
+ generateScript(server_data, pgWindow.pgAdmin.DataGrid);
+ } else {
+ pgWindow.pgAdmin.ddl_diff = generated_script;
+ generateScript(server_data, pgWindow.pgAdmin.DataGrid);
+ }
+ }
+
+ $('#diff_fetching_data').find('.schema-diff-busy-text').text('');
+ $('#diff_fetching_data').addClass('d-none');
+
+ })
+ .fail(function (xhr) {
+ self.raise_error_on_fail(gettext('Generate script error'), xhr);
+ $('#diff_fetching_data').find('.schema-diff-busy-text').text('');
+ $('#diff_fetching_data').addClass('d-none');
+ });
+ };
+
+ if (sel_rows.length > 0) {
+ for (var row = 0; row < sel_rows.length; row++) {
+ let data = self.grid.getData().getItem(sel_rows[row]);
+
+ if (data.type) {
+ let tmp_data = {
+ 'node_type': data.type,
+ 'source_oid': parseInt(data.oid, 10),
+ 'target_oid': parseInt(data.oid, 10),
+ 'comp_status': data.status,
+ };
+
+ if(data.status && (data.status.toLowerCase() == 'different' || data.status.toLowerCase() == 'identical')) {
+ tmp_data['target_oid'] = data.target_oid;
+ }
+ sel_rows_data.push(tmp_data);
+ }
+ }
+
+ url_params['sel_rows'] = sel_rows_data;
+
+ let baseUrl = url_for('schema_diff.generate_script', {'trans_id': self.trans_id});
+
+ $.ajax({
+ url: baseUrl,
+ method: 'POST',
+ dataType: 'json',
+ contentType: 'application/json',
+ data: JSON.stringify(url_params),
+ })
+ .done(function (res) {
+ if (res) {
+ generated_script = 'BEGIN;' + '\n' + res.diff_ddl + '\n' + 'END;';
+ }
+ open_query_tool();
+ })
+ .fail(function (xhr) {
+ self.raise_error_on_fail(gettext('Generate script error'), xhr);
+ $('#diff_fetching_data').addClass('d-none');
+ });
+ } else if (!_.isUndefined(self.model.get('diff_ddl'))) {
+ open_query_tool();
+ }
+ return false;
+ }
+
+ render_grid(data) {
+
+ var self = this;
+ var grid;
+
+ if (self.grid) {
+ // Only render the data
+ self.render_grid_data(data);
+ return;
+ }
+ // Checkbox Column
+ var checkboxSelector = new Slick.CheckboxSelectColumn({
+ cssClass: 'slick-cell-checkboxsel',
+ minWidth: 30,
+ });
+
+ // Format Schema object title with appropriate icon
+ var formatColumnTitle = function (row, cell, value, columnDef, dataContext) {
+ let icon = 'icon-' + dataContext.type;
+ return '<i class="ml-5 wcTabIcon '+ icon +'"></i><span>' + value + '</span>';
+ };
+
+ // Grid Columns
+ var grid_width = (self.grid_width - 47) / 2 ;
+ var columns = [
+ checkboxSelector.getColumnDefinition(),
+ {id: 'title', name: 'Schema Objects', field: 'title', minWidth: grid_width, formatter: formatColumnTitle},
+ {id: 'status', name: 'Comparison Result', field: 'status', minWidth: grid_width},
+ {id: 'label', name: 'Schema Objects', field: 'label', width: 0, minWidth: 0, maxWidth: 0,
+ cssClass: 'really-hidden', headerCssClass: 'really-hidden'},
+ {id: 'type', name: 'Schema Objects', field: 'type', width: 0, minWidth: 0, maxWidth: 0,
+ cssClass: 'really-hidden', headerCssClass: 'really-hidden'},
+ {id: 'id', name: 'id', field: 'id', width: 0, minWidth: 0, maxWidth: 0,
+ cssClass: 'really-hidden', headerCssClass: 'really-hidden' },
+
+ ];
+
+ // Grid Options
+ var options = {
+ enableCellNavigation: true,
+ enableColumnReorder: false,
+ enableRowSelection: true,
+ };
+
+ // Grouping by Schema Object
+ self.groupBySchemaObject = function() {
+ self.dataView.setGrouping({
+ getter: 'type',
+ formatter: function (g) {
+ let icon = 'icon-coll-' + g.value;
+ return '<i class="wcTabIcon '+ icon +'"></i><span>' + g.rows[0].label + '</span>';
+ },
+ aggregateCollapsed: true,
+ lazyTotalsCalculation: true,
+ });
+ };
+
+ var groupItemMetadataProvider = new Slick.Data.GroupItemMetadataProvider({ checkboxSelect: true,
+ checkboxSelectPlugin: checkboxSelector });
+
+ // Dataview for grid
+ self.dataView = new Slick.Data.DataView({
+ groupItemMetadataProvider: groupItemMetadataProvider,
+ inlineFilters: false,
+ });
+
+ // Wire up model events to drive the grid
+ self.dataView.onRowCountChanged.subscribe(function () {
+ grid.updateRowCount();
+ grid.render();
+ });
+ self.dataView.onRowsChanged.subscribe(function (e, args) {
+ grid.invalidateRows(args.rows);
+ grid.render();
+ });
+
+ // Change Row css on the basis of item status
+ self.dataView.getItemMetadata = function(row) {
+ var item = self.dataView.getItem(row);
+ if (item.__group) {
+ return groupItemMetadataProvider.getGroupRowMetadata(item);
+ }
+
+ if(item.status === 'Different') {
+ return { cssClasses: 'different' };
+ } else if (item.status === 'Source Only') {
+ return { cssClasses: 'source' };
+ } else if (item.status === 'Target Only') {
+ return { cssClasses: 'target' };
+ }
+
+ return null;
+ };
+
+ // Grid filter
+ self.filter = function (item) {
+ let self = this;
+ if (self.sel_filters.indexOf(item.status) !== -1) return true;
+ return false;
+ };
+
+ let $data_grid = $('#schema-diff-grid');
+ grid = this.grid = new Slick.Grid($data_grid, self.dataView, columns, options);
+ grid.registerPlugin(groupItemMetadataProvider);
+ grid.setSelectionModel(new Slick.RowSelectionModel({selectActiveRow: false}));
+ grid.registerPlugin(checkboxSelector);
+
+ grid.onClick.subscribe(function(e, args) {
+ if (args.row) {
+ data = args.grid.getData().getItem(args.row);
+ if (data.status) this.ddlCompare(data);
+ }
+ }.bind(self));
+
+ grid.onSelectedRowsChanged.subscribe(self.handle_generate_button.bind(self));
+
+ self.model.on('change:diff_ddl', self.handle_generate_button.bind(self));
+
+ $('#schema-diff-grid').on('keyup', function() {
+ if ((event.keyCode == 38 || event.keyCode ==40) && this.grid.getActiveCell().row) {
+ data = this.grid.getData().getItem(this.grid.getActiveCell().row);
+ this.ddlCompare(data);
+ }
+ }.bind(self));
+
+ self.render_grid_data(data);
+ }
+
+
+
+ render_grid_data(data) {
+ var self = this;
+ self.dataView.beginUpdate();
+ self.dataView.setItems(data);
+ self.dataView.setFilter(self.filter.bind(self));
+ self.groupBySchemaObject();
+ self.dataView.endUpdate();
+
+ self.resize_grid();
+ }
+
+ handle_generate_button(){
+ if (this.grid.getSelectedRows().length > 0 || (this.model.get('diff_ddl') != '' && !_.isUndefined(this.model.get('diff_ddl')))) {
+ this.header.$el.find('button#generate-script').removeAttr('disabled');
+ } else {
+ this.header.$el.find('button#generate-script').attr('disabled', true);
+ }
+ }
+
+ resize_grid() {
+ let $data_grid = $('#schema-diff-grid'),
+ grid_height = (this.panel_obj.height() > 0) ? this.panel_obj.height() - 100 : this.grid_height - 100;
+
+ $data_grid.height(grid_height);
+ $data_grid.css({
+ 'height': grid_height + 'px',
+ });
+ if (this.grid) this.grid.resizeCanvas();
+ }
+
+ getCompareStatus() {
+ var self = this,
+ url_params = {'trans_id': self.trans_id},
+ baseUrl = url_for('schema_diff.poll', url_params);
+
+ $.ajax({
+ url: baseUrl,
+ method: 'GET',
+ dataType: 'json',
+ contentType: 'application/json',
+ })
+ .done(function (res) {
+ let msg = res.data.compare_msg + res.data.diff_percentage + '% completed';
+ $('#diff_fetching_data').find('.schema-diff-busy-text').text(msg);
+ })
+ .fail(function (xhr) {
+ self.raise_error_on_fail(gettext('Poll error'), xhr);
+ self.stopDiffPoller('fail');
+ });
+ }
+
+ startDiffPoller() {
+ $('#ddl_comp_fetching_data').addClass('d-none');
+ $('#diff_fetching_data').removeClass('d-none');
+ /* Execute once for the first time as setInterval will not do */
+ this.getCompareStatus();
+ this.diff_poller_int_id = setInterval(this.getCompareStatus.bind(this), 1000);
+ }
+
+ stopDiffPoller(status) {
+ clearInterval(this.diff_poller_int_id);
+ // The last polling for comparison
+ if (status !== 'fail') this.getCompareStatus();
+
+ $('#diff_fetching_data').find('.schema-diff-busy-text').text('');
+ $('#diff_fetching_data').addClass('d-none');
+
+ }
+
+ ddlCompare(data) {
+ var self = this,
+ node_type = data.type,
+ source_oid = data.oid,
+ target_oid = data.oid;
+
+ self.model.set({
+ 'source_ddl': undefined,
+ 'target_ddl': undefined,
+ 'diff_ddl': undefined,
+ });
+
+ var url_params = self.selection;
+
+ if(data.status && (data.status.toLowerCase() == 'different' || data.status.toLowerCase() == 'identical')) {
+ target_oid = data.target_oid;
+ }
+
+ url_params['trans_id'] = self.trans_id;
+ url_params['source_oid'] = source_oid;
+ url_params['target_oid'] = target_oid;
+ url_params['comp_status'] = data.status;
+ url_params['node_type'] = node_type;
+
+ _.each(url_params, function(key, val) {
+ url_params[key] = parseInt(val, 10);
+ });
+
+ $('#ddl_comp_fetching_data').removeClass('d-none');
+
+ var baseUrl = url_for('schema_diff.ddl_compare', url_params);
+ self.model.url = baseUrl;
+
+ self.model.fetch({
+ success: function() {
+ self.footer.render();
+ $('#ddl_comp_fetching_data').addClass('d-none');
+ },
+ error: function() {
+ self.footer.render();
+ $('#ddl_comp_fetching_data').addClass('d-none');
+ },
+ });
+ }
+
+ render() {
+ let self = this;
+ let panel = self.docker.findPanels('schema_diff_header_panel')[0];
+
+ var header = panel.$container.find('#schema-diff-header');
+
+ self.header = new SchemaDiffHeaderView({
+ el: header,
+ model: this.model,
+ fields: [{
+ name: 'source_sid', label: false,
+ control: SchemaDiffSelect2Control,
+ url: url_for('schema_diff.servers'),
+ select2: {
+ allowClear: true,
+ placeholder: gettext('Select server...'),
+ },
+ connect: function() {
+ self.connect_server(arguments[0], arguments[1]);
+ },
+ group: 'source',
+ disabled: function() {
+ return false;
+ },
+ }, {
+ name: 'source_did',
+ group: 'source',
+ deps: ['source_sid'],
+ control: SchemaDiffSelect2Control,
+ url: function() {
+ if (this.get('source_sid'))
+ return url_for('schema_diff.databases', {'sid': this.get('source_sid')});
+ return false;
+ },
+ select2: {
+ allowClear: true,
+ placeholder: gettext('Select database...'),
+ },
+ disabled: function(m) {
+ if (!_.isUndefined(m.get('source_sid')) && !_.isNull(m.get('source_sid')))
+ return false;
+ return true;
+ },
+ connect: function() {
+ self.connect_database(this.model.get('source_sid'), arguments[0], arguments[1]);
+ },
+ }, {
+ name: 'source_scid',
+ control: SchemaDiffSelect2Control,
+ group: 'source',
+ deps: ['source_sid', 'source_did'],
+ url: function() {
+ if (this.get('source_sid') && this.get('source_did'))
+ return url_for('schema_diff.schemas', {'sid': this.get('source_sid'), 'did': this.get('source_did')});
+ return false;
+ },
+ select2: {
+ allowClear: true,
+ placeholder: gettext('Select schema...'),
+ },
+ disabled: function(m) {
+ if (!_.isUndefined(m.get('source_did')) && !_.isNull(m.get('source_did')))
+ return false;
+ return true;
+ },
+ }, {
+ name: 'target_sid', label: false,
+ control: SchemaDiffSelect2Control,
+ group: 'target',
+ url: url_for('schema_diff.servers'),
+ select2: {
+ allowClear: true,
+ placeholder: gettext('Select server...'),
+ },
+ disabled: function() {
+ return false;
+ },
+ connect: function() {
+ self.connect_server(arguments[0], arguments[1]);
+ },
+ }, {
+ name: 'target_did',
+ control: SchemaDiffSelect2Control,
+ group: 'target',
+ deps: ['target_sid'],
+ url: function() {
+ if (this.get('target_sid'))
+ return url_for('schema_diff.databases', {'sid': this.get('target_sid')});
+ return false;
+ },
+ select2: {
+ allowClear: true,
+ placeholder: gettext('Select database...'),
+ },
+ disabled: function(m) {
+ if (!_.isUndefined(m.get('target_sid')) && !_.isNull(m.get('target_sid')))
+ return false;
+ return true;
+ },
+ connect: function() {
+ self.connect_database(this.model.get('target_sid'), arguments[0], arguments[1]);
+ },
+ }, {
+ name: 'target_scid',
+ control: SchemaDiffSelect2Control,
+ group: 'target',
+ deps: ['target_sid', 'target_did'],
+ url: function() {
+ if (this.get('target_sid') && this.get('target_did'))
+ return url_for('schema_diff.schemas', {'sid': this.get('target_sid'), 'did': this.get('target_did')});
+ return false;
+ },
+ select2: {
+ allowClear: true,
+ placeholder: gettext('Select schema...'),
+ },
+ disabled: function(m) {
+ if (!_.isUndefined(m.get('target_did')) && !_.isNull(m.get('target_did')))
+ return false;
+ return true;
+ },
+ }],
+ });
+
+ self.footer = new SchemaDiffFooterView({
+ model: this.model,
+ fields: [{
+ name: 'source_ddl', label: false,
+ control: SchemaDiffSqlControl,
+ group: 'ddl-source',
+ }, {
+ name: 'target_ddl', label: false,
+ control: SchemaDiffSqlControl,
+ group: 'ddl-target',
+ }, {
+ name: 'diff_ddl', label: false,
+ control: SchemaDiffSqlControl,
+ group: 'ddl-diff', copyRequired: true,
+ }],
+ });
+
+ self.header.render();
+
+ self.header.$el.find('button.btn-primary').on('click', self.compare_schemas.bind(self));
+ self.header.$el.find('button#generate-script').on('click', self.generate_script.bind(self));
+ self.header.$el.find('ul.filter a.dropdown-item').on('click', self.refresh_filters.bind(self));
+
+ let footer_panel = self.docker.findPanels('schema_diff_footer_panel')[0],
+ header_panel = self.docker.findPanels('schema_diff_header_panel')[0];
+
+ footer_panel.$container.find('#schema-diff-ddl-comp').append(self.footer.render().$el);
+ header_panel.$container.find('#schema-diff-grid').append(`<div class='obj_properties container-fluid'>
+ <div class='alert alert-info pg-panel-message'>` + gettext('Select the server, database and schema for the source and target and click <b>Compare</b> to compare them.') + '</div></div>');
+
+ self.grid_width = $('#schema-diff-grid').width();
+ self.grid_height = this.panel_obj.height();
+ }
+
+ refresh_filters(event) {
+ let self = this;
+ _.each(self.filters, function(filter) {
+ let index = self.sel_filters.indexOf(filter);
+ let filter_class = '.' + filter.replace(' ', '-').toLowerCase();
+ if ($(event.currentTarget).find(filter_class).length == 1) {
+ if ($(filter_class).hasClass('visibility-hidden') === true) {
+ $(filter_class).removeClass('visibility-hidden');
+ if (index === -1) self.sel_filters.push(filter);
+ } else {
+ $(filter_class).addClass('visibility-hidden');
+ if(index !== -1 ) delete self.sel_filters[index];
+ }
+ }
+ });
+ // Refresh the grid
+ self.dataView.refresh();
+ }
+
+ connect_database(server_id, db_id, callback) {
+ var url = url_for('schema_diff.connect_database', {'sid': server_id, 'did': db_id});
+ $.post(url)
+ .done(function(res) {
+ if (res.success && res.data) {
+ callback(res.data);
+ }
+ })
+ .fail(function(xhr, error) {
+ Alertify.pgNotifier(error, xhr, gettext('Failed to connect the database.'));
+ });
+
+ }
+
+ connect_server(server_id, callback) {
+ var onFailure = function(
+ xhr, status, error, server_id, callback
+ ) {
+ Alertify.pgNotifier('error', xhr, error, function(msg) {
+ setTimeout(function() {
+ Alertify.dlgServerPass(
+ gettext('Connect to Server'),
+ msg,
+ server_id,
+ callback
+ ).resizeTo();
+ }, 100);
+ });
+ },
+ onSuccess = function(res, callback) {
+ if (res && res.data) {
+ // We're not reconnecting
+ callback(res.data);
+ }
+ };
+
+
+ // Ask Password and send it back to the connect server
+ if (!Alertify.dlgServerPass) {
+ Alertify.dialog('dlgServerPass', function factory() {
+ return {
+ main: function(
+ title, message, server_id, success_callback, _onSuccess, _onFailure, _onCancel
+ ) {
+ this.set('title', title);
+ this.message = message;
+ this.server_id = server_id;
+ this.success_callback = success_callback;
+ this.onSuccess = _onSuccess || onSuccess;
+ this.onFailure = _onFailure || onFailure;
+ this.onCancel = _onCancel || onCancel;
+ },
+ setup:function() {
+ return {
+ buttons:[{
+ text: gettext('Cancel'), className: 'btn btn-secondary fa fa-times pg-alertify-button',
+ key: 27,
+ },{
+ text: gettext('OK'), key: 13, className: 'btn btn-primary fa fa-check pg-alertify-button',
+ }],
+ focus: {element: '#password', select: true},
+ options: {
+ modal: 0, resizable: false, maximizable: false, pinnable: false,
+ },
+ };
+ },
+ build:function() {},
+ prepare:function() {
+ this.setContent(this.message);
+ },
+ callback: function(closeEvent) {
+ var _onFailure = this.onFailure,
+ _onSuccess = this.onSuccess,
+ _onCancel = this.onCancel,
+ _success_callback = this.success_callback;
+
+ if (closeEvent.button.text == gettext('OK')) {
+
+ var _url = url_for('schema_diff.connect_server', {'sid': this.server_id});
+
+ $.ajax({
+ type: 'POST',
+ timeout: 30000,
+ url: _url,
+ data: $('#frmPassword').serialize(),
+ })
+ .done(function(res) {
+ if (res.success == 1) {
+ return _onSuccess(res, _success_callback);
+ }
+ })
+ .fail(function(xhr, status, error) {
+ return _onFailure(
+ xhr, status, error, this.server_id, _success_callback
+ );
+ });
+ } else {
+ _onCancel && typeof(_onCancel) == 'function' &&
+ _onCancel();
+ }
+ },
+ };
+ });
+ }
+
+ var onCancel = function() {
+ return false;
+ };
+
+ var url = url_for('schema_diff.connect_server', {'sid': server_id});
+ $.post(url)
+ .done(function(res) {
+ if (res.success == 1) {
+ return onSuccess(res, callback);
+ }
+ })
+ .fail(function(xhr, status, error) {
+ return onFailure(
+ xhr, status, error, server_id, callback
+ );
+ });
+ }
+}
diff --git a/web/pgadmin/tools/schema_diff/static/scss/_schema_diff.scss b/web/pgadmin/tools/schema_diff/static/scss/_schema_diff.scss
new file mode 100644
index 000000000..800449655
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/static/scss/_schema_diff.scss
@@ -0,0 +1,85 @@
+#schema-diff-container {
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ padding-top: 10px;
+ background-color: $color-gray-light;
+}
+
+#schema-diff-grid {
+ background: $color-bg;
+ outline: 0;
+ font-size: 9pt;
+ margin-top: 28px;
+ background: none;
+ background-color: $color-gray-light;
+}
+
+#schema-diff-grid .slick-header .slick-header-columns {
+ background: $color-bg;
+ height: 40px;
+ border-bottom: $panel-border;
+}
+
+#schema-diff-grid .slick-header .slick-header-column.ui-state-default {
+ padding: 4px 0 3px 6px;
+ border-bottom: $panel-border;
+ border-right: $panel-border;
+}
+
+.slick-row:hover .slick-cell{
+ border-top: $table-hover-border;
+ border-bottom: $table-hover-border;
+ background-color: $table-hover-bg-color;
+}
+
+#schema-diff-grid .slick-header .slick-header-column.selected {
+ background-color: $color-primary;
+ color: $color-primary-fg;
+}
+.slick-row .slick-cell {
+ border-bottom: $panel-border;
+ border-right: $panel-border;
+ z-index: 0;
+}
+
+#schema-diff-grid .slick-row .slick-cell.l0.r0.selected {
+ background-color: $color-primary;
+ color: $color-primary-fg;
+}
+
+#schema-diff-grid .slick-row > .slick-cell:not(.l0):not(.r0).selected {
+ background-color: $table-hover-bg-color;
+ border-top: $table-hover-border;
+ border-bottom: $table-hover-border;
+}
+
+#schema-diff-grid div.slick-header.ui-state-default {
+ background: $color-bg;
+ border-bottom: none;
+ border-right: none;
+ border-top: none;
+}
+
+#schema-diff-grid .different {
+ background-color: $schemadiff-diff-row-color !important;
+}
+#schema-diff-grid .source {
+ background-color: $schemadiff-source-row-color !important;
+}
+#schema-diff-grid .target {
+ background-color: $schemadiff-target-row-color !important;
+}
+
+#schema-diff-grid .slick-row.active {
+ background-color: $table-bg-selected !important;
+}
+
+#schema-diff-ddl-comp {
+ height: 100%;
+ bottom: 10px;
+ background-color: $color-bg !important;
+ overflow-y: hidden;
+}
diff --git a/web/pgadmin/tools/schema_diff/templates/schema_diff/index.html b/web/pgadmin/tools/schema_diff/templates/schema_diff/index.html
new file mode 100644
index 000000000..9788264d9
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/templates/schema_diff/index.html
@@ -0,0 +1,31 @@
+{% extends "base.html" %}
+{% block init_script %}
+try {
+ require(
+ ['sources/generated/schema_diff', 'sources/generated/slickgrid', 'sources/generated/codemirror', 'sources/generated/browser_nodes'],
+ function(pgSchemaDiffHook) {
+ var pgSchemaDiffHook = pgSchemaDiffHook || pgAdmin.Tools.SchemaDiffHook;
+ pgSchemaDiffHook.load({{trans_id}});
+ },
+ function() {
+ console.log(arguments);
+ });
+} catch (err) {
+ console.log(err);
+}
+{% endblock %}
+{% block css_link %}
+<link type="text/css" rel="stylesheet" href="{{ url_for('browser.browser_css')}}"/>
+{% endblock %}
+{% block body %}
+<div id="schema-diff-container">
+ <div id="diff_fetching_data" class="pg-sp-container schema-diff-busy-fetching d-none">
+ <div class="pg-sp-content">
+ <div class="row">
+ <div class="col-12 pg-sp-icon"></div>
+ </div>
+ <div class="row"><div class="col-12 pg-sp-text schema-diff-busy-text"></div></div>
+ </div>
+ </div>
+</div>
+{% endblock %}
diff --git a/web/pgadmin/tools/schema_diff/tests/__init__.py b/web/pgadmin/tools/schema_diff/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/web/pgadmin/tools/schema_diff/tests/pg/10_plus/source.sql b/web/pgadmin/tools/schema_diff/tests/pg/10_plus/source.sql
new file mode 100644
index 000000000..99757ceb2
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/pg/10_plus/source.sql
@@ -0,0 +1,440 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:54:15 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- TOC entry 17 (class 2615 OID 139770)
+-- Name: source; Type: SCHEMA; Schema: -; Owner: postgres
+--
+
+CREATE SCHEMA source;
+
+
+ALTER SCHEMA source OWNER TO postgres;
+
+SET default_tablespace = '';
+
+
+CREATE EXTENSION btree_gist
+ SCHEMA source;
+
+--
+-- TOC entry 12272 (class 1259 OID 149205)
+-- Name: table_for_partition; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_partition (
+ col1 bigint NOT NULL
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE source.table_for_partition OWNER TO postgres;
+
+--
+-- TOC entry 12273 (class 1259 OID 149208)
+-- Name: part1; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.part1 (
+ col1 bigint NOT NULL
+);
+ALTER TABLE ONLY source.table_for_partition ATTACH PARTITION source.part1 FOR VALUES FROM ('1') TO ('23');
+
+
+ALTER TABLE source.part1 OWNER TO postgres;
+
+--
+-- TOC entry 12274 (class 1259 OID 149213)
+-- Name: table_for_partition_1; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_partition_1 (
+ col1 bigint
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE source.table_for_partition_1 OWNER TO postgres;
+
+--
+-- TOC entry 12275 (class 1259 OID 149216)
+-- Name: part3; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.part3 (
+ col1 bigint
+);
+ALTER TABLE ONLY source.table_for_partition_1 ATTACH PARTITION source.part3 FOR VALUES FROM ('1') TO ('10');
+
+
+ALTER TABLE source.part3 OWNER TO postgres;
+
+--
+-- TOC entry 12276 (class 1259 OID 149219)
+-- Name: part4; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.part4 (
+ col1 bigint
+);
+ALTER TABLE ONLY source.table_for_partition_1 ATTACH PARTITION source.part4 FOR VALUES FROM ('11') TO ('20');
+
+
+ALTER TABLE source.part4 OWNER TO postgres;
+
+--
+-- TOC entry 12258 (class 1259 OID 148963)
+-- Name: table_for_column; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_column (
+ col1 bigint NOT NULL,
+ col2 text,
+ col3 text
+);
+
+
+ALTER TABLE source.table_for_column OWNER TO postgres;
+
+--
+-- TOC entry 12256 (class 1259 OID 148895)
+-- Name: table_for_constraints; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_constraints OWNER TO postgres;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12256
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON TABLE source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 12262 (class 1259 OID 149004)
+-- Name: table_for_identical; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_identical OWNER TO postgres;
+
+--
+-- TOC entry 12260 (class 1259 OID 148977)
+-- Name: table_for_index; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_index OWNER TO postgres;
+
+--
+-- TOC entry 12269 (class 1259 OID 149128)
+-- Name: table_for_primary_key; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE source.table_for_primary_key OWNER TO postgres;
+
+--
+-- TOC entry 12264 (class 1259 OID 149024)
+-- Name: table_for_rule; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_rule OWNER TO postgres;
+
+--
+-- TOC entry 12266 (class 1259 OID 149048)
+-- Name: table_for_trigger; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_trigger OWNER TO postgres;
+
+--
+-- TOC entry 56893 (class 2606 OID 148904)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='12') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 56893
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56891 (class 2606 OID 148911)
+-- Name: table_for_constraints check_con; Type: CHECK CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE source.table_for_constraints
+ ADD CONSTRAINT check_con CHECK ((col1 > 10)) NOT VALID;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56891
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT check_con ON source.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 56899 (class 2606 OID 148970)
+-- Name: table_for_column table_for_column_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_column
+ ADD CONSTRAINT table_for_column_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56895 (class 2606 OID 148902)
+-- Name: table_for_constraints table_for_constraints_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT table_for_constraints_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 148984)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56913 (class 2606 OID 149135)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1, col2);
+
+
+--
+-- TOC entry 56909 (class 2606 OID 149031)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56907 (class 2606 OID 149011)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56911 (class 2606 OID 149055)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148913)
+-- Name: table_for_constraints unique; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "unique" UNIQUE (col1);
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 56897
+-- Name: CONSTRAINT "unique" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "unique" ON source.table_for_constraints IS 'cmnt';
+
+
+--
+-- TOC entry 56900 (class 1259 OID 149023)
+-- Name: index1; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index1 ON source.table_for_index USING btree (col2 varchar_pattern_ops);
+
+
+--
+-- TOC entry 56905 (class 1259 OID 149012)
+-- Name: index_identical; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index_identical ON source.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56901 (class 1259 OID 149211)
+-- Name: index_same; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index_same ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56902 (class 1259 OID 149022)
+-- Name: index_source; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index_source ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 61044 (class 2618 OID 149032)
+-- Name: table_for_rule rule1; Type: RULE; Schema: source; Owner: postgres
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO source.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61070 (class 0 OID 0)
+-- Dependencies: 61044
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON RULE rule1 ON source.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149033)
+-- Name: table_for_rule rule2; Type: RULE; Schema: source; Owner: postgres
+--
+
+CREATE RULE rule2 AS
+ ON INSERT TO source.table_for_rule DO NOTHING;
+
+--
+-- TOC entry 12283 (class 1259 OID 347818)
+-- Name: test view; Type: VIEW; Schema: source; Owner: postgres
+--
+
+CREATE VIEW source."test view" AS
+ SELECT pg_class.relname,
+ pg_class.relnamespace,
+ pg_class.reltype,
+ pg_class.reloftype,
+ pg_class.relowner,
+ pg_class.relam,
+ pg_class.relfilenode,
+ pg_class.reltablespace,
+ pg_class.relpages,
+ pg_class.reltuples,
+ pg_class.relallvisible,
+ pg_class.reltoastrelid,
+ pg_class.relhasindex,
+ pg_class.relisshared,
+ pg_class.relpersistence,
+ pg_class.relkind,
+ pg_class.relnatts,
+ pg_class.relchecks,
+ pg_class.relhasoids,
+ pg_class.relhaspkey,
+ pg_class.relhasrules,
+ pg_class.relhastriggers,
+ pg_class.relhassubclass,
+ pg_class.relrowsecurity,
+ pg_class.relforcerowsecurity,
+ pg_class.relispopulated,
+ pg_class.relreplident,
+ pg_class.relispartition,
+ pg_class.relfrozenxid,
+ pg_class.relminmxid,
+ pg_class.relacl,
+ pg_class.reloptions,
+ pg_class.relpartbound
+ FROM pg_class
+ LIMIT 10;
+
+
+ALTER TABLE source."test view" OWNER TO postgres;
+
+--
+-- TOC entry 12286 (class 1259 OID 347832)
+-- Name: test view f; Type: VIEW; Schema: source; Owner: postgres
+--
+
+CREATE VIEW source."test view f" WITH (security_barrier='false') AS
+ SELECT 2;
+
+
+ALTER TABLE source."test view f" OWNER TO postgres;
+
+--
+-- TOC entry 61111 (class 0 OID 0)
+-- Dependencies: 12286
+-- Name: VIEW "test view f"; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON VIEW source."test view f" IS 'cmn';
diff --git a/web/pgadmin/tools/schema_diff/tests/pg/10_plus/target.sql b/web/pgadmin/tools/schema_diff/tests/pg/10_plus/target.sql
new file mode 100644
index 000000000..c3042ab60
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/pg/10_plus/target.sql
@@ -0,0 +1,429 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:55:22 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- TOC entry 18 (class 2615 OID 139771)
+-- Name: target; Type: SCHEMA; Schema: -; Owner: postgres
+--
+
+CREATE SCHEMA target;
+
+ALTER SCHEMA target OWNER TO postgres;
+
+SET default_tablespace = '';
+
+CREATE EXTENSION btree_gist
+ SCHEMA target;
+
+--
+-- TOC entry 12250 (class 1259 OID 139938)
+-- Name: MView; Type: MATERIALIZED VIEW; Schema: target; Owner: postgres
+--
+
+CREATE MATERIALIZED VIEW target."MView" AS
+ SELECT 'tekst'::text AS text
+ WITH NO DATA;
+
+
+ALTER TABLE target."MView" OWNER TO postgres;
+
+--
+-- TOC entry 12277 (class 1259 OID 149234)
+-- Name: table_for_partition_1; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_partition_1 (
+ col1 bigint
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE target.table_for_partition_1 OWNER TO postgres;
+
+--
+-- TOC entry 12278 (class 1259 OID 149237)
+-- Name: part3; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.part3 (
+ col1 bigint
+);
+ALTER TABLE ONLY target.table_for_partition_1 ATTACH PARTITION target.part3 FOR VALUES FROM ('13') TO ('56');
+
+
+ALTER TABLE target.part3 OWNER TO postgres;
+
+--
+-- TOC entry 12259 (class 1259 OID 148971)
+-- Name: table_for_column; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_column (
+ col1 bigint,
+ col2 bigint,
+ col4 text
+);
+
+
+ALTER TABLE target.table_for_column OWNER TO postgres;
+
+--
+-- TOC entry 12268 (class 1259 OID 149089)
+-- Name: table_for_constraints; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text,
+ CONSTRAINT check_con CHECK ((col1 > 30))
+);
+
+
+ALTER TABLE target.table_for_constraints OWNER TO postgres;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON TABLE target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT check_con ON target.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 12257 (class 1259 OID 148960)
+-- Name: table_for_del; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_del (
+);
+
+
+ALTER TABLE target.table_for_del OWNER TO postgres;
+
+--
+-- TOC entry 12271 (class 1259 OID 149172)
+-- Name: table_for_foreign_key; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_foreign_key (
+ col1 integer NOT NULL,
+ col2 "char",
+ col3 bigint
+);
+
+
+ALTER TABLE target.table_for_foreign_key OWNER TO postgres;
+
+--
+-- TOC entry 12263 (class 1259 OID 149013)
+-- Name: table_for_identical; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_identical OWNER TO postgres;
+
+--
+-- TOC entry 12261 (class 1259 OID 148986)
+-- Name: table_for_index; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_index OWNER TO postgres;
+
+--
+-- TOC entry 12270 (class 1259 OID 149144)
+-- Name: table_for_primary_key; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE target.table_for_primary_key OWNER TO postgres;
+
+--
+-- TOC entry 12265 (class 1259 OID 149034)
+-- Name: table_for_rule; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_rule OWNER TO postgres;
+
+--
+-- TOC entry 12267 (class 1259 OID 149066)
+-- Name: table_for_trigger; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_trigger OWNER TO postgres;
+
+
+--
+-- TOC entry 56906 (class 2606 OID 149097)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='15') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56906
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56910 (class 2606 OID 149176)
+-- Name: table_for_foreign_key table_for_foreign_key_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_foreign_key
+ ADD CONSTRAINT table_for_foreign_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148993)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56908 (class 2606 OID 149151)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56902 (class 2606 OID 149041)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56900 (class 2606 OID 149020)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 149073)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56893 (class 1259 OID 148994)
+-- Name: index1; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index1 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56894 (class 1259 OID 148995)
+-- Name: index2; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index2 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56898 (class 1259 OID 149021)
+-- Name: index_identical; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index_identical ON target.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56895 (class 1259 OID 149212)
+-- Name: index_same; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index_same ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56892 (class 1259 OID 139945)
+-- Name: mview_index; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX mview_index ON target."MView" USING btree (text text_pattern_ops);
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149042)
+-- Name: table_for_rule rule1; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO target.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 61045
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON RULE rule1 ON target.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61046 (class 2618 OID 149043)
+-- Name: table_for_rule rule2; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule2 AS
+ ON UPDATE TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61047 (class 2618 OID 149044)
+-- Name: table_for_rule rule3; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule3 AS
+ ON INSERT TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61050 (class 0 OID 139938)
+-- Dependencies: 12250 61062
+-- Name: MView; Type: MATERIALIZED VIEW DATA; Schema: target; Owner: postgres
+--
+
+REFRESH MATERIALIZED VIEW target."MView";
+
+
+--
+-- TOC entry 12284 (class 1259 OID 347823)
+-- Name: test view; Type: VIEW; Schema: target; Owner: postgres
+--
+
+CREATE VIEW target."test view" AS
+ SELECT pg_class.relname,
+ pg_class.relnamespace,
+ pg_class.reltype,
+ pg_class.reloftype,
+ pg_class.relowner,
+ pg_class.relam,
+ pg_class.relfilenode,
+ pg_class.reltablespace,
+ pg_class.relpages,
+ pg_class.reltuples,
+ pg_class.relallvisible,
+ pg_class.reltoastrelid,
+ pg_class.relhasindex,
+ pg_class.relisshared,
+ pg_class.relpersistence,
+ pg_class.relkind,
+ pg_class.relnatts,
+ pg_class.relchecks,
+ pg_class.relhasoids,
+ pg_class.relhaspkey,
+ pg_class.relhasrules,
+ pg_class.relhastriggers,
+ pg_class.relhassubclass,
+ pg_class.relrowsecurity,
+ pg_class.relforcerowsecurity,
+ pg_class.relispopulated,
+ pg_class.relreplident,
+ pg_class.relispartition,
+ pg_class.relfrozenxid,
+ pg_class.relminmxid,
+ pg_class.relacl,
+ pg_class.reloptions,
+ pg_class.relpartbound
+ FROM pg_class
+ LIMIT 10;
+
+
+ALTER TABLE target."test view" OWNER TO postgres;
+
+--
+-- TOC entry 12285 (class 1259 OID 347828)
+-- Name: test view f; Type: VIEW; Schema: target; Owner: postgres
+--
+
+CREATE VIEW target."test view f" WITH (security_barrier='true') AS
+ SELECT 2;
+
+
+ALTER TABLE target."test view f" OWNER TO postgres;
+
+--
+-- TOC entry 61105 (class 0 OID 0)
+-- Dependencies: 12285
+-- Name: VIEW "test view f"; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON VIEW target."test view f" IS 'cmn';
diff --git a/web/pgadmin/tools/schema_diff/tests/pg/12_plus/source.sql b/web/pgadmin/tools/schema_diff/tests/pg/12_plus/source.sql
new file mode 100644
index 000000000..8ef87e3bc
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/pg/12_plus/source.sql
@@ -0,0 +1,440 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:54:15 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- TOC entry 17 (class 2615 OID 139770)
+-- Name: source; Type: SCHEMA; Schema: -; Owner: postgres
+--
+
+CREATE SCHEMA source;
+
+
+ALTER SCHEMA source OWNER TO postgres;
+
+SET default_tablespace = '';
+
+
+CREATE EXTENSION btree_gist
+ SCHEMA source;
+
+--
+-- TOC entry 12272 (class 1259 OID 149205)
+-- Name: table_for_partition; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_partition (
+ col1 bigint NOT NULL
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE source.table_for_partition OWNER TO postgres;
+
+--
+-- TOC entry 12273 (class 1259 OID 149208)
+-- Name: part1; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.part1 (
+ col1 bigint NOT NULL
+);
+ALTER TABLE ONLY source.table_for_partition ATTACH PARTITION source.part1 FOR VALUES FROM ('1') TO ('23');
+
+
+ALTER TABLE source.part1 OWNER TO postgres;
+
+--
+-- TOC entry 12274 (class 1259 OID 149213)
+-- Name: table_for_partition_1; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_partition_1 (
+ col1 bigint
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE source.table_for_partition_1 OWNER TO postgres;
+
+--
+-- TOC entry 12275 (class 1259 OID 149216)
+-- Name: part3; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.part3 (
+ col1 bigint
+);
+ALTER TABLE ONLY source.table_for_partition_1 ATTACH PARTITION source.part3 FOR VALUES FROM ('1') TO ('10');
+
+
+ALTER TABLE source.part3 OWNER TO postgres;
+
+--
+-- TOC entry 12276 (class 1259 OID 149219)
+-- Name: part4; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.part4 (
+ col1 bigint
+);
+ALTER TABLE ONLY source.table_for_partition_1 ATTACH PARTITION source.part4 FOR VALUES FROM ('11') TO ('20');
+
+
+ALTER TABLE source.part4 OWNER TO postgres;
+
+--
+-- TOC entry 12258 (class 1259 OID 148963)
+-- Name: table_for_column; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_column (
+ col1 bigint NOT NULL,
+ col2 text,
+ col3 text
+);
+
+
+ALTER TABLE source.table_for_column OWNER TO postgres;
+
+--
+-- TOC entry 12256 (class 1259 OID 148895)
+-- Name: table_for_constraints; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_constraints OWNER TO postgres;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12256
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON TABLE source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 12262 (class 1259 OID 149004)
+-- Name: table_for_identical; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_identical OWNER TO postgres;
+
+--
+-- TOC entry 12260 (class 1259 OID 148977)
+-- Name: table_for_index; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_index OWNER TO postgres;
+
+--
+-- TOC entry 12269 (class 1259 OID 149128)
+-- Name: table_for_primary_key; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE source.table_for_primary_key OWNER TO postgres;
+
+--
+-- TOC entry 12264 (class 1259 OID 149024)
+-- Name: table_for_rule; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_rule OWNER TO postgres;
+
+--
+-- TOC entry 12266 (class 1259 OID 149048)
+-- Name: table_for_trigger; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_trigger OWNER TO postgres;
+
+--
+-- TOC entry 56893 (class 2606 OID 148904)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='12') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 56893
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56891 (class 2606 OID 148911)
+-- Name: table_for_constraints check_con; Type: CHECK CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE source.table_for_constraints
+ ADD CONSTRAINT check_con CHECK ((col1 > 10)) NOT VALID;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56891
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT check_con ON source.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 56899 (class 2606 OID 148970)
+-- Name: table_for_column table_for_column_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_column
+ ADD CONSTRAINT table_for_column_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56895 (class 2606 OID 148902)
+-- Name: table_for_constraints table_for_constraints_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT table_for_constraints_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 148984)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56913 (class 2606 OID 149135)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1, col2);
+
+
+--
+-- TOC entry 56909 (class 2606 OID 149031)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56907 (class 2606 OID 149011)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56911 (class 2606 OID 149055)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148913)
+-- Name: table_for_constraints unique; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "unique" UNIQUE (col1);
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 56897
+-- Name: CONSTRAINT "unique" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "unique" ON source.table_for_constraints IS 'cmnt';
+
+
+--
+-- TOC entry 56900 (class 1259 OID 149023)
+-- Name: index1; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index1 ON source.table_for_index USING btree (col2 varchar_pattern_ops);
+
+
+--
+-- TOC entry 56905 (class 1259 OID 149012)
+-- Name: index_identical; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index_identical ON source.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56901 (class 1259 OID 149211)
+-- Name: index_same; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index_same ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56902 (class 1259 OID 149022)
+-- Name: index_source; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index_source ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 61044 (class 2618 OID 149032)
+-- Name: table_for_rule rule1; Type: RULE; Schema: source; Owner: postgres
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO source.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61070 (class 0 OID 0)
+-- Dependencies: 61044
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON RULE rule1 ON source.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149033)
+-- Name: table_for_rule rule2; Type: RULE; Schema: source; Owner: postgres
+--
+
+CREATE RULE rule2 AS
+ ON INSERT TO source.table_for_rule DO NOTHING;
+
+--
+-- TOC entry 12283 (class 1259 OID 347818)
+-- Name: test view; Type: VIEW; Schema: source; Owner: postgres
+--
+
+CREATE VIEW source."test view" AS
+ SELECT pg_class.relname,
+ pg_class.relnamespace,
+ pg_class.reltype,
+ pg_class.reloftype,
+ pg_class.relowner,
+ pg_class.relam,
+ pg_class.relfilenode,
+ pg_class.reltablespace,
+ pg_class.relpages
+ FROM pg_class
+ LIMIT 10;
+
+
+ALTER TABLE source."test view" OWNER TO postgres;
+
+--
+-- TOC entry 12286 (class 1259 OID 347832)
+-- Name: test view f; Type: VIEW; Schema: source; Owner: postgres
+--
+
+CREATE VIEW source."test view f" WITH (security_barrier='false') AS
+ SELECT 2;
+
+
+ALTER TABLE source."test view f" OWNER TO postgres;
+
+--
+-- TOC entry 61111 (class 0 OID 0)
+-- Dependencies: 12286
+-- Name: VIEW "test view f"; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON VIEW source."test view f" IS 'cmn';
+
+--
+-- TOC entry 223 (class 1255 OID 67206)
+-- Name: dodaj_klijenta(character varying, character varying, character varying, character varying, integer, character varying, character varying, character varying, boolean, boolean, character varying, character varying, character varying, character varying, numeric, character varying); Type: PROCEDURE; Schema: public; Owner: postgres
+--
+
+CREATE PROCEDURE source.dodaj_klijenta(v_naziv character varying, v_oib character varying, v_pdv_id character varying, v_adresa character varying, v_mjesto integer, v_drzava character varying, v_tip_p_sub character varying, v_vlasnik character varying, v_pdv boolean, v_fisk boolean, v_iban character varying, v_k_osoba character varying, v_email character varying, v_br_tel character varying, v_radna_god numeric, v_schema character varying)
+ LANGUAGE sql
+ AS $$select 1;$$;
+
+
+ALTER PROCEDURE source.dodaj_klijenta(v_naziv character varying, v_oib character varying, v_pdv_id character varying, v_adresa character varying, v_mjesto integer, v_drzava character varying, v_tip_p_sub character varying, v_vlasnik character varying, v_pdv boolean, v_fisk boolean, v_iban character varying, v_k_osoba character varying, v_email character varying, v_br_tel character varying, v_radna_god numeric, v_schema character varying) OWNER TO postgres;
+
+--
+-- TOC entry 220 (class 1255 OID 67205)
+-- Name: proc1(bigint); Type: PROCEDURE; Schema: source; Owner: postgres
+--
+
+CREATE PROCEDURE source.proc1(arg1 bigint)
+ LANGUAGE sql
+ AS $$select 1;$$;
+
+
+ALTER PROCEDURE source.proc1(arg1 bigint) OWNER TO postgres;
diff --git a/web/pgadmin/tools/schema_diff/tests/pg/12_plus/target.sql b/web/pgadmin/tools/schema_diff/tests/pg/12_plus/target.sql
new file mode 100644
index 000000000..d57841744
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/pg/12_plus/target.sql
@@ -0,0 +1,417 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:55:22 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- TOC entry 18 (class 2615 OID 139771)
+-- Name: target; Type: SCHEMA; Schema: -; Owner: postgres
+--
+
+CREATE SCHEMA target;
+
+ALTER SCHEMA target OWNER TO postgres;
+
+SET default_tablespace = '';
+
+CREATE EXTENSION btree_gist
+ SCHEMA target;
+
+--
+-- TOC entry 12250 (class 1259 OID 139938)
+-- Name: MView; Type: MATERIALIZED VIEW; Schema: target; Owner: postgres
+--
+
+CREATE MATERIALIZED VIEW target."MView" AS
+ SELECT 'tekst'::text AS text
+ WITH NO DATA;
+
+
+ALTER TABLE target."MView" OWNER TO postgres;
+
+--
+-- TOC entry 12277 (class 1259 OID 149234)
+-- Name: table_for_partition_1; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_partition_1 (
+ col1 bigint
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE target.table_for_partition_1 OWNER TO postgres;
+
+--
+-- TOC entry 12278 (class 1259 OID 149237)
+-- Name: part3; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.part3 (
+ col1 bigint
+);
+ALTER TABLE ONLY target.table_for_partition_1 ATTACH PARTITION target.part3 FOR VALUES FROM ('13') TO ('56');
+
+
+ALTER TABLE target.part3 OWNER TO postgres;
+
+--
+-- TOC entry 12259 (class 1259 OID 148971)
+-- Name: table_for_column; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_column (
+ col1 bigint,
+ col2 bigint,
+ col4 text
+);
+
+
+ALTER TABLE target.table_for_column OWNER TO postgres;
+
+--
+-- TOC entry 12268 (class 1259 OID 149089)
+-- Name: table_for_constraints; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text,
+ CONSTRAINT check_con CHECK ((col1 > 30))
+);
+
+
+ALTER TABLE target.table_for_constraints OWNER TO postgres;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON TABLE target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT check_con ON target.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 12257 (class 1259 OID 148960)
+-- Name: table_for_del; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_del (
+);
+
+
+ALTER TABLE target.table_for_del OWNER TO postgres;
+
+--
+-- TOC entry 12271 (class 1259 OID 149172)
+-- Name: table_for_foreign_key; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_foreign_key (
+ col1 integer NOT NULL,
+ col2 "char",
+ col3 bigint
+);
+
+
+ALTER TABLE target.table_for_foreign_key OWNER TO postgres;
+
+--
+-- TOC entry 12263 (class 1259 OID 149013)
+-- Name: table_for_identical; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_identical OWNER TO postgres;
+
+--
+-- TOC entry 12261 (class 1259 OID 148986)
+-- Name: table_for_index; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_index OWNER TO postgres;
+
+--
+-- TOC entry 12270 (class 1259 OID 149144)
+-- Name: table_for_primary_key; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE target.table_for_primary_key OWNER TO postgres;
+
+--
+-- TOC entry 12265 (class 1259 OID 149034)
+-- Name: table_for_rule; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_rule OWNER TO postgres;
+
+--
+-- TOC entry 12267 (class 1259 OID 149066)
+-- Name: table_for_trigger; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_trigger OWNER TO postgres;
+
+
+--
+-- TOC entry 56906 (class 2606 OID 149097)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='15') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56906
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56910 (class 2606 OID 149176)
+-- Name: table_for_foreign_key table_for_foreign_key_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_foreign_key
+ ADD CONSTRAINT table_for_foreign_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148993)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56908 (class 2606 OID 149151)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56902 (class 2606 OID 149041)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56900 (class 2606 OID 149020)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 149073)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56893 (class 1259 OID 148994)
+-- Name: index1; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index1 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56894 (class 1259 OID 148995)
+-- Name: index2; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index2 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56898 (class 1259 OID 149021)
+-- Name: index_identical; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index_identical ON target.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56895 (class 1259 OID 149212)
+-- Name: index_same; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index_same ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56892 (class 1259 OID 139945)
+-- Name: mview_index; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX mview_index ON target."MView" USING btree (text text_pattern_ops);
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149042)
+-- Name: table_for_rule rule1; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO target.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 61045
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON RULE rule1 ON target.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61046 (class 2618 OID 149043)
+-- Name: table_for_rule rule2; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule2 AS
+ ON UPDATE TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61047 (class 2618 OID 149044)
+-- Name: table_for_rule rule3; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule3 AS
+ ON INSERT TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61050 (class 0 OID 139938)
+-- Dependencies: 12250 61062
+-- Name: MView; Type: MATERIALIZED VIEW DATA; Schema: target; Owner: postgres
+--
+
+REFRESH MATERIALIZED VIEW target."MView";
+
+--
+-- TOC entry 12284 (class 1259 OID 347823)
+-- Name: test view; Type: VIEW; Schema: target; Owner: postgres
+--
+
+CREATE VIEW target."test view" AS
+ SELECT pg_class.relname,
+ pg_class.relnamespace,
+ pg_class.reltype,
+ pg_class.reloftype,
+ pg_class.relowner,
+ pg_class.relam,
+ pg_class.relfilenode,
+ pg_class.reltablespace,
+ pg_class.relpages
+ FROM pg_class
+ LIMIT 10;
+
+
+ALTER TABLE target."test view" OWNER TO postgres;
+
+--
+-- TOC entry 12285 (class 1259 OID 347828)
+-- Name: test view f; Type: VIEW; Schema: target; Owner: postgres
+--
+
+CREATE VIEW target."test view f" WITH (security_barrier='true') AS
+ SELECT 2;
+
+
+ALTER TABLE target."test view f" OWNER TO postgres;
+
+--
+-- TOC entry 61105 (class 0 OID 0)
+-- Dependencies: 12285
+-- Name: VIEW "test view f"; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON VIEW target."test view f" IS 'cmn';
+
+
+--
+-- TOC entry 437 (class 1255 OID 112907)
+-- Name: dodaj_klijenta(character varying, character varying, character varying, character varying, integer, character varying, character varying, character varying, boolean, boolean, character varying, character varying, character varying, character varying, numeric, character varying); Type: PROCEDURE; Schema: target schema; Owner: postgres
+--
+
+CREATE PROCEDURE target.dodaj_klijenta(v_naziv character varying, v_oib character varying, v_pdv_id character varying, v_adresa character varying, v_mjesto integer, v_drzava character varying, v_tip_p_sub character varying, v_vlasnik character varying, v_pdv boolean, v_fisk boolean, v_iban character varying, v_k_osoba character varying, v_email character varying, v_br_tel character varying, v_radna_god numeric, v_schema character varying)
+ LANGUAGE sql
+ AS $$select 4;$$;
+
+
+ALTER PROCEDURE target.dodaj_klijenta(v_naziv character varying, v_oib character varying, v_pdv_id character varying, v_adresa character varying, v_mjesto integer, v_drzava character varying, v_tip_p_sub character varying, v_vlasnik character varying, v_pdv boolean, v_fisk boolean, v_iban character varying, v_k_osoba character varying, v_email character varying, v_br_tel character varying, v_radna_god numeric, v_schema character varying) OWNER TO postgres;
diff --git a/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/source.sql b/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/source.sql
new file mode 100644
index 000000000..af9054eeb
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/source.sql
@@ -0,0 +1,311 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:54:15 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+
+--
+-- TOC entry 17 (class 2615 OID 139770)
+-- Name: source; Type: SCHEMA; Schema: -; Owner: postgres
+--
+
+CREATE SCHEMA source;
+
+
+ALTER SCHEMA source OWNER TO postgres;
+
+SET default_tablespace = '';
+
+
+CREATE EXTENSION btree_gist
+ SCHEMA source;
+
+
+--
+-- TOC entry 12258 (class 1259 OID 148963)
+-- Name: table_for_column; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_column (
+ col1 bigint NOT NULL,
+ col2 text,
+ col3 text
+);
+
+
+ALTER TABLE source.table_for_column OWNER TO postgres;
+
+--
+-- TOC entry 12256 (class 1259 OID 148895)
+-- Name: table_for_constraints; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_constraints OWNER TO postgres;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12256
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON TABLE source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 12262 (class 1259 OID 149004)
+-- Name: table_for_identical; Type: TABLE; Schema: source; Owner: postgres;
+--
+
+CREATE TABLE source.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_identical OWNER TO postgres;;
+
+--
+-- TOC entry 12260 (class 1259 OID 148977)
+-- Name: table_for_index; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_index OWNER TO postgres;
+
+--
+-- TOC entry 12269 (class 1259 OID 149128)
+-- Name: table_for_primary_key; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE source.table_for_primary_key OWNER TO postgres;
+
+--
+-- TOC entry 12264 (class 1259 OID 149024)
+-- Name: table_for_rule; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_rule OWNER TO postgres;
+
+--
+-- TOC entry 12266 (class 1259 OID 149048)
+-- Name: table_for_trigger; Type: TABLE; Schema: source; Owner: postgres
+--
+
+CREATE TABLE source.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_trigger OWNER TO postgres;
+
+--
+-- TOC entry 56893 (class 2606 OID 148904)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='12') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 56893
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56891 (class 2606 OID 148911)
+-- Name: table_for_constraints check_con; Type: CHECK CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE source.table_for_constraints
+ ADD CONSTRAINT check_con CHECK ((col1 > 10)) NOT VALID;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56891
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT check_con ON source.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 56899 (class 2606 OID 148970)
+-- Name: table_for_column table_for_column_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_column
+ ADD CONSTRAINT table_for_column_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56895 (class 2606 OID 148902)
+-- Name: table_for_constraints table_for_constraints_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT table_for_constraints_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 148984)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56913 (class 2606 OID 149135)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1, col2);
+
+
+--
+-- TOC entry 56909 (class 2606 OID 149031)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56907 (class 2606 OID 149011)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres;
+--
+
+ALTER TABLE ONLY source.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56911 (class 2606 OID 149055)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148913)
+-- Name: table_for_constraints unique; Type: CONSTRAINT; Schema: source; Owner: postgres
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "unique" UNIQUE (col1);
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 56897
+-- Name: CONSTRAINT "unique" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "unique" ON source.table_for_constraints IS 'cmnt';
+
+
+--
+-- TOC entry 56900 (class 1259 OID 149023)
+-- Name: index1; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index1 ON source.table_for_index USING btree (col2 varchar_pattern_ops);
+
+
+--
+-- TOC entry 56905 (class 1259 OID 149012)
+-- Name: index_identical; Type: INDEX; Schema: source; Owner: postgres;
+--
+
+CREATE INDEX index_identical ON source.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56901 (class 1259 OID 149211)
+-- Name: index_same; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index_same ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56902 (class 1259 OID 149022)
+-- Name: index_source; Type: INDEX; Schema: source; Owner: postgres
+--
+
+CREATE INDEX index_source ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 61044 (class 2618 OID 149032)
+-- Name: table_for_rule rule1; Type: RULE; Schema: source; Owner: postgres
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO source.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61070 (class 0 OID 0)
+-- Dependencies: 61044
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: source; Owner: postgres
+--
+
+COMMENT ON RULE rule1 ON source.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149033)
+-- Name: table_for_rule rule2; Type: RULE; Schema: source; Owner: postgres
+--
+
+CREATE RULE rule2 AS
+ ON INSERT TO source.table_for_rule DO NOTHING;
+
diff --git a/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/target.sql b/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/target.sql
new file mode 100644
index 000000000..ddc4fda28
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/target.sql
@@ -0,0 +1,337 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:55:22 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+
+--
+-- TOC entry 18 (class 2615 OID 139771)
+-- Name: target; Type: SCHEMA; Schema: -; Owner: postgres
+--
+
+CREATE SCHEMA target;
+
+
+ALTER SCHEMA target OWNER TO postgres;
+
+SET default_tablespace = '';
+
+CREATE EXTENSION btree_gist
+ SCHEMA target;
+
+--
+-- TOC entry 12250 (class 1259 OID 139938)
+-- Name: MView; Type: MATERIALIZED VIEW; Schema: target; Owner: postgres
+--
+
+CREATE MATERIALIZED VIEW target."MView" AS
+ SELECT 'tekst'::text AS text
+ WITH NO DATA;
+
+
+ALTER TABLE target."MView" OWNER TO postgres;
+
+--
+-- TOC entry 12259 (class 1259 OID 148971)
+-- Name: table_for_column; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_column (
+ col1 bigint,
+ col2 bigint,
+ col4 text
+);
+
+
+ALTER TABLE target.table_for_column OWNER TO postgres;
+
+--
+-- TOC entry 12268 (class 1259 OID 149089)
+-- Name: table_for_constraints; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text,
+ CONSTRAINT check_con CHECK ((col1 > 30))
+);
+
+
+ALTER TABLE target.table_for_constraints OWNER TO postgres;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON TABLE target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT check_con ON target.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 12257 (class 1259 OID 148960)
+-- Name: table_for_del; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_del (
+);
+
+
+ALTER TABLE target.table_for_del OWNER TO postgres;
+
+--
+-- TOC entry 12271 (class 1259 OID 149172)
+-- Name: table_for_foreign_key; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_foreign_key (
+ col1 integer NOT NULL,
+ col2 "char",
+ col3 bigint
+);
+
+
+ALTER TABLE target.table_for_foreign_key OWNER TO postgres;
+
+--
+-- TOC entry 12263 (class 1259 OID 149013)
+-- Name: table_for_identical; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_identical OWNER TO postgres;
+
+--
+-- TOC entry 12261 (class 1259 OID 148986)
+-- Name: table_for_index; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_index OWNER TO postgres;
+
+--
+-- TOC entry 12270 (class 1259 OID 149144)
+-- Name: table_for_primary_key; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE target.table_for_primary_key OWNER TO postgres;
+
+--
+-- TOC entry 12265 (class 1259 OID 149034)
+-- Name: table_for_rule; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_rule OWNER TO postgres;
+
+--
+-- TOC entry 12267 (class 1259 OID 149066)
+-- Name: table_for_trigger; Type: TABLE; Schema: target; Owner: postgres
+--
+
+CREATE TABLE target.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_trigger OWNER TO postgres;
+
+
+--
+-- TOC entry 56906 (class 2606 OID 149097)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='15') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56906
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56910 (class 2606 OID 149176)
+-- Name: table_for_foreign_key table_for_foreign_key_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_foreign_key
+ ADD CONSTRAINT table_for_foreign_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148993)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56908 (class 2606 OID 149151)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56902 (class 2606 OID 149041)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56900 (class 2606 OID 149020)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 149073)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: target; Owner: postgres
+--
+
+ALTER TABLE ONLY target.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56893 (class 1259 OID 148994)
+-- Name: index1; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index1 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56894 (class 1259 OID 148995)
+-- Name: index2; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index2 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56898 (class 1259 OID 149021)
+-- Name: index_identical; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index_identical ON target.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56895 (class 1259 OID 149212)
+-- Name: index_same; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX index_same ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56892 (class 1259 OID 139945)
+-- Name: mview_index; Type: INDEX; Schema: target; Owner: postgres
+--
+
+CREATE INDEX mview_index ON target."MView" USING btree (text text_pattern_ops);
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149042)
+-- Name: table_for_rule rule1; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO target.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 61045
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: target; Owner: postgres
+--
+
+COMMENT ON RULE rule1 ON target.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61046 (class 2618 OID 149043)
+-- Name: table_for_rule rule2; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule2 AS
+ ON UPDATE TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61047 (class 2618 OID 149044)
+-- Name: table_for_rule rule3; Type: RULE; Schema: target; Owner: postgres
+--
+
+CREATE RULE rule3 AS
+ ON INSERT TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61050 (class 0 OID 139938)
+-- Dependencies: 12250 61062
+-- Name: MView; Type: MATERIALIZED VIEW DATA; Schema: target; Owner: postgres
+--
+
+REFRESH MATERIALIZED VIEW target."MView";
diff --git a/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/source.sql b/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/source.sql
new file mode 100644
index 000000000..b60dbcd55
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/source.sql
@@ -0,0 +1,376 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:54:15 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- TOC entry 17 (class 2615 OID 139770)
+-- Name: source; Type: SCHEMA; Schema: -; Owner: enterprisedb
+--
+
+CREATE SCHEMA source;
+
+
+ALTER SCHEMA source OWNER TO enterprisedb;
+
+SET default_tablespace = '';
+
+
+CREATE EXTENSION btree_gist
+ SCHEMA source;
+
+--
+-- TOC entry 12272 (class 1259 OID 149205)
+-- Name: table_for_partition; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_partition (
+ col1 bigint NOT NULL
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE source.table_for_partition OWNER TO enterprisedb;
+
+--
+-- TOC entry 12273 (class 1259 OID 149208)
+-- Name: part1; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.part1 (
+ col1 bigint NOT NULL
+);
+ALTER TABLE ONLY source.table_for_partition ATTACH PARTITION source.part1 FOR VALUES FROM ('1') TO ('23');
+
+
+ALTER TABLE source.part1 OWNER TO enterprisedb;
+
+--
+-- TOC entry 12274 (class 1259 OID 149213)
+-- Name: table_for_partition_1; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_partition_1 (
+ col1 bigint
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE source.table_for_partition_1 OWNER TO enterprisedb;
+
+--
+-- TOC entry 12275 (class 1259 OID 149216)
+-- Name: part3; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.part3 (
+ col1 bigint
+);
+ALTER TABLE ONLY source.table_for_partition_1 ATTACH PARTITION source.part3 FOR VALUES FROM ('1') TO ('10');
+
+
+ALTER TABLE source.part3 OWNER TO enterprisedb;
+
+--
+-- TOC entry 12276 (class 1259 OID 149219)
+-- Name: part4; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.part4 (
+ col1 bigint
+);
+ALTER TABLE ONLY source.table_for_partition_1 ATTACH PARTITION source.part4 FOR VALUES FROM ('11') TO ('20');
+
+
+ALTER TABLE source.part4 OWNER TO enterprisedb;
+
+--
+-- TOC entry 12258 (class 1259 OID 148963)
+-- Name: table_for_column; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_column (
+ col1 bigint NOT NULL,
+ col2 text,
+ col3 text
+);
+
+
+ALTER TABLE source.table_for_column OWNER TO enterprisedb;
+
+--
+-- TOC entry 12256 (class 1259 OID 148895)
+-- Name: table_for_constraints; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_constraints OWNER TO enterprisedb;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12256
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON TABLE source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 12262 (class 1259 OID 149004)
+-- Name: table_for_identical; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_identical OWNER TO enterprisedb;
+
+--
+-- TOC entry 12260 (class 1259 OID 148977)
+-- Name: table_for_index; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_index OWNER TO enterprisedb;
+
+--
+-- TOC entry 12269 (class 1259 OID 149128)
+-- Name: table_for_primary_key; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE source.table_for_primary_key OWNER TO enterprisedb;
+
+--
+-- TOC entry 12264 (class 1259 OID 149024)
+-- Name: table_for_rule; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_rule OWNER TO enterprisedb;
+
+--
+-- TOC entry 12266 (class 1259 OID 149048)
+-- Name: table_for_trigger; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_trigger OWNER TO enterprisedb;
+
+--
+-- TOC entry 56893 (class 2606 OID 148904)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='12') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 56893
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56891 (class 2606 OID 148911)
+-- Name: table_for_constraints check_con; Type: CHECK CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE source.table_for_constraints
+ ADD CONSTRAINT check_con CHECK ((col1 > 10)) NOT VALID;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56891
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT check_con ON source.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 56899 (class 2606 OID 148970)
+-- Name: table_for_column table_for_column_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_column
+ ADD CONSTRAINT table_for_column_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56895 (class 2606 OID 148902)
+-- Name: table_for_constraints table_for_constraints_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT table_for_constraints_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 148984)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56913 (class 2606 OID 149135)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1, col2);
+
+
+--
+-- TOC entry 56909 (class 2606 OID 149031)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56907 (class 2606 OID 149011)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56911 (class 2606 OID 149055)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148913)
+-- Name: table_for_constraints unique; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "unique" UNIQUE (col1);
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 56897
+-- Name: CONSTRAINT "unique" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT "unique" ON source.table_for_constraints IS 'cmnt';
+
+
+--
+-- TOC entry 56900 (class 1259 OID 149023)
+-- Name: index1; Type: INDEX; Schema: source; Owner: enterprisedb
+--
+
+CREATE INDEX index1 ON source.table_for_index USING btree (col2 varchar_pattern_ops);
+
+
+--
+-- TOC entry 56905 (class 1259 OID 149012)
+-- Name: index_identical; Type: INDEX; Schema: source; Owner: enterprisedb
+--
+
+CREATE INDEX index_identical ON source.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56901 (class 1259 OID 149211)
+-- Name: index_same; Type: INDEX; Schema: source; Owner: enterprisedb
+--
+
+CREATE INDEX index_same ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56902 (class 1259 OID 149022)
+-- Name: index_source; Type: INDEX; Schema: source; Owner: enterprisedb
+--
+
+CREATE INDEX index_source ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 61044 (class 2618 OID 149032)
+-- Name: table_for_rule rule1; Type: RULE; Schema: source; Owner: enterprisedb
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO source.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61070 (class 0 OID 0)
+-- Dependencies: 61044
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON RULE rule1 ON source.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149033)
+-- Name: table_for_rule rule2; Type: RULE; Schema: source; Owner: enterprisedb
+--
+
+CREATE RULE rule2 AS
+ ON INSERT TO source.table_for_rule DO NOTHING;
diff --git a/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/target.sql b/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/target.sql
new file mode 100644
index 000000000..57ef05d6a
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/target.sql
@@ -0,0 +1,364 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:55:22 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- TOC entry 18 (class 2615 OID 139771)
+-- Name: target; Type: SCHEMA; Schema: -; Owner: enterprisedb
+--
+
+CREATE SCHEMA target;
+
+ALTER SCHEMA target OWNER TO enterprisedb;
+
+SET default_tablespace = '';
+
+CREATE EXTENSION btree_gist
+ SCHEMA target;
+
+--
+-- TOC entry 12250 (class 1259 OID 139938)
+-- Name: MView; Type: MATERIALIZED VIEW; Schema: target; Owner: enterprisedb
+--
+
+CREATE MATERIALIZED VIEW target."MView" AS
+ SELECT 'tekst'::text AS text
+ WITH NO DATA;
+
+
+ALTER TABLE target."MView" OWNER TO enterprisedb;
+
+--
+-- TOC entry 12277 (class 1259 OID 149234)
+-- Name: table_for_partition_1; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_partition_1 (
+ col1 bigint
+)
+PARTITION BY RANGE (col1);
+
+
+ALTER TABLE target.table_for_partition_1 OWNER TO enterprisedb;
+
+--
+-- TOC entry 12278 (class 1259 OID 149237)
+-- Name: part3; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.part3 (
+ col1 bigint
+);
+ALTER TABLE ONLY target.table_for_partition_1 ATTACH PARTITION target.part3 FOR VALUES FROM ('13') TO ('56');
+
+
+ALTER TABLE target.part3 OWNER TO enterprisedb;
+
+--
+-- TOC entry 12259 (class 1259 OID 148971)
+-- Name: table_for_column; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_column (
+ col1 bigint,
+ col2 bigint,
+ col4 text
+);
+
+
+ALTER TABLE target.table_for_column OWNER TO enterprisedb;
+
+--
+-- TOC entry 12268 (class 1259 OID 149089)
+-- Name: table_for_constraints; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text,
+ CONSTRAINT check_con CHECK ((col1 > 30))
+);
+
+
+ALTER TABLE target.table_for_constraints OWNER TO enterprisedb;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: target; Owner: enterprisedb
+--
+
+COMMENT ON TABLE target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: target; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT check_con ON target.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 12257 (class 1259 OID 148960)
+-- Name: table_for_del; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_del (
+);
+
+
+ALTER TABLE target.table_for_del OWNER TO enterprisedb;
+
+--
+-- TOC entry 12271 (class 1259 OID 149172)
+-- Name: table_for_foreign_key; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_foreign_key (
+ col1 integer NOT NULL,
+ col2 "char",
+ col3 bigint
+);
+
+
+ALTER TABLE target.table_for_foreign_key OWNER TO enterprisedb;
+
+--
+-- TOC entry 12263 (class 1259 OID 149013)
+-- Name: table_for_identical; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_identical OWNER TO enterprisedb;
+
+--
+-- TOC entry 12261 (class 1259 OID 148986)
+-- Name: table_for_index; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_index OWNER TO enterprisedb;
+
+--
+-- TOC entry 12270 (class 1259 OID 149144)
+-- Name: table_for_primary_key; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE target.table_for_primary_key OWNER TO enterprisedb;
+
+--
+-- TOC entry 12265 (class 1259 OID 149034)
+-- Name: table_for_rule; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_rule OWNER TO enterprisedb;
+
+--
+-- TOC entry 12267 (class 1259 OID 149066)
+-- Name: table_for_trigger; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_trigger OWNER TO enterprisedb;
+
+
+--
+-- TOC entry 56906 (class 2606 OID 149097)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='15') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56906
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: target; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56910 (class 2606 OID 149176)
+-- Name: table_for_foreign_key table_for_foreign_key_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_foreign_key
+ ADD CONSTRAINT table_for_foreign_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148993)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56908 (class 2606 OID 149151)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56902 (class 2606 OID 149041)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56900 (class 2606 OID 149020)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 149073)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56893 (class 1259 OID 148994)
+-- Name: index1; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX index1 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56894 (class 1259 OID 148995)
+-- Name: index2; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX index2 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56898 (class 1259 OID 149021)
+-- Name: index_identical; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX index_identical ON target.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56895 (class 1259 OID 149212)
+-- Name: index_same; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX index_same ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56892 (class 1259 OID 139945)
+-- Name: mview_index; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX mview_index ON target."MView" USING btree (text text_pattern_ops);
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149042)
+-- Name: table_for_rule rule1; Type: RULE; Schema: target; Owner: enterprisedb
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO target.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 61045
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: target; Owner: enterprisedb
+--
+
+COMMENT ON RULE rule1 ON target.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61046 (class 2618 OID 149043)
+-- Name: table_for_rule rule2; Type: RULE; Schema: target; Owner: enterprisedb
+--
+
+CREATE RULE rule2 AS
+ ON UPDATE TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61047 (class 2618 OID 149044)
+-- Name: table_for_rule rule3; Type: RULE; Schema: target; Owner: enterprisedb
+--
+
+CREATE RULE rule3 AS
+ ON INSERT TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61050 (class 0 OID 139938)
+-- Dependencies: 12250 61062
+-- Name: MView; Type: MATERIALIZED VIEW DATA; Schema: target; Owner: enterprisedb
+--
+
+REFRESH MATERIALIZED VIEW target."MView";
diff --git a/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/source.sql b/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/source.sql
new file mode 100644
index 000000000..67ec216d6
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/source.sql
@@ -0,0 +1,311 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:54:15 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+
+--
+-- TOC entry 17 (class 2615 OID 139770)
+-- Name: source; Type: SCHEMA; Schema: -; Owner: enterprisedb
+--
+
+CREATE SCHEMA source;
+
+
+ALTER SCHEMA source OWNER TO enterprisedb;
+
+SET default_tablespace = '';
+
+
+CREATE EXTENSION btree_gist
+ SCHEMA source;
+
+
+--
+-- TOC entry 12258 (class 1259 OID 148963)
+-- Name: table_for_column; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_column (
+ col1 bigint NOT NULL,
+ col2 text,
+ col3 text
+);
+
+
+ALTER TABLE source.table_for_column OWNER TO enterprisedb;
+
+--
+-- TOC entry 12256 (class 1259 OID 148895)
+-- Name: table_for_constraints; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_constraints OWNER TO enterprisedb;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12256
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON TABLE source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 12262 (class 1259 OID 149004)
+-- Name: table_for_identical; Type: TABLE; Schema: source; Owner: enterprisedb;
+--
+
+CREATE TABLE source.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_identical OWNER TO enterprisedb;;
+
+--
+-- TOC entry 12260 (class 1259 OID 148977)
+-- Name: table_for_index; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_index OWNER TO enterprisedb;
+
+--
+-- TOC entry 12269 (class 1259 OID 149128)
+-- Name: table_for_primary_key; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE source.table_for_primary_key OWNER TO enterprisedb;
+
+--
+-- TOC entry 12264 (class 1259 OID 149024)
+-- Name: table_for_rule; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_rule OWNER TO enterprisedb;
+
+--
+-- TOC entry 12266 (class 1259 OID 149048)
+-- Name: table_for_trigger; Type: TABLE; Schema: source; Owner: enterprisedb
+--
+
+CREATE TABLE source.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE source.table_for_trigger OWNER TO enterprisedb;
+
+--
+-- TOC entry 56893 (class 2606 OID 148904)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='12') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 56893
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON source.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56891 (class 2606 OID 148911)
+-- Name: table_for_constraints check_con; Type: CHECK CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE source.table_for_constraints
+ ADD CONSTRAINT check_con CHECK ((col1 > 10)) NOT VALID;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56891
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT check_con ON source.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 56899 (class 2606 OID 148970)
+-- Name: table_for_column table_for_column_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_column
+ ADD CONSTRAINT table_for_column_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56895 (class 2606 OID 148902)
+-- Name: table_for_constraints table_for_constraints_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT table_for_constraints_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 148984)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56913 (class 2606 OID 149135)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1, col2);
+
+
+--
+-- TOC entry 56909 (class 2606 OID 149031)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56907 (class 2606 OID 149011)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb;
+--
+
+ALTER TABLE ONLY source.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56911 (class 2606 OID 149055)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148913)
+-- Name: table_for_constraints unique; Type: CONSTRAINT; Schema: source; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY source.table_for_constraints
+ ADD CONSTRAINT "unique" UNIQUE (col1);
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 56897
+-- Name: CONSTRAINT "unique" ON table_for_constraints; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT "unique" ON source.table_for_constraints IS 'cmnt';
+
+
+--
+-- TOC entry 56900 (class 1259 OID 149023)
+-- Name: index1; Type: INDEX; Schema: source; Owner: enterprisedb
+--
+
+CREATE INDEX index1 ON source.table_for_index USING btree (col2 varchar_pattern_ops);
+
+
+--
+-- TOC entry 56905 (class 1259 OID 149012)
+-- Name: index_identical; Type: INDEX; Schema: source; Owner: enterprisedb;
+--
+
+CREATE INDEX index_identical ON source.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56901 (class 1259 OID 149211)
+-- Name: index_same; Type: INDEX; Schema: source; Owner: enterprisedb
+--
+
+CREATE INDEX index_same ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56902 (class 1259 OID 149022)
+-- Name: index_source; Type: INDEX; Schema: source; Owner: enterprisedb
+--
+
+CREATE INDEX index_source ON source.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 61044 (class 2618 OID 149032)
+-- Name: table_for_rule rule1; Type: RULE; Schema: source; Owner: enterprisedb
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO source.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61070 (class 0 OID 0)
+-- Dependencies: 61044
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: source; Owner: enterprisedb
+--
+
+COMMENT ON RULE rule1 ON source.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149033)
+-- Name: table_for_rule rule2; Type: RULE; Schema: source; Owner: enterprisedb
+--
+
+CREATE RULE rule2 AS
+ ON INSERT TO source.table_for_rule DO NOTHING;
+
diff --git a/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/target.sql b/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/target.sql
new file mode 100644
index 000000000..f64765224
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/target.sql
@@ -0,0 +1,337 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 10.7
+-- Dumped by pg_dump version 12beta2
+
+-- Started on 2019-11-01 12:55:22 IST
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+
+--
+-- TOC entry 18 (class 2615 OID 139771)
+-- Name: target; Type: SCHEMA; Schema: -; Owner: enterprisedb
+--
+
+CREATE SCHEMA target;
+
+
+ALTER SCHEMA target OWNER TO enterprisedb;
+
+SET default_tablespace = '';
+
+CREATE EXTENSION btree_gist
+ SCHEMA target;
+
+--
+-- TOC entry 12250 (class 1259 OID 139938)
+-- Name: MView; Type: MATERIALIZED VIEW; Schema: target; Owner: enterprisedb
+--
+
+CREATE MATERIALIZED VIEW target."MView" AS
+ SELECT 'tekst'::text AS text
+ WITH NO DATA;
+
+
+ALTER TABLE target."MView" OWNER TO enterprisedb;
+
+--
+-- TOC entry 12259 (class 1259 OID 148971)
+-- Name: table_for_column; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_column (
+ col1 bigint,
+ col2 bigint,
+ col4 text
+);
+
+
+ALTER TABLE target.table_for_column OWNER TO enterprisedb;
+
+--
+-- TOC entry 12268 (class 1259 OID 149089)
+-- Name: table_for_constraints; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_constraints (
+ col1 integer NOT NULL,
+ col2 text,
+ CONSTRAINT check_con CHECK ((col1 > 30))
+);
+
+
+ALTER TABLE target.table_for_constraints OWNER TO enterprisedb;
+
+--
+-- TOC entry 61066 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: TABLE table_for_constraints; Type: COMMENT; Schema: target; Owner: enterprisedb
+--
+
+COMMENT ON TABLE target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 61067 (class 0 OID 0)
+-- Dependencies: 12268
+-- Name: CONSTRAINT check_con ON table_for_constraints; Type: COMMENT; Schema: target; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT check_con ON target.table_for_constraints IS 'coment';
+
+
+--
+-- TOC entry 12257 (class 1259 OID 148960)
+-- Name: table_for_del; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_del (
+);
+
+
+ALTER TABLE target.table_for_del OWNER TO enterprisedb;
+
+--
+-- TOC entry 12271 (class 1259 OID 149172)
+-- Name: table_for_foreign_key; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_foreign_key (
+ col1 integer NOT NULL,
+ col2 "char",
+ col3 bigint
+);
+
+
+ALTER TABLE target.table_for_foreign_key OWNER TO enterprisedb;
+
+--
+-- TOC entry 12263 (class 1259 OID 149013)
+-- Name: table_for_identical; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_identical (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_identical OWNER TO enterprisedb;
+
+--
+-- TOC entry 12261 (class 1259 OID 148986)
+-- Name: table_for_index; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_index (
+ col1 integer NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_index OWNER TO enterprisedb;
+
+--
+-- TOC entry 12270 (class 1259 OID 149144)
+-- Name: table_for_primary_key; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_primary_key (
+ col1 integer NOT NULL,
+ col2 text NOT NULL
+);
+
+
+ALTER TABLE target.table_for_primary_key OWNER TO enterprisedb;
+
+--
+-- TOC entry 12265 (class 1259 OID 149034)
+-- Name: table_for_rule; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_rule (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_rule OWNER TO enterprisedb;
+
+--
+-- TOC entry 12267 (class 1259 OID 149066)
+-- Name: table_for_trigger; Type: TABLE; Schema: target; Owner: enterprisedb
+--
+
+CREATE TABLE target.table_for_trigger (
+ col1 bigint NOT NULL,
+ col2 text
+);
+
+
+ALTER TABLE target.table_for_trigger OWNER TO enterprisedb;
+
+
+--
+-- TOC entry 56906 (class 2606 OID 149097)
+-- Name: table_for_constraints Exclusion; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_constraints
+ ADD CONSTRAINT "Exclusion" EXCLUDE USING gist (col2 WITH <>) WITH (fillfactor='15') WHERE ((col1 > 1)) DEFERRABLE INITIALLY DEFERRED;
+
+
+--
+-- TOC entry 61068 (class 0 OID 0)
+-- Dependencies: 56906
+-- Name: CONSTRAINT "Exclusion" ON table_for_constraints; Type: COMMENT; Schema: target; Owner: enterprisedb
+--
+
+COMMENT ON CONSTRAINT "Exclusion" ON target.table_for_constraints IS 'comments';
+
+
+--
+-- TOC entry 56910 (class 2606 OID 149176)
+-- Name: table_for_foreign_key table_for_foreign_key_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_foreign_key
+ ADD CONSTRAINT table_for_foreign_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56897 (class 2606 OID 148993)
+-- Name: table_for_index table_for_index_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_index
+ ADD CONSTRAINT table_for_index_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56908 (class 2606 OID 149151)
+-- Name: table_for_primary_key table_for_primary_key_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_primary_key
+ ADD CONSTRAINT table_for_primary_key_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56902 (class 2606 OID 149041)
+-- Name: table_for_rule table_for_rule_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_rule
+ ADD CONSTRAINT table_for_rule_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56900 (class 2606 OID 149020)
+-- Name: table_for_identical table_for_table_for_identical_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_identical
+ ADD CONSTRAINT table_for_table_for_identical_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56904 (class 2606 OID 149073)
+-- Name: table_for_trigger table_for_trigger_pkey; Type: CONSTRAINT; Schema: target; Owner: enterprisedb
+--
+
+ALTER TABLE ONLY target.table_for_trigger
+ ADD CONSTRAINT table_for_trigger_pkey PRIMARY KEY (col1);
+
+
+--
+-- TOC entry 56893 (class 1259 OID 148994)
+-- Name: index1; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX index1 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56894 (class 1259 OID 148995)
+-- Name: index2; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX index2 ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56898 (class 1259 OID 149021)
+-- Name: index_identical; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX index_identical ON target.table_for_identical USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56895 (class 1259 OID 149212)
+-- Name: index_same; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX index_same ON target.table_for_index USING btree (col2 text_pattern_ops);
+
+
+--
+-- TOC entry 56892 (class 1259 OID 139945)
+-- Name: mview_index; Type: INDEX; Schema: target; Owner: enterprisedb
+--
+
+CREATE INDEX mview_index ON target."MView" USING btree (text text_pattern_ops);
+
+
+--
+-- TOC entry 61045 (class 2618 OID 149042)
+-- Name: table_for_rule rule1; Type: RULE; Schema: target; Owner: enterprisedb
+--
+
+CREATE RULE rule1 AS
+ ON UPDATE TO target.table_for_rule DO INSTEAD NOTHING;
+
+
+--
+-- TOC entry 61069 (class 0 OID 0)
+-- Dependencies: 61045
+-- Name: RULE rule1 ON table_for_rule; Type: COMMENT; Schema: target; Owner: enterprisedb
+--
+
+COMMENT ON RULE rule1 ON target.table_for_rule IS 'comments';
+
+
+--
+-- TOC entry 61046 (class 2618 OID 149043)
+-- Name: table_for_rule rule2; Type: RULE; Schema: target; Owner: enterprisedb
+--
+
+CREATE RULE rule2 AS
+ ON UPDATE TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61047 (class 2618 OID 149044)
+-- Name: table_for_rule rule3; Type: RULE; Schema: target; Owner: enterprisedb
+--
+
+CREATE RULE rule3 AS
+ ON INSERT TO target.table_for_rule DO NOTHING;
+
+
+--
+-- TOC entry 61050 (class 0 OID 139938)
+-- Dependencies: 12250 61062
+-- Name: MView; Type: MATERIALIZED VIEW DATA; Schema: target; Owner: enterprisedb
+--
+
+REFRESH MATERIALIZED VIEW target."MView";
diff --git a/web/pgadmin/tools/schema_diff/tests/test_schema_diff_comp.py b/web/pgadmin/tools/schema_diff/tests/test_schema_diff_comp.py
new file mode 100644
index 000000000..3e790bc06
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/test_schema_diff_comp.py
@@ -0,0 +1,204 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import uuid
+import json
+import os
+import random
+
+from pgadmin.utils import server_utils as server_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression import parent_node_dict
+from regression.python_test_utils import test_utils as utils
+from .utils import create_table, create_schema, restore_schema
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.versioned_template_loader import \
+ get_version_mapping_directories
+
+
+class SchemaDiffTestCase(BaseTestGenerator):
+ """ This class will test the schema diff. """
+ scenarios = [
+ # Fetching default URL for database node.
+ ('Schema diff comparison', dict(
+ url='schema_diff/compare/{0}/{1}/{2}/{3}/{4}/{5}/{6}'))
+ ]
+
+ def setUp(self):
+ self.src_database = "db_schema_diff_src_%s" % str(uuid.uuid4())[1:8]
+ self.tar_database = "db_schema_diff_tar_%s" % str(uuid.uuid4())[1:8]
+
+ self.src_db_id = utils.create_database(self.server, self.src_database)
+ self.tar_db_id = utils.create_database(self.server, self.tar_database)
+
+ self.server = parent_node_dict["server"][-1]["server"]
+ self.server_id = parent_node_dict["server"][-1]["server_id"]
+ self.nodes = ['table', 'function', 'procedure', 'view', 'mview']
+ self.restore_backup()
+
+ def restore_backup(self):
+ self.sql_folder = self.get_sql_folder()
+
+ if self.sql_folder is None:
+ raise FileNotFoundError('Schema diff folder does not exists')
+
+ src_sql_path = os.path.join(self.sql_folder, 'source.sql')
+ tar_sql_path = os.path.join(self.sql_folder, 'target.sql')
+
+ if not os.path.exists(src_sql_path):
+ raise FileNotFoundError(
+ '{} file does not exists'.format(src_sql_path))
+
+ if not os.path.exists(tar_sql_path):
+ raise FileNotFoundError(
+ '{} file does not exists'.format(tar_sql_path))
+
+ self.src_schema_id = restore_schema(self.server, self.src_database,
+ 'source', src_sql_path)
+ self.tar_schema_id = restore_schema(self.server, self.tar_database,
+ 'target', tar_sql_path)
+
+ def get_sql_folder(self):
+ """
+ This function will get the appropriate test folder based on
+ server version and their existence.
+
+ :param module_path: Path of the module to be tested.
+ :return:
+ """
+ # Join the application path, module path and tests folder
+ tests_folder_path = os.path.dirname(os.path.abspath(__file__))
+
+ # A folder name matching the Server Type (pg, ppas) takes priority so
+ # check whether that exists or not. If so, than check the version
+ # folder in it, else look directly in the 'tests' folder.
+ absolute_path = os.path.join(tests_folder_path, self.server['type'])
+ if not os.path.exists(absolute_path):
+ absolute_path = tests_folder_path
+
+ # Iterate the version mapping directories.
+ for version_mapping in get_version_mapping_directories(
+ self.server['type']):
+ if version_mapping['number'] > \
+ self.server_information['server_version']:
+ continue
+
+ complete_path = os.path.join(absolute_path,
+ version_mapping['name'])
+
+ if os.path.exists(complete_path):
+ return complete_path
+
+ return None
+
+ def compare(self):
+ comp_url = self.url.format(self.trans_id, self.server_id,
+ self.src_db_id,
+ self.src_schema_id,
+ self.server_id,
+ self.tar_db_id,
+ self.tar_schema_id
+ )
+
+ response = self.tester.get(comp_url)
+
+ self.assertEquals(response.status_code, 200)
+ return json.loads(response.data.decode('utf-8'))
+
+ def runTest(self):
+ """ This function will test the schema diff."""
+
+ response = self.tester.get("schema_diff/initialize")
+ self.assertEquals(response.status_code, 200)
+ response_data = json.loads(response.data.decode('utf-8'))
+ self.trans_id = response_data['data']['schemaDiffTransId']
+
+ url = 'schema_diff/server/connect/{}'.format(self.server_id)
+ data = {'password': self.server['db_password']}
+ response = self.tester.post(url,
+ data=json.dumps(data),
+ content_type='html/json'
+ )
+ response = self.tester.post(
+ 'schema_diff/database/connect/{0}/{1}'.format(
+ self.server_id,
+ self.src_db_id))
+ response = self.tester.post(
+ 'schema_diff/database/connect/{0}/{1}'.format(
+ self.server_id,
+ self.tar_db_id))
+
+ response_data = self.compare()
+
+ diff_file = os.path.join(self.sql_folder, 'diff_{0}.sql'.format(
+ str(random.randint(1, 99999))))
+ file_obj = open(diff_file, 'a')
+
+ for diff in response_data['data']:
+ if diff['type'] in self.nodes:
+ src_obj_oid = tar_obj_oid = None
+ if diff['status'] == 'Source Only' or\
+ diff['status'] == 'Target Only':
+ src_obj_oid = tar_obj_oid = diff['oid']
+ elif diff['status'] == 'Different':
+ src_obj_oid = diff['source_oid']
+ tar_obj_oid = diff['target_oid']
+
+ if src_obj_oid is not None:
+ url = 'schema_diff/ddl_compare/{0}/{1}/{2}/{3}/{4}/{5}/' \
+ '{6}/{7}/{8}/{9}/{10}/'.format(self.trans_id,
+ self.server_id,
+ self.src_db_id,
+ self.src_schema_id,
+ self.server_id,
+ self.tar_db_id,
+ self.tar_schema_id,
+ src_obj_oid,
+ tar_obj_oid,
+ diff['type'],
+ diff['status']
+ )
+
+ response = self.tester.get(url)
+
+ self.assertEquals(response.status_code, 200)
+ response_data = json.loads(response.data.decode('utf-8'))
+ file_obj.write(response_data['diff_ddl'])
+
+ file_obj.close()
+ try:
+ restore_schema(self.server, self.tar_database, 'target',
+ diff_file)
+
+ os.remove(diff_file)
+
+ response_data = self.compare()
+ for diff in response_data['data']:
+ if diff['type'] in self.nodes:
+ self.assertEquals(diff['status'], 'Identical')
+ except Exception as e:
+ os.remove(diff_file)
+
+ def tearDown(self):
+ """This function drop the added database"""
+ connection = utils.get_db_connection(self.server['db'],
+ self.server['username'],
+ self.server['db_password'],
+ self.server['host'],
+ self.server['port'],
+ self.server['sslmode'])
+ utils.drop_database(connection, self.src_database)
+ connection = utils.get_db_connection(self.server['db'],
+ self.server['username'],
+ self.server['db_password'],
+ self.server['host'],
+ self.server['port'],
+ self.server['sslmode'])
+ utils.drop_database(connection, self.tar_database)
diff --git a/web/pgadmin/tools/schema_diff/tests/utils.py b/web/pgadmin/tools/schema_diff/tests/utils.py
new file mode 100644
index 000000000..ee513e490
--- /dev/null
+++ b/web/pgadmin/tools/schema_diff/tests/utils.py
@@ -0,0 +1,103 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import sys
+import traceback
+
+from regression.python_test_utils import test_utils as utils
+from pgadmin.browser.server_groups.servers.databases.schemas.tests import \
+ utils as schema_utils
+
+
+def restore_schema(server, db_name, schema_name, sql_path):
+ connection = utils.get_db_connection(db_name,
+ server['username'],
+ server['db_password'],
+ server['host'],
+ server['port'],
+ server['sslmode']
+ )
+
+ old_isolation_level = connection.isolation_level
+ connection.set_isolation_level(0)
+ pg_cursor = connection.cursor()
+
+ sql = ''
+ with open(sql_path, 'r') as content_file:
+ sql = content_file.read()
+ pg_cursor.execute(sql)
+ connection.set_isolation_level(old_isolation_level)
+ connection.commit()
+
+ SQL = """SELECT
+ nsp.oid
+FROM
+ pg_namespace nsp
+ WHERE nsp.nspname = '{0}'""".format(schema_name)
+
+ pg_cursor.execute(SQL)
+ schema = pg_cursor.fetchone()
+ schema_id = None
+ if schema:
+ schema_id = schema[0]
+ connection.close()
+ return schema_id
+
+
+def create_schema(server, db_name, schema_name):
+ connection = utils.get_db_connection(db_name,
+ server['username'],
+ server['db_password'],
+ server['host'],
+ server['port'],
+ server['sslmode']
+ )
+ return schema_utils.create_schema(connection, schema_name)
+
+
+def create_table(server, db_name, schema_id, table_name, query):
+ """
+ This function creates a table under provided schema.
+ :param server: server details
+ :type server: dict
+ :param db_name: database name
+ :type db_name: str
+ :param schema_id: schema oid
+ :type schema_name: int
+ :param table_name: table name
+ :type table_name: str
+ :return table_id: table id
+ :rtype: int
+ """
+ try:
+ connection = utils.get_db_connection(db_name,
+ server['username'],
+ server['db_password'],
+ server['host'],
+ server['port'],
+ server['sslmode'])
+ old_isolation_level = connection.isolation_level
+ connection.set_isolation_level(0)
+ pg_cursor = connection.cursor()
+ pg_cursor.execute(query)
+ connection.set_isolation_level(old_isolation_level)
+ connection.commit()
+ # Get 'oid' from newly created table
+ pg_cursor.execute("SELECT oid FROM pg_class WHERE relname='{0}'"
+ " AND relnamespace = {1}".format(table_name,
+ schema_id))
+ table = pg_cursor.fetchone()
+ table_id = ''
+ if table:
+ table_id = table[0]
+ connection.close()
+ return table_id
+ except Exception:
+ traceback.print_exc(file=sys.stderr)
+ raise
diff --git a/web/pgadmin/tools/sqleditor/__init__.py b/web/pgadmin/tools/sqleditor/__init__.py
index 63fb45a5c..da612da1f 100644
--- a/web/pgadmin/tools/sqleditor/__init__.py
+++ b/web/pgadmin/tools/sqleditor/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/command.py b/web/pgadmin/tools/sqleditor/command.py
index 3e4549cb1..05268f6d4 100644
--- a/web/pgadmin/tools/sqleditor/command.py
+++ b/web/pgadmin/tools/sqleditor/command.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
index ab91f9bb2..e6c2a9f50 100644
--- a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
+++ b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
@@ -84,6 +84,8 @@ define('tools.querytool', [
this.handler.preferences = this.preferences;
this.connIntervalId = null;
this.layout = opts.layout;
+ this.set_server_version(opts.server_ver);
+ this.trigger('pgadmin-sqleditor:view:initialised');
},
// Bind all the events
@@ -2318,6 +2320,12 @@ define('tools.querytool', [
}
},
+ set_value_to_editor: function(query) {
+ if (this.gridView && this.gridView.query_tool_obj && !_.isUndefined(query)) {
+ this.gridView.query_tool_obj.setValue(query);
+ }
+ },
+
init_events: function() {
var self = this;
// Listen to the file manager button events
diff --git a/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/primary_keys.sql b/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/primary_keys.sql
index a96c928f6..d1e398579 100644
--- a/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/primary_keys.sql
+++ b/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/primary_keys.sql
@@ -4,5 +4,5 @@ SELECT at.attname, at.attnum, ty.typname
FROM pg_attribute at LEFT JOIN pg_type ty ON (ty.oid = at.atttypid)
WHERE attrelid={{obj_id}}::oid AND attnum = ANY (
(SELECT con.conkey FROM pg_class rel LEFT OUTER JOIN pg_constraint con ON con.conrelid=rel.oid
- AND con.contype='p' WHERE rel.relkind IN ('r','s','t') AND rel.oid = {{obj_id}}::oid)::oid[])
+ AND con.contype='p' WHERE rel.relkind IN ('r','s','t') AND rel.oid = ({{obj_id}})::oid)::oid[])
{% endif %}
diff --git a/web/pgadmin/tools/sqleditor/tests/__init__.py b/web/pgadmin/tools/sqleditor/tests/__init__.py
index 7af45b1b5..168bc2e9b 100644
--- a/web/pgadmin/tools/sqleditor/tests/__init__.py
+++ b/web/pgadmin/tools/sqleditor/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/tests/execute_query_test_utils.py b/web/pgadmin/tools/sqleditor/tests/execute_query_test_utils.py
index 69058a743..af10564dc 100644
--- a/web/pgadmin/tools/sqleditor/tests/execute_query_test_utils.py
+++ b/web/pgadmin/tools/sqleditor/tests/execute_query_test_utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/tests/test_download_csv_query_tool.py b/web/pgadmin/tools/sqleditor/tests/test_download_csv_query_tool.py
index f4a72f05e..f3652fc05 100644
--- a/web/pgadmin/tools/sqleditor/tests/test_download_csv_query_tool.py
+++ b/web/pgadmin/tools/sqleditor/tests/test_download_csv_query_tool.py
@@ -3,7 +3,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/tests/test_editor_history.py b/web/pgadmin/tools/sqleditor/tests/test_editor_history.py
index 42b28489e..f94c2598f 100644
--- a/web/pgadmin/tools/sqleditor/tests/test_editor_history.py
+++ b/web/pgadmin/tools/sqleditor/tests/test_editor_history.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/tests/test_encoding_charset.py b/web/pgadmin/tools/sqleditor/tests/test_encoding_charset.py
index 539787557..d5aa30c9b 100644
--- a/web/pgadmin/tools/sqleditor/tests/test_encoding_charset.py
+++ b/web/pgadmin/tools/sqleditor/tests/test_encoding_charset.py
@@ -3,7 +3,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/tests/test_explain_plan.py b/web/pgadmin/tools/sqleditor/tests/test_explain_plan.py
index 8da233938..daff5ba82 100644
--- a/web/pgadmin/tools/sqleditor/tests/test_explain_plan.py
+++ b/web/pgadmin/tools/sqleditor/tests/test_explain_plan.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/tests/test_explain_plan_templates.py b/web/pgadmin/tools/sqleditor/tests/test_explain_plan_templates.py
index aaa50acb9..dfa6e0b7e 100644
--- a/web/pgadmin/tools/sqleditor/tests/test_explain_plan_templates.py
+++ b/web/pgadmin/tools/sqleditor/tests/test_explain_plan_templates.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/tests/test_extract_sql_from_network_parameters.py b/web/pgadmin/tools/sqleditor/tests/test_extract_sql_from_network_parameters.py
index 0d10c94d4..9b19491f4 100644
--- a/web/pgadmin/tools/sqleditor/tests/test_extract_sql_from_network_parameters.py
+++ b/web/pgadmin/tools/sqleditor/tests/test_extract_sql_from_network_parameters.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/tests/test_poll_query_tool.py b/web/pgadmin/tools/sqleditor/tests/test_poll_query_tool.py
index 774fb46df..5b4b354b4 100644
--- a/web/pgadmin/tools/sqleditor/tests/test_poll_query_tool.py
+++ b/web/pgadmin/tools/sqleditor/tests/test_poll_query_tool.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/tests/test_sql_ascii_encoding.py b/web/pgadmin/tools/sqleditor/tests/test_sql_ascii_encoding.py
index e3f12d57d..a63a2dead 100644
--- a/web/pgadmin/tools/sqleditor/tests/test_sql_ascii_encoding.py
+++ b/web/pgadmin/tools/sqleditor/tests/test_sql_ascii_encoding.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/tests/test_start_query_tool.py b/web/pgadmin/tools/sqleditor/tests/test_start_query_tool.py
index c69fc5e6d..a5a6aa45f 100644
--- a/web/pgadmin/tools/sqleditor/tests/test_start_query_tool.py
+++ b/web/pgadmin/tools/sqleditor/tests/test_start_query_tool.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/tests/test_transaction_status.py b/web/pgadmin/tools/sqleditor/tests/test_transaction_status.py
index 589041acc..59c855fb8 100644
--- a/web/pgadmin/tools/sqleditor/tests/test_transaction_status.py
+++ b/web/pgadmin/tools/sqleditor/tests/test_transaction_status.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/tests/test_view_data.py b/web/pgadmin/tools/sqleditor/tests/test_view_data.py
index 3466e5c7c..1096d5f63 100644
--- a/web/pgadmin/tools/sqleditor/tests/test_view_data.py
+++ b/web/pgadmin/tools/sqleditor/tests/test_view_data.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/tests/test_view_data_templates.py b/web/pgadmin/tools/sqleditor/tests/test_view_data_templates.py
index cf76cd7b2..6c9603630 100644
--- a/web/pgadmin/tools/sqleditor/tests/test_view_data_templates.py
+++ b/web/pgadmin/tools/sqleditor/tests/test_view_data_templates.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/utils/__init__.py b/web/pgadmin/tools/sqleditor/utils/__init__.py
index e6b6a2c14..f0953754a 100644
--- a/web/pgadmin/tools/sqleditor/utils/__init__.py
+++ b/web/pgadmin/tools/sqleditor/utils/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/utils/apply_explain_plan_wrapper.py b/web/pgadmin/tools/sqleditor/utils/apply_explain_plan_wrapper.py
index 2b5ee5d12..989f97792 100644
--- a/web/pgadmin/tools/sqleditor/utils/apply_explain_plan_wrapper.py
+++ b/web/pgadmin/tools/sqleditor/utils/apply_explain_plan_wrapper.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/utils/constant_definition.py b/web/pgadmin/tools/sqleditor/utils/constant_definition.py
index 1f3296b63..64eb5c194 100644
--- a/web/pgadmin/tools/sqleditor/utils/constant_definition.py
+++ b/web/pgadmin/tools/sqleditor/utils/constant_definition.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/utils/filter_dialog.py b/web/pgadmin/tools/sqleditor/utils/filter_dialog.py
index 62baab3de..4edb50817 100644
--- a/web/pgadmin/tools/sqleditor/utils/filter_dialog.py
+++ b/web/pgadmin/tools/sqleditor/utils/filter_dialog.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/utils/get_column_types.py b/web/pgadmin/tools/sqleditor/utils/get_column_types.py
index 5484985be..74b2e2f60 100644
--- a/web/pgadmin/tools/sqleditor/utils/get_column_types.py
+++ b/web/pgadmin/tools/sqleditor/utils/get_column_types.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -35,12 +35,13 @@ def get_columns_types(is_query_tool, columns_info, table_oid, conn, has_oids):
column_types[col['name']] = col_type
if not is_query_tool:
- col_type['not_null'] = col['not_null'] = \
- rset['rows'][key]['not_null']
+ if key in rset['rows']:
+ col_type['not_null'] = col['not_null'] = \
+ rset['rows'][key]['not_null']
- col_type['has_default_val'] = \
- col['has_default_val'] = \
- rset['rows'][key]['has_default_val']
+ col_type['has_default_val'] = \
+ col['has_default_val'] = \
+ rset['rows'][key]['has_default_val']
else:
for row in rset['rows']:
diff --git a/web/pgadmin/tools/sqleditor/utils/is_begin_required.py b/web/pgadmin/tools/sqleditor/utils/is_begin_required.py
index 52a20df7f..2f8194277 100644
--- a/web/pgadmin/tools/sqleditor/utils/is_begin_required.py
+++ b/web/pgadmin/tools/sqleditor/utils/is_begin_required.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/utils/is_query_resultset_updatable.py b/web/pgadmin/tools/sqleditor/utils/is_query_resultset_updatable.py
index d64cec54a..0582ca3ab 100644
--- a/web/pgadmin/tools/sqleditor/utils/is_query_resultset_updatable.py
+++ b/web/pgadmin/tools/sqleditor/utils/is_query_resultset_updatable.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/utils/query_tool_fs_utils.py b/web/pgadmin/tools/sqleditor/utils/query_tool_fs_utils.py
index df31e62d0..ce24821fe 100644
--- a/web/pgadmin/tools/sqleditor/utils/query_tool_fs_utils.py
+++ b/web/pgadmin/tools/sqleditor/utils/query_tool_fs_utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/utils/query_tool_preferences.py b/web/pgadmin/tools/sqleditor/utils/query_tool_preferences.py
index 114046f6c..c465598b2 100644
--- a/web/pgadmin/tools/sqleditor/utils/query_tool_preferences.py
+++ b/web/pgadmin/tools/sqleditor/utils/query_tool_preferences.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/utils/save_changed_data.py b/web/pgadmin/tools/sqleditor/utils/save_changed_data.py
index 9bb68a398..cdfdc2116 100644
--- a/web/pgadmin/tools/sqleditor/utils/save_changed_data.py
+++ b/web/pgadmin/tools/sqleditor/utils/save_changed_data.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/utils/start_running_query.py b/web/pgadmin/tools/sqleditor/utils/start_running_query.py
index b4d213992..927e91d02 100644
--- a/web/pgadmin/tools/sqleditor/utils/start_running_query.py
+++ b/web/pgadmin/tools/sqleditor/utils/start_running_query.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/utils/tests/__init__.py b/web/pgadmin/tools/sqleditor/utils/tests/__init__.py
index 7af45b1b5..168bc2e9b 100644
--- a/web/pgadmin/tools/sqleditor/utils/tests/__init__.py
+++ b/web/pgadmin/tools/sqleditor/utils/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/utils/tests/test_apply_explain_plan_wrapper.py b/web/pgadmin/tools/sqleditor/utils/tests/test_apply_explain_plan_wrapper.py
index e219f9381..3cd0f83b0 100644
--- a/web/pgadmin/tools/sqleditor/utils/tests/test_apply_explain_plan_wrapper.py
+++ b/web/pgadmin/tools/sqleditor/utils/tests/test_apply_explain_plan_wrapper.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/utils/tests/test_filter_dialog_callbacks.py b/web/pgadmin/tools/sqleditor/utils/tests/test_filter_dialog_callbacks.py
index c72159313..bd0585163 100644
--- a/web/pgadmin/tools/sqleditor/utils/tests/test_filter_dialog_callbacks.py
+++ b/web/pgadmin/tools/sqleditor/utils/tests/test_filter_dialog_callbacks.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/utils/tests/test_is_query_resultset_updatable.py b/web/pgadmin/tools/sqleditor/utils/tests/test_is_query_resultset_updatable.py
index aae642dc8..8b451174a 100644
--- a/web/pgadmin/tools/sqleditor/utils/tests/test_is_query_resultset_updatable.py
+++ b/web/pgadmin/tools/sqleditor/utils/tests/test_is_query_resultset_updatable.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/utils/tests/test_query_tool_fs_utils.py b/web/pgadmin/tools/sqleditor/utils/tests/test_query_tool_fs_utils.py
index 541f4e7e9..3174ffa84 100644
--- a/web/pgadmin/tools/sqleditor/utils/tests/test_query_tool_fs_utils.py
+++ b/web/pgadmin/tools/sqleditor/utils/tests/test_query_tool_fs_utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/utils/tests/test_save_changed_data.py b/web/pgadmin/tools/sqleditor/utils/tests/test_save_changed_data.py
index f959b2b4b..a0cb9f766 100644
--- a/web/pgadmin/tools/sqleditor/utils/tests/test_save_changed_data.py
+++ b/web/pgadmin/tools/sqleditor/utils/tests/test_save_changed_data.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/utils/tests/test_start_running_query.py b/web/pgadmin/tools/sqleditor/utils/tests/test_start_running_query.py
index 9f5f1f4b0..2c0ec3e21 100644
--- a/web/pgadmin/tools/sqleditor/utils/tests/test_start_running_query.py
+++ b/web/pgadmin/tools/sqleditor/utils/tests/test_start_running_query.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/sqleditor/utils/update_session_grid_transaction.py b/web/pgadmin/tools/sqleditor/utils/update_session_grid_transaction.py
index 41dbf95ee..ea5ae3c4a 100644
--- a/web/pgadmin/tools/sqleditor/utils/update_session_grid_transaction.py
+++ b/web/pgadmin/tools/sqleditor/utils/update_session_grid_transaction.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/templates/js/translations.js b/web/pgadmin/tools/templates/js/translations.js
index 74dae1fbf..64541d2be 100644
--- a/web/pgadmin/tools/templates/js/translations.js
+++ b/web/pgadmin/tools/templates/js/translations.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/tools/user_management/__init__.py b/web/pgadmin/tools/user_management/__init__.py
index 55365173f..26407a86e 100644
--- a/web/pgadmin/tools/user_management/__init__.py
+++ b/web/pgadmin/tools/user_management/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/tools/user_management/static/js/user_management.js b/web/pgadmin/tools/user_management/static/js/user_management.js
index 64014863f..b1156bf4f 100644
--- a/web/pgadmin/tools/user_management/static/js/user_management.js
+++ b/web/pgadmin/tools/user_management/static/js/user_management.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/tools/user_management/templates/user_management/js/current_user.js b/web/pgadmin/tools/user_management/templates/user_management/js/current_user.js
index cfcb77813..fc1aed7d4 100644
--- a/web/pgadmin/tools/user_management/templates/user_management/js/current_user.js
+++ b/web/pgadmin/tools/user_management/templates/user_management/js/current_user.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/pgadmin/translations/de/LC_MESSAGES/messages.mo b/web/pgadmin/translations/de/LC_MESSAGES/messages.mo
index 20539ec24a0759959b21d56f5d66c87d182883ed..1a42bca2c35858ce2d12d1f6d53f5f06614699c0 100644
GIT binary patch
delta 21996
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
delta 21920
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
diff --git a/web/pgadmin/translations/de/LC_MESSAGES/messages.po b/web/pgadmin/translations/de/LC_MESSAGES/messages.po
index 0ff5f7096..9dfb7d0eb 100644
--- a/web/pgadmin/translations/de/LC_MESSAGES/messages.po
+++ b/web/pgadmin/translations/de/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: pgAdmin 4\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-01-03 19:02+0530\n"
+"POT-Creation-Date: 2019-12-06 19:29+0530\n"
"PO-Revision-Date: 2017-04-14 22:53+0200\n"
"Last-Translator: Jonas Thelemann\n"
"Language: de\n"
@@ -47,13 +47,13 @@ msgstr "Desktop"
#: pgadmin/static/js/slickgrid/editors.js:50
#: pgadmin/static/js/slickgrid/editors.js:60
#: pgadmin/static/js/slickgrid/editors.js:61
-#: pgadmin/static/js/sqleditor/filter_dialog.js:84
-#: pgadmin/tools/datagrid/static/js/show_data.js:143
-#: pgadmin/tools/datagrid/static/js/show_data.js:218
+#: pgadmin/static/js/sqleditor/filter_dialog.js:83
+#: pgadmin/tools/datagrid/static/js/show_data.js:142
+#: pgadmin/tools/datagrid/static/js/show_data.js:217
#: pgadmin/tools/import_export/static/js/import_export.js:500
-#: pgadmin/tools/maintenance/static/js/maintenance.js:302
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2005
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2035
+#: pgadmin/tools/maintenance/static/js/maintenance.js:301
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1999
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2029
msgid "OK"
msgstr "OK"
@@ -456,7 +456,7 @@ msgstr "Erforderliche Eigenschaften fehlen."
#: pgadmin/browser/utils.py:386
#: pgadmin/static/js/alertify.pgadmin.defaults.js:102
#: pgadmin/static/js/alertify.pgadmin.defaults.js:163
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:305
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:303
#: pgadmin/tools/grant_wizard/__init__.py:129 pgadmin/utils/exception.py:35
msgid "Connection to the server has been lost."
msgstr "Die Verbindung zum Server wurde unterbrochen."
@@ -577,7 +577,7 @@ msgid "No parameters were changed."
msgstr ""
#: pgadmin/browser/server_groups/servers/__init__.py:767
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:567
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:562
#: pgadmin/browser/server_groups/servers/databases/casts/__init__.py:370
#: pgadmin/browser/server_groups/servers/databases/extensions/__init__.py:264
#: pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py:395
@@ -599,7 +599,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:365
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:569
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/__init__.py:436
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:888
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:922
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:393
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py:484
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py:478
@@ -772,33 +772,33 @@ msgstr "Konnte nicht das Hilfsprogramm für die Operation '%s' finden"
msgid "PostgreSQL"
msgstr "PostgreSQL"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:38
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:37
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:21
msgid "Databases"
msgstr "Datenbanken"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:375
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:391
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:654
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:724
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:849
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:1021
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:374
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:390
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:649
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:719
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:844
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:1016
msgid "Could not find the database on the server."
msgstr "Konnte nicht die Datenbank auf dem Server finden."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:469
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:468
msgid "Database connected."
msgstr "Datenbank verbunden."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:488
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:485
msgid "Database could not be disconnected."
msgstr "Datenbank konnte nicht getrennt werden."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:492
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:489
msgid "Database disconnected."
msgstr "Datenbank getrennt."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:777
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:772
#: pgadmin/browser/server_groups/servers/databases/casts/__init__.py:483
#: pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py:522
#: pgadmin/browser/server_groups/servers/databases/extensions/__init__.py:357
@@ -813,10 +813,10 @@ msgstr "Datenbank getrennt."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py:548
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py:488
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py:453
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:830
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:829
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py:441
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:462
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1051
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1085
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:474
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py:565
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py:591
@@ -834,11 +834,11 @@ msgstr "Datenbank getrennt."
msgid "Error: Object not found."
msgstr "Fehler: Objekt nicht gefunden."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:780
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:775
msgid "The specified database could not be found.\n"
msgstr "Die angegebene Datenbank konnte nicht gefunden werden.\n"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:876
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:871
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:728
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:1561
msgid " -- definition incomplete"
@@ -934,19 +934,19 @@ msgstr "Umwandlung..."
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:93
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:39
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:210
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:182
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:107
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:670
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:712
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:119
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:105
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:53
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:292
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:181
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:106
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:669
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:710
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:118
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:104
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:52
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:289
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:358
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:131
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:130
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:265
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:324
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:184
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:183
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:324
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:148
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:112
@@ -998,22 +998,22 @@ msgstr "Name"
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:114
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog.js:65
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:393
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:185
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:110
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:673
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:716
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:123
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:109
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:295
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:184
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:109
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:672
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:714
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:122
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:108
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:292
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:361
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:146
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:145
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:254
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:327
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:187
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:186
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:328
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:151
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:115
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:312
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:309
#: pgadmin/browser/server_groups/servers/resource_groups/static/js/resource_group.js:87
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:391
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:344
@@ -1128,56 +1128,56 @@ msgstr "Quelltyp"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:654
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:658
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:662
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:137
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:158
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:692
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:702
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:747
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:750
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:758
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:781
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:735
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:748
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:772
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:789
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:805
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:853
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:144
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:416
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:513
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:538
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:561
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:576
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:604
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:130
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:402
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:499
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:523
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:550
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:565
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:593
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:315
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:346
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:349
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:136
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:157
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:691
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:701
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:746
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:749
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:757
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:780
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:733
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:746
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:770
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:787
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:803
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:851
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:143
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:415
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:512
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:537
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:560
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:575
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:603
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:129
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:401
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:498
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:522
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:549
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:564
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:592
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:311
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:342
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:345
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:384
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:388
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:392
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:396
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:400
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:404
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:407
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:411
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:415
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:418
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:440
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:166
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:179
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:191
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:207
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:250
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:268
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:292
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:318
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:323
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:414
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:436
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:165
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:190
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:249
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:267
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:291
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:317
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:322
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:350
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:375
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:385
@@ -1189,14 +1189,14 @@ msgstr "Quelltyp"
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:173
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:136
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:140
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:338
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:343
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:367
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:376
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:381
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:335
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:340
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:364
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:373
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:378
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:383
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:386
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:389
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:393
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:390
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:395
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:408
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:412
@@ -1251,22 +1251,22 @@ msgstr "Systemumwandlung?"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog.js:74
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:403
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:674
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:306
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:113
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:676
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:719
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:127
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:113
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:59
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:477
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:305
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:112
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:675
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:717
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:126
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:112
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:58
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:473
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:411
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:203
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:202
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:397
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:515
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:514
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:762
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:169
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:132
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:334
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:331
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:465
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:140
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:206
@@ -1349,7 +1349,7 @@ msgstr "Ereignisauslöser..."
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:331
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:154
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:118
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:315
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:312
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:355
#: pgadmin/dashboard/static/js/dashboard.js:1129
#: pgadmin/dashboard/static/js/dashboard.js:1387
@@ -1361,7 +1361,7 @@ msgstr "Besitzer"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:111
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:155
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:242
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:199
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:198
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:286
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:103
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:144
@@ -1370,28 +1370,28 @@ msgstr "Aktiviert?"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:120
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:39
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:316
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:315
msgid "Trigger function"
msgstr "Auslöserfunktion"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:124
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:205
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:267
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:272
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:347
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:387
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:391
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:404
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:417
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:429
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:459
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:464
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:204
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:266
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:271
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:346
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:386
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:390
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:403
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:416
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:428
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:458
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:463
msgid "Events"
msgstr "Ereignisse"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:132
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:264
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:456
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:263
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:455
msgid "When"
msgstr "Wenn"
@@ -1410,7 +1410,7 @@ msgstr "Wenn"
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:784
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:222
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:169
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:409
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:406
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:514
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:378
msgid "Security labels"
@@ -1443,14 +1443,14 @@ msgstr "Sicherheitsetiketten"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1124
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:167
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:130
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:317
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:320
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:323
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:326
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:329
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:332
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:400
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:412
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:467
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:397
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:409
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:464
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:516
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:360
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:372
@@ -1557,11 +1557,11 @@ msgstr "Verschiebbar?"
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:189
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:479
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:195
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:321
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:495
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:530
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:320
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:491
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:529
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:811
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:455
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:452
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:473
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:163
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:221
@@ -1761,8 +1761,8 @@ msgstr "Typ"
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:214
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:129
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:161
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:319
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:396
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:316
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:393
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:420
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:427
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:440
@@ -1945,7 +1945,7 @@ msgid "Schema dropped"
msgstr "Schema gelöscht"
#: pgadmin/browser/server_groups/servers/databases/schemas/__init__.py:781
-#: pgadmin/static/js/backform.pgadmin.js:1837
+#: pgadmin/static/js/backform.pgadmin.js:1833
msgid "Definition incomplete."
msgstr "Definition unvollständig."
@@ -1964,23 +1964,23 @@ msgstr "Konnte nicht das angegebene Katalogobjekt finden."
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:594
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:60
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:23
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:269
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:268
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:786
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:787
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:788
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:909
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:898
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:899
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:143
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:344
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:417
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:908
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:896
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:897
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:142
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:340
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:413
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:421
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:427
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:428
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:401
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:495
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:496
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:461
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:460
#: pgadmin/tools/import_export/static/js/import_export.js:179
#: pgadmin/tools/import_export/static/js/import_export.js:199
#: pgadmin/tools/import_export/static/js/import_export.js:237
@@ -2030,7 +2030,7 @@ msgstr "Datentyp"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:85
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:171
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:449
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:375
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:372
msgid "Collation"
msgstr "Kollation"
@@ -2148,7 +2148,7 @@ msgstr "Domänen-Einschränkung..."
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/static/js/domain.js:65
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:415
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:21
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:127
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:614
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:679
msgid "Check"
@@ -2156,7 +2156,7 @@ msgstr "Überprüfung"
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js:97
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:419
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:136
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:135
msgid "No inherit?"
msgstr ""
@@ -2167,7 +2167,7 @@ msgid "Validate?"
msgstr "Validieren?"
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:177
msgid "Check cannot be empty."
msgstr "Überprüfung kann nicht leer sein."
@@ -2272,8 +2272,8 @@ msgstr "Fremdtabelle gelöscht"
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py:1285
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py:1330
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1367
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1417
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1401
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1451
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:1356
msgid "-- Please create column(s) first..."
msgstr "-- Bitte zuerst Spalte(n) erstellen..."
@@ -2282,8 +2282,6 @@ msgstr "-- Bitte zuerst Spalte(n) erstellen..."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:487
#: pgadmin/browser/static/js/browser.js:213
#: pgadmin/misc/static/explain/js/explain.js:1219
-#: pgadmin/misc/static/explain/js/explain.js:1348
-#: pgadmin/misc/static/explain/js/explain.js:1349
#: pgadmin/misc/statistics/static/js/statistics.js:129
msgid "Statistics"
msgstr "Statistiken"
@@ -2293,7 +2291,7 @@ msgid "Inherited From"
msgstr "Geerbt von"
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:259
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:176
msgid "Column Name cannot be empty."
msgstr "Spaltenname kann nicht leer sein."
@@ -2490,7 +2488,7 @@ msgid "FTS Dictionary..."
msgstr "FTS-Wörterbuch..."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/static/js/fts_dictionary.js:153
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:342
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:339
msgid "Template"
msgstr "Vorlage"
@@ -2644,7 +2642,7 @@ msgstr "Lexize-Funktion muss ausgewählt werden."
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:59
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:21
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:457
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:434
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:431
msgid "Functions"
msgstr "Funktionen"
@@ -2657,29 +2655,29 @@ msgstr ""
msgid "Could not find the function node in the database."
msgstr "Konnte nicht den Funktionsknoten in der Datenbank finden"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:833
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:832
msgid "The specified function could not be found.\n"
msgstr "Die angegebene Funktion konnte nicht gefunden werden.\n"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:850
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:849
msgid "Function dropped."
msgstr "Funktion gelöscht."
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1141
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1320
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1140
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1319
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:334
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:511
msgid "Could not find the function in the database."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1628
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1627
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js:24
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:621
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbproc.js:24
msgid "Procedures"
msgstr "Prozeduren"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1728
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1727
msgid "Trigger Functions"
msgstr "Triggerfunktionen"
@@ -2719,7 +2717,7 @@ msgstr "Argumentzahl"
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:327
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:150
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:79
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:322
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:321
msgid "Arguments"
msgstr "Argumente"
@@ -2743,8 +2741,8 @@ msgstr "Rückgabetyp"
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:182
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:98
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:100
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:289
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:493
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:288
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:492
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:154
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:155
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:209
@@ -2812,7 +2810,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:338
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:245
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1119
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:405
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:402
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:508
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:366
#: pgadmin/tools/debugger/static/js/direct.js:1707
@@ -2852,7 +2850,7 @@ msgstr "Linksymbol kann nicht leer sein."
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:406
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js:200
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:314
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:338
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:337
msgid "Code cannot be empty."
msgstr "Code kann nicht leer sein."
@@ -3042,7 +3040,7 @@ msgstr "Kopfzeile kann nicht leer sein."
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:56
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:25
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:450
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:428
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:425
msgid "Sequences"
msgstr "Sequenzen"
@@ -3205,22 +3203,22 @@ msgid "System schema?"
msgstr "Systemschema?"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:409
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:322
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:319
msgid "Default TABLE privileges"
msgstr "Standard-TABLE-Berechtigungen"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:412
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:325
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:322
msgid "Default SEQUENCE privileges"
msgstr "Standard-SEQUENCE-Berechtigungen"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:415
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:328
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:325
msgid "Default FUNCTION privileges"
msgstr "Standard-FUNCTION-Berechtigungen"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:418
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:331
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:328
msgid "Default TYPE privileges"
msgstr "Standard-TYPE-Berechtigungen"
@@ -3229,9 +3227,9 @@ msgid "Default privileges"
msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:443
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:53
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:29
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:422
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:419
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:130
msgid "Tables"
msgstr "Tabellen"
@@ -3239,7 +3237,7 @@ msgstr "Tabellen"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:464
#: pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py:58
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:24
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:445
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:442
msgid "Types"
msgstr "Typen"
@@ -3300,8 +3298,8 @@ msgstr "Öffentliches Synonym?"
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:185
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:221
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:527
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:791
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:808
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:789
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:806
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:275
#: pgadmin/browser/static/js/browser.js:630
#: pgadmin/browser/static/js/node.js:1283
@@ -3310,17 +3308,17 @@ msgstr "Öffentliches Synonym?"
#: pgadmin/misc/file_manager/templates/file_manager/index.html:78
#: pgadmin/static/js/backform.pgadmin.js:538
#: pgadmin/static/js/backgrid.pgadmin.js:621
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1741
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1786
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2385
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1735
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1780
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2379
msgid "Yes"
msgstr "Ja"
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:185
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:221
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:527
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:792
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:809
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:790
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:807
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:275
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:147
#: pgadmin/browser/static/js/browser.js:631
@@ -3330,9 +3328,9 @@ msgstr "Ja"
#: pgadmin/misc/file_manager/templates/file_manager/index.html:77
#: pgadmin/static/js/backform.pgadmin.js:539
#: pgadmin/static/js/backgrid.pgadmin.js:622
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1742
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1787
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2386
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1736
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1781
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2380
msgid "No"
msgstr "Nein"
@@ -3344,32 +3342,32 @@ msgstr "Zielschema kann nicht leer sein."
msgid "Target object cannot be empty."
msgstr "Zielobjekt kann nicht leer sein."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:359
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:357
msgid "Could not find the table."
msgstr "Konnte nicht die Tabelle finden."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:596
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1271
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:630
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1305
msgid "The specified table could not be found."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1054
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1088
msgid "The specified table could not be found.\n"
msgstr "Die angegebene Tabelle konnte nicht gefunden werden.\n"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1067
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1101
msgid "Table dropped"
msgstr "Tabelle gelöscht"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1145
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1179
msgid "Trigger(s) have been disabled"
msgstr "Auslöser wurde(n) deaktiviert"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1147
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1181
msgid "Trigger(s) have been enabled"
msgstr "Auslöser wurde(n) aktiviert"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1501
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1535
#, python-format
msgid "Table rows counted: %s"
msgstr ""
@@ -3422,7 +3420,7 @@ msgstr "Spalte ist gelöscht"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:608
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:704
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:856
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:853
msgid "Could not find the column on the server."
msgstr ""
@@ -3568,70 +3566,70 @@ msgstr ""
msgid "Compound Trigger"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:56
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:62
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:68
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:74
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:90
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:61
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:67
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:73
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:89
msgid "Compound Trigger..."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:80
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:79
msgid "Enable compound trigger"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:85
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:84
msgid "Disable compound trigger"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:169
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:168
msgid "Disable compound trigger failed"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:188
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:190
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:187
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:189
msgid "Trigger enabled?"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:205
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:209
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:222
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:235
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:248
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:204
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:208
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:221
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:234
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:247
msgid "FOR Events"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:207
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:389
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:388
msgid "INSERT"
msgstr "INSERT"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:220
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:402
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:219
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:401
msgid "UPDATE"
msgstr "UPDATE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:233
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:415
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:232
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:414
msgid "DELETE"
msgstr "DELETE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:246
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:428
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:245
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:427
msgid "TRUNCATE"
msgstr "TRUNCATE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:303
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:512
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:302
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:511
msgid "System trigger?"
msgstr "Systemauslöser?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:328
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:543
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:327
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:542
msgid "Specify at least one event."
msgstr "Geben Sie mindestens ein Ereignis an."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:347
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:346
msgid ""
"-- Enter any global declarations below:\n"
"\n"
@@ -3701,15 +3699,15 @@ msgstr ""
msgid "Check constraint updated."
msgstr "Überprüfungseinschränkung aktualisiert."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:40
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:39
msgid "Check..."
msgstr "Überprüfung..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:46
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:45
msgid "Validate check constraint"
msgstr "Überprüfeinschränkung validieren"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:157
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:156
msgid "Don't validate?"
msgstr "Nicht validieren?"
@@ -3745,7 +3743,7 @@ msgid "Exclusion constraint dropped."
msgstr "Ausschlusseinschränkung gelöscht."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:38
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:97
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:96
msgid "Operator class"
msgstr "Operatorklasse"
@@ -3773,10 +3771,10 @@ msgstr "Bitte geben Sie den Operator für die Spalte an: "
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:453
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:381
#: pgadmin/browser/server_groups/servers/static/js/variable.js:341
-#: pgadmin/static/js/backform.pgadmin.js:1260
-#: pgadmin/static/js/backform.pgadmin.js:1370
-#: pgadmin/static/js/backform.pgadmin.js:1550
-#: pgadmin/static/js/backform.pgadmin.js:1669
+#: pgadmin/static/js/backform.pgadmin.js:1259
+#: pgadmin/static/js/backform.pgadmin.js:1366
+#: pgadmin/static/js/backform.pgadmin.js:1546
+#: pgadmin/static/js/backform.pgadmin.js:1665
msgid "Add new row"
msgstr ""
@@ -3788,7 +3786,7 @@ msgstr "Ausschlusseinschränkung"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:28
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:28
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:29
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:236
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:234
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/exclusion_constraint/sql/default/stats.sql:7
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/exclusion_constraint/sql/default/stats.sql:12
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/index_constraint/sql/default/stats.sql:7
@@ -3798,87 +3796,87 @@ msgstr "Ausschlusseinschränkung"
msgid "Index size"
msgstr "Indexgröße"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:642
msgid "Exclusion constraint..."
msgstr "Ausschlusseinschränkung..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:691
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:512
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:498
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:298
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:690
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:511
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:497
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:295
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:378
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:344
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:196
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:366
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:363
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:40
#: pgadmin/tools/backup/static/js/backup.js:366
#: pgadmin/tools/restore/static/js/restore.js:255
msgid "Tablespace"
msgstr "Tablespace"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:701
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:700
msgid "Access method"
msgstr "Zugriffsmethode"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:716
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:326
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:715
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:322
msgid "Changing access method will clear columns collection"
msgstr "Das Ändern der Zugriffsmethode löscht die Spaltensammlung"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:746
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:560
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:549
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:386
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:745
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:559
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:548
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:382
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:716
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:790
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:204
msgid "Fill factor"
msgstr "Füllfaktor"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:749
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:734
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:575
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:564
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:267
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:748
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:732
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:574
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:563
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:266
msgid "Deferrable?"
msgstr "Aufschiebbar?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:757
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:747
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:603
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:592
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:291
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:756
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:745
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:602
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:591
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:290
msgid "Deferred?"
msgstr "Aufgeschoben?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:779
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:413
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:778
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:409
msgid "Constraint"
msgstr "Einschränkung"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:908
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:415
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:401
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:348
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:439
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:907
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:414
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:400
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:344
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:435
msgid "Include columns"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:931
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:242
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:438
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:228
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:424
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:370
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:461
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:930
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:241
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:437
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:227
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:423
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:366
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:457
msgid "Select the column(s)"
msgstr "Wählen Sie die Spalte(n)"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1012
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1011
msgid "Please specify name for exclusion constraint."
msgstr "Bitte geben Sie den Namen für die Ausschlusseinschränkung an."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1018
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1017
msgid "Please specify columns for exclusion constraint."
msgstr "Bitte geben Sie Spalten für Ausschlusseinschränkung an."
@@ -3936,53 +3934,53 @@ msgstr "Referenzen"
msgid "Referencing"
msgstr "Referenzieren"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:616
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:615
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:585
msgid "Foreign key"
msgstr "Fremdschlüssel"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:637
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:635
msgid "Foreign key..."
msgstr "Fremdschlüssel..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:641
msgid "Validate foreign key"
msgstr "Fremdschlüssel validieren"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:771
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:769
msgid "Match type"
msgstr "Übereinstimmungstyp"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:788
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:786
msgid "Validated?"
msgstr "Validiert?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:804
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:802
msgid "Auto FK index?"
msgstr "Automatischer FK-Index?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:852
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:850
msgid "Covering index"
msgstr "Abdeckungsindex"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1002
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1000
msgid "On update"
msgstr "Beim Aktualisieren"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1003
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1023
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1001
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1021
msgid "Action"
msgstr "Aktion"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1022
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1020
msgid "On delete"
msgstr "Beim Löschen"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1050
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1048
msgid "Please specify columns for Foreign key."
msgstr "Bitte geben Sie Spalten für Fremdschlüssel an."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1059
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1057
msgid "Please specify covering index name."
msgstr "Bitte geben Sie den Deckungsindexnamen an."
@@ -4028,7 +4026,7 @@ msgstr "{0} gelöscht."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py:996
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:20
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:43
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:42
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:557
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:729
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:811
@@ -4037,7 +4035,7 @@ msgstr "Primärschlüssel"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py:1006
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:20
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:43
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:42
msgid "Unique constraint"
msgstr "Eindeutige Einschränkung"
@@ -4045,19 +4043,19 @@ msgstr "Eindeutige Einschränkung"
msgid "Could not find the constraint in the table."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:536
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:522
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:231
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:535
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:521
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:229
msgid "Index"
msgstr "Index"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:644
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:633
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:632
#, python-format
msgid "Please specify columns for %s"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:56
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:55
msgid "Oid"
msgstr "Oid"
@@ -4084,7 +4082,7 @@ msgid "Index is dropped"
msgstr "Index ist gelöscht"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:29
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:236
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:234
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:45
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:33
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:49
@@ -4101,59 +4099,63 @@ msgstr "Index ist gelöscht"
msgid "Size"
msgstr "Größe"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:130
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:128
msgid "Sort order"
msgstr "Sortierreihenfolge"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:151
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:149
msgid "NULLs"
msgstr "NULLs"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:248
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:254
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:260
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:266
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:272
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:245
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:251
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:257
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:263
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:269
msgid "Index..."
msgstr "Index..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:311
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:308
msgid "Access Method"
msgstr "Zugriffsmethode"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:390
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:386
msgid "Unique?"
msgstr "Eindeutig?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:394
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:390
msgid "Clustered?"
msgstr "Geclustert?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:398
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:394
msgid "Valid?"
msgstr "Valide?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:402
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:398
msgid "Primary?"
msgstr "Primär?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:406
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:402
msgid "System index?"
msgstr "Systemindex?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:409
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:405
msgid "Concurrent build?"
msgstr "Gleichzeitiges Erstellen?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:501
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:497
+msgid "Tablespace cannot be empty."
+msgstr "Tablespace kann nicht leer sein."
+
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:503
msgid "Access method cannot be empty."
msgstr "Zugriffsmethode kann nicht leer sein."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:509
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:511
msgid "You must specify column name."
msgstr "Sie müssen den Spaltennamen angeben."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:514
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:516
msgid "You must specify at least one column."
msgstr "Sie müssen mindestens eine Spalte angeben."
@@ -4544,39 +4546,39 @@ msgstr "Regel gelöscht"
msgid "rule"
msgstr "Regel"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:93
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:99
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:105
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:111
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:117
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:92
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:98
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:104
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:110
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:116
msgid "Rule..."
msgstr "Regel..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:165
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:164
#: pgadmin/static/js/sqleditor/query_tool_notifications.js:32
#: pgadmin/static/js/sqleditor/query_tool_notifications.js:80
msgid "Event"
msgstr "Ereignis"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:179
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:178
msgid "Do instead?"
msgstr ""
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:182
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:183
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:184
msgid "Condition"
msgstr "Bedingung"
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:188
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:189
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:190
msgid "Commands"
msgstr "Befehle"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:195
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:194
msgid "System rule?"
msgstr "Systemregel?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:215
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:214
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:241
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:183
msgid "Please specify name."
@@ -5138,56 +5140,56 @@ msgstr "Auslöser ist gelöscht"
msgid "Trigger"
msgstr "Auslöser"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:56
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:62
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:68
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:74
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:90
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:61
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:67
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:73
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:89
msgid "Trigger..."
msgstr "Auslöser..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:80
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:79
msgid "Enable trigger"
msgstr "Trigger aktivieren"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:85
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:84
msgid "Disable trigger"
msgstr "Auslöser deaktivieren"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:169
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:168
msgid "Disable trigger failed"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:205
msgid "Row trigger?"
msgstr "Zeilenauslöser?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:247
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:246
msgid "Constraint trigger?"
msgstr "Einschränkungsauslöser?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:346
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:345
msgid "Fires"
msgstr "Löst aus"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:481
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:480
msgid "Old table"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:482
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:488
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:481
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:487
msgid "Transition"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:487
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:486
msgid "New table"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:536
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:535
msgid "Trigger function cannot be empty."
msgstr "Auslöserfunktion kann nicht leer sein."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:556
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:555
msgid "Trigger code cannot be empty."
msgstr "Auslösercode kann nicht leer sein."
@@ -5576,7 +5578,7 @@ msgid "Size of temporary files"
msgstr "Größe der temporären Dateien"
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:45
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:309
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:306
#: pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.2_plus/stats.sql:2
#: pgadmin/browser/server_groups/servers/databases/templates/databases/sql/default/stats.sql:2
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:176
@@ -5630,35 +5632,35 @@ msgstr "Die Datenbank trennen"
msgid "Are you sure you want to disconnect the database - %s?"
msgstr "Sind Sie sicher, dass Sie die Datenbank trennen möchten - %s?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:337
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:334
#: pgadmin/static/js/browser/server_groups/servers/databases/external_tables/external_tables.js:52
#: pgadmin/tools/backup/static/js/backup.js:192
#: pgadmin/tools/import_export/static/js/import_export.js:108
msgid "Encoding"
msgstr "Codierung"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:380
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:377
msgid "Character type"
msgstr "Zeichentyp"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:385
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:382
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:413
msgid "Connection limit"
msgstr "Verbindungslimitierung"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:388
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:385
msgid "Template?"
msgstr "Vorlage?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:392
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:389
msgid "Allow connections?"
msgstr "Verbindungen zulassen?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:417
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:414
msgid "Default Privileges"
msgstr "Standard-Berechtigungen"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:499
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:496
msgid "Connect to database"
msgstr "Zu Datenbank verbinden"
@@ -6497,7 +6499,7 @@ msgstr "Art"
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:139
#: pgadmin/browser/static/js/browser.js:224
#: pgadmin/dashboard/static/js/dashboard.js:191
-#: pgadmin/static/js/backform.pgadmin.js:2032
+#: pgadmin/static/js/backform.pgadmin.js:2028
msgid "SQL"
msgstr "SQL"
@@ -7100,8 +7102,8 @@ msgid "At least one privilege should be selected."
msgstr "Mindestens ein Privileg sollte ausgewählt sein."
#: pgadmin/browser/server_groups/servers/static/js/server.js:46
-msgid "Security label must be specified."
-msgstr ""
+msgid "Label must be specified."
+msgstr "Etikett muss angegeben werden."
#: pgadmin/browser/server_groups/servers/static/js/server.js:79
#: pgadmin/browser/server_groups/servers/static/js/server.js:84
@@ -7202,20 +7204,20 @@ msgstr ""
#: pgadmin/misc/file_manager/static/js/create_dialogue.js:188
#: pgadmin/misc/file_manager/static/js/select_dialogue.js:86
#: pgadmin/misc/file_manager/static/js/select_dialogue.js:129
-#: pgadmin/preferences/static/js/preferences.js:435
+#: pgadmin/preferences/static/js/preferences.js:434
#: pgadmin/static/js/slickgrid/editors.js:50
-#: pgadmin/static/js/sqleditor/filter_dialog.js:79
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:62
-#: pgadmin/tools/datagrid/static/js/show_data.js:139
+#: pgadmin/static/js/sqleditor/filter_dialog.js:78
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:61
+#: pgadmin/tools/datagrid/static/js/show_data.js:138
#: pgadmin/tools/debugger/static/js/debugger_ui.js:588
#: pgadmin/tools/debugger/static/js/debugger_ui.js:893
#: pgadmin/tools/import_export/static/js/import_export.js:495
-#: pgadmin/tools/maintenance/static/js/maintenance.js:297
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:56
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2010
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2164
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4222
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4289
+#: pgadmin/tools/maintenance/static/js/maintenance.js:296
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:55
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2004
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2158
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4216
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4283
msgid "Cancel"
msgstr "Abbrechen"
@@ -7436,7 +7438,7 @@ msgid "Connection timeout (seconds)"
msgstr ""
#: pgadmin/browser/server_groups/servers/static/js/server.js:1130
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2192
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2186
msgid "Connect to Server"
msgstr "Zu Server verbinden"
@@ -7689,17 +7691,15 @@ msgid "Dependents"
msgstr "Abhängige Objekte"
#: pgadmin/browser/static/js/browser.js:348
-#: pgadmin/browser/static/js/toolbar.js:30
-#: pgadmin/browser/static/js/toolbar.js:31
-#: pgadmin/browser/static/js/toolbar.js:91
+#: pgadmin/browser/static/js/toolbar.js:29
+#: pgadmin/browser/static/js/toolbar.js:88
#: pgadmin/tools/datagrid/static/js/datagrid.js:74
msgid "View Data"
msgstr ""
#: pgadmin/browser/static/js/browser.js:349
#: pgadmin/browser/static/js/toolbar.js:20
-#: pgadmin/browser/static/js/toolbar.js:21
-#: pgadmin/browser/static/js/toolbar.js:93
+#: pgadmin/browser/static/js/toolbar.js:90
#: pgadmin/tools/datagrid/static/js/datagrid.js:75
msgid "Filtered Rows"
msgstr ""
@@ -7945,10 +7945,10 @@ msgid "Changes will be lost. Are you sure you want to reset?"
msgstr ""
#: pgadmin/browser/static/js/node.js:1513
-#: pgadmin/preferences/static/js/preferences.js:439
-#: pgadmin/preferences/static/js/preferences.js:464
+#: pgadmin/preferences/static/js/preferences.js:438
+#: pgadmin/preferences/static/js/preferences.js:463
#: pgadmin/tools/datagrid/templates/datagrid/index.html:37
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4297
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4291
msgid "Save"
msgstr "Speichern"
@@ -7968,20 +7968,17 @@ msgstr "Alles Auswählen"
msgid "Unselect All"
msgstr "Komplette Auswahl aufheben"
-#: pgadmin/browser/static/js/toolbar.js:40
-#: pgadmin/browser/static/js/toolbar.js:41
-#: pgadmin/browser/static/js/toolbar.js:89
+#: pgadmin/browser/static/js/toolbar.js:38
+#: pgadmin/browser/static/js/toolbar.js:86
#: pgadmin/tools/datagrid/static/js/datagrid.js:103
#: pgadmin/tools/datagrid/static/js/datagrid.js:115
#: pgadmin/tools/sqleditor/__init__.py:68
msgid "Query Tool"
msgstr "Abfragewerkzeug"
-#: pgadmin/browser/static/js/wizard.js:85
#: pgadmin/browser/static/js/wizard.js:86
#: pgadmin/static/js/alertify.pgadmin.defaults.js:261
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:263
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:457
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:455
#: pgadmin/templates/security/messages.html:7
#: pgadmin/tools/user_management/static/js/user_management.js:81
#: pgadmin/tools/user_management/static/js/user_management.js:174
@@ -7989,11 +7986,9 @@ msgstr "Abfragewerkzeug"
msgid "Close"
msgstr "Schließen"
-#: pgadmin/browser/static/js/wizard.js:88
#: pgadmin/browser/static/js/wizard.js:89
#: pgadmin/static/js/alertify.pgadmin.defaults.js:262
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:264
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:458
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:456
msgid "Maximize"
msgstr ""
@@ -8001,22 +7996,6 @@ msgstr ""
msgid "Left panel logo"
msgstr ""
-#: pgadmin/browser/static/js/wizard.js:124
-msgid "Close error bar"
-msgstr ""
-
-#: pgadmin/browser/static/js/wizard.js:131
-#: pgadmin/browser/templates/browser/index.html:135 pgadmin/help/__init__.py:59
-#: pgadmin/help/__init__.py:70 pgadmin/preferences/static/js/preferences.js:427
-#: pgadmin/static/js/sqleditor/filter_dialog.js:72
-#: pgadmin/static/js/sqleditor/filter_dialog.js:73
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:56
-#: pgadmin/tools/datagrid/static/js/show_data.js:133
-#: pgadmin/tools/maintenance/static/js/maintenance.js:289
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:50
-msgid "Help"
-msgstr "Hilfe"
-
#: pgadmin/browser/static/js/wizard.js:139
#: pgadmin/misc/file_manager/templates/file_manager/index.html:15
msgid "Back"
@@ -8054,6 +8033,11 @@ msgstr "Verwaltung"
msgid "Tools"
msgstr "Werkzeuge"
+#: pgadmin/browser/templates/browser/index.html:135 pgadmin/help/__init__.py:59
+#: pgadmin/help/__init__.py:70 pgadmin/static/js/sqleditor/filter_dialog.js:72
+msgid "Help"
+msgstr "Hilfe"
+
#: pgadmin/browser/templates/browser/index.html:157
msgid "Logout"
msgstr "Abmelden"
@@ -8444,7 +8428,7 @@ msgstr ""
#: pgadmin/dashboard/templates/dashboard/database_dashboard.html:88
#: pgadmin/dashboard/templates/dashboard/server_dashboard.html:92
#: pgadmin/misc/file_manager/templates/file_manager/index.html:27
-#: pgadmin/preferences/static/js/preferences.js:492
+#: pgadmin/preferences/static/js/preferences.js:491
msgid "Refresh"
msgstr "Aktualisieren"
@@ -8964,33 +8948,13 @@ msgstr ""
msgid "Analysis"
msgstr ""
-#: pgadmin/misc/static/explain/js/explain.js:1286
-#: pgadmin/misc/static/explain/js/explain.js:1287
-msgid "Zoom in"
-msgstr ""
-
-#: pgadmin/misc/static/explain/js/explain.js:1295
-#: pgadmin/misc/static/explain/js/explain.js:1296
-msgid "Zoom to original"
-msgstr ""
-
-#: pgadmin/misc/static/explain/js/explain.js:1304
-#: pgadmin/misc/static/explain/js/explain.js:1305
-msgid "Zoom out"
-msgstr ""
-
-#: pgadmin/misc/static/explain/js/explain.js:1319
-#: pgadmin/misc/static/explain/js/explain.js:1320
-msgid "Download"
-msgstr ""
-
#: pgadmin/misc/statistics/static/js/statistics.js:214
msgid "No statistics are available for the selected object."
msgstr "Für das ausgewählte Objekt stehen keine Statistiken zur Verfügung."
#: pgadmin/preferences/__init__.py:55
#: pgadmin/preferences/static/js/preferences.js:426
-#: pgadmin/preferences/static/js/preferences.js:449
+#: pgadmin/preferences/static/js/preferences.js:448
msgid "Preferences"
msgstr "Einstellungen"
@@ -9016,17 +8980,17 @@ msgstr ""
msgid "Category is not selected."
msgstr ""
-#: pgadmin/preferences/static/js/preferences.js:483
+#: pgadmin/preferences/static/js/preferences.js:482
msgid "Refresh required"
msgstr ""
-#: pgadmin/preferences/static/js/preferences.js:484
+#: pgadmin/preferences/static/js/preferences.js:483
msgid ""
"A page refresh is required to apply the theme. Do you wish to refresh the"
" page now?"
msgstr ""
-#: pgadmin/preferences/static/js/preferences.js:493
+#: pgadmin/preferences/static/js/preferences.js:492
msgid "Later"
msgstr ""
@@ -9070,37 +9034,33 @@ msgstr ""
msgid "INTERNAL SERVER ERROR"
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:1550
-msgid "Add"
-msgstr ""
-
-#: pgadmin/static/js/backform.pgadmin.js:1841
+#: pgadmin/static/js/backform.pgadmin.js:1837
msgid "No updates."
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:1956
+#: pgadmin/static/js/backform.pgadmin.js:1952
msgid "General"
msgstr "Allgemein"
-#: pgadmin/static/js/backform.pgadmin.js:2157
+#: pgadmin/static/js/backform.pgadmin.js:2153
msgid "Preview not available..."
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:2618
+#: pgadmin/static/js/backform.pgadmin.js:2605
#: pgadmin/tools/backup/static/js/backup.js:95
#: pgadmin/tools/backup/static/js/backup.js:230
msgid "Note"
msgstr "Hinweis"
-#: pgadmin/static/js/backform.pgadmin.js:2974
+#: pgadmin/static/js/backform.pgadmin.js:2961
msgid "More"
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:2975
+#: pgadmin/static/js/backform.pgadmin.js:2962
msgid "Less"
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:3059
+#: pgadmin/static/js/backform.pgadmin.js:3046
msgid "Space"
msgstr ""
@@ -9129,7 +9089,7 @@ msgstr ""
msgid "Delete row"
msgstr ""
-#: pgadmin/static/js/backgrid.pgadmin.js:1098
+#: pgadmin/static/js/backgrid.pgadmin.js:1091
msgid "Array Values"
msgstr ""
@@ -9283,13 +9243,13 @@ msgstr "Abfrage wurde in %s erfolgreich zurückgegeben."
msgid "Sort/Filter options"
msgstr ""
-#: pgadmin/static/js/sqleditor/filter_dialog.js:239
+#: pgadmin/static/js/sqleditor/filter_dialog.js:238
msgid "Filter updated successfully"
msgstr ""
-#: pgadmin/static/js/sqleditor/filter_dialog.js:245
-#: pgadmin/tools/datagrid/static/js/show_data.js:238
-#: pgadmin/tools/datagrid/static/js/show_data.js:245
+#: pgadmin/static/js/sqleditor/filter_dialog.js:244
+#: pgadmin/tools/datagrid/static/js/show_data.js:237
+#: pgadmin/tools/datagrid/static/js/show_data.js:244
msgid "Validation Error"
msgstr ""
@@ -9370,7 +9330,6 @@ msgstr ""
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:40
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:41
-#: pgadmin/tools/datagrid/templates/datagrid/index.html:56
#: pgadmin/tools/datagrid/templates/datagrid/index.html:68
msgid "Find"
msgstr ""
@@ -9454,14 +9413,14 @@ msgstr ""
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:129
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:131
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4230
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4224
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:663
msgid "Commit"
msgstr ""
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:135
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:137
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4227
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4221
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:681
msgid "Rollback"
msgstr ""
@@ -9539,7 +9498,7 @@ msgstr "Diese URL kann nicht direkt angefordert werden."
#: pgadmin/tools/backup/__init__.py:43
#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:46
#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:55
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:67
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:66
msgid "Backup"
msgstr "Sicherung"
@@ -9819,8 +9778,8 @@ msgstr "Sicherung..."
#: pgadmin/tools/backup/static/js/backup_dialog.js:71
#: pgadmin/tools/import_export/static/js/import_export.js:685
#: pgadmin/tools/import_export/static/js/import_export.js:699
-#: pgadmin/tools/maintenance/static/js/maintenance.js:477
-#: pgadmin/tools/maintenance/static/js/maintenance.js:488
+#: pgadmin/tools/maintenance/static/js/maintenance.js:476
+#: pgadmin/tools/maintenance/static/js/maintenance.js:487
#: pgadmin/tools/restore/static/js/restore_dialog.js:51
#: pgadmin/tools/restore/static/js/restore_dialog.js:75
msgid "Utility not found"
@@ -9828,25 +9787,25 @@ msgstr ""
#: pgadmin/tools/backup/static/js/backup_dialog.js:72
#: pgadmin/tools/import_export/static/js/import_export.js:700
-#: pgadmin/tools/maintenance/static/js/maintenance.js:489
+#: pgadmin/tools/maintenance/static/js/maintenance.js:488
#: pgadmin/tools/restore/static/js/restore_dialog.js:76
msgid "Failed to fetch Utility information"
msgstr ""
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:159
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:158
msgid "Backup job created."
msgstr "Sicherungsjob erstellt."
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:163
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:162
msgid "Backup job creation failed."
msgstr ""
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:171
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:170
msgid "Backup job failed."
msgstr "Sicherungsjob ist fehlgeschlagen."
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:242
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:229
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:241
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:228
msgid "Please provide a filename"
msgstr "Bitte geben Sie einen Dateinamen an"
@@ -9895,7 +9854,7 @@ msgstr ""
msgid "Data Filter"
msgstr ""
-#: pgadmin/tools/datagrid/static/js/show_data.js:161
+#: pgadmin/tools/datagrid/static/js/show_data.js:160
msgid "Use SHIFT + ENTER to apply filter..."
msgstr ""
@@ -10490,30 +10449,6 @@ msgstr "Stapel"
msgid "Debugger - "
msgstr "Debugger - "
-#: pgadmin/tools/debugger/templates/debugger/direct.html:59
-msgid "Step into"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:67
-msgid "Step over"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:75
-msgid "Continue/Start"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:85
-msgid "Toggle breakpoint"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:93
-msgid "Clear all breakpoints"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:103
-msgid "Stop"
-msgstr ""
-
#: pgadmin/tools/grant_wizard/__init__.py:327
msgid "Unable to fetch the {} objects"
msgstr ""
@@ -10867,7 +10802,7 @@ msgstr "Ausführliche Meldungen"
#: pgadmin/tools/maintenance/static/js/maintenance.js:167
#: pgadmin/tools/maintenance/static/js/maintenance.js:183
-#: pgadmin/tools/maintenance/static/js/maintenance.js:483
+#: pgadmin/tools/maintenance/static/js/maintenance.js:482
msgid "Maintenance..."
msgstr "Wartung..."
@@ -10881,15 +10816,15 @@ msgid ""
"cannot be maintained using this utility."
msgstr ""
-#: pgadmin/tools/maintenance/static/js/maintenance.js:387
-#: pgadmin/tools/maintenance/static/js/maintenance.js:394
+#: pgadmin/tools/maintenance/static/js/maintenance.js:386
+#: pgadmin/tools/maintenance/static/js/maintenance.js:393
msgid "Maintenance job creation failed."
msgstr "Wartungsjoberstellung fehlgeschlagen."
#: pgadmin/tools/restore/__init__.py:41
#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:40
#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:49
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:62
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:61
msgid "Restore"
msgstr "Wiederherstellen"
@@ -10955,15 +10890,15 @@ msgstr "Wiederherstellen..."
msgid "Restore (%s: %s)"
msgstr ""
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:149
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:148
msgid "Restore job created."
msgstr "Wiederherstellungsjob erstellt."
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:153
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:152
msgid "Restore job creation failed."
msgstr ""
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:161
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:160
msgid "Restore job failed."
msgstr ""
@@ -11049,77 +10984,77 @@ msgstr ""
msgid "Geometry Viewer"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:832
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:826
msgid "Editable column"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:834
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:828
msgid "Read-only column"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1261
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1255
msgid "Fetching all records..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1730
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2369
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3314
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1724
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2363
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3308
msgid "Unsaved changes"
msgstr "Nicht gespeicherte Änderungen"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1731
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3315
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1725
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3309
msgid "Are you sure you wish to discard the current changes?"
msgstr "Sind Sie sicher, dass Sie die aktuellen Änderungen verwerfen möchten?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1759
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1753
msgid "Clear history"
msgstr "Verlauf löschen"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1760
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1754
msgid "Are you sure you wish to clear the history?"
msgstr "Sind Sie sicher, dass Sie den Verlauf löschen wollen?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1761
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1755
msgid ""
"This will remove all of your query history from this and other sessions "
"for this database."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2125
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2119
msgid "Connection Warning"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2132
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2126
msgid "The application has lost the database connection:"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2136
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2130
msgid "⁃ If the connection was idle it may have been forcibly disconnected."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2138
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2132
msgid "⁃ The application server or database server may have been restarted."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2140
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2134
msgid "⁃ The user session may have timed out."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2144
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2138
msgid "Do you want to continue and establish a new session?"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2163
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2157
msgid "Continue"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2299
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2293
#, python-format
msgid "Error fetching SQL for script: %s."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2370
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2364
msgid ""
"The data has been modified, but not saved. Are you sure you wish to "
"discard the changes?"
@@ -11127,165 +11062,165 @@ msgstr ""
"Die Daten wurden geändert, aber nicht gespeichert. Sind Sie sicher, dass "
"Sie die Änderungen verwerfen möchten?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2414
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2408
msgid "Running query..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2422
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2416
msgid "Waiting for the query to complete..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2579
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2573
msgid "Loading data from the database server and rendering..."
msgstr "Laden von Daten aus dem Datenbankserver und Rendern..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2588
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2582
#, python-format
msgid "Successfully run. Total query runtime: %s."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2589
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2583
#, python-format
msgid "%s rows affected."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2865
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2859
msgid ""
"This query was generated by pgAdmin as part of a \"View/Edit Data\" "
"operation"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2966
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2960
msgid "Row(s) deleted."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3040
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3034
msgid "Saving the updated data..."
msgstr "Speichern der aktualisierten Daten..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3156
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3150
msgid "Data saved successfully."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3159
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3153
msgid "Auto-commit is off. You still need to commit changes to the database."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3165
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3159
#, python-format
msgid "%s."
msgstr "%s."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3170
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3164
msgid ""
"Saving data changes was rolled back but the current transaction is still "
"active; previous queries are unaffected."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3192
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3186
msgid "This query was generated by pgAdmin as part of a \"Save Data\" operation"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3353
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3347
msgid "Loading the file..."
msgstr "Lade die Datei..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3404
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3398
msgid "Saving the queries in the file..."
msgstr "Speichern der Abfragen in der Datei..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3416
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3410
msgid "File saved successfully."
msgstr "Datei erfolgreich gespeichert."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3538
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3597
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3532
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3591
msgid "Applying the new filter..."
msgstr "Wende den neuen Filter an ..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3558
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3568
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3552
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3562
msgid "Filter By Selection Error"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3617
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3627
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3611
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3621
msgid "Filter Exclude Selection Error"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3637
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3631
msgid "Removing the filter..."
msgstr "Filter entfernen..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3655
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3665
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3649
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3659
msgid "Remove Filter Error"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3768
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3762
msgid "Setting the limit on the result..."
msgstr "Setzen des Limits für das Ergebnis..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3787
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3796
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3781
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3790
msgid "Change limit Error"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3922
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3941
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3916
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3935
msgid "Cancel Query Error"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3960
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3954
msgid "Downloading CSV..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4014
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4008
msgid "CSV Download cancelled."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4017
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4011
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:395
msgid "Download CSV"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4020
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4014
msgid "Download CSV error"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4054
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4061
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4048
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4055
msgid "Auto Rollback Error"
msgstr ""
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4081
#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4087
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4093
msgid "Auto Commit Error"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4182
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4176
msgid "The data has changed. Do you want to save changes?"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4188
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4182
msgid "The text has changed. Do you want to save changes?"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4268
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4262
msgid ""
"The current transaction is not commited to the database.Do you want to "
"commit or rollback the transaction?"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4271
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4265
msgid "Commit transaction?"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4294
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4288
msgid "Don't save"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4337
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4331
msgid "Save changes?"
msgstr ""
@@ -12960,9 +12895,3 @@ msgstr "Konnte nicht die angegebene Datenbank finden."
#~ msgid "Error dropping %s: \"%s\""
#~ msgstr "Fehler beim Löschen von %s: \"%s\""
-#~ msgid "Tablespace cannot be empty."
-#~ msgstr "Tablespace kann nicht leer sein."
-
-#~ msgid "Label must be specified."
-#~ msgstr "Etikett muss angegeben werden."
-
diff --git a/web/pgadmin/translations/es/LC_MESSAGES/messages.mo b/web/pgadmin/translations/es/LC_MESSAGES/messages.mo
index 63a38e846402836e7d33c314aa7868954da8fb8f..9ca606c4fc08b61efc0732dfdf15219f343f96b8 100644
GIT binary patch
delta 28053
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
delta 27986
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
Rhs;YW)?xiiN75dz{C{YoWexxU
diff --git a/web/pgadmin/translations/es/LC_MESSAGES/messages.po b/web/pgadmin/translations/es/LC_MESSAGES/messages.po
index 4f9aa8722..9f9a01381 100644
--- a/web/pgadmin/translations/es/LC_MESSAGES/messages.po
+++ b/web/pgadmin/translations/es/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-01-03 19:02+0530\n"
+"POT-Creation-Date: 2019-12-06 19:29+0530\n"
"PO-Revision-Date: 2018-08-08 09:29+0000\n"
"Last-Translator: Isaias Sanchez <[email protected]>\n"
"Language: es\n"
@@ -47,13 +47,13 @@ msgstr "Escritorio"
#: pgadmin/static/js/slickgrid/editors.js:50
#: pgadmin/static/js/slickgrid/editors.js:60
#: pgadmin/static/js/slickgrid/editors.js:61
-#: pgadmin/static/js/sqleditor/filter_dialog.js:84
-#: pgadmin/tools/datagrid/static/js/show_data.js:143
-#: pgadmin/tools/datagrid/static/js/show_data.js:218
+#: pgadmin/static/js/sqleditor/filter_dialog.js:83
+#: pgadmin/tools/datagrid/static/js/show_data.js:142
+#: pgadmin/tools/datagrid/static/js/show_data.js:217
#: pgadmin/tools/import_export/static/js/import_export.js:500
-#: pgadmin/tools/maintenance/static/js/maintenance.js:302
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2005
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2035
+#: pgadmin/tools/maintenance/static/js/maintenance.js:301
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1999
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2029
msgid "OK"
msgstr "OK"
@@ -464,7 +464,7 @@ msgstr "Faltan las propiedades requeridas."
#: pgadmin/browser/utils.py:386
#: pgadmin/static/js/alertify.pgadmin.defaults.js:102
#: pgadmin/static/js/alertify.pgadmin.defaults.js:163
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:305
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:303
#: pgadmin/tools/grant_wizard/__init__.py:129 pgadmin/utils/exception.py:35
msgid "Connection to the server has been lost."
msgstr "Se ha perdido la conexión con el servidor."
@@ -583,7 +583,7 @@ msgid "No parameters were changed."
msgstr "Ningún parámetro fue modificado."
#: pgadmin/browser/server_groups/servers/__init__.py:767
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:567
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:562
#: pgadmin/browser/server_groups/servers/databases/casts/__init__.py:370
#: pgadmin/browser/server_groups/servers/databases/extensions/__init__.py:264
#: pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py:395
@@ -605,7 +605,7 @@ msgstr "Ningún parámetro fue modificado."
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:365
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:569
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/__init__.py:436
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:888
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:922
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:393
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py:484
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py:478
@@ -782,33 +782,33 @@ msgstr "No se puede encontrar la utilidad para la operación '%s'"
msgid "PostgreSQL"
msgstr "PostgreSQL"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:38
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:37
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:21
msgid "Databases"
msgstr "Bases de Datos"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:375
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:391
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:654
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:724
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:849
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:1021
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:374
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:390
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:649
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:719
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:844
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:1016
msgid "Could not find the database on the server."
msgstr "No se puede encontrar la base de datos en el servidor."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:469
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:468
msgid "Database connected."
msgstr "Base de datos conectada."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:488
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:485
msgid "Database could not be disconnected."
msgstr "La base de datos no se puede desconectar."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:492
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:489
msgid "Database disconnected."
msgstr "Base de datos desconectada."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:777
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:772
#: pgadmin/browser/server_groups/servers/databases/casts/__init__.py:483
#: pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py:522
#: pgadmin/browser/server_groups/servers/databases/extensions/__init__.py:357
@@ -823,10 +823,10 @@ msgstr "Base de datos desconectada."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py:548
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py:488
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py:453
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:830
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:829
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py:441
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:462
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1051
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1085
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:474
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py:565
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py:591
@@ -844,11 +844,11 @@ msgstr "Base de datos desconectada."
msgid "Error: Object not found."
msgstr "Error: Objeto no encontrado."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:780
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:775
msgid "The specified database could not be found.\n"
msgstr "No se puede encontrar la base de datos especificada.\n"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:876
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:871
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:728
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:1561
msgid " -- definition incomplete"
@@ -946,19 +946,19 @@ msgstr "Conversion..."
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:93
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:39
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:210
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:182
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:107
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:670
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:712
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:119
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:105
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:53
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:292
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:181
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:106
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:669
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:710
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:118
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:104
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:52
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:289
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:358
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:131
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:130
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:265
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:324
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:184
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:183
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:324
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:148
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:112
@@ -1010,22 +1010,22 @@ msgstr "Nombre"
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:114
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog.js:65
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:393
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:185
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:110
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:673
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:716
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:123
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:109
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:295
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:184
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:109
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:672
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:714
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:122
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:108
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:292
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:361
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:146
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:145
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:254
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:327
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:187
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:186
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:328
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:151
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:115
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:312
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:309
#: pgadmin/browser/server_groups/servers/resource_groups/static/js/resource_group.js:87
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:391
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:344
@@ -1140,56 +1140,56 @@ msgstr "Tipo de origen"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:654
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:658
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:662
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:137
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:158
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:692
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:702
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:747
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:750
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:758
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:781
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:735
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:748
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:772
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:789
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:805
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:853
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:144
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:416
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:513
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:538
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:561
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:576
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:604
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:130
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:402
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:499
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:523
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:550
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:565
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:593
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:315
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:346
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:349
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:136
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:157
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:691
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:701
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:746
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:749
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:757
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:780
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:733
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:746
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:770
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:787
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:803
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:851
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:143
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:415
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:512
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:537
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:560
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:575
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:603
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:129
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:401
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:498
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:522
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:549
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:564
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:592
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:311
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:342
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:345
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:384
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:388
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:392
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:396
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:400
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:404
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:407
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:411
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:415
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:418
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:440
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:166
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:179
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:191
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:207
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:250
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:268
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:292
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:318
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:323
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:414
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:436
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:165
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:190
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:249
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:267
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:291
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:317
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:322
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:350
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:375
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:385
@@ -1201,14 +1201,14 @@ msgstr "Tipo de origen"
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:173
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:136
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:140
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:338
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:343
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:367
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:376
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:381
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:335
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:340
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:364
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:373
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:378
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:383
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:386
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:389
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:393
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:390
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:395
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:408
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:412
@@ -1263,22 +1263,22 @@ msgstr "Conversión del sistema?"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog.js:74
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:403
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:674
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:306
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:113
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:676
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:719
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:127
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:113
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:59
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:477
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:305
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:112
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:675
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:717
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:126
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:112
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:58
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:473
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:411
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:203
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:202
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:397
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:515
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:514
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:762
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:169
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:132
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:334
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:331
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:465
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:140
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:206
@@ -1361,7 +1361,7 @@ msgstr "Disparador por Evento..."
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:331
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:154
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:118
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:315
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:312
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:355
#: pgadmin/dashboard/static/js/dashboard.js:1129
#: pgadmin/dashboard/static/js/dashboard.js:1387
@@ -1373,7 +1373,7 @@ msgstr "Dueño"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:111
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:155
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:242
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:199
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:198
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:286
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:103
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:144
@@ -1382,28 +1382,28 @@ msgstr "¿Habilitado?"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:120
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:39
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:316
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:315
msgid "Trigger function"
msgstr "Función de disparador"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:124
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:205
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:267
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:272
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:347
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:387
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:391
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:404
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:417
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:429
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:459
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:464
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:204
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:266
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:271
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:346
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:386
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:390
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:403
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:416
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:428
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:458
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:463
msgid "Events"
msgstr "Eventos"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:132
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:264
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:456
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:263
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:455
msgid "When"
msgstr "Cuando"
@@ -1422,7 +1422,7 @@ msgstr "Cuando"
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:784
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:222
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:169
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:409
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:406
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:514
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:378
msgid "Security labels"
@@ -1455,14 +1455,14 @@ msgstr "Etiquetas de seguridad"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1124
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:167
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:130
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:317
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:320
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:323
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:326
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:329
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:332
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:400
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:412
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:467
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:397
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:409
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:464
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:516
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:360
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:372
@@ -1569,11 +1569,11 @@ msgstr "¿Reubicable?"
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:189
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:479
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:195
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:321
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:495
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:530
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:320
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:491
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:529
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:811
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:455
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:452
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:473
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:163
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:221
@@ -1773,8 +1773,8 @@ msgstr "Tipo"
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:214
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:129
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:161
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:319
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:396
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:316
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:393
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:420
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:427
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:440
@@ -1957,7 +1957,7 @@ msgid "Schema dropped"
msgstr "Esquema eliminado"
#: pgadmin/browser/server_groups/servers/databases/schemas/__init__.py:781
-#: pgadmin/static/js/backform.pgadmin.js:1837
+#: pgadmin/static/js/backform.pgadmin.js:1833
msgid "Definition incomplete."
msgstr "Definición incompleta."
@@ -1976,23 +1976,23 @@ msgstr "No se pudo encontrar el objeto del catálogo especificado."
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:594
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:60
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:23
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:269
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:268
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:786
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:787
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:788
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:909
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:898
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:899
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:143
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:344
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:417
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:908
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:896
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:897
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:142
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:340
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:413
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:421
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:427
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:428
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:401
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:495
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:496
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:461
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:460
#: pgadmin/tools/import_export/static/js/import_export.js:179
#: pgadmin/tools/import_export/static/js/import_export.js:199
#: pgadmin/tools/import_export/static/js/import_export.js:237
@@ -2041,7 +2041,7 @@ msgstr "Tipo de Datos"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:85
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:171
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:449
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:375
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:372
msgid "Collation"
msgstr "Colación"
@@ -2160,7 +2160,7 @@ msgstr "Restricciones de Dominio..."
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/static/js/domain.js:65
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:415
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:21
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:127
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:614
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:679
msgid "Check"
@@ -2168,7 +2168,7 @@ msgstr "Comprobar"
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js:97
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:419
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:136
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:135
msgid "No inherit?"
msgstr ""
@@ -2179,7 +2179,7 @@ msgid "Validate?"
msgstr "Validar?"
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:177
msgid "Check cannot be empty."
msgstr "Comprobación no puede estar vacía."
@@ -2284,8 +2284,8 @@ msgstr "Tabla Foránea eliminada"
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py:1285
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py:1330
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1367
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1417
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1401
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1451
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:1356
msgid "-- Please create column(s) first..."
msgstr "-- Por favor primero crear columna(s)..."
@@ -2294,8 +2294,6 @@ msgstr "-- Por favor primero crear columna(s)..."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:487
#: pgadmin/browser/static/js/browser.js:213
#: pgadmin/misc/static/explain/js/explain.js:1219
-#: pgadmin/misc/static/explain/js/explain.js:1348
-#: pgadmin/misc/static/explain/js/explain.js:1349
#: pgadmin/misc/statistics/static/js/statistics.js:129
msgid "Statistics"
msgstr "Estadísticas"
@@ -2305,7 +2303,7 @@ msgid "Inherited From"
msgstr "Heredada Desde"
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:259
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:176
msgid "Column Name cannot be empty."
msgstr "Nombre de Columna no puede estar vacía."
@@ -2511,7 +2509,7 @@ msgid "FTS Dictionary..."
msgstr "Diccionario FTS..."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/static/js/fts_dictionary.js:153
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:342
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:339
msgid "Template"
msgstr "Plantilla"
@@ -2669,7 +2667,7 @@ msgstr "Tiene que seleccionar la función Lexize."
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:59
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:21
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:457
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:434
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:431
msgid "Functions"
msgstr "Funciones"
@@ -2682,29 +2680,29 @@ msgstr "No se pudo encontrar la %s especificada."
msgid "Could not find the function node in the database."
msgstr "No se pudo encontrar el nodo de la función en la base de datos."
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:833
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:832
msgid "The specified function could not be found.\n"
msgstr "No se pudo encontrar la función especificada.\n"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:850
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:849
msgid "Function dropped."
msgstr "Función eliminada."
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1141
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1320
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1140
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1319
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:334
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:511
msgid "Could not find the function in the database."
msgstr "No se pudo encontrar la función en la base de datos."
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1628
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1627
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js:24
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:621
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbproc.js:24
msgid "Procedures"
msgstr "Procedimientos"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1728
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1727
msgid "Trigger Functions"
msgstr "Funciones disparadoras"
@@ -2744,7 +2742,7 @@ msgstr "Conteo de argumentos"
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:327
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:150
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:79
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:322
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:321
msgid "Arguments"
msgstr "Argumentos"
@@ -2768,8 +2766,8 @@ msgstr "Tipo del retorno"
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:182
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:98
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:100
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:289
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:493
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:288
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:492
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:154
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:155
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:209
@@ -2837,7 +2835,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:338
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:245
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1119
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:405
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:402
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:508
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:366
#: pgadmin/tools/debugger/static/js/direct.js:1707
@@ -2877,7 +2875,7 @@ msgstr "Símbolo de enlace no puede estar vacío."
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:406
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js:200
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:314
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:338
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:337
msgid "Code cannot be empty."
msgstr "Código no puede estar vacío."
@@ -3067,7 +3065,7 @@ msgstr "Encabezado no puede estar vacío."
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:56
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:25
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:450
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:428
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:425
msgid "Sequences"
msgstr "Secuencias"
@@ -3230,22 +3228,22 @@ msgid "System schema?"
msgstr "¿Esquema del sistema?"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:409
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:322
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:319
msgid "Default TABLE privileges"
msgstr "Privilegios de TABLE por defecto"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:412
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:325
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:322
msgid "Default SEQUENCE privileges"
msgstr "Privilegios de SEQUENCE por defecto"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:415
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:328
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:325
msgid "Default FUNCTION privileges"
msgstr "Privilegios de FUNCTION por defecto"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:418
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:331
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:328
msgid "Default TYPE privileges"
msgstr "Privilegios de TYPE por defecto"
@@ -3254,9 +3252,9 @@ msgid "Default privileges"
msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:443
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:53
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:29
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:422
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:419
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:130
msgid "Tables"
msgstr "Tablas"
@@ -3264,7 +3262,7 @@ msgstr "Tablas"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:464
#: pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py:58
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:24
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:445
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:442
msgid "Types"
msgstr "Tipos"
@@ -3325,8 +3323,8 @@ msgstr "¿Sinónimo publico?"
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:185
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:221
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:527
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:791
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:808
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:789
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:806
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:275
#: pgadmin/browser/static/js/browser.js:630
#: pgadmin/browser/static/js/node.js:1283
@@ -3335,17 +3333,17 @@ msgstr "¿Sinónimo publico?"
#: pgadmin/misc/file_manager/templates/file_manager/index.html:78
#: pgadmin/static/js/backform.pgadmin.js:538
#: pgadmin/static/js/backgrid.pgadmin.js:621
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1741
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1786
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2385
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1735
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1780
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2379
msgid "Yes"
msgstr "Si"
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:185
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:221
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:527
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:792
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:809
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:790
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:807
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:275
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:147
#: pgadmin/browser/static/js/browser.js:631
@@ -3355,9 +3353,9 @@ msgstr "Si"
#: pgadmin/misc/file_manager/templates/file_manager/index.html:77
#: pgadmin/static/js/backform.pgadmin.js:539
#: pgadmin/static/js/backgrid.pgadmin.js:622
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1742
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1787
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2386
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1736
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1781
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2380
msgid "No"
msgstr "No"
@@ -3369,32 +3367,32 @@ msgstr "Esquema destino no puede estar vacío."
msgid "Target object cannot be empty."
msgstr "Objeto destino no puede estar vacío."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:359
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:357
msgid "Could not find the table."
msgstr "No se pudo encontrar la tabla."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:596
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1271
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:630
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1305
msgid "The specified table could not be found."
msgstr "No se pudo encontrar la tabla especificada."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1054
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1088
msgid "The specified table could not be found.\n"
msgstr "No se pudo encontrar la tabla especificada.\n"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1067
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1101
msgid "Table dropped"
msgstr "Tabla eliminada"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1145
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1179
msgid "Trigger(s) have been disabled"
msgstr "Disparador(es) ha(n) sido deshabilitado(s)"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1147
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1181
msgid "Trigger(s) have been enabled"
msgstr "Disparador(es) ha(n) sido habilitado(s)"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1501
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1535
#, python-format
msgid "Table rows counted: %s"
msgstr ""
@@ -3447,7 +3445,7 @@ msgstr "Columna es eliminada"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:608
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:704
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:856
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:853
msgid "Could not find the column on the server."
msgstr "No se pudo encontrar la columna en el servidor."
@@ -3593,70 +3591,70 @@ msgstr ""
msgid "Compound Trigger"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:56
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:62
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:68
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:74
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:90
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:61
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:67
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:73
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:89
msgid "Compound Trigger..."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:80
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:79
msgid "Enable compound trigger"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:85
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:84
msgid "Disable compound trigger"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:169
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:168
msgid "Disable compound trigger failed"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:188
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:190
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:187
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:189
msgid "Trigger enabled?"
msgstr "¿Disparador habilitado?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:205
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:209
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:222
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:235
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:248
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:204
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:208
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:221
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:234
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:247
msgid "FOR Events"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:207
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:389
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:388
msgid "INSERT"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:220
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:402
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:219
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:401
msgid "UPDATE"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:233
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:415
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:232
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:414
msgid "DELETE"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:246
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:428
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:245
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:427
msgid "TRUNCATE"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:303
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:512
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:302
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:511
msgid "System trigger?"
msgstr "¿Disparador del sistema?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:328
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:543
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:327
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:542
msgid "Specify at least one event."
msgstr "Especificar al menos un evento."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:347
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:346
msgid ""
"-- Enter any global declarations below:\n"
"\n"
@@ -3726,15 +3724,15 @@ msgstr "No se pudo encontrar el objeto en el servidor."
msgid "Check constraint updated."
msgstr "Restricción de verificación actualizada."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:40
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:39
msgid "Check..."
msgstr "Verificación..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:46
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:45
msgid "Validate check constraint"
msgstr "Validar restricción de verificación"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:157
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:156
msgid "Don't validate?"
msgstr "¿No validar?"
@@ -3770,7 +3768,7 @@ msgid "Exclusion constraint dropped."
msgstr "Restricción de exclusión eliminada."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:38
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:97
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:96
msgid "Operator class"
msgstr "Clase de operador"
@@ -3798,10 +3796,10 @@ msgstr "Por favor especifique operador para la columna: "
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:453
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:381
#: pgadmin/browser/server_groups/servers/static/js/variable.js:341
-#: pgadmin/static/js/backform.pgadmin.js:1260
-#: pgadmin/static/js/backform.pgadmin.js:1370
-#: pgadmin/static/js/backform.pgadmin.js:1550
-#: pgadmin/static/js/backform.pgadmin.js:1669
+#: pgadmin/static/js/backform.pgadmin.js:1259
+#: pgadmin/static/js/backform.pgadmin.js:1366
+#: pgadmin/static/js/backform.pgadmin.js:1546
+#: pgadmin/static/js/backform.pgadmin.js:1665
msgid "Add new row"
msgstr "Agregar nueva fila"
@@ -3813,7 +3811,7 @@ msgstr "Restricción de exclusión"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:28
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:28
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:29
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:236
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:234
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/exclusion_constraint/sql/default/stats.sql:7
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/exclusion_constraint/sql/default/stats.sql:12
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/index_constraint/sql/default/stats.sql:7
@@ -3823,87 +3821,87 @@ msgstr "Restricción de exclusión"
msgid "Index size"
msgstr "Tamaño del índice"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:642
msgid "Exclusion constraint..."
msgstr "Restricción de exclusión..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:691
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:512
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:498
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:298
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:690
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:511
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:497
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:295
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:378
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:344
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:196
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:366
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:363
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:40
#: pgadmin/tools/backup/static/js/backup.js:366
#: pgadmin/tools/restore/static/js/restore.js:255
msgid "Tablespace"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:701
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:700
msgid "Access method"
msgstr "Método de acceso"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:716
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:326
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:715
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:322
msgid "Changing access method will clear columns collection"
msgstr "Cambiar el método de acceso limpiará la colección de columnas"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:746
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:560
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:549
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:386
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:745
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:559
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:548
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:382
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:716
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:790
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:204
msgid "Fill factor"
msgstr "Factor de llenado"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:749
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:734
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:575
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:564
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:267
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:748
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:732
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:574
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:563
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:266
msgid "Deferrable?"
msgstr "¿Aplazable?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:757
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:747
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:603
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:592
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:291
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:756
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:745
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:602
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:591
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:290
msgid "Deferred?"
msgstr "¿Aplazado?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:779
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:413
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:778
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:409
msgid "Constraint"
msgstr "Restricción"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:908
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:415
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:401
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:348
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:439
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:907
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:414
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:400
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:344
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:435
msgid "Include columns"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:931
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:242
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:438
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:228
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:424
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:370
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:461
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:930
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:241
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:437
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:227
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:423
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:366
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:457
msgid "Select the column(s)"
msgstr "Seleccionar la(s) columna(s)"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1012
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1011
msgid "Please specify name for exclusion constraint."
msgstr "Por favor especifique el nombre para la restricción de exclusión."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1018
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1017
msgid "Please specify columns for exclusion constraint."
msgstr "Por favor especifique las columnas para la restricción de exclusión."
@@ -3961,53 +3959,53 @@ msgstr "Referencias"
msgid "Referencing"
msgstr "Referenciando"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:616
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:615
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:585
msgid "Foreign key"
msgstr "Clave foránea"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:637
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:635
msgid "Foreign key..."
msgstr "Clave foránea..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:641
msgid "Validate foreign key"
msgstr "Validar clave foránea"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:771
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:769
msgid "Match type"
msgstr "Tipo de coincidencia"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:788
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:786
msgid "Validated?"
msgstr "¿Validado?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:804
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:802
msgid "Auto FK index?"
msgstr "¿Indice auto FK?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:852
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:850
msgid "Covering index"
msgstr "Índice de cobertura"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1002
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1000
msgid "On update"
msgstr "En actualización"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1003
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1023
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1001
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1021
msgid "Action"
msgstr "Acción"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1022
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1020
msgid "On delete"
msgstr "En borrado"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1050
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1048
msgid "Please specify columns for Foreign key."
msgstr "Por favor especificar columnas para la clave foránea."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1059
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1057
msgid "Please specify covering index name."
msgstr "Por favor especificar el nombre del índice de cobertura."
@@ -4052,7 +4050,7 @@ msgstr "{0} eliminado."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py:996
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:20
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:43
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:42
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:557
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:729
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:811
@@ -4061,7 +4059,7 @@ msgstr "Clave Primaria"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py:1006
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:20
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:43
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:42
msgid "Unique constraint"
msgstr "Restricción de unicidad"
@@ -4069,19 +4067,19 @@ msgstr "Restricción de unicidad"
msgid "Could not find the constraint in the table."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:536
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:522
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:231
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:535
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:521
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:229
msgid "Index"
msgstr "Índice"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:644
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:633
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:632
#, python-format
msgid "Please specify columns for %s"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:56
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:55
msgid "Oid"
msgstr ""
@@ -4108,7 +4106,7 @@ msgid "Index is dropped"
msgstr "Índice es eliminado"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:29
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:236
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:234
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:45
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:33
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:49
@@ -4125,59 +4123,63 @@ msgstr "Índice es eliminado"
msgid "Size"
msgstr "Tamaño"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:130
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:128
msgid "Sort order"
msgstr "Orden de clasificación"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:151
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:149
msgid "NULLs"
msgstr "NULOs"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:248
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:254
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:260
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:266
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:272
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:245
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:251
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:257
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:263
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:269
msgid "Index..."
msgstr "Índice..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:311
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:308
msgid "Access Method"
msgstr "Método de Acceso"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:390
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:386
msgid "Unique?"
msgstr "¿Único?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:394
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:390
msgid "Clustered?"
msgstr "¿Agrupado?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:398
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:394
msgid "Valid?"
msgstr "¿Válido?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:402
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:398
msgid "Primary?"
msgstr "¿Primario?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:406
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:402
msgid "System index?"
msgstr "¿Índice del sistema?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:409
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:405
msgid "Concurrent build?"
msgstr "¿Construcción concurrente?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:501
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:497
+msgid "Tablespace cannot be empty."
+msgstr "Tablespace no puede estar vacío."
+
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:503
msgid "Access method cannot be empty."
msgstr "Método de accesos no puede estar vacío."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:509
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:511
msgid "You must specify column name."
msgstr "Tiene que especificar un nombre de columna."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:514
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:516
msgid "You must specify at least one column."
msgstr "Tiene que especificar al menos una columna."
@@ -4574,39 +4576,39 @@ msgstr "Regla eliminada"
msgid "rule"
msgstr "regla"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:93
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:99
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:105
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:111
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:117
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:92
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:98
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:104
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:110
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:116
msgid "Rule..."
msgstr "Regla..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:165
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:164
#: pgadmin/static/js/sqleditor/query_tool_notifications.js:32
#: pgadmin/static/js/sqleditor/query_tool_notifications.js:80
msgid "Event"
msgstr "Evento"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:179
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:178
msgid "Do instead?"
msgstr ""
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:182
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:183
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:184
msgid "Condition"
msgstr "Condición"
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:188
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:189
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:190
msgid "Commands"
msgstr "Comandos"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:195
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:194
msgid "System rule?"
msgstr "¿Reglas del sistema?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:215
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:214
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:241
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:183
msgid "Please specify name."
@@ -5175,56 +5177,56 @@ msgstr "El disparador es eliminado"
msgid "Trigger"
msgstr "Disparador"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:56
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:62
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:68
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:74
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:90
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:61
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:67
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:73
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:89
msgid "Trigger..."
msgstr "Disparador..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:80
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:79
msgid "Enable trigger"
msgstr "Habilitar disparador"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:85
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:84
msgid "Disable trigger"
msgstr "Deshabilitar disparador"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:169
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:168
msgid "Disable trigger failed"
msgstr "Deshabilitar disparador falló"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:205
msgid "Row trigger?"
msgstr "¿Disparador de fila?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:247
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:246
msgid "Constraint trigger?"
msgstr "¿Disparador de restricción?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:346
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:345
msgid "Fires"
msgstr "Dispara"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:481
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:480
msgid "Old table"
msgstr "Tabla old"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:482
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:488
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:481
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:487
msgid "Transition"
msgstr "Transición"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:487
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:486
msgid "New table"
msgstr "Tabla new"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:536
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:535
msgid "Trigger function cannot be empty."
msgstr "Función del disparador no puede estar vacía."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:556
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:555
msgid "Trigger code cannot be empty."
msgstr "Código del disparador no puede estar vacío."
@@ -5610,7 +5612,7 @@ msgid "Size of temporary files"
msgstr "Tamaño de archivos temporales"
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:45
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:309
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:306
#: pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.2_plus/stats.sql:2
#: pgadmin/browser/server_groups/servers/databases/templates/databases/sql/default/stats.sql:2
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:176
@@ -5664,35 +5666,35 @@ msgstr "Desconectar la base de datos"
msgid "Are you sure you want to disconnect the database - %s?"
msgstr "¿Estas seguro de querer desconectar la base de datos - %s?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:337
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:334
#: pgadmin/static/js/browser/server_groups/servers/databases/external_tables/external_tables.js:52
#: pgadmin/tools/backup/static/js/backup.js:192
#: pgadmin/tools/import_export/static/js/import_export.js:108
msgid "Encoding"
msgstr "Codificación"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:380
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:377
msgid "Character type"
msgstr "Tipo de caracteres"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:385
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:382
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:413
msgid "Connection limit"
msgstr "Limite de conexiones"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:388
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:385
msgid "Template?"
msgstr "¿Plantilla?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:392
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:389
msgid "Allow connections?"
msgstr "¿Permitir conexiones?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:417
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:414
msgid "Default Privileges"
msgstr "Privilegios por defecto"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:499
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:496
msgid "Connect to database"
msgstr "Conectar a la base de datos"
@@ -6529,7 +6531,7 @@ msgstr "Tipo"
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:139
#: pgadmin/browser/static/js/browser.js:224
#: pgadmin/dashboard/static/js/dashboard.js:191
-#: pgadmin/static/js/backform.pgadmin.js:2032
+#: pgadmin/static/js/backform.pgadmin.js:2028
msgid "SQL"
msgstr "SQL"
@@ -7177,8 +7179,8 @@ msgid "At least one privilege should be selected."
msgstr "Al menos un privilegio debe estar seleccionado."
#: pgadmin/browser/server_groups/servers/static/js/server.js:46
-msgid "Security label must be specified."
-msgstr ""
+msgid "Label must be specified."
+msgstr "Nivel tiene que estar especificado."
#: pgadmin/browser/server_groups/servers/static/js/server.js:79
#: pgadmin/browser/server_groups/servers/static/js/server.js:84
@@ -7277,20 +7279,20 @@ msgstr "Cambiar Contraseña "
#: pgadmin/misc/file_manager/static/js/create_dialogue.js:188
#: pgadmin/misc/file_manager/static/js/select_dialogue.js:86
#: pgadmin/misc/file_manager/static/js/select_dialogue.js:129
-#: pgadmin/preferences/static/js/preferences.js:435
+#: pgadmin/preferences/static/js/preferences.js:434
#: pgadmin/static/js/slickgrid/editors.js:50
-#: pgadmin/static/js/sqleditor/filter_dialog.js:79
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:62
-#: pgadmin/tools/datagrid/static/js/show_data.js:139
+#: pgadmin/static/js/sqleditor/filter_dialog.js:78
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:61
+#: pgadmin/tools/datagrid/static/js/show_data.js:138
#: pgadmin/tools/debugger/static/js/debugger_ui.js:588
#: pgadmin/tools/debugger/static/js/debugger_ui.js:893
#: pgadmin/tools/import_export/static/js/import_export.js:495
-#: pgadmin/tools/maintenance/static/js/maintenance.js:297
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:56
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2010
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2164
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4222
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4289
+#: pgadmin/tools/maintenance/static/js/maintenance.js:296
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:55
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2004
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2158
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4216
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4283
msgid "Cancel"
msgstr "Cancelar"
@@ -7514,7 +7516,7 @@ msgid "Connection timeout (seconds)"
msgstr "Tiempo de espera de conexión (segundos)"
#: pgadmin/browser/server_groups/servers/static/js/server.js:1130
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2192
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2186
msgid "Connect to Server"
msgstr "Conectar al Servidor"
@@ -7773,17 +7775,15 @@ msgid "Dependents"
msgstr "Dependientes"
#: pgadmin/browser/static/js/browser.js:348
-#: pgadmin/browser/static/js/toolbar.js:30
-#: pgadmin/browser/static/js/toolbar.js:31
-#: pgadmin/browser/static/js/toolbar.js:91
+#: pgadmin/browser/static/js/toolbar.js:29
+#: pgadmin/browser/static/js/toolbar.js:88
#: pgadmin/tools/datagrid/static/js/datagrid.js:74
msgid "View Data"
msgstr ""
#: pgadmin/browser/static/js/browser.js:349
#: pgadmin/browser/static/js/toolbar.js:20
-#: pgadmin/browser/static/js/toolbar.js:21
-#: pgadmin/browser/static/js/toolbar.js:93
+#: pgadmin/browser/static/js/toolbar.js:90
#: pgadmin/tools/datagrid/static/js/datagrid.js:75
msgid "Filtered Rows"
msgstr ""
@@ -8029,10 +8029,10 @@ msgid "Changes will be lost. Are you sure you want to reset?"
msgstr ""
#: pgadmin/browser/static/js/node.js:1513
-#: pgadmin/preferences/static/js/preferences.js:439
-#: pgadmin/preferences/static/js/preferences.js:464
+#: pgadmin/preferences/static/js/preferences.js:438
+#: pgadmin/preferences/static/js/preferences.js:463
#: pgadmin/tools/datagrid/templates/datagrid/index.html:37
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4297
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4291
msgid "Save"
msgstr "Salvar"
@@ -8052,20 +8052,17 @@ msgstr "Seleccionar Todo"
msgid "Unselect All"
msgstr "De-seleccionar Todo"
-#: pgadmin/browser/static/js/toolbar.js:40
-#: pgadmin/browser/static/js/toolbar.js:41
-#: pgadmin/browser/static/js/toolbar.js:89
+#: pgadmin/browser/static/js/toolbar.js:38
+#: pgadmin/browser/static/js/toolbar.js:86
#: pgadmin/tools/datagrid/static/js/datagrid.js:103
#: pgadmin/tools/datagrid/static/js/datagrid.js:115
#: pgadmin/tools/sqleditor/__init__.py:68
msgid "Query Tool"
msgstr "Herramienta de Consulta"
-#: pgadmin/browser/static/js/wizard.js:85
#: pgadmin/browser/static/js/wizard.js:86
#: pgadmin/static/js/alertify.pgadmin.defaults.js:261
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:263
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:457
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:455
#: pgadmin/templates/security/messages.html:7
#: pgadmin/tools/user_management/static/js/user_management.js:81
#: pgadmin/tools/user_management/static/js/user_management.js:174
@@ -8073,11 +8070,9 @@ msgstr "Herramienta de Consulta"
msgid "Close"
msgstr "Cerrar"
-#: pgadmin/browser/static/js/wizard.js:88
#: pgadmin/browser/static/js/wizard.js:89
#: pgadmin/static/js/alertify.pgadmin.defaults.js:262
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:264
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:458
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:456
msgid "Maximize"
msgstr "Maximizar"
@@ -8085,22 +8080,6 @@ msgstr "Maximizar"
msgid "Left panel logo"
msgstr "Panel izquierdo de logo"
-#: pgadmin/browser/static/js/wizard.js:124
-msgid "Close error bar"
-msgstr ""
-
-#: pgadmin/browser/static/js/wizard.js:131
-#: pgadmin/browser/templates/browser/index.html:135 pgadmin/help/__init__.py:59
-#: pgadmin/help/__init__.py:70 pgadmin/preferences/static/js/preferences.js:427
-#: pgadmin/static/js/sqleditor/filter_dialog.js:72
-#: pgadmin/static/js/sqleditor/filter_dialog.js:73
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:56
-#: pgadmin/tools/datagrid/static/js/show_data.js:133
-#: pgadmin/tools/maintenance/static/js/maintenance.js:289
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:50
-msgid "Help"
-msgstr "Ayuda"
-
#: pgadmin/browser/static/js/wizard.js:139
#: pgadmin/misc/file_manager/templates/file_manager/index.html:15
msgid "Back"
@@ -8138,6 +8117,11 @@ msgstr "Administración"
msgid "Tools"
msgstr "Herramientas"
+#: pgadmin/browser/templates/browser/index.html:135 pgadmin/help/__init__.py:59
+#: pgadmin/help/__init__.py:70 pgadmin/static/js/sqleditor/filter_dialog.js:72
+msgid "Help"
+msgstr "Ayuda"
+
#: pgadmin/browser/templates/browser/index.html:157
msgid "Logout"
msgstr "Salir"
@@ -8530,7 +8514,7 @@ msgstr ""
#: pgadmin/dashboard/templates/dashboard/database_dashboard.html:88
#: pgadmin/dashboard/templates/dashboard/server_dashboard.html:92
#: pgadmin/misc/file_manager/templates/file_manager/index.html:27
-#: pgadmin/preferences/static/js/preferences.js:492
+#: pgadmin/preferences/static/js/preferences.js:491
msgid "Refresh"
msgstr "Actualizar"
@@ -9056,33 +9040,13 @@ msgstr ""
msgid "Analysis"
msgstr ""
-#: pgadmin/misc/static/explain/js/explain.js:1286
-#: pgadmin/misc/static/explain/js/explain.js:1287
-msgid "Zoom in"
-msgstr ""
-
-#: pgadmin/misc/static/explain/js/explain.js:1295
-#: pgadmin/misc/static/explain/js/explain.js:1296
-msgid "Zoom to original"
-msgstr ""
-
-#: pgadmin/misc/static/explain/js/explain.js:1304
-#: pgadmin/misc/static/explain/js/explain.js:1305
-msgid "Zoom out"
-msgstr ""
-
-#: pgadmin/misc/static/explain/js/explain.js:1319
-#: pgadmin/misc/static/explain/js/explain.js:1320
-msgid "Download"
-msgstr ""
-
#: pgadmin/misc/statistics/static/js/statistics.js:214
msgid "No statistics are available for the selected object."
msgstr "No hay estadísticas disponibles pata el objeto seleccionado."
#: pgadmin/preferences/__init__.py:55
#: pgadmin/preferences/static/js/preferences.js:426
-#: pgadmin/preferences/static/js/preferences.js:449
+#: pgadmin/preferences/static/js/preferences.js:448
msgid "Preferences"
msgstr "Preferencias"
@@ -9107,17 +9071,17 @@ msgstr "Ocultar"
msgid "Category is not selected."
msgstr "Categoría no está seleccionada."
-#: pgadmin/preferences/static/js/preferences.js:483
+#: pgadmin/preferences/static/js/preferences.js:482
msgid "Refresh required"
msgstr ""
-#: pgadmin/preferences/static/js/preferences.js:484
+#: pgadmin/preferences/static/js/preferences.js:483
msgid ""
"A page refresh is required to apply the theme. Do you wish to refresh the"
" page now?"
msgstr ""
-#: pgadmin/preferences/static/js/preferences.js:493
+#: pgadmin/preferences/static/js/preferences.js:492
msgid "Later"
msgstr ""
@@ -9163,37 +9127,33 @@ msgstr "Error desconocido"
msgid "INTERNAL SERVER ERROR"
msgstr "ERROR INTERNO DEL SERVIDOR"
-#: pgadmin/static/js/backform.pgadmin.js:1550
-msgid "Add"
-msgstr ""
-
-#: pgadmin/static/js/backform.pgadmin.js:1841
+#: pgadmin/static/js/backform.pgadmin.js:1837
msgid "No updates."
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:1956
+#: pgadmin/static/js/backform.pgadmin.js:1952
msgid "General"
msgstr "General"
-#: pgadmin/static/js/backform.pgadmin.js:2157
+#: pgadmin/static/js/backform.pgadmin.js:2153
msgid "Preview not available..."
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:2618
+#: pgadmin/static/js/backform.pgadmin.js:2605
#: pgadmin/tools/backup/static/js/backup.js:95
#: pgadmin/tools/backup/static/js/backup.js:230
msgid "Note"
msgstr "Nota"
-#: pgadmin/static/js/backform.pgadmin.js:2974
+#: pgadmin/static/js/backform.pgadmin.js:2961
msgid "More"
msgstr "Mas"
-#: pgadmin/static/js/backform.pgadmin.js:2975
+#: pgadmin/static/js/backform.pgadmin.js:2962
msgid "Less"
msgstr "Menos"
-#: pgadmin/static/js/backform.pgadmin.js:3059
+#: pgadmin/static/js/backform.pgadmin.js:3046
msgid "Space"
msgstr "Espacio"
@@ -9222,7 +9182,7 @@ msgstr "Este objeto no puede ser borrado."
msgid "Delete row"
msgstr "Borrar fila"
-#: pgadmin/static/js/backgrid.pgadmin.js:1098
+#: pgadmin/static/js/backgrid.pgadmin.js:1091
msgid "Array Values"
msgstr "Arreglo de Valores"
@@ -9386,13 +9346,13 @@ msgstr "Consulta retornó exitosamente en %s."
msgid "Sort/Filter options"
msgstr "Opciones Ordenar/Filtrar"
-#: pgadmin/static/js/sqleditor/filter_dialog.js:239
+#: pgadmin/static/js/sqleditor/filter_dialog.js:238
msgid "Filter updated successfully"
msgstr "Filtro actualizado exitosamente"
-#: pgadmin/static/js/sqleditor/filter_dialog.js:245
-#: pgadmin/tools/datagrid/static/js/show_data.js:238
-#: pgadmin/tools/datagrid/static/js/show_data.js:245
+#: pgadmin/static/js/sqleditor/filter_dialog.js:244
+#: pgadmin/tools/datagrid/static/js/show_data.js:237
+#: pgadmin/tools/datagrid/static/js/show_data.js:244
msgid "Validation Error"
msgstr "Error de Validación"
@@ -9473,7 +9433,6 @@ msgstr ""
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:40
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:41
-#: pgadmin/tools/datagrid/templates/datagrid/index.html:56
#: pgadmin/tools/datagrid/templates/datagrid/index.html:68
msgid "Find"
msgstr "Buscar"
@@ -9557,14 +9516,14 @@ msgstr ""
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:129
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:131
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4230
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4224
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:663
msgid "Commit"
msgstr ""
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:135
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:137
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4227
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4221
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:681
msgid "Rollback"
msgstr ""
@@ -9642,7 +9601,7 @@ msgstr "Esta URL no se puede consultar directamente."
#: pgadmin/tools/backup/__init__.py:43
#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:46
#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:55
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:67
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:66
msgid "Backup"
msgstr "Respaldo"
@@ -9922,8 +9881,8 @@ msgstr "Respaldar..."
#: pgadmin/tools/backup/static/js/backup_dialog.js:71
#: pgadmin/tools/import_export/static/js/import_export.js:685
#: pgadmin/tools/import_export/static/js/import_export.js:699
-#: pgadmin/tools/maintenance/static/js/maintenance.js:477
-#: pgadmin/tools/maintenance/static/js/maintenance.js:488
+#: pgadmin/tools/maintenance/static/js/maintenance.js:476
+#: pgadmin/tools/maintenance/static/js/maintenance.js:487
#: pgadmin/tools/restore/static/js/restore_dialog.js:51
#: pgadmin/tools/restore/static/js/restore_dialog.js:75
msgid "Utility not found"
@@ -9931,25 +9890,25 @@ msgstr ""
#: pgadmin/tools/backup/static/js/backup_dialog.js:72
#: pgadmin/tools/import_export/static/js/import_export.js:700
-#: pgadmin/tools/maintenance/static/js/maintenance.js:489
+#: pgadmin/tools/maintenance/static/js/maintenance.js:488
#: pgadmin/tools/restore/static/js/restore_dialog.js:76
msgid "Failed to fetch Utility information"
msgstr ""
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:159
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:158
msgid "Backup job created."
msgstr "Trabajo de respaldo creado."
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:163
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:162
msgid "Backup job creation failed."
msgstr ""
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:171
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:170
msgid "Backup job failed."
msgstr "Trabajo de respaldo falló."
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:242
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:229
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:241
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:228
msgid "Please provide a filename"
msgstr "Suministre un nombre de archivo"
@@ -9998,7 +9957,7 @@ msgstr "Ningún objeto seleccionado."
msgid "Data Filter"
msgstr ""
-#: pgadmin/tools/datagrid/static/js/show_data.js:161
+#: pgadmin/tools/datagrid/static/js/show_data.js:160
msgid "Use SHIFT + ENTER to apply filter..."
msgstr ""
@@ -10598,30 +10557,6 @@ msgstr "Pila"
msgid "Debugger - "
msgstr "Depurador - "
-#: pgadmin/tools/debugger/templates/debugger/direct.html:59
-msgid "Step into"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:67
-msgid "Step over"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:75
-msgid "Continue/Start"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:85
-msgid "Toggle breakpoint"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:93
-msgid "Clear all breakpoints"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:103
-msgid "Stop"
-msgstr ""
-
#: pgadmin/tools/grant_wizard/__init__.py:327
msgid "Unable to fetch the {} objects"
msgstr ""
@@ -10982,7 +10917,7 @@ msgstr "Mensajes detallados"
#: pgadmin/tools/maintenance/static/js/maintenance.js:167
#: pgadmin/tools/maintenance/static/js/maintenance.js:183
-#: pgadmin/tools/maintenance/static/js/maintenance.js:483
+#: pgadmin/tools/maintenance/static/js/maintenance.js:482
msgid "Maintenance..."
msgstr "Mantenimiento..."
@@ -10998,15 +10933,15 @@ msgstr ""
"Creación de trabajo de mantenimiento falló. Bases de Datos con símbolo = "
"en el nombre no puede mantenerse usando esta utilidad."
-#: pgadmin/tools/maintenance/static/js/maintenance.js:387
-#: pgadmin/tools/maintenance/static/js/maintenance.js:394
+#: pgadmin/tools/maintenance/static/js/maintenance.js:386
+#: pgadmin/tools/maintenance/static/js/maintenance.js:393
msgid "Maintenance job creation failed."
msgstr "Creación de trabajo de mantenimiento falló."
#: pgadmin/tools/restore/__init__.py:41
#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:40
#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:49
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:62
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:61
msgid "Restore"
msgstr "Restaurar"
@@ -11072,15 +11007,15 @@ msgstr "Restaurar..."
msgid "Restore (%s: %s)"
msgstr "Restaurar (%s: %s)"
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:149
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:148
msgid "Restore job created."
msgstr "Trabajo de restauración creado."
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:153
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:152
msgid "Restore job creation failed."
msgstr ""
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:161
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:160
msgid "Restore job failed."
msgstr "Trabajo de restauración falló."
@@ -11168,79 +11103,79 @@ msgstr "Notificaciones"
msgid "Geometry Viewer"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:832
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:826
msgid "Editable column"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:834
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:828
msgid "Read-only column"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1261
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1255
msgid "Fetching all records..."
msgstr "Obteniendo todos los registros..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1730
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2369
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3314
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1724
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2363
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3308
msgid "Unsaved changes"
msgstr "Cambios sin salvar"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1731
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3315
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1725
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3309
msgid "Are you sure you wish to discard the current changes?"
msgstr "¿Esta seguro de querer descartar los cambios actuales?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1759
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1753
msgid "Clear history"
msgstr "Limpiar historial"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1760
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1754
msgid "Are you sure you wish to clear the history?"
msgstr "¿Esta seguro de querer limpiar el historial?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1761
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1755
msgid ""
"This will remove all of your query history from this and other sessions "
"for this database."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2125
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2119
msgid "Connection Warning"
msgstr "Advertencia de Conexión"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2132
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2126
msgid "The application has lost the database connection:"
msgstr "La aplicación ha perdido la conexión con la base de datos:"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2136
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2130
msgid "⁃ If the connection was idle it may have been forcibly disconnected."
msgstr "- Si la conexión estuvo inactiva pudo haber sido desconectada a la fuerza."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2138
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2132
msgid "⁃ The application server or database server may have been restarted."
msgstr ""
"- El servidor de la aplicación o el servidor de la base de datos pueden "
"haber sido reiniciados."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2140
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2134
msgid "⁃ The user session may have timed out."
msgstr "- La sesión de usuario pudo superar el límite de tiempo."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2144
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2138
msgid "Do you want to continue and establish a new session?"
msgstr "¿Desea continuar o establecer una nueva sesión?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2163
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2157
msgid "Continue"
msgstr "Continuar"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2299
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2293
#, python-format
msgid "Error fetching SQL for script: %s."
msgstr "Error obteniendo SQL para el código: %s."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2370
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2364
msgid ""
"The data has been modified, but not saved. Are you sure you wish to "
"discard the changes?"
@@ -11248,165 +11183,165 @@ msgstr ""
"La data se ha modificado, pero no se ha salvado. ¿Esta seguro de "
"descartar los cambios?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2414
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2408
msgid "Running query..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2422
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2416
msgid "Waiting for the query to complete..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2579
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2573
msgid "Loading data from the database server and rendering..."
msgstr "Cargando datos desde el servidor de base de datos y representando..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2588
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2582
#, python-format
msgid "Successfully run. Total query runtime: %s."
msgstr "Ejecución exitosa. Tiempo de ejecución total de la consulta: %s."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2589
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2583
#, python-format
msgid "%s rows affected."
msgstr "%s filas afectadas."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2865
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2859
msgid ""
"This query was generated by pgAdmin as part of a \"View/Edit Data\" "
"operation"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2966
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2960
msgid "Row(s) deleted."
msgstr "Fila(s) borradas."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3040
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3034
msgid "Saving the updated data..."
msgstr "Salvando los datos actualizados..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3156
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3150
msgid "Data saved successfully."
msgstr "Datos salvados exitosamente."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3159
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3153
msgid "Auto-commit is off. You still need to commit changes to the database."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3165
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3159
#, python-format
msgid "%s."
msgstr "%s."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3170
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3164
msgid ""
"Saving data changes was rolled back but the current transaction is still "
"active; previous queries are unaffected."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3192
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3186
msgid "This query was generated by pgAdmin as part of a \"Save Data\" operation"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3353
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3347
msgid "Loading the file..."
msgstr "Cargando el archivo..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3404
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3398
msgid "Saving the queries in the file..."
msgstr "Salvando las consultas en el archivo..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3416
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3410
msgid "File saved successfully."
msgstr "Archivos salvados exitosamente."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3538
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3597
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3532
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3591
msgid "Applying the new filter..."
msgstr "Aplicando el nuevo filtro..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3558
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3568
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3552
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3562
msgid "Filter By Selection Error"
msgstr "Error Filtro por Selección"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3617
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3627
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3611
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3621
msgid "Filter Exclude Selection Error"
msgstr "Error Filtro Excluir Selección"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3637
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3631
msgid "Removing the filter..."
msgstr "Quitando el filtro..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3655
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3665
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3649
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3659
msgid "Remove Filter Error"
msgstr "Error al Quitar Filtro"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3768
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3762
msgid "Setting the limit on the result..."
msgstr "Configurando el limite en el resultado..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3787
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3796
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3781
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3790
msgid "Change limit Error"
msgstr "Error Cambiando limite"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3922
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3941
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3916
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3935
msgid "Cancel Query Error"
msgstr "Error al Cancelar la Consulta"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3960
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3954
msgid "Downloading CSV..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4014
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4008
msgid "CSV Download cancelled."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4017
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4011
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:395
msgid "Download CSV"
msgstr "Descargar CSV"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4020
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4014
msgid "Download CSV error"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4054
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4061
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4048
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4055
msgid "Auto Rollback Error"
msgstr "Error en Auto Rollback"
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4081
#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4087
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4093
msgid "Auto Commit Error"
msgstr "Error en Auto Commit"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4182
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4176
msgid "The data has changed. Do you want to save changes?"
msgstr "La data ha cambiado. ¿Quiere salvar los cambios?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4188
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4182
msgid "The text has changed. Do you want to save changes?"
msgstr "El texto ha cambiado. ¿Quiere salvar los cambios?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4268
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4262
msgid ""
"The current transaction is not commited to the database.Do you want to "
"commit or rollback the transaction?"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4271
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4265
msgid "Commit transaction?"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4294
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4288
msgid "Don't save"
msgstr "No salvar"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4337
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4331
msgid "Save changes?"
msgstr "¿Salvar cambios?"
@@ -12642,9 +12577,3 @@ msgstr "No se pudo encontrar la base de datos especificada."
#~ msgid "Error dropping %s: \"%s\""
#~ msgstr "Error eliminando %s: \"%s\""
-#~ msgid "Tablespace cannot be empty."
-#~ msgstr "Tablespace no puede estar vacío."
-
-#~ msgid "Label must be specified."
-#~ msgstr "Nivel tiene que estar especificado."
-
diff --git a/web/pgadmin/translations/fr/LC_MESSAGES/messages.mo b/web/pgadmin/translations/fr/LC_MESSAGES/messages.mo
index 404c7e584182ca2e4bd2c40b75c81c771d313742..1d09217170427a307a1d9311df6eb2e6f6fdea5e 100644
GIT binary patch
delta 34607
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
MWR2aD+LYt}0BkD)TmS$7
delta 48474
zcmZ791(;P;AMf!!Gjw;yP(uwhba!_n-3THLl5RQ$q)Vl{1Ox;DNhty8?k?$&ko*0e
z_2*viyPs$KS!?apvCo+S-go}s7_*<p@UJ9@G|l5`7tQlhVY#xNS2CvObsniy&--$N
z=iS1Nm@nA#YW(7P-H8v|<arJ76;{S-n>}w^kmpUuwZ!Xg@w}ffWUJ@RBz*zWgjaN%
zvz*iSs#`(>j6;SNW*3Z3e2_WHoMg_yxIABMZbX&eXYo^*ocJwFjQ?V4OtjslM_?Au
zr{@IX@t`--QEw!w;nB!Mc$3Ya%oUh|^i3EAkE8OR!}xduL+~Y5$G52b6?S-DVQhu!
z&>YN9``$VN8SpM9!<fH&UMOZnX51@pRx+!aHO$&(J+q<N*lcFDG~1w-qCNWRc~=6F
zu%Bi4*5X4fKGNc2EIz^FlPo^n;<GINlf~y-e2K-ETYQbh*Zt1?YlNFDVT)zhVewt4
zsr<vz4_W#Vi=VLgX^UU5_+^XVu=s6@Kd|^?i$DL}cO!pg3GXb!M~esVbk8HBIvT^`
zu`Qm!;)zimO=0P2EIpmY!z`ZF;yKMcz6J7`1<fL6akG?J7E^j`CRBs1Q5|b<b~HPi
zUCkb5Z?muI53s<u<`7iH!!14<wOPhle5yIaoNfMS&NCO9OU&iwDpdVzoxZoh5;mK^
znZILc&-3<RWQ@GajXWmSC7v0p;sDe!+>cT5C~7mGK{a#{bu6!<2J#GJ<2y{q{_~>k
zb_uC44G*%Rj$vg?hpjObhhu77j5^PIQ0MpxCdHSirHQr2y<oDS@|8i=*9?`v4<^Cy
zB<*_(?ZH;_FY^xS#q<HyaO}PAjh7uY;-Y35%t*Yl#k*h#@!qHo^h3QFr(!Hzh<dU8
zjJ^`K5zwpjAZm)vqo(`@s^C3Tg>Nt?zDK<`vh8#E^P%z=#{^gwmA?VTz{Xe)+hKm(
zin;LVKIT6MfzUs^fHklH@qyR_H((VE+wU6cj#}gXs16TB&Cq1jh!$FWEo$UDF*07n
z+ISs{Vcr97#=0F~{!5WCjf5I_1~tM=2l-sUdYBF8V;=ky)xm!;0`nho`M$&!#5ZC=
zOnjJ6QLK*HaXb#jEm$0j{OQvB`UF(*B1<@fS&0W9aSex~rm7)o>PBH9+-~WwQA-qd
z)NSJY7@c@ojD^)v9cYZ&oFlOcF2H8!KPHfyK-FWe!GRcs_)^q})>u5wU#_9VsN<B;
z;sr1v@$#q!zreWI-k$ft^2A4AQ9O+LSdMx;P|o+#5zwZ|kBP7n#>QqC1HZyZ*vHZb
zpc)#3+N{%2`Q~DJT!C8SBd8^aal)ORDwv1(mzWP{V`82EV+1rcw^8Rm=%ky0P>fGJ
zGseThm=LR=@;Ao>*dI0J<58P#hQ-&THs3Z>hj&~280x)p8l%&`_r?-}PPwVefNC%=
zY9`8|Mpy@9Vl&i?bVN;c7mSMEq8b{Bnu#gc7&l=;jDOnY%Vg$2Un9v+AT8ELy~(<x
z8XSWvIMw3IEWQENk^QI<p2Spm9&_PqRQa$oZYJ|!BI1QmGgcin(=E?1|LU<%f*Sq~
zGvgvu!+%=(HB`a3s5Osy*3Cd7RQcqn83;plD5u5qVI1PcP%~8(RlbSY_AK+S-S{;L
zn(9%g8JUJEunx5pyHFiCVcteH_!di{cg`Kp(ilPX8_b6*Ed45~BZ<$unahakXl|c?
zHdz5of|XDWw!q}r%^ZvB;3Cur)}t!;4K=m9EPe)+?-HuR4=_1?G?QL%`SW06()|hq
zRG_In=!7chquv9PEj|m?!Bwb+_n>CzAZjMgqt^U7YI8n9HSi2of7FX^<cU$IB^@$w
z-^)%wYgimrK^0WP^)VEiqBhqc)J)B`_$u=ts=_;{nR$xp&_9?AgD$ypDa>$8N_q*5
zs`KA~fC@GbBzRs2i+4qJq%UeS`u2PZsv~nyYq}b>WZN($9zo^5kIMJajC<L|)1f+?
z7h~)E7bl>pt!f!sqblr$IdB9P!VTC9A7Mjmb;Z5ewxIH#MKyd6)v*t#nT>hXHJl9f
zJR54JOQ5enWdd5udZ@K;i>mM&ER3V=`EJyRPGB0mW$}<}Ziy0OQ_>?aGfqU+yBXEa
ze$<=q1cu_vYs|lTl=!;a99dCommf7n#ZgOB5jCP(sLj>F;%!kcqMoQz;G;S?6*Z70
zSQfXKA5ry|zTwJMz2Upv+>iu~s2Qfhff$anFc<!TI?u0BBg=l%eYn&`rBA_ZcmRvx
z3(SMLZ@K)fQA;=$wWND613vQ!gc3-6+kGP`fGXI;;^R>btVcC`7qej8JMP1#5GsFN
z)aU#NR7cjK8oGq}F~(h2t`ue^-Vv4GpF$u#f!|RL-M|8v^q%`BQv=fyABj0}32H`8
zqjr1b`);Pvp*m6nm47gX;XKTO`!O#*#Y~v-K_K1tst{05dZH?vi|YArm<{h^R!sEJ
z<tu@TcS23!RMY@|#f*3n)j{u(YbZC?BiaD9q$^QNd=5i({$CNuOhS^!ZYfG&ZsILa
z6@QN^xB->#8mggaf4dRpKs8tol|CGGYL;Vmyoo9o_lf&#D2S@B6K1D<Zw3KP)gJQ!
zs-pN$-P9F8#ap0eWH@RD)}r3+=PmsOs^T=y+-9zdn)*)W6x8!=m<R8puc=7++;yN3
z>Xq37HMM=Q1pa`<@gi2j<S*Q(UTZ8%d?8lFyI2nMzT^i~?2AS4cT_#^Py;CZ%5|je
zE9O5236n@jhd*E(+<{T>2*$)y7!R*ue0*kxymlWhiOmccmFIadF&4&1SQAyg9>&6U
z7#n-MX8v{V2a}K&=b{=ui3#z7W&GRHKcG4o^2X&$fNCH)s)019`f_0stbx(79crLm
zQTh9$2Il(&;u08V33E_AT#8z&Ur<YO9krJ4P!(o)>)wnxP#rCRTCysrhPz-z9D$m#
zBd7+iqRKzSM(DpHpdQuu$9*i;Ma92Dji?){f+3gyr=TiYV)6B;3in}TJciNmG%DW}
z)Qmkqy%+w$jF|jgV99;21OZjh5|yD7s)DhowVZ-_FU&!8V6(*!VKU-(Fe!er=SknY
z`m&+w$%pDlaZ9g^T8g@uMCZRbf%+u$My>r}R6{3F8E>OD%TtU0i&~=SA6&&rP^Tz8
zDql%d$E%|TRv)ut3skvrsCs8&OxpJr5>SD)s43r!>iGdnKaN`C^QewJMpfi}bT6#f
zsB$?`4VFah{>rFR)dE%j5Y$YJLCxGW^fl#c2xt=?MQxrdmf@Af<NWLPKqj*wYRW64
zDsF`;-x1Y7Kg<=x=Ck<5Pwum27ixxIV{-iXiTO`NAgLD=7+E-Kvy?=Qqz0;iMyM%k
ziE8L8)C>(k&BSoj%uGTp!6H<?^_IRH!-$_o<^O=GF?x{i3S<s)5AvfbE`yr#s;C)i
zfhyo*Vf+y_#b;3sK1Q9I_m=Jj2L+ZS3F`D@M$K$tRQ<J39sI&4pegBy1+g0zz-6eO
zUPT?NN0<hmqoz21h?|krsPrtTC8>y+u?23yQK%U$9VsYqifUmK;+=6k`UeQ8M-3u7
zTVM$BFHs%njB22tJ)ennh|k9<_!6_>=qPT)8&DnIiyHYM48=>B5<j9oRg*^z(r1eA
z6(gV*LVr|4b5T>e19Rh_sHy&lTEm3Vf&!m@MNsj!7>eUCAFe`u!MKj<Sk&llW+Ti_
zsF_-TsdfIhTEaP0N1mc8P8`EkSPZo!-7!BdGq0dJm?&mY;8k57)nE_Q68vcKeW;N?
z#Z(w8mK#7;OilY<T>@FKJF4Jp48`53b9xiC`#)d~j2heRnf$17#ZYV9&g_L+f?=qc
z9D{m4%&_OnP&2w2eN}jbfJXiv)q&7BL4gmGN~rYCs7*Qvbu4G1j@trM$2MYA+=)8Q
z2kiM}R6|cKJxW}6ic+GMpm5wEKTu(95>!zW)Ujxf>UkfF4@Xrz6}5SmqelEED&Iv^
z2kxWFKSOmmD4we~8m1$j5VfiEqfSwoc%1*hi-rX4)<%}06RJbspr&pps=+C!1{R<i
zUXNvPCn|qPeAjRsRDFq2Z@SE=0hC6~Tmw|S9eo0-xIgLzF$Ps|9;(9ir~=zj4gQ7d
z`4!Yi9-u0IgX&nU1TJ4Hj6^(}nF}=|`A}0|6q}=8mw<Nhdej$)n^+K|CUm>BBx;j&
zMD2~qsQg<|d*dN$v&Bo~I+O(UKFNSul5kXm`7i>jVIK664*K3Y0?N1vwG=y0yZ!)b
zimsz(=((i_C3Y32Ks6MBnvtTY5mrP^c@5P2<V)16d=zSi=Ai0Zi75l;pMa+J464Cf
z7>2J<Q<y4=Tat9B4(3JWFOF)kDryGmpek-;&pV*<_r}18F)#6T7>>6wm(G8Jr0!go
zLG99RsI{MrTH7B{FOK!7sXT@{R(DY&|A^WP(UZ9jBth+^OsKt73^no^sE#*BmG6wc
zMm&^&dOihJ;Q~~{Ys@|N{2Z#GyB2?m`g9CQ?i$E|nvuK~FM_JC3aVTK)WF)H@^wkh
z`PUTpCPBNrKTg2$sHsbp!mV)_Y9zT(6_!Rlua0^(H?;T!)Lxp2+C%eDBj19Wxr3M$
zuUmS|l$?L{EM-cUF$-!_6+%^1+N_Lfur{jaO;8<fjoM_rQ3IKZ8sRKd`9-K1UWHoP
z?WlULqVnJO38=!qQ9XQx8folQu0v^2734w{D1}<P@~9<iV(Fbw^>jt$?_=qs%<oVG
zorJmZC)6JCj}cIh@1PofhT6>`se`;=jE<U-Sf~aPqdJhv(j!otswk?1mGMigfz@#{
zmcqzsf&#z)uYd)K55>|t|62)^CE)|=jZ`Xakk<z1q8bbdb;dw76d$$e(qalMiTX@v
zj5_y&P%|(CHGpNPj;%y3!Oy7jCorzg|8oLbli+l&f>@{*Mi?r+2!>)g)ReVD&Cozp
zLqkzBH^t(M%}uD8-H+O|CoFyib-M0jeA@T^C7>yem)>of<fyeuhnX-ZYOU*`3bsM*
zmA<GBeUEBrDXO0JsE+-Hnz27or{Mx>#$KRKMVt(re^s1@fTkn|YHh2dc5fS0#;;KM
z2A~=oi>hcoYBOy^eRe#?P>i3^eKtg34&n__&qrALa`R|L&c7OZL4u~}J!;CMW^!K?
z;-kJg<wC7(Rn*Aaq1JQ|YNm!-d?JPrpNg7^nW$qrA2qOFP~{GxX6#rd&c8ZvfdsAT
z4b-N)hpONSs^Pb&DNPXOI+_91(Ojr0E{y6(MO40esF`brs;4(<=DtM@beg5l_X((H
zE6kmi;S8$hH&8u&W$9jKS8*&<M^m91%z!yDA8N|mV0N5@*>F2*<oECtK1OxW-<`!B
zixa40^b)n3lV)`VvZ6+i6SW5lqCSi&phnULRdH8~_d+evVAN)vi3M;q>Qvn_-y#F!
z&wsMHsZWZU!qljqWkZdy2&x06QA<$;)o@!>hq_@H`luyYf?CR-%}uBo+=iN|{iu$d
z!}vP?j|ixte^CV^XLk+6#K26TMv@gXV+l)dkD<i-Vi%l+TFPkQu48FX4d+1BTL?9<
z5~$NwL(g^oyAV)A{ZI{!L#_QhbAzS-ftrbns7-qd^+V|+)cKB)!+jWKK%IgzsF|vO
z%3lZ7p~k3s+M%xpT?pt?tPg4vO+%&c#lQ;$11}I%2VbDpJX%io%_cVL)mjo&t`%yE
zJECTG5USzf=0r=Mozp)5=aZmKvjjEr9jMKC+~O}$Qx`Rt+apO)Q<@Pq!fdDx6+kUP
zQB-}kF%&zZ_SRT)25PS?%EkHDCR#&+D%g&in%(AM)Q89^jKH&~O&BA0P~Z=jGhzwi
zZBZRrh$_DpHIQFXGjSO8BD;#&@jaHp%zhsCL*|#L5&vlMou~?5p*j{6;d&eeHS&0<
z^dy#^5|uv_R=_-19{XY@+=12b7U~q_$?NpX5Ks^6qTWy)P!)fRTKi$B5lyoAY*Yu9
zp_XI~Y6f?pHr)}_j2%a<{VCM@;v#Cw-=g+faK1o?eJ`C0csWo#D~wvJDwf_5wW->e
zUzt5o4Gut6?3-gy9iC$GA5b&1#Nz9*I`M6Rbk1Ll{BHLqK~+=;RiF&&Sk^#ork1D?
z_eJF!jcRBzY6j+@M!W)*e;sPqA2d&)267cOgLg5C&i`Wqs`w>_Vx$5tLnhRcWXHgH
zMpaM&mA?k6qs>tbbwYKhHwKo_;=@oK{tlIII;x}dG4S{QmJ!eh)}xkSm&H$@_QrM8
zOuRyErl<wo*XSIWfp|mI8*Kn)$2q9ozaQ1$1ysGaQ5}4Z8o;N5oPSjqw~*Tu`B9s$
z9_Gc?s0OB^rgST6>P}!6JcsSDV&NdKEw08kn4pOJEmt25<VOwU9BKw1p$7D_2<Klt
ziBi;MOoHlZD%2F_KxK@;Vpt9v;}EQgmr%zoyqNn&)Dw#kpI{zDm5Wq7DDdZhrOp1R
zfo<>!Xa>%rUZEc`Go~%!Dy)clakNIIe~VRc3F=rqL(NQ_lJ2u04D}u<hu>lc)C=nl
zDxX)%Jx_+siTXte=)r7M#`UPR{1da{BUFV+O1qz03u9s8?J)<=Lwz<JMUDKf#nYE@
z11pNErxj`-<51rRmLl!=-W3A+6#Ex7!c=A5m&$UeDe8^t*eq0o8&DrY*D)i$#$ST?
z5w4u;$Y15%RNqH6oW6ql1x7V2N4z&`#<yZ6eg0n~pta6g(al6o)Gn=nIyN;?yZ8&#
zacqm)-2+e~pMdJnQcK^4Dt`=B{v7JK-9R1J`>6U}VPe|n&(z$5B&f}p9#wG!>P=YH
zo;NbvT6#BBLxWHajYRFC?@<k`xAg6(diGoTDf24&IeGAafTl8eWj8e?P!+UA9mlSy
zr5S{3a53tAu?E%Q?G`_RQHftd9lKkoh998nd4sAqaupYkSB3Mh<Cew}a-lX!anz>!
z0ySj=QTaxrDwt*Ii%<>yjOySfR0po08oXn^MCA*v>dHq$)t9iU?;d2dglwpSMJ-+#
z)nH?@9jZg!Pz?=4jc_<>4@^Q;yaZKlGb-P1)XW`1<vWQQ=sll+Du`6gtzmrBW=U!B
z^r$yiIBL_CLjCAf7quC?So#RmH=miP@@r5HZ$x!?J8DlIwDcRO4*3rVgc5jxnxaJ2
zU58SjD$I;p>*A=9RkP>KEZzx2Ngsg9_XDb9D^YLG-Kafs3e}-osCphDGvRw53Fu9h
zpoSZ1E>wZCs1esiO=Wx37l-bs&H6oN#*L^EUPg`lK5A;8nz3rSdb6N9Pz*KW<uLI3
zzuE+}CSRjA-B478i%}h0hnlLRs1cq;y)W*dj@v`j@rzx{&0tdGPd2>NsB%qE&)cH*
zRu|L^48&ME|Kka0#IsQquRt}l7L{=aYGlVyGjRqrg6pUe{f%0>*BF8yEZwW^>WPLb
zmlRcBdNVHu{{Bxn0(z&{#0VUNs%RT(1Upd`97HX_Dbx(Tu=G!;nTt`!eg5abs>Hv*
zGPoG^{2qp3%(|}rh`OAAHBf*A^{gZ+Ud#LfH6yK2Bkh3NR9#V1Is`SP<1Bp^YUWm2
zd@FV*{wHdwO4M_wrzL8}2GryH>qBM;3F_fu48;S;r;~Rd)uHJ1-G~#Q8cu_&g85@N
z)Y6=8=sr6xp*rvqb=*Q4x%{b60|-OSTuxNEB0d3q`jtjC)WZA{HPY^=3WuRaFd4O1
zenD;8y{L-L<8Zu&TB>$mxS8pOdVhS2s%J80#`#zj{euKlQRK!hV+z!{&xsmAIn?uJ
zsE^?usPp}u#TTMB<91X-hfp(g1+_HyEdClbK(C2g>gdQ!_+APEDiCH5a-$k3jT%`a
zR0AzgBkybuL~X|JP&2g>HACA`BfX01_}{4VAx+&Elz6E8RWb1Uzh(rqCSRjE(hs#(
z!_0B0kxfDEiKQ5d`%xphXV0IZzUxJ9=6)tDgX+i-RDIv0_Sj5Rx!*9d&i`Hl+U18(
z1&*Pn?h2}7k5FIH-l9eluelp}YSfYxLzQcQD%TD*@}8*tqfrBxhI*qeN42*NeO0{6
z9-K#Qo=2#L-=GSHv~cmHsLh%Ib$m+W8?1;qgE+n|gS=hDyR-`O)?x0}LHfSw-N3TM
zGqer-&e!XJZHO;#%lYp>Aa*<Vb-Fj!CcX~~Vbb>QU0w?{g`H6i_cHsVMm`uraUyB}
zKVv5R4fEi2%!vs*xO&Q<>Z#JfcLi#ZpxxdCHFdpEn{NziO}|G?*%8zpIbmKxRdmOm
zKSE9UGgOEFMZMUfeCg7YqE1&v)bk>~1<KfiDwu@_Em2cF26Y;iq6+LlE!iKK4X>aY
zjNZ{bPlD=r8q^GALd{53R7V=1>gj+wO@3F);G=fsSX6~mP*Xe4T#Kq;2WpcYLsf7Y
zb(|if%6&qWi`B{HONq*t74^KZSpfs*zb*k)+yd2sZe~B!R1HNf$xPH#uSRuX18QWu
zP@ngIqCT$gp=K=dS8fJVq4E{MP%Mw?P<xD~@Be)WXv%z4#*wH7C!vnZ5>$g*P^V%)
z>eKP0rJqH;h;E}Qj?~%ZPlQTOk1AIhwWQTi1N{n9==}F0piMOqRlzI_oKw^cY(pKx
z6Q~OBU>HXJ+MWM!oItz+YPX+8y{Mvg3F0rV@D&a_5g*mneKC2CdiUq<#`!N!pfiC+
zxB~V0AJRR@+lU2FKkYukwpg);`|7m{(@^no%u4#xo<ZJAOwr37-?+Wq=YA^;Cw&p-
z#p9?=8M%-9zLC8T=RZ3M?MTqBpM=V=74zXW)QA#)<9_z5h`EUOMxE!ysESXaIufm~
zi$`D%;_XrOPes+Y6P523=Ek)BIR6C+)avJYIvN$<h-%<5sspL|y8<;(75b<Suf%M4
z3N_MCs1Ah>aQR!J%1^?~xChmNhp2iI`vZdle`UHfs-mAzJwJ%*z#G(Bg$;5ATcaxa
z4%LBQQ28&T%E$cHJuiTospb}+fLhv3s8e(w1DpN{0ZsX9)Hk72%!oEuDb$-!Z^*j1
z2(|g%VmeGZ*!||CFjgf#7<K&qMCHGa+B?OE1o79gIKHS|Uwo*0lUBeO`uwj-Ks{-I
zdNVaczFB$gQ168=F+TP~o$GO^H{b$$zSW)|Ms?t_#owVu8f%y<mjKmHR#bX!41E3<
zu!IUokGyKAscnd%I2biE^HFcGeW(tcK;?g6zCsPa8}2$B4RzjApaxRNtc;q$#+Xp&
ze;@&k@O#v`Uw|sO5jCQdsD_@Rrtm%L!zj`S7mto=AOXg~43-{&>QGUPiDk{2s2OO2
zz8<t9ppkuzdeiksb!0TE!a3#&j81$DYAN=hURW0}FcYYmd1dLbN4oN<Q5_CPz0mTY
z+N(H{^REi(k)WQoMfI#RsslYRA&x+;-7E~nd8lKw3p3(F)aHyg${nj*sOL>k4URya
zk~ye+2T}Fi8^vzc)IT9X290(dNr>ukN{ff0W+Dq}h6<u)pggLBO;Iz`4K<+ts1c4u
zb#R8IZ^KaHf1(Eb*e5Wbz$?^<XN++LSD-51jM@u_Q5D@sbu`Xcx2B<}j)tT5Kps>F
z%Ah(>2lZjr!qR)81~44^qCc6ycmgrUxo@qrP_N2!sEo0{bEZUXzO1N^+X&QB)j)Nq
z9;(6isFC$VP4NKK%nh~pB-EGInMlWcZ#@A`-G0<2I*uC2B};#dnwdAK24jqOQy&j?
zIx?fmmosaiI?xDJPfN2qYG#I_@=wN?`uzWafC?-_P36y)VIyipzoTa2PfNdG>9<fL
zdxn}3Z-V>SO@*qj80vXB)C|={4WJ!rpkGOy|2~#s2&#uu%!Qbj_y*M4-$gA!tck9H
z#Hf*^HZz-f?0HetfXd<&tYqnzP{;lj2LAm2DFOBH6RN`a-@9+aDN#MmhuTCXQ8Q5w
zH8ZVIBkyYI<1n1~EYvroKT!D&p=RPNYDw;(>V5M)=U*9vC%G>UQBW_CMyMWk!#X$+
zGvP7RX?TU2;)IjkjHE<WoYCU>QJb#>>im~Sb-al^?}*CZV>0JoUzLWDptV_unzH5Q
z8q|l;2Gr7QGXKD^Abu5t>gdNQuA%5t-AL1-MxGP3WJOUwUz9`D-wZW?);<AEc_&Ng
zg(^4@)#EX!8Jc0~bFc#OW#$viLcGAVAa4mBYJty*N14HIyXpBqIEi?P+3rtF{z8>6
zIVXs}yv+F<N#HUG&3_E?c4M)hg1p~(@Cnt!-{-jz>^J{1&!g7#hWQLN5O2OShMCAr
zgPOrCW+9}!?^UvdhN#Wd0kzqNS$rnyo&5`D!;`3n|3&)g#a`eVjEmaD$x+X<qn4%!
z=D-T5J<$u*(E%9v_rD_uXo~0H7dRKy;6JFTO199wa9Ut>;(ahD?nV77_626ZIE&m~
zi7@k<h0LO63A41+`7dV)70oJUb+Z=gxYR|BsJW$gGQT#vnLW)uW<PVF>6=5**X|x+
z38T$%<^*$+In|tD&NhEE=b>hDp~aV)E6mmA&*p|joPTv-lO=31x0%12yUl&(0rRkV
z)I4sUGS8Y9%**CA)ZV$NZ?)>cZF_Lfd}#h{J~LmMZ_Ib*N7GyE>I*TWU>NmBM>Uw+
z(j(0Lz6A=IMa>dsX|tSJ(X3)tM^#+Q;&o7arM|^mnr+PXW=GTSY=N$353{$~7uCQ3
zbC9WyD}9JL3`-CnfjVY;F*_c{-uMQa;McsR^hP|0ykC6p1OdGgFQ7KhRn%v|P1HGl
zk2=>embzDLDpWiI^<h&E^-ZZe=D`t|4mYFTBj-_{9e<-bmS~wvPZ^N&mz#hpC~tmY
z8NNn+cnn1qoQXQ`b5X}|E9#rfALcbwgYPgu#$E2-c;!*$>!UtnnxZ~)S}R@We<%UH
zYR917aFb9CZ9|Rpti|u6KK&xCa1EzNl`Dp-xE$(BX%*Crw!%W#9#zj=a~&%G9`x1F
zK?0ikTd2)*54+(DEQf7Zx?dbD$700qViC-^%Kasi7C4yrVr+?Ft6j%NnG-Sa<<?w*
zn!)X>?fd^h5<*EhkLuYw?1<i)puj)P>V%nz?zH$lY(u=nTK8pj0rnw&*5WmOc7Mn`
z49k$d6$|1=tc&^Axjz>evyStx5xys(GL~BJHqlsINqigD#4k6vcmA(fnD|}PW=r>r
z`?0z%79c(n^Wk<ZiO;btMr?Gy59ouMiKVC|+3FL}r_rDG;0)>*-A8S%ESvZhDwe_K
zI1F{HZlLx`oXzey6~^|;hnm6VsBbuHQ4Q`yef*w8ZPJ^l?-~AE0?HWqS9jc!U~A%;
zP*XP=b({{Pj^$(2sffJA{Wd!#s^Su;HLYPbM&)mhI>z6kHtTrQ7n^CAUgv)y0ZsiM
zsE^lpTiq^ijuFHMqK?yARKvGX-xJ=WKBklY<~D5sRC;ODrf!BhEqzf-G97j74x>8s
z5X1ES{~ZBMMY?Tn1UXS}s3NGTEQ_I78MRcMP@Ab2s-ab=hWDdJb`#aWGgLj^c2`ey
z)J(=jow7WbROi1K0j*^{?1?^R!WXC)NAewR>OwI$@hqs#_62H$-=ivAgPNf&7C(l1
zA6&5XXQ%;1<@=r9oUzf@W-3BJ1>2+6Xdr58hogGD5Ow_aq282_Q9pVG?Q|VVgJHyL
zqL!==YSS%8b!;1IhWDe|Ifa_32Rk|cdhnJ6O>N{|ZZpM2ZOXK$3UZr8Q5~s(YM={-
z;t<r=>jkJ&^Bbyzr%^Nc95t|HyWKB3L$M0+e!G45CfiGbcKavP2+Hhn9qEng=?HTQ
zs^a;muiZOPYkwCt10j3eFCMa?c7Hw8KsuwAau6#2a8!rp`2=(xm!YP7J8FcN%t-s(
z2*OcIQ3sX3m!*%v48+%>8aRo1v0Ol{{Ub{c`NPdn3{=AzP@C7!PCy?P6;Q{cDyqj{
zS%!hA^F0GKwM$V`zYCS`6sp48sJ-+Uvtsi7E?-$xya8&{4Mr{LYNzl0N<hbC52}Gb
zQ6s!#zPI#v2VA~vsJ)UG^};ER+C!C5GtdA7=O5LvzNncPj5?MxP@8ZG2G0LB0@^$`
zQET=Ab*vH{bh|wQ)nEnGUZ{ntpgC$LdZ9W#3ajIM)T{alPRAODg1pXn8*^iw!!G|Y
z4AuGnk$^_L1J%=$sE#~9ZMNV)-AL1-I+7hV_4!dFt$;d~t*|Kew&&|CeK+PM{S2y|
z7)RV*ON)L-5=s!zrdx*EJb$6q=mzREJVvcu=uy}6>ZqyjfLgkq79WV};AqqgO-3!r
zGSm#MH4h^1e(&Z{&c8B7Ip%tl3R@5_icN72s=~LZ27~`{Z?HJ13KF5tcR{R%%`g|P
zKz%%4Kn)<)are`2No+!V4OYe&CpiDD3Di5`ep|g6D-lm{(tVR@f{lr9L!~D@<#u^X
z)RcaQ`h4Gs`7zRI_Z}&N>c}9}ny*G3-z!)gy)&+3C42&fiFZf6kyc^}e2prY|Eycn
z_NWmpKrPiN)CfLc1*~w+IUcj=IchI_LVZ{jJ?}cu6O}#<)p7qgfvf})UvO(&5;d~U
zsEqS0{SxLR9{r+wV-`Y<s3)p{X{ZX1pgI`;lB>5c<{;h%m46bdo((SD_ihl-t2f?d
z_n<E7xD3T&_yqNa3%}wzSPNCbAk?N>h57Ig)LwXxSuovI*MTaihI^rAW;$wVb_LQo
zf6oY%A|c^5H^uc(n`<O$WXn-AbRAW3%<HZr`A`+N!cZKBVYmpDei&8$F={C@-EeQ%
z2B=Nh2lMLuFDH-@FQY~heA5*yh+5;Ws7<p4H4|@8$1&wCcWNr3ro01|#)+u>$FU{G
zz3qOn(G43AKZM%U>F#j;>kt@7pf(;u^(@_8_XVRKszc*YOR*CZ;78P^jd#zT^D3xw
z-Vy`v1=I_vC#J<wsHIwp`YhRnI`+r!asE~CE(uz@zfm7XiSD}!lA|)_Kou;D*|9Ea
zbNZ-P@^6?D52D_1w=o*NL%qsF9=HysL)D)J^#;xHz;{zuf&{&4+oKv9W*MfS3M@j6
zd^u`F+fWT$LREAd%j0X*5*2&s2GkPue55%8)y^{1Cfw%}P=&9sDJFj8GW0-A;Y8Fc
zc_H@4ji?Uge(cKS$H>I%V^VB_`Y`K>YUn%E3@t}}zu1h*cLr6?|C@kD@)Bd=M^wWx
z{&qh+ra|rAhFAngV|3huIweOe{uDJs?@+rx_7fM+h00e3)q!@H0*50V@x8eO^trql
z)zd%BQ|1lSrh1AR*$3>6iJ!WTj6;od8fxj*qh@S3szawxo9`~F<3Z2d9*K#8fBzFo
zASw?cPz@Eql2`#XBO@(+ipA%mHrXoF$Mr7Mr{y_RJvUJeKST}eU(~>2KX)&#l&C#X
z1q1*4A592oiaMY^M8={j+KI||05jrwd;TwKx959dZ$!*Nd=P5$twgQyG4n2Jk9|VT
zK-!nCgIUqnS{EZQJ&12M_TcU-_X2r`>PVs2L0%}9LM=fn)X4jzrg{=;1{R|B(i+qZ
zY(@>>5NZZ4qVnHI?S=QRIsd9K#Tz%Gyr`bnM7<9>pr(4f#TQuo0P4MP8TI~nff~p=
z)GIj7TRR=tig<lgJDX7*`U^F%>-y7dP0f80)KK()Tt#V6QyGCO&;T`}4yY0K$5J>9
zb&mI<mgJ>9kN3_kNpjSls)*W4bx}*)5<_viPe8BI&3GH1p{Dlid-tL9H%=v<>_d>Z
z6<4Fy@XL>`BRw#L_yE+@`lt>~LN&MxtKw1Iiz)tfA97bwr^1i_$xUH)42&2xg$+;@
z4MNS(YOIV$un;EY_ofA~7HWn@VHKQ-;dm2kV7#E<z=u)`EJl1js@xT<rt_aT*d?^a
zvOJiDs^~J-#4I7ffsft3sBcE|F*{zvycjD|aNx6`6y_m55cQ&3gB9?;J<lCEIPi+@
zjO9pQkA?K}{~H4OxXc~J^|TABfuB(y9+yzh-(fZ^6g4=oWNk1v@gGqmK8kv?y+=)b
zl4!w!PtOdfscwX7xCd%RH)Ar|_s$Z~CV7h5{U1;jC5r9}=E8KuE2BpC6_&y!s2RD7
z+CyP6+zhrvbzl+dSgu3Wx6R^bQG4hH`r2%d2*{9_t^+Ah@d(t5sWNH=ol(1gB<eg*
zM4g%+QO9vTs@wsKUqyBN73%aPjTIc&q}fo%uUIVp{39-bawO;+*F*KV394XwR70at
zBbtut`9f5~t1W#us@yTuX1stZ_YhV8KdAE2V+RL*|Ca=n-YGVJ{-K8Zlb~Hc1ht8l
zq1O5WX2!^I-18i$7gIgd+V{t-xDqu}r!gGgqVi>m8yq-QRWX!!S5&><Tl#OlJ-CXI
zc;Llz9g1wmLT$o?*bVbwd0c=6@g8bZg~oS#pdBiGE>^^|s6CQ4fjec*QSD5_!1<p|
zKx_I7Y6`cbMtlG@!lxL4=@Pm%tB1<h)Z!gbOVt&%t0$rATW9H8F>s1dpN8*Hdn9_I
zKz+U!N<dSX#jJzMFc7uIQ&4ZVWvB+WTKWalJO2sh!;r*olNCapqN=DhZiC9#6V<U%
zsE&M($#wqc63}MZf@*j_R>vz?4a1WJ2Y&YJhYg7D#yXfhse4g%Ms2RmsFChP&EO3T
z#Tdz4dUn+2tZX*MxH|t|5ztx;Kpm557#K0Cr(5m$K})}hs_2y&C3$e*8&Fcz$7(**
zi0h*2>wubx{;1727B#aQ(bw)jL_iH5M>TlU;?Gedi<H7mU3}DwDg~;cFuaH5Q5EJ)
z>GG9D#jBz6w?ZA;udyY5WASq-IsZ{fxIu!Z{sHQ{Tu>_a3QmKSiB~~&Y$|FGEJPi*
zJ*dri$DTh!joeG^8cc+Go(A>toE5c1<xvA~lbZ7%coC4Gk@iP@Q5c1JaUQCIQ>cz!
zMQx(Hs17_u&0NAXu7ONuY1A=mhI$XQ#>hAt)$jz=j7;+hsKL3Yiho5_xC^y*C$SXX
zL5(1DS~sO-QLo&Zs0!O*Fm^`O)78@ZV&I&k8k~iye<3QLzmY&M0z0q<<_!%F{BSrF
zixa<$RWM~b_v&nq%C{9eVD$9Cfj@fbj_Sxg^9gEZUt<_X$>81-IZ!iO6Eo`be;5Jn
z=4GfU+k%?v9jJnTAQ|}|mvEaZK}Of}%&1M68+G1mq8jXgdINrgTI;o_sXv0+V<%BF
z@BkC&{C^;zf^jpssZEROP<GUwD2CdUl~J3kJ!<OuqdGbaRpB^Phkr!v`n{-A@E58h
zw^2(N66W?)TB-A&jes)dN3B&Avn{INx2OhwK<$Y&m;-mAX66a1BZ)G*j;BJMmK><h
z{bH!i+7Jt1f7B~`9r~KWla}xt_3boK7I)05n4M5FFc#I&Qq)YWMRj}+hT}Pmz{pwM
zXGbBkBdXkN)SGqzYN>zD%K6u(*+_z>dK+ql2T^N!3AJ`FQOEEds-no*TzYI&`GlzS
z6sVD=N6lDy)KWA=Em<4X40pEYBeVH#Q_Lhm4X;IYWH+h<$1LMr)JXq9RS+k;8*vuY
zRM$tnnA)O7I2?66C!^|FhU&mhR6Pe#U*)d&7DyiM66%=~Q6oQuFYzzbCf%3At^H}t
zNjxN{Tk{B1{<5fZUfI&?Vm9J!QROG1^3AolznFk}z7a$5G#19!s25Z2TyBOcqej*e
zRY4cj$a|rtdKhXcrlF?%2h4=aP`myps=f!Pk%#0Cl;?l{lYrK)I;!XOQA^PRRj>zY
zlTJWw!quoHI)o~B7S-TYR7W172J{h&V(L6@DZaqm#Jl1`oQHwW|8fy-B+XG3evR6l
zy-{n`A2rnzQ7@1ks1BY+t?@lnzJJYxd0hvxpaxV4Rc{?EgpE-hnSz1;{olO=LP&Uu
zn&OwJ0>Sy*NMoQjPf}ERC}zhjm<#J!`f$_|e241T6jX<oqXx7S_3GV+dT;!LzSc5L
zez!R?qT=~b9Vuc~LRHYfY=T;nmZ%quk2!EQYKab@cKvPCoAe{9-Z%x^OeaDOI70!>
zzbeX1g5Go$P;aKTs3{$3&OvRqpHWl)J8C9Q*z*e(e}eiHe1m219cuR%FBly7J;0aP
zn)o5qUdd62^RJPXEac90bqpom0X0RVQLoI^*bQ%CNvvPkjd&U=z6aIekRooR$x!vC
zK`lwRrRPPx$O_x@az26LB-Fw3_&sVW&tO%IRMag^Ez~QwC2CE3VJMD6EzK%agX>Ux
z<#*If9Y9U}Mb!DfZt2fZOW;Q;=B6wfDq~E{gz-@o7Q_r#9(C+GT6!PU$cCfN^*B@m
zi!A*Y)Drz>?m;zp7`2qgkb&^;{|TtzE7YcmT--IB8a3kVI1o#sMzjs{;4xH1K_%Sz
zkB53Sr$ViH0o0yqg*t{lYU;<J>Ya*F^!dMxfHvV;RK}yIDLjW7!FANk+((W0392Kn
zQA-uQq|Fp&AzmIe(k`g{Jy55hAF2amQSD5_XteLmC7?B2hMI}hs5jbn^B}6gY4a*-
z1ou(9_@f!Olsot7P@AzJ>Q!3}i{U5?$GxZ-dWL>J0;x*7g0)dS?0~AE2Wrhnq0aSG
zR7LABGyaWQvLt2PPfR&cn|UDW`Bu~n+`s{NAHTtNW!;iqF3b7vK|<ql!GS+AJ%XC@
z@bbZ4Da?nO`rfD!4?w-yCZamF7&QayQ8Ty~mG2;y#>?0g(^halx(&qY#80A@JY7ZK
zeXA{1(fzV%s(A}5lObOvcPzifz|^5W3!a&wmE8}YHBl7~N1dL9sC);p5x&JRtX;+J
znZD){pMc)wr*JZQRb2&B%q^Ig<g2JDOjynB>WQcdSDU9$OZgtlV(#j$p<Y;*_yVkr
zuTdSXRKs=5??6DuW+&=%{{j}oL^a*3xEktJ+6A-XI#h=*qVh+r<(8^6>P<Nm)8ZD?
z<~xu27*AB&4J0=v2<8=!>?z;-rmp+(dMavHUPet_w0iCbjDn~U&BZQw6SdZL>bsFN
zL><>Ys8iyjHt`sHJ{7f@H=tfr2T*U&>lpa=KW_=Bf@lp~!T6|Mn+o*?%z)Z#c~BLU
zuy{k%d!Q|92ERca+exT$Kbk91$9fB@V+T?7pTaPm|BIFo+|Xr+j;bILs>1ZB3UXpq
zEP?t0F%~srzo9yK2bJ#y>YGnUBUip8D!nS|v^2pu_%-?(`9K141nPKAK=pKy#n+<F
z`99R<xoq(d7}zUcxbt2O^``5En&J_t27f>eXbozKwqX_g;|tEe&U^gEE<<uNGpYmm
zQC~1hp{BkG>ebo{wWfVh9UG6@WQ$QVvCBM)>cB-*2Ogu!y+^&E;x*y?YwZd(aT)5M
zI@A(1BVVG<b9ZwFYU;M5UQB<Y@}EF8d;zul@1i;uwW(_;Eow$8qB`2#;{AOBnvzN8
z98?2~QB(a3s)3WJO>+@*;SE&21kK#cq(i+AilDwhwL*1dm_1);@olJMc?mTWe$wWy
zp>R}>tD^Qm8&t>oq1JR5s=}$54}Zaocpp_RP7C)L5r&$HvKWrFFaigmI{q_iQ(r^s
z_q|61)ZlB>6vb-k;u%nTpfIYZ<uDt5fqL-_#~io=wYHB?Yx)iYr>2$r;*t}!RCO>v
zHnR8x41E4iC7@UA9Mqa0Lyi0#YV+Jcjr1jI?UJ{49n6nflB%fpKpnFks-C{6jt@cA
zGaXg$GSrf;S6t_RD*<KPi`wPqQ6qYeni;Q+Thk<{87hPou_kIQXP{2S2~@*pP&0QG
zwTB*{mLz&xm!1T*H0jXSi=qaBb~qO6;8V*`ww;^mZm0%Upc+_%8qsEpA4JW>3Dne|
zN9~#0m=#~6Iv(2I4Xhw4y?lGlzrLe&B|#a+;|yGcdczg#;J#9QjcRy0=ES+?QS+l2
z{-tZ63917fQKzIoY6N3YQ$O}AH#3vJ^4&<*k)So+gPOW~s0Lr4*6f2BrL)Ty5A{4h
zDt`&od!#aI3EQA{{Xo<glC`Lr-h*1&PxvFo_P=(UXC<oO4%C{RMHPIFg)l}J_tmN_
z>U<ADZN`PDuV%kvdc1@x_X#zigk9YX7Q*brTcKuVJnF^f|3pBWW3N3pjvDa|^AT!u
zzDDJX+0BhO87e&k>b+11HMNaUr=cZk^Y%pL8-wc5PxgEda-4nd3;}JXpzf|fLR1A=
zu{IV%RWJcHvW2Kmv(2cf-;Y{~6Q~YcMCHGUI`3~$9n9Io<*R|A#2aEeegE%EpaTh4
zP#-oGdb(ZQ3iZbN+TuT=UL?y=4X#CP+F#9Ms1Dvijr1LAPo(YTroJ%hh1Cw#&J+y%
z{ogeN)WbjQ!5vh=px$mKQlgGmPE@}9sI{(-T9Uq~nHYhZ^6yc{a0zO!tVfkUh0%kU
zAzY5P`*8mE@nB-#VDA~$?-#6pz~WWx@7@QG2e|h^-GRa0Xr3>@QJ8Cx`<?G*97H_l
zw{DZJLLJZBs17CKbVb6ns19UA%~*EKgJpcqzt*xB33`(a#}fFv`7dfS79Z@Uz9MSG
z)lu(_#;6aUzNiMi$BH-uwNzJ8GjJPq{GtwVd!#I?V^xRHfTpY#30l+ks0zEHdO8ZV
znSQe88_aE}H`qQbi%&2E<{j#eZ$s2(?1QT3Tg;5pPy^nM8rTt^fEqrFVR#L-c2S49
zbD9wKJR|B<<Ul<yg{q($Y5)!Fd1uo{ZN|x{^S%Ui$~L3&AGElCm4GUKhRPUexSN5*
zsGjCPy+Vtl8m@+VQ8hw!tUGFk`lITZh|0eJwFK)>^=?MhcK|iebC_4>{}X{w67r64
z$D<yqqM@iwG7YsP`%w*EMXmKc)Fyj^dIP>gbtLIX_lgZib+`zsLlrDuA2She6-ej&
zk0PLV@^s9Ci%=CG!B9MhTFZY>n<;3NoB9l>26LdMv<zy>8=*SX8TB3*W3Ita;wNzl
zzQm%m@68$Q&huGZ6U0cc7wOB#x*xaGjB~$aYJxf)bFevHz)D#7yI}7Q4#lsq<9K&G
zPop+nwF$w2{~4ZMSdRF{iG2R69rPQKka<#Y;GfwH#^S`!U<FJx+4Z;ymLxt9!*Cnw
zoZm#fkP=LBKW;~uy|5VRn^4E@1x8@5sqSaQ)~FZQtf`!TeV5xtg4X0U=E79d+~<Ea
zRK`K53g)5q#7Wd~i#*-Ec(P)4;;k_oPCy;cEvS4qQ5}ss!!2QE)Y4R*!THxaxeEyz
z(GRE&9JY+_Q5{G<(-kO%<A}Gj_%l?;lFV{nsVbvpun(%-FQ|skVko{r4K&$ow=^Yu
z0_t&l)aU#p)aU;pEQ9wk3Wm>dn=mgHAYK$T6FtmDSe^J89F7@(aP=-nHFyfY#CO;k
z+x+M{?EghzBncl;8HWE9>>b6&7#X+Cb?!#JdJmwE(`nRszJ<~7CF)K05p`S>&2s|@
zN6kQ0)O+JARELIR7M=eU1XS=Os=)`S0#8vRk2l|$)J%iQmkD*gv!j--AZkY1qn2bQ
zs>6p-4WC0D>u0EA`XTV#r-22o$Ei_EkssBemZ)?64Qg|ZM^&^1HNq39d=F3^4qE6w
z*VCb9rWoqIQVk<vW7M0l1?sC?H%w0Z-gg8vrAtsF+lZ>*H%mWk=@(EHT*LVI4AsGq
zMefruIVK=p5cOiJg38wdwW+&Xd_Jn44H)>}|J-X2UZ4s_UhI0D0<~6YQ5`Ig8c{ve
z8?iO2!<|qsnr`My)Y9!l&FFs2htE;(gUn0Zv23%1^Iw33Q6%tT;O#(-=sD)cXiMEO
zDuLQ$tx(T9nS(8TI;z3BsE#c`t??SvOzuV<^Ao63#{a!m;Jr|IneW!F840R*5UL|n
zQ19^l7>>746~|v5>}|*7SOL$XW+crD_reKBo%;r;5%)vwku~N%)TX_Js{fu(K$|M^
zO1Fk-kYnK$!%%F8dLN9$?{P8yh6Ppy2mU3)bF4<Z#%kBl9Mnv#M~!?7Y6%abPQw#a
zhdx-`Pq@a7EEH8R3u+VPLQQ!Y48y9ZUE2fo#bbgw6SZd+ppMsOR0F$F^_@oz;2P>H
z+b2}M)N2Fv_+AzQn%W4|t}J3!MXg~|RD<16Q`aAre<X(B1k}<^M&)0I8o)M7KZe@8
zw=Ml8>bOSzSp(zzWhS7W)<E^JK89jX)VZCCYIv5p81?D44mGmBQEM4{o%?NAHq1@D
zHEN_&P<!Mj)Qqk|b#$ZD`9DZNBfN|{PIqxLK1LN-yxw(S4Qgat%_FGueGSv$b5zBN
zHn<m27SzbgqSn3+s-rDXdt)H_>gjg`G?m*?Bi)56aKyZT+N5_;`Mh7;FO?&qW}p$O
z;cu`5j>B+#f!fTW8{G_7Mh&zUs{Y0sIsaPA4kXB~sI~kCHD%*bGcX6WHx{8@C>v2T
zbq%#dcTgRBXg)!0!WXE9Vr=3s9tH8;5H%xxH@iJBYBT3wQ@E6bz;Qt}cn~$>6R5rM
z(9)lq?@<*;`ql0J_^5aosv~((4Hd*MumV=ad8ilBBcwlGJ753hy2#y-aQDFc29msX
z3@xL@Uuw8^?XogIk#=0e=So1@2MfED|M%ah!7iMEJin3WfJVgCo$`KD8aU0|>qt!J
zK}~C@4fdd5ISSpT&`(xq4dEl?<qhqHQ8oc(6Op%qYUE0-b>vFRG~U1rJPTC<S7FM=
zrJif#xrp2J`TyKTXn3m#bmL(I8oq`JDD*qwN2I4FT--*Z3L6pU-=cUisBkmSHxX}5
zgO9n>^ZYN$>uss)6y>htBJw38|5Mz{{`2b7(;q2NnZ#Wr#-oz0WSm3z5#ib@%~gX6
z;&cB(+6wM|<o|pnC9kgSmX-x;(J@^)xzo@_8}7NJ&!y}E>bXpMVg3EPKM172bKLiN
zFdF}RHKcRfN$<d2pTc3*NI&BIQy}jF@z?(;u$1zBc~*i3H}bqc&j-@M^Mu<H{)PH<
zr68{V{dw;^1?t)erqF<{%TzFp^vs0kVl(18dY>=8^mrq=n^CTURoIn$nMmu!&G%NX
z3XK)v8GpIn8-cB{C+YQ37k^pa_xKC%forwH%SFbPbfPYWt68V+^Xx0)Es0O!uFJ^Y
zk~W_PJ6ebJLg3$?dLwwAfb`E-FO{Rw5Yih^PFDfaekZ;<g!M1M!_QX>D&t?+1g@-P
zD)yge+bK|vv^rEWfb{)@FL8gqq7hE3j*~DDlajBMb>tKA%XF{^b)=^3UgF7ko`?63
zcZEzlD6ALG=W8434M^`v`a*2agT_?Qmx8wyMqMxQAM)n6P9Gru&)mOIMi*ZX0#_?_
zhV)Y8ze`#ad#=wPuO$zsxqN}w=?Z$8gv_6>#>BH*d;$$Mq=HtYO(Fb^b>ws2N*3ry
z{$k{b!`+|!)o4Rk56WbvOb!<hwC~*^Qxy{8@h~!@{Cv%$l59LnXKCr_^%UZ|nvnk*
z6%8i7jpzDuqN^5VQu2%sL+=NkC$_RX%su3P$+K5Hdl;4WGxOjf38nBY4WuJOe;(=@
zXZ}h03!Wz+-{&hKo!wy1Ut=Php+Cv6jr^y$b*&;F|GLZTVR5Cs=l-Y;Y5W<u`KS;4
zP*ItTHR=6P;%h0elS)HLE6M#Y1xEd+1DP${g7i4nk$cpo>jQTp>UqInx{!|_cDxIu
z4YGV4sXG_9f1m$E<^F*NN^zf3X}hM-_*yCmq9R@O2{)yp^5py9>nwHXYDAg#gezKH
zY57PSN|`(O`D#I3{UQa%|2c^d1uE}MraScV1r?kpldcD(>sssZwvfJs=Rc7zm}jpj
z^O&^5Jn!_MMlO?Q1`Wq%07Gr$s$vg$o(J+V|6{E{GNy4Knc|W8Zwe;ku0p&v4ZI~!
z5t{{7keql*@+ToJ6Ae!#UZ3=R<eg}<^Eb~wUoA=7WP^#0@yXwd`ilhq{<Y;wVg-xy
zpeq#xV<Rf*X6e6DXg3{-McO=`PbR%Ad6L@5niI}Ro<cORns6w0De~#c`Jc|{tJ)#*
zl%ex}ZZhe5PlnMH-em=pc89dCr0FV7IKoDt@B8|TV}Dq~zZ1VszBiQ3P8$DaDe&jJ
z*RA72t&Lke<L4KBee^<HJKFzbCc_O9M$*7>{FTaet+2+2l6Ke9dbvmc_rHxOqc5SW
z?71EcqP~WVE*@!Zxyx~Pr;bP5|Nlk%`{~sKD?H6c6hx&NtnqNd$1HsgBT7dNe_Jgb
zsj#t)vNZWKkT)(3e?xsC#J}d*49eaj{{rHpNbiF=tiGh5zyEzC@qe!`tl}9IDow?i
zsko1gpciRh{AV;Z31_6zhE&oD8<F=r%I{$&$`VdP`DEOmuR`QMLLF}YNo~!;v?P`w
zu_oaR6nw_5t2`B?BYdA{kBH}?fsCZ>BYsE~5ns%`mO+&GPb1}crt5*#^8?{S{~72W
zeg4m;l35ha#KZmccs=o>n3h7D3IFdEMBY?X((gYFr6El}A1ovPVbcHNUQfIM@j5)y
zRf!INzW6t;UJ35N`0H3N_5DBne|q;ha~CRDN;>~)+B^6;5mQ@*TEdYu)Qo!+ola|Y
zRHPGSNo&gUjf8Iz{(Q|OaDlYI{O2Y^2MT4=6q7g{2XKGBBJ+H;Dk0A;I(yAJoXbX5
zm1pZz8CQDJYH~NFb7yb|>61xc8hGmdQ-=JDc(#=`{4rEI*$RKov)dXtjFq{slX)Ev
zcam=`qj*i3U09E2i>agn@y}NU;(3TfaOdUD$DN<M0Cz#|Lfrb5ul~4)>;LXQ7q$Nu
z#gg2mxyy2w=dQ?InOi?bRp+kBJ(I>VGn#zdpRYco)ge-ky8(A2?#A3rxtnvh<ZjK~
zmV0L;+P}xB<`H?zh^E;{IuP&3{S|j-?ytGKaChbI#@(H}2X|^~_zW|lq2#BIvZN6W
z{Hus>urGH%?*7~ZxCe3%;{KL9P$(N~HHd<`ve20zN)IMHlzSNWaPAS@Be_R$kLDi3
zJ(gQnZpwsF$4ZuIGPkbg)Hk1wtYkKtF{t?enW3}9tMEJ$dHt1SE>A)d64H>VG8N^;
z$rRL8ipq7(<9TvA7D1tU+<#I=S7gGitnzAvUy*MT@q(!99r->HE{rvBKlM!@+=09`
zK7anFvkIQl=z44LcQT}*z%w!@A^j5ZCUjswX~#*^wU@m5Ilne(4M;mdI0|XgsZT$4
z$HGw3FY>$q_i*BkxQAQ$!2IhM4qbRyn#w<4_iXg-Y4k34eJgO>(kqf**L<FxA#Dtm
ze!hkfZb4m@Y#>U{N4y3zTbBI%8|A>&nzUy6`&a8Mp@~(hryU4)rGgFIgDEtLcrf|O
zQz#noAFLzFJB)B&EBhtSq7&awKK*LvG~uU&b=9G+zqzwh&rI^AWKjM?9`qvNAsJ`b
zD60{kN}*!JBY3uqJC;?VivHp*NkzJLlSjX-DvsmG^V&L+m-u@csY}_q)K`N%gGu}E
zH8V2%|2+@Wlj#PTixSo!K%b|QNY=m=N~9!B*Lo_LrBTpOTk`++`h)a|q#YnJn{}cH
z@#}<xxRX()BK4HPH{_jyG4%hxal<PAmB#rW!0^t~NKdPv8{sHq{LbS4ZBXG)JbTKs
zc2u~Eyp^b99O++^Hj6tt9SFrCq*WrXt{UXkRfcEJ_4D5g?xsW{Q^9yD&=pFi+!WMR
zhICzVcvhbKw53-hJvsYF*J;Y{p`N8YJHjBA6Mt#to>~4iJl{)NPU<*@J<*SEy}4(Z
zFOhk=t26N54;1>AJXNidg_zx*=jPc}Ze5S4Ojj=&u1z>4>I$PXZz*4laC7TyB+ENc
z>;D@Sj-`_QWT;HW{M?Djkc@)5ZW12C9f`sbR>2KA+nuxm*7z{;wxXWgG<wm>rQ+FZ
z?xWQA`ASQkD?Cquu}Rne|7hUaNM)}{c#K&nG=~Om5&uNy*i^a*zac%jRsM=n#jVz_
zd48At$!x?EZ~*Zr7JpB<95h&uw5*hA!o7v?N77H|Yjh^7)avu<5wFF=_*Ov(c{Wi%
z*Gj_s2yd`58|d(3%ctiZ|EI2&R&F5mo&B7TGP=eyK!3GmXivpkxj&NWTWrd$tA<rr
zi_GOH_z)Yj46z7jrBYpm2)7{L5T5Dc&lbEbR;~y2oFpEdcCt}-EuPP^HY@1;ub+Va
z<-TPFI#5Xz!ZS$we08+WEG2yn;cevEf|;$sY@~lh<@G63RHNiBDY+(L6Yh`X%}>MQ
zDL0M$t1&^~|9{8j^Tv_z9X<VvyA~Dc&jPwoAc)MLuM9lXwT5*5<R);nA#Xd|m@CO!
zg?o<ba*w@f<SWVDkbLDV-#GH*qK<ETdR5vQNKW{q^*SyEzM(*C;y0<NJDG2DkKoqz
z4P_?r{IbP+ldmw9k0EV<)uDWkdESZm5$YbLcBnVRo@XT<*#EalJW9c4B*Z7rk7RB~
z+UKh<qxpQjB=E$Z4W`VmRF<9mTS#j{`2;*qOgIG%zu?|TS^h_Hyz*AZ6UvO>*7c>e
z?_&IS2X`119wx(bYot2i2ns*3URNc(hK)KB73&&I+GfHR$hV37#hHmd<WFqR{~>>R
zI+=&(V@RK`+2Bs6?|&OeTuTMRaI!V3N<Zp9Tsf`b9_DmwT+gc0P%Um<X{m4!4c@os
zNr*2b9%1pAID~sB?L4EdW|a9(|NqO~Xf%vSLJC~PaN?CH*o2W>BmN_q(_16EDO{gh
z*EY)T!JloEfkggu(4Hr;!Tdu!5qY9g&pzBop02o+=l*;uDN4fwF&Yi(ip`ycLaj-w
zPNC7<cS)O#x{{KfgZn6Vbn94ZYcw-yamW*sI(1bgKGVXlt$w9vp|0s6?7ui<(DfTV
zs%Q;#A!B;$eS4l?AbjvYh0|D>L{$8n<@;cbxZ3!HBmd9T7ni(U@g?zJ$#akV!>}i5
z2Xy|kS!FBeKn(64#DBsp+&_P=4PO!O!u^q(KUeaGS;N)HAD_yrQsH4{p*EG5x6WL~
z@sy2$i^;zaXLGmxJea`wBf~^0SxAPORIV%BI<*k{kv5S6^RN?zXOM3_@fb|~?>tXH
z+B(caT5?xB@ZYE8KR~DI@T@m?0rJ(x4&)1`Y+dT{6Oo}h4|Ij|pdNP-3g+VB=W76?
zicf)Ur0W__CAxBOHz%z&cTLJgAw3sqX{_w`q+O-#WuAXcSl3$Oov;dRZqoS=Co-Em
z4+%ZEOOkO5oznG;f}<(0)f${*m7H^r1ONSj#+vf{dt!O$WFGQ7vHY8OHjMC2>d=*n
zXNzzR^~UDeIQ{Q0Zy+Hi4UVPpAtd%C(^Jx3Sz`pf)`Uw@(QIsisYsheI5`z>w$2{6
zMk>;Y#MIT5_&f5==PpHBJMu53{zash=02=WYW-VqZ>LAYsAvV@Dcn;Dr=pTgr0c5Y
z@cL0O8kOjJjLUH+dESt|93zo7iL}27e@BC}2-mSX=272V@-?9DpGdDpII#a-@?a{r
zu1i+A!X@e9w^X9*K850uCohFIkmn)s&(|6&t9V1otinN<l~K3m))h?tO_be1*+)G4
zgYeSNKmRF1R5Dh!#>Ud)hh)(83->kRl_;bu@BeA+T)?BMu01~c<o$pE;UNLx5DAY9
zNeG080UsfNQUQTbG}NM#nUiE-GG{nvCXiH(ZSjFc9)^0XiXv)Ckg6E$@yhi@tXB{P
z0U;`vRKZ8R*HY1nV2k&+XZEzYkA7d*_pPk8*ZQyjTKhcqBmq7k`U3kVvAx}f_=H%O
zsy~4L61f7_x6trkS?^<g2;GXmiP~KFH_Q9qhsGlT{sn!S#8-go+0kkWKfr$#y$e4f
z859;UOg}YHB7U4&pNdTeuYv1{O@h}4$2x$^@K36ZY4o^UUjH<l9D;)xBvY}?f$Vj_
z37JOjFpDk3_R{3RZUcRZzY4sE_&#Y7`MHv<hWVAkZc>ex)9({v$I#gQZ-MkOf?uoR
zbE<JK06~iGfaokcNJu5IlZsTv(ituVm2#hI@_YECyr{T#Vwb`HGWNs2*EW0BLOe@>
z<0TwK04s?<MPLsFh9Z5O!s}J>VPZeTZz8`5+yrbP`U7ImQomenrVE}Z*yG)LECurz
z@%QDQ|D0rZ`vK$<_((OXQ^mIf%s{1Ft#Z;|0d^ES{u!iy0Q>JWPRKW`kD{gE-y$9b
zGXdSJI0q1$r2Lx`zyFoRUi2iyQr4?!AHy!9Q71!whu)+bz0OcQ)g`}|cnLaKk;WPL
z6%1VK!A0Q60(+LkL56Y^x5PF76i`r+t|M_s`Av{bQ^QE$kI2oXxD$JZc!6p@7+-!9
z`y&SEE*pqnOYBX>F%`ai>J@zqx>LUYYnbpP1WOfgP<Mo4ETB+|Pwntl)ocqjFA%#y
z)x1SK440ITv0>_7C$>-JcVj!%?R*(KRo?%XAgEyRTD;D475<d~r>UkXsz9b+!QZPI
z<gsp`_Aa$v4SpHAk9Z-mr8LfCz(M#gVwX`nh1hyYgglNPd;gZphWJm&0J0U*Luegj
z_oDwsaW0rki6vwLYbggHe;9upx1$yR60jZUgXHF8rQCxZi=H6=2^*V)o<*fJ2Pr<Q
z8plI?hC^1Onmq%sigi{ZiJeUBXVg@ok0{&{c)DoN#=ugxg1L_M6KEBFc03&WItji;
zV#npbzuHFOqpGM4!eh$M1aJw!_nCYum|o=W!EQj4h-<7}{AbWsu=lf0XP9#QguI<_
zu&<FjBCi7cf5P6*`hmpH{}Pu@qD>WFK?5m&WxbRgNVysRJqmkaM=RVONDff<4)$$w
z7Z_py16@qbacWwLWyGrEUuLs@Qt`>i3-Z-j2*FY8PgKH3Vi$fh;As#iqz2;O5SxR2
zh(<@qeSnqnJh4Hj7yXpl2f<0n!@rwhU!#YVR`5;4+E6LY{Q+LU8Af3-!3`=QldJJN
zDeR)CMG?sOldSKc`7g;&<w{-XHe?gHGw4xtGn{`$cQ8Ou4KxM(Y3lxrZkNCRkung#
z_mHkvO)djGg2M0BWqyuz9qa3`IyOY{v-s=4@1prC*8LzpPwd?oBj4YV`y=aH!Eb<D
z%JXsKSp<GO@e29(KkmmFj_ySh@~+y^SV-Ol+=D^Vu~NPwcbN5bbO`DrK9NR`#M7Ri
zs!d!@)Axw^!P~0Vld!}mFz_|a5J;(_=vD0W*otpPDEbQoKPG=8`Yyv=N^v%g5^^cA
z-;rxjq<O3-k$2T@cStNv60(mT8_-r2I7q(v9Twj!f}{Ai65PXjI0L+az6a@KNIs@f
zCjN`6cmcRH@}*!i<gk()dr-!}9#lg-Lp%k{XV`PtkFioFgIg<q{*&@FWD_C(9Dgc+
zo+S6+e?-Ca_^&~@ocKs^We~4povL<rAF<7n1bG5IO#XA~q|~b+#=zZ<e<#`ikDuBa
zc(0N7U&?%fQuYJ<jKn>tl*iCKz>g4rfa2dPTrA0#Rm8H$Nx4s1>DQ|IGuQyb`~uu_
z#2>~cqo-9qw*MIbZi09gjeemfmm~(-ngHToLw*~(?JiGH_aQZB2=0P-8&@VFZ>wRe
z$otU_wO$R!-RQ62ZoY!xZRocIlCdYSOCWh4T?yd|K)cmYmlG4+8aQ-1hEAd8R&d+E
zOIg66hm?Pe_#NG9{-okMn2l-d{}l@ST)GcvGLhhPHRa<JjmCco`-U2zlt$;3zgS)F
z92$%Vb2+&g=w=%12eX`5E-Ga@>mzXK<P#!dgQ)wT1K<Lh1(}p6nhW3&Vp7I1n3Ni|
zK8^olMHZ#TrBM->{i<GKN2unx#1~UHSMB^fgYRURTZj#pzyCc4kxfB?B20p02J0gL
z?ocsFcme+-NDn};5L>Q>`U&_VVyB2bM9pLx9m7hwlbUbUmD-3sO}{DNQ@~ze-F$*C
zuTpR$WJ5`00r;buG)}>{*MPrb(M5h1Dy0>i0q%fW%UCDPZeu-4F0j7@Bc-nz;05wN
z{8Q8g8Sqp2`QKB4sz`o@zDhGG1M#ICQNyeOSIUrA6aSKUHUwE<UsUz;@V_Tsr*__#
z^)PDB5xW?F7L6YQ8>W6Z>nX81?*CTR2%P5-pbFJcuIuoBtq5PHpqcy$VxOy;Vd@r0
zY;W=d(A&xV3%D|L3D|PkPy&#ntZlB$GzK^icAWe<Z6<&;7R4lrX!Z=+13wDrzliS!
zlaT)an-GoW-+|o<W)WIQLn)aGbB6l;`0s!jgZ~!!53y@lk4CrStLHynSV+_J1mDMQ
z1CT>;HchT4mc|gXX%Zw?$9gMyDU-2>(5Hw=0TPqJ%IVQ<_`~47MDK^=74UQAzwlkh
zREG&{M(gpTY8R5_E@J%{VmKt7`0{E?zPb1hLo^YR5j09g$DrHDwX9gZy#4IYAL^Ci
zi$uLaPr2XUzH!q9Ey)hp?Q5JKIVmfmhSk`<u62G=OK01P7U$lamg(EWJxtrs4a+hu
zz1nNFKfS#vwRb2I2t|$J%81vBcq+_rWBZ7mgOXd0yZJ38&wbl+$Q|20`nNs$wHLqn
zY;sHIfyrsQ*VZd47q_P#%ugL?nc;9CR9kEr^=1Q(USOB$`2}`<yMEM4FEGQAfEltq
zGgleDXvENCV<lF_3ym7fu<Kf!6W;8gHxSaxL*8IxlhOY5iMc5)Wv7fZRp0KMD(%&N
z>gy?DXs9+)S3KV`d;uF~&m7}_2Aoj77~1Rqiw>$P)Bg`#x9iMk(65Kgh+b{zLBqE7
zNS!ytHvVaBnchC|o5eknX9a?W8%Po@NlA9ZaL=WRg}GXR?N;Q89myHyN?Q*G>H`ty
ziy`7va)s$P-2Fqv4$*&xH{#VRXj*I7o=R_np~sl4VWL<#x8#d#txR{;=8NIZ`g}2n
zh5MU)F(t`4Q6O&0)$5~nY;-%!C8-G*{vx+{gm^wBHCkWqwHn>7G2&c$#yr~TiyFg*
z^G2!g<>`S?#Pn1~jIeGt7*@=qcf<_4V<(DHA|+nCV3N2^bHA7(f?{Za9lNc%&l^$~
z%P;S};g8>XcR`uh-Y>J-GQ7*fCiL!C*NVK<=CI$(^Hs}5HFUpG69@(51EH@B1cSOH
z(7hqQZW)C>3VA*xtRBY-c!Pl^!>>04jFm<D><H0DaCS5pVR$`ga-+-|+#1uOKyrGk
z%_zx;O{1_8@*AOuo?%umGkg)dNN*W>V1T&7%~~vONguYvH0!DL#4J^DCt~WR6{rpH
z5W06R6?T$yNww(HbNsl%aV3T0O7)V`vXTi-MYXufajM1m>^a=BsJGTA(`zi}%W5$(
z>4%GEIir2z5@&C<7&T>T=2b?>u-J~jaC&2zKHXbw1oiPnlZwV=USFtkrd6iTHw}Lv
zLS}qXNv0>$S>hKf-7cR<>C=Pv+u;3P#*l{PeiRkoCZ)=k#5UZ{Mq%}F-myhr=f>Ma
zhFiH-+@0(+ZxsEV|J)!pJAbvsK)G}V%rdNc!_tFZ`PN(9h>@HDM%3+ludvgH#t#5X
zFV_7XZ9Fp;4+Q5xKpCfNi|FS*{D2sn>a5->COR8#(0aLVZV^L-^Yj*x?Ht}F3Y_dG
zMIZOvqvHHP_Yb?pqEx4NkGL+!(!EhVeuw0d;Wq9O1Je83(QuesDc@giRpP{O_^*BX
zI_5sn^Vg5=gLY#?^m86PDlX1p^kTg{cG3lG!*YImRMhsoe*T>D+4J=BdF6AeDrdTb
zj)}L@(s*$qjPLaBf{OnnrM~yI@dHTqsfi`s+AeWpKljwvVy750$K(zgQL9)FTODnQ
zBgM<(rQ&}NJHtw}T<7Miwd}ziTVlt<KLL{`&Od||^#8}XeEFJh`bJ#ZJ2To~1uTa5
z)wyq^X~&XN%wUj5VRN>2=A!IMc_{<(<`&pa&H-_e+ghOgJhksUvz}K`?m8H#4H-7C
z&nkD+Sgl;7$dgBRjY4gt<~&fW6{bmQZnoQ8tUV`UJ4|7RoH?J4(}p;^*|BqFiI(aN
zDAC5sv1XQNJCf2D8ooNi^3^$~OEt4(WJg;hz~LU@9fscKVn(e%q@zvun>^Va+qo^e
z9hTR)CeYDl6uCD{)H2hvyt>^Oiqv&%<9V*SOxv2(M-O`~J;F&Pc|yNyiTa(>S8I`G
z$r<ET=Aj8eppW8=4ad&0(VmVq5ibS*3t>cf^g^);j)aajc_w&65iUl&R-Sx`+W6t;
zDYq;}m9L7y6Jh#zNTaco&uyNq`9wzL-=_WW2iou?cho#>mq;s!pN-DOBO=%N&d{>l
z<JW3CFLIirqQG5Sr-jq|aI5Qicy+EU@3O__oGbfk1D)$yMGkvQ+(xg?)O@({G;(n0
zK7)H*=nE9-Gja5=!2!pyW_dfF;$V?4bl9-uB_G-CAhe;gbenz3!%rTEf7?6f;9@@S
zjHbc{GivKTGxqK~uheQO&Vm)%5I1jywkYdjc`O>1XGTX`Q`}SMC1*EBWBtwAuB874
Dq-%ag
diff --git a/web/pgadmin/translations/fr/LC_MESSAGES/messages.po b/web/pgadmin/translations/fr/LC_MESSAGES/messages.po
index f1429e44f..8723a9cb0 100644
--- a/web/pgadmin/translations/fr/LC_MESSAGES/messages.po
+++ b/web/pgadmin/translations/fr/LC_MESSAGES/messages.po
@@ -1,6 +1,6 @@
-# French translations for PROJECT.
+# French translations for PgAdmin4.
# Copyright (C) 2017 ORGANIZATION
-# This file is distributed under the same license as the PROJECT project.
+# This file is distributed under the same license as the PgAdmin4 project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
# Fred Escallier <[email protected]>, 2019.
#
@@ -8,16 +8,16 @@ msgid ""
msgstr ""
"Project-Id-Version: PgAdmin4 -3.4\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-01-03 19:02+0530\n"
-"PO-Revision-Date: 2020-01-04 14:13+0100\n"
+"POT-Creation-Date: 2019-12-06 19:29+0530\n"
+"PO-Revision-Date: 2019-12-09 13:54+0100\n"
"Last-Translator: Fred Escallier <[email protected]>\n"
-"Language-Team: français <[email protected]>\n"
"Language: fr\n"
+"Language-Team: français <[email protected]>\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"Generated-By: Babel 2.6.0\n"
+"Generated-By: Babel 2.7.0\n"
"X-Generator: Poedit 2.2.1\n"
#: pgadmin/__init__.py:509 pgadmin/__init__.py:562
@@ -49,13 +49,13 @@ msgstr "Ordinateur de bureau"
#: pgadmin/static/js/slickgrid/editors.js:50
#: pgadmin/static/js/slickgrid/editors.js:60
#: pgadmin/static/js/slickgrid/editors.js:61
-#: pgadmin/static/js/sqleditor/filter_dialog.js:84
-#: pgadmin/tools/datagrid/static/js/show_data.js:143
-#: pgadmin/tools/datagrid/static/js/show_data.js:218
+#: pgadmin/static/js/sqleditor/filter_dialog.js:83
+#: pgadmin/tools/datagrid/static/js/show_data.js:142
+#: pgadmin/tools/datagrid/static/js/show_data.js:217
#: pgadmin/tools/import_export/static/js/import_export.js:500
-#: pgadmin/tools/maintenance/static/js/maintenance.js:302
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2005
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2035
+#: pgadmin/tools/maintenance/static/js/maintenance.js:301
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1999
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2029
msgid "OK"
msgstr "OK"
@@ -139,12 +139,8 @@ msgid "Please set a master password for pgAdmin."
msgstr "Veuillez définir un mot de passe maître pour pgAdmin."
#: pgadmin/browser/__init__.py:732
-msgid ""
-"This will be used to secure and later unlock saved passwords and other "
-"credentials."
-msgstr ""
-"Ceci sera utilisé pour sécuriser et déverrouiller les mots de passe "
-"enregistrés ainsi que d'autres informations d'identification."
+msgid "This will be used to secure and later unlock saved passwords and other credentials."
+msgstr "Ceci sera utilisé pour sécuriser et déverrouiller les mots de passe enregistrés ainsi que d'autres informations d'identification."
#: pgadmin/browser/__init__.py:736
msgid "Unlock Saved Passwords"
@@ -155,12 +151,8 @@ msgid "Please enter your master password."
msgstr "Veuillez saisir votre mot de passe maître."
#: pgadmin/browser/__init__.py:739
-msgid ""
-"This is required to unlock saved passwords and reconnect to the database "
-"server(s)."
-msgstr ""
-"Ceci est nécessaire pour déverrouiller les mots de passe enregistrés et pour "
-"se reconnecter au(x) serveur(s) de base de données."
+msgid "This is required to unlock saved passwords and reconnect to the database server(s)."
+msgstr "Ceci est nécessaire pour déverrouiller les mots de passe enregistrés et pour se reconnecter au(x) serveur(s) de base de données."
#: pgadmin/browser/__init__.py:802
msgid "Incorrect master password"
@@ -172,29 +164,23 @@ msgstr "Le mot de passe maître ne peut pas être vide"
#: pgadmin/browser/__init__.py:903 pgadmin/browser/__init__.py:995
#: pgadmin/browser/__init__.py:1066
-msgid ""
-"SMTP Socket error: {}\n"
+msgid "SMTP Socket error: {}\n"
"Your password has not been changed."
-msgstr ""
-"Erreur de connexion SMTP : {}\n"
+msgstr "Erreur de connexion SMTP : {}\n"
"Votre mot de passe n'a pas été changé."
#: pgadmin/browser/__init__.py:914 pgadmin/browser/__init__.py:1007
#: pgadmin/browser/__init__.py:1078
-msgid ""
-"SMTP error: {}\n"
+msgid "SMTP error: {}\n"
"Your password has not been changed."
-msgstr ""
-"Erreur SMTP : {}\n"
+msgstr "Erreur SMTP : {}\n"
"Votre mot de passe n'a pas été changé."
#: pgadmin/browser/__init__.py:923 pgadmin/browser/__init__.py:1015
#: pgadmin/browser/__init__.py:1086
-msgid ""
-"Error: {}\n"
+msgid "Error: {}\n"
"Your password has not been changed."
-msgstr ""
-"Erreur: {}\n"
+msgstr "Erreur: {}\n"
"Votre mot de passe n'a pas été changé."
#: pgadmin/browser/register_browser_preferences.py:21
@@ -233,50 +219,32 @@ msgid "Browser tree state saving interval"
msgstr "Intervalle de sauvegarde de l'arborescence"
#: pgadmin/browser/register_browser_preferences.py:41
-msgid ""
-"Browser tree state saving interval in seconds.Use -1 to disable the tree "
-"saving mechanism."
-msgstr ""
-"Intervalle de sauvegarde de l'état de l'arborescence en secondes. -1 pour "
-"désactiver le mécanisme de sauvegarde."
+msgid "Browser tree state saving interval in seconds.Use -1 to disable the tree saving mechanism."
+msgstr "Intervalle de sauvegarde de l'état de l'arborescence en secondes. -1 pour désactiver le mécanisme de sauvegarde."
#: pgadmin/browser/register_browser_preferences.py:49
msgid "Confirm on close or refresh ?"
msgstr "Confirmer lors de fermeture ou d'actualisation ?"
#: pgadmin/browser/register_browser_preferences.py:51
-msgid ""
-"Confirm closure or refresh of the browser or browser tab is intended before "
-"proceeding."
-msgstr ""
-"Demander confirmation lors de la fermeture ou de l'actualisation du "
-"navigateur ou de l'onglet du navigateur."
+msgid "Confirm closure or refresh of the browser or browser tab is intended before proceeding."
+msgstr "Demander confirmation lors de la fermeture ou de l'actualisation du navigateur ou de l'onglet du navigateur."
#: pgadmin/browser/register_browser_preferences.py:59
msgid "Confirm before Close/Reset in object properties dialog ?"
-msgstr ""
-"Confirmer avant de Fermer/Réinitialiser les boites de dialogues des "
-"propriétés des objets ?"
+msgstr "Confirmer avant de Fermer/Réinitialiser les boites de dialogues des propriétés des objets ?"
#: pgadmin/browser/register_browser_preferences.py:62
-msgid ""
-"Confirm before closing or resetting the changes in the properties dialog for "
-"an object if the changes are not saved."
-msgstr ""
-"Confirme avant la fermeture ou la réinitialisation des boites de dialogues "
-"de propriétés des objets si les modifications ne sont pas enregistrées."
+msgid "Confirm before closing or resetting the changes in the properties dialog for an object if the changes are not saved."
+msgstr "Confirme avant la fermeture ou la réinitialisation des boites de dialogues de propriétés des objets si les modifications ne sont pas enregistrées."
#: pgadmin/browser/register_browser_preferences.py:70
msgid "Auto-expand sole children"
msgstr "Auto-extension des objets uniques"
#: pgadmin/browser/register_browser_preferences.py:72
-msgid ""
-"If a treeview node is expanded and has only a single child, automatically "
-"expand the child node as well."
-msgstr ""
-"Si un noeud de l'arborescence est étendu et ne présente qu'un seul élément, "
-"étendre automatiquement ce dernier."
+msgid "If a treeview node is expanded and has only a single child, automatically expand the child node as well."
+msgstr "Si un noeud de l'arborescence est étendu et ne présente qu'un seul élément, étendre automatiquement ce dernier."
#: pgadmin/browser/register_browser_preferences.py:88
msgid "Lock the UI layout at different levels"
@@ -297,12 +265,8 @@ msgid "Maximum job history rows"
msgstr "Nombre de lignes max de l'historique des tâches"
#: pgadmin/browser/register_browser_preferences.py:104
-msgid ""
-"The maximum number of history rows to show on the Statistics tab for pgAgent "
-"jobs"
-msgstr ""
-"Nombre maximum de lignes à afficher dans le tableau de statistiques des "
-"tâches pgAgent"
+msgid "The maximum number of history rows to show on the Statistics tab for pgAgent jobs"
+msgstr "Nombre maximum de lignes à afficher dans le tableau de statistiques des tâches pgAgent"
#: pgadmin/browser/register_browser_preferences.py:111
#: pgadmin/utils/__init__.py:307 pgadmin/utils/__init__.py:316
@@ -480,7 +444,7 @@ msgstr "Les caractériqtiques requises sont manquantes."
#: pgadmin/browser/utils.py:386
#: pgadmin/static/js/alertify.pgadmin.defaults.js:102
#: pgadmin/static/js/alertify.pgadmin.defaults.js:163
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:305
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:303
#: pgadmin/tools/grant_wizard/__init__.py:129 pgadmin/utils/exception.py:35
msgid "Connection to the server has been lost."
msgstr "La connexion au serveur a été perdue."
@@ -521,11 +485,9 @@ msgid "Could not find the server with id# {0}."
msgstr "Impossible de trouver le serveur avec id# {0}."
#: pgadmin/browser/server_groups/servers/__init__.py:466
-msgid ""
-"The specified server could not be found.\n"
+msgid "The specified server could not be found.\n"
"Does the user have permission to access the server?"
-msgstr ""
-"Le groupe de serveur spécifié ne peut pas être trouvé.\n"
+msgstr "Le groupe de serveur spécifié ne peut pas être trouvé.\n"
"L'utilisateur a-t-il les autorisations nécessaires pour accéder à ce serveur?"
#: pgadmin/browser/server_groups/servers/__init__.py:488
@@ -599,7 +561,7 @@ msgid "No parameters were changed."
msgstr "Aucun paramètre n'a été modifié."
#: pgadmin/browser/server_groups/servers/__init__.py:767
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:567
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:562
#: pgadmin/browser/server_groups/servers/databases/casts/__init__.py:370
#: pgadmin/browser/server_groups/servers/databases/extensions/__init__.py:264
#: pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py:395
@@ -621,7 +583,7 @@ msgstr "Aucun paramètre n'a été modifié."
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:365
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:569
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/__init__.py:436
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:888
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:922
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:393
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py:484
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py:478
@@ -639,20 +601,16 @@ msgstr "Impossible de trouver le paramètre (%s)."
#: pgadmin/browser/server_groups/servers/__init__.py:865
#, python-format
-msgid ""
-"Unable to connect to server:\n"
+msgid "Unable to connect to server:\n"
"\n"
"%s"
-msgstr ""
-"Impossible de se connecter au serveur:\n"
+msgstr "Impossible de se connecter au serveur:\n"
"\n"
"%s"
#: pgadmin/browser/server_groups/servers/__init__.py:938
msgid "Server has no active connection for generating statistics."
-msgstr ""
-"Le serveur ne dispose pas d'une connexion active pour générer les "
-"statistiques."
+msgstr "Le serveur ne dispose pas d'une connexion active pour générer les statistiques."
#: pgadmin/browser/server_groups/servers/__init__.py:1018
#: pgadmin/browser/server_groups/servers/__init__.py:1187
@@ -696,10 +654,8 @@ msgstr "Configuration du serveur rechargée."
#: pgadmin/static/js/sqleditor/execute_query.js:307
#: pgadmin/static/js/sqleditor/query_tool_http_error_handler.js:51
#: pgadmin/static/js/sqleditor_utils.js:167
-msgid ""
-"Not connected to the server or the connection to the server has been closed."
-msgstr ""
-"Absence de connexion au serveur ou la connexion au serveur a été fermée."
+msgid "Not connected to the server or the connection to the server has been closed."
+msgstr "Absence de connexion au serveur ou la connexion au serveur a été fermée."
#: pgadmin/browser/server_groups/servers/__init__.py:1268
msgid "Named restore point created: {0}"
@@ -743,12 +699,8 @@ msgid "Greenplum Database Binary Path"
msgstr "Chemin des binaires Greenplum"
#: pgadmin/browser/server_groups/servers/gpdb.py:16
-msgid ""
-"Path to the directory containing the Greenplum Database utility programs "
-"(pg_dump, pg_restore etc)."
-msgstr ""
-"Chemin du dossier contenant les binaires des utilitaires de bases de données "
-"Greenplum (pg_dump, pg_restore etc)."
+msgid "Path to the directory containing the Greenplum Database utility programs (pg_dump, pg_restore etc)."
+msgstr "Chemin du dossier contenant les binaires des utilitaires de bases de données Greenplum (pg_dump, pg_restore etc)."
#: pgadmin/browser/server_groups/servers/gpdb.py:30
msgid "Greenplum Database"
@@ -759,12 +711,8 @@ msgid "EDB Advanced Server Binary Path"
msgstr "Chemin des binaire EDB Advanced Server"
#: pgadmin/browser/server_groups/servers/ppas.py:16
-msgid ""
-"Path to the directory containing the EDB Advanced Server utility programs "
-"(pg_dump, pg_restore etc)."
-msgstr ""
-"Chemin du dossier contenant les binaires des utilitaires de bases de données "
-"EDB Advanced Server (pg_dump, pg_restore etc)."
+msgid "Path to the directory containing the EDB Advanced Server utility programs (pg_dump, pg_restore etc)."
+msgstr "Chemin du dossier contenant les binaires des utilitaires de bases de données EDB Advanced Server (pg_dump, pg_restore etc)."
#: pgadmin/browser/server_groups/servers/ppas.py:26
msgid "EDB Advanced Server"
@@ -775,12 +723,8 @@ msgid "PostgreSQL Binary Path"
msgstr "Chemin des binaires PostgreSQL"
#: pgadmin/browser/server_groups/servers/types.py:31
-msgid ""
-"Path to the directory containing the PostgreSQL utility programs (pg_dump, "
-"pg_restore etc)."
-msgstr ""
-"Chemin du dossier contenant les binaires des utilitaires PostgreSQL "
-"(pg_dump, pg_restore etc)."
+msgid "Path to the directory containing the PostgreSQL utility programs (pg_dump, pg_restore etc)."
+msgstr "Chemin du dossier contenant les binaires des utilitaires PostgreSQL (pg_dump, pg_restore etc)."
#: pgadmin/browser/server_groups/servers/types.py:59
#: pgadmin/help/__init__.py:53
@@ -800,33 +744,33 @@ msgstr "Impossible de trouver l'utilitaire pour cette opération '%s'"
msgid "PostgreSQL"
msgstr "PostgreSQL"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:38
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:37
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:21
msgid "Databases"
msgstr "Bases de données"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:375
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:391
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:654
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:724
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:849
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:1021
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:374
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:390
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:649
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:719
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:844
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:1016
msgid "Could not find the database on the server."
msgstr "Impossible de trouver la base de données sur le serveur."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:469
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:468
msgid "Database connected."
msgstr "Base de données connectée."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:488
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:485
msgid "Database could not be disconnected."
msgstr "Impossible de déconnecter la base de données."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:492
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:489
msgid "Database disconnected."
msgstr "Base de données déconnectée."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:777
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:772
#: pgadmin/browser/server_groups/servers/databases/casts/__init__.py:483
#: pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py:522
#: pgadmin/browser/server_groups/servers/databases/extensions/__init__.py:357
@@ -841,10 +785,10 @@ msgstr "Base de données déconnectée."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py:548
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py:488
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py:453
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:830
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:829
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py:441
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:462
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1051
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1085
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:474
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py:565
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py:591
@@ -862,11 +806,11 @@ msgstr "Base de données déconnectée."
msgid "Error: Object not found."
msgstr "Erreur: Objet non trouvé."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:780
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:775
msgid "The specified database could not be found.\n"
msgstr "La base de données ne peut pas être trouvée\n"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:876
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:871
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:728
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:1561
msgid " -- definition incomplete"
@@ -893,12 +837,10 @@ msgid "Could not find the specified cast on the server."
msgstr "Impossible de trouver le transtypage sur le serveur."
#: pgadmin/browser/server_groups/servers/databases/casts/__init__.py:666
-msgid ""
-"Could not generate reversed engineered SQL for the cast.\n"
+msgid "Could not generate reversed engineered SQL for the cast.\n"
"\n"
"{0}"
-msgstr ""
-"Impossible de générer le code SQL pour le transtypage.\n"
+msgstr "Impossible de générer le code SQL pour le transtypage.\n"
"\n"
"{0}"
@@ -962,19 +904,19 @@ msgstr "Conversion..."
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:93
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:39
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:210
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:182
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:107
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:670
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:712
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:119
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:105
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:53
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:292
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:181
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:106
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:669
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:710
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:118
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:104
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:52
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:289
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:358
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:131
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:130
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:265
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:324
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:184
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:183
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:324
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:148
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:112
@@ -1026,22 +968,22 @@ msgstr "Nom"
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:114
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog.js:65
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:393
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:185
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:110
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:673
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:716
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:123
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:109
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:295
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:184
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:109
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:672
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:714
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:122
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:108
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:292
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:361
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:146
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:145
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:254
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:327
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:187
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:186
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:328
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:151
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:115
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:312
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:309
#: pgadmin/browser/server_groups/servers/resource_groups/static/js/resource_group.js:87
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:391
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:344
@@ -1156,56 +1098,56 @@ msgstr "Type source"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:654
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:658
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:662
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:137
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:158
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:692
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:702
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:747
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:750
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:758
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:781
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:735
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:748
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:772
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:789
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:805
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:853
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:144
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:416
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:513
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:538
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:561
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:576
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:604
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:130
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:402
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:499
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:523
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:550
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:565
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:593
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:315
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:346
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:349
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:136
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:157
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:691
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:701
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:746
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:749
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:757
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:780
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:733
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:746
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:770
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:787
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:803
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:851
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:143
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:415
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:512
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:537
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:560
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:575
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:603
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:129
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:401
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:498
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:522
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:549
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:564
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:592
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:311
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:342
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:345
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:384
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:388
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:392
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:396
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:400
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:404
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:407
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:411
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:415
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:418
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:440
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:166
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:179
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:191
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:207
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:250
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:268
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:292
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:318
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:323
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:414
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:436
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:165
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:190
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:249
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:267
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:291
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:317
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:322
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:350
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:375
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:385
@@ -1217,14 +1159,14 @@ msgstr "Type source"
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:173
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:136
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:140
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:338
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:343
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:367
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:376
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:381
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:335
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:340
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:364
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:373
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:378
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:383
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:386
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:389
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:393
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:390
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:395
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:408
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:412
@@ -1279,22 +1221,22 @@ msgstr "Transtypage système?"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog.js:74
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:403
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:674
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:306
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:113
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:676
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:719
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:127
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:113
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:59
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:477
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:305
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:112
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:675
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:717
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:126
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:112
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:58
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:473
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:411
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:203
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:202
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:397
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:515
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:514
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:762
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:169
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:132
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:334
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:331
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:465
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:140
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:206
@@ -1321,8 +1263,7 @@ msgstr "Impossible de trouver le trigger sur évènement."
#: pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py:336
#: pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py:610
msgid "Could not find the event trigger information."
-msgstr ""
-"Impossible de trouver l'information concernant le trigger sur évènement."
+msgstr "Impossible de trouver l'information concernant le trigger sur évènement."
#: pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py:380
#: pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py:639
@@ -1378,7 +1319,7 @@ msgstr "Trigger sur évènement..."
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:331
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:154
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:118
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:315
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:312
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:355
#: pgadmin/dashboard/static/js/dashboard.js:1129
#: pgadmin/dashboard/static/js/dashboard.js:1387
@@ -1390,7 +1331,7 @@ msgstr "Propriétaire"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:111
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:155
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:242
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:199
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:198
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:286
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:103
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:144
@@ -1399,28 +1340,28 @@ msgstr "Activé ?"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:120
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:39
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:316
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:315
msgid "Trigger function"
msgstr "Fonction déclencheur"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:124
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:205
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:267
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:272
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:347
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:387
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:391
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:404
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:417
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:429
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:459
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:464
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:204
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:266
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:271
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:346
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:386
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:390
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:403
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:416
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:428
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:458
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:463
msgid "Events"
msgstr "Événements"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:132
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:264
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:456
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:263
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:455
msgid "When"
msgstr "Quand"
@@ -1439,7 +1380,7 @@ msgstr "Quand"
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:784
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:222
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:169
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:409
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:406
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:514
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:378
msgid "Security labels"
@@ -1472,14 +1413,14 @@ msgstr "Label de sécurité"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1124
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:167
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:130
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:317
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:320
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:323
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:326
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:329
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:332
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:400
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:412
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:467
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:397
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:409
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:464
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:516
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:360
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:372
@@ -1586,11 +1527,11 @@ msgstr "Déplaçable ?"
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:189
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:479
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:195
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:321
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:495
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:530
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:320
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:491
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:529
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:811
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:455
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:452
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:473
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:163
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:221
@@ -1627,8 +1568,7 @@ msgstr "Impossible de trouver le wrapper de données distantes."
#: pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py:344
#: pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py:609
msgid "Could not find the foreign data wrapper information."
-msgstr ""
-"Impossible de trouver l'information sur le wrapper de données distantes."
+msgstr "Impossible de trouver l'information sur le wrapper de données distantes."
#: pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py:520
msgid "The specified foreign data wrapper could not be found.\n"
@@ -1791,8 +1731,8 @@ msgstr "Type"
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:214
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:129
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:161
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:319
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:396
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:316
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:393
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:420
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:427
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:440
@@ -1821,8 +1761,7 @@ msgstr "Impossible de trouver la correspondance d'utilisateurs."
#: pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/__init__.py:633
#: pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/__init__.py:726
msgid "Could not find the user mapping information."
-msgstr ""
-"Impossible de trouver l'information sur la correspondance d'utilisateurs."
+msgstr "Impossible de trouver l'information sur la correspondance d'utilisateurs."
#: pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/__init__.py:548
msgid "The specified user mapping could not be found.\n"
@@ -1949,23 +1888,17 @@ msgstr "Catalogues"
#: pgadmin/browser/server_groups/servers/databases/schemas/__init__.py:487
#: pgadmin/browser/server_groups/servers/databases/schemas/__init__.py:894
#: pgadmin/browser/server_groups/servers/databases/schemas/__init__.py:996
-msgid ""
-"\n"
+msgid "\n"
"Could not find the schema in the database.\n"
"It may have been removed by another user.\n"
-msgstr ""
-"\n"
+msgstr "\n"
"Impossible de trouver le schéma dans la base de données.\n"
"Il a pu être supprimé par un autre utilisateur.\n"
#: pgadmin/browser/server_groups/servers/databases/schemas/__init__.py:534
#: pgadmin/browser/server_groups/servers/databases/schemas/__init__.py:815
-msgid ""
-"Could not find the schema in the database. It may have been removed by "
-"another user."
-msgstr ""
-"Impossible de trouver le schéma dans la base de données. Il a pu être "
-"supprimé par un autre utilisateur."
+msgid "Could not find the schema in the database. It may have been removed by another user."
+msgstr "Impossible de trouver le schéma dans la base de données. Il a pu être supprimé par un autre utilisateur."
#: pgadmin/browser/server_groups/servers/databases/schemas/__init__.py:687
msgid "The specified schema could not be found.\n"
@@ -1976,7 +1909,7 @@ msgid "Schema dropped"
msgstr "Schéma supprimé"
#: pgadmin/browser/server_groups/servers/databases/schemas/__init__.py:781
-#: pgadmin/static/js/backform.pgadmin.js:1837
+#: pgadmin/static/js/backform.pgadmin.js:1833
msgid "Definition incomplete."
msgstr "Définition incomplète."
@@ -1995,23 +1928,23 @@ msgstr "Impossible de trouver l'objet catalogue."
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:594
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:60
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:23
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:269
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:268
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:786
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:787
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:788
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:909
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:898
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:899
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:143
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:344
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:417
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:908
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:896
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:897
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:142
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:340
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:413
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:421
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:427
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:428
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:401
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:495
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:496
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:461
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:460
#: pgadmin/tools/import_export/static/js/import_export.js:179
#: pgadmin/tools/import_export/static/js/import_export.js:199
#: pgadmin/tools/import_export/static/js/import_export.js:237
@@ -2060,7 +1993,7 @@ msgstr "Type de données"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:85
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:171
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:449
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:375
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:372
msgid "Collation"
msgstr "Collationnement"
@@ -2086,12 +2019,8 @@ msgstr "Impossible de trouver le collationnement dans la base de données."
#: pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py:447
#: pgadmin/browser/server_groups/servers/databases/schemas/collations/static/js/collation.js:178
-msgid ""
-"Definition incomplete. Please provide Locale OR Copy Collation OR LC_TYPE/"
-"LC_COLLATE."
-msgstr ""
-"Définition incomplète!. Merci de fournir soit une Locale soit un LC_TYPE/"
-"LC_COLLATE soit copier un collationnement."
+msgid "Definition incomplete. Please provide Locale OR Copy Collation OR LC_TYPE/LC_COLLATE."
+msgstr "Définition incomplète!. Merci de fournir soit une Locale soit un LC_TYPE/LC_COLLATE soit copier un collationnement."
#: pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py:537
msgid "Collation dropped"
@@ -2131,15 +2060,12 @@ msgid "Could not find the specified domain."
msgstr "Impossible de trouver le domaine."
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py:380
-msgid ""
-"\n"
+msgid "\n"
"Could not find the domain in the database.\n"
"It may have been removed by another user or moved to another schema.\n"
-msgstr ""
-"\n"
+msgstr "\n"
"Impossible de trouver le domaine dans la base de données.\n"
-"Il a pu être supprimé par un autre utilisateur ou déplacé dans un autre "
-"schéma.\n"
+"Il a pu être supprimé par un autre utilisateur ou déplacé dans un autre schéma.\n"
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py:606
msgid "The specified domain could not be found.\n"
@@ -2180,7 +2106,7 @@ msgstr "Contrainte du domaine..."
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/static/js/domain.js:65
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:415
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:21
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:127
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:614
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:679
msgid "Check"
@@ -2188,7 +2114,7 @@ msgstr "Vérification"
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js:97
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:419
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:136
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:135
msgid "No inherit?"
msgstr "Pas d'héritage ?"
@@ -2199,7 +2125,7 @@ msgid "Validate?"
msgstr "Valider ?"
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:177
msgid "Check cannot be empty."
msgstr "La vérification ne peut pas être vide."
@@ -2304,8 +2230,8 @@ msgstr "Table distante supprimée"
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py:1285
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py:1330
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1367
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1417
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1401
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1451
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:1356
msgid "-- Please create column(s) first..."
msgstr "-- Merci de créer d'abord la/les colonne/s..."
@@ -2314,8 +2240,6 @@ msgstr "-- Merci de créer d'abord la/les colonne/s..."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:487
#: pgadmin/browser/static/js/browser.js:213
#: pgadmin/misc/static/explain/js/explain.js:1219
-#: pgadmin/misc/static/explain/js/explain.js:1348
-#: pgadmin/misc/static/explain/js/explain.js:1349
#: pgadmin/misc/statistics/static/js/statistics.js:129
msgid "Statistics"
msgstr "Statistiques"
@@ -2325,7 +2249,7 @@ msgid "Inherited From"
msgstr "Hérité de"
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:259
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:176
msgid "Column Name cannot be empty."
msgstr "Le nom de colonne ne peut pas être vide."
@@ -2380,14 +2304,11 @@ msgstr "Configurations de recherche plein texte"
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py:320
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py:643
msgid "Could not find the FTS Configuration node."
-msgstr ""
-"Impossible de trouver le noeud de configuration de recherche plein texte."
+msgstr "Impossible de trouver le noeud de configuration de recherche plein texte."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py:359
msgid "Could not find the FTS Configuration node in the database node."
-msgstr ""
-"Impossible de trouver le noeud de configuration de recherche plein texte "
-"dans le noeud de la base de données."
+msgstr "Impossible de trouver le noeud de configuration de recherche plein texte dans le noeud de la base de données."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py:416
msgid "Provide at least copy config or parser."
@@ -2395,9 +2316,7 @@ msgstr "Renseigner soit 'Copier la configuration' soit 'Analyseur'."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py:504
msgid "Could not find the FTS Configuration node to update."
-msgstr ""
-"Impossible de trouver le noeud de configuration de recherche plein texte à "
-"mettre à jour."
+msgstr "Impossible de trouver le noeud de configuration de recherche plein texte à mettre à jour."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py:557
msgid "The specified FTS configuration could not be found.\n"
@@ -2408,20 +2327,14 @@ msgid "FTS Configuration dropped"
msgstr "Configuration de recherche plein texte supprimée"
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py:873
-msgid ""
-"Could not generate reversed engineered query for the FTS Configuration.\n"
+msgid "Could not generate reversed engineered query for the FTS Configuration.\n"
"{0}"
-msgstr ""
-"Impossible de générer la requête pour la configuration de la recherche plein "
-"texte.\n"
+msgstr "Impossible de générer la requête pour la configuration de la recherche plein texte.\n"
"{0}"
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py:881
-msgid ""
-"Could not generate reversed engineered query for FTS Configuration node."
-msgstr ""
-"Impossible de générer la requête pour la configuration du noeud de recherche "
-"plein texte.\n"
+msgid "Could not generate reversed engineered query for FTS Configuration node."
+msgstr "Impossible de générer la requête pour la configuration du noeud de recherche plein texte.\n"
"{0}"
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/static/js/fts_configuration.js:29
@@ -2496,21 +2409,16 @@ msgstr "Dictionnaires de recherche plein texte"
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py:331
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py:639
msgid "Could not find the FTS Dictionary node."
-msgstr ""
-"Impossible de trouver le noeud du dictionnaire de recherche plein texte."
+msgstr "Impossible de trouver le noeud du dictionnaire de recherche plein texte."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py:368
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py:772
msgid "Could not find the FTS Dictionary node in the database node."
-msgstr ""
-"Impossible de trouver le noeud du dictionnaire de recherche plein texte "
-"dans la base de données."
+msgstr "Impossible de trouver le noeud du dictionnaire de recherche plein texte dans la base de données."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py:499
msgid "Could not find the FTS Dictionary node to update."
-msgstr ""
-"Impossible de trouver le noeud du dictionnaire de recherche plein texte à "
-"mettre à jour."
+msgstr "Impossible de trouver le noeud du dictionnaire de recherche plein texte à mettre à jour."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py:551
msgid "The specified FTS dictionary could not be found.\n"
@@ -2539,7 +2447,7 @@ msgid "FTS Dictionary..."
msgstr "Dictionnaire de recherche plein texte ..."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/static/js/fts_dictionary.js:153
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:342
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:339
msgid "Template"
msgstr "Modèle"
@@ -2555,20 +2463,15 @@ msgstr "Analyseurs de recherche plein texte"
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py:291
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py:577
msgid "Could not find the FTS Parser node."
-msgstr ""
-"Impossible de trouver le noeud de l'analyseur de recherche plein texte ."
+msgstr "Impossible de trouver le noeud de l'analyseur de recherche plein texte ."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py:318
msgid "Could not find the FTS Parser node in the database node."
-msgstr ""
-"Impossible de trouver le noeud de l'analyseur de recherche plein texte dans "
-"la base de données."
+msgstr "Impossible de trouver le noeud de l'analyseur de recherche plein texte dans la base de données."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py:438
msgid "Could not find the FTS Parser node to update."
-msgstr ""
-"Impossible de trouver le noeud de l'analyseur de recherche plein texte à "
-"mettre à jour."
+msgstr "Impossible de trouver le noeud de l'analyseur de recherche plein texte à mettre à jour."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py:491
msgid "The specified FTS parser could not be found.\n"
@@ -2579,18 +2482,14 @@ msgid "FTS Parser dropped"
msgstr "Analyseur de recherche plein texte supprimé"
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py:807
-msgid ""
-"Could not generate reversed engineered query for the FTS Parser.\n"
+msgid "Could not generate reversed engineered query for the FTS Parser.\n"
"{0}"
-msgstr ""
-"Impossible de générer la requête pour l'analyseur de recherche plein texte.\n"
+msgstr "Impossible de générer la requête pour l'analyseur de recherche plein texte.\n"
"{0}"
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py:815
msgid "Could not generate reversed engineered query for FTS Parser node"
-msgstr ""
-"Impossible de générer la requête pour le noeud de l'analyseur de recherche "
-"plein texte"
+msgstr "Impossible de générer la requête pour le noeud de l'analyseur de recherche plein texte"
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/static/js/fts_parser.js:36
msgid "FTS Parser"
@@ -2658,18 +2557,14 @@ msgid "FTS Template dropped"
msgstr "Modèle de recherche plein texte supprimé"
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py:685
-msgid ""
-"Could not generate reversed engineered query for the FTS Template.\n"
+msgid "Could not generate reversed engineered query for the FTS Template.\n"
"{0}"
-msgstr ""
-"Impossible de générer la requête pour le modèle de recherche plein texte.\n"
+msgstr "Impossible de générer la requête pour le modèle de recherche plein texte.\n"
"{0}"
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py:692
msgid "Could not generate reversed engineered query for FTS Template node."
-msgstr ""
-"Impossible de générer la requête pour le noeud du modèle de recherche plein "
-"texte."
+msgstr "Impossible de générer la requête pour le noeud du modèle de recherche plein texte."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/static/js/fts_template.js:36
msgid "FTS Template"
@@ -2698,7 +2593,7 @@ msgstr "LA fonction lexize doit être sélectionnée."
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:59
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:21
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:457
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:434
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:431
msgid "Functions"
msgstr "Fonctions"
@@ -2711,29 +2606,29 @@ msgstr "Impossible de trouver %s."
msgid "Could not find the function node in the database."
msgstr "Impossible de trouver le noeud de fonction dans la base de donnée."
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:833
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:832
msgid "The specified function could not be found.\n"
msgstr "Impossible de trouver la fonction.\n"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:850
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:849
msgid "Function dropped."
msgstr "Fonction supprimée."
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1141
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1320
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1140
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1319
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:334
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:511
msgid "Could not find the function in the database."
msgstr "Impossible de trouver la fonction dans la base de données."
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1628
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1627
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js:24
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:621
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbproc.js:24
msgid "Procedures"
msgstr "Procédures"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1728
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1727
msgid "Trigger Functions"
msgstr "Fonctions déclencheurs"
@@ -2773,7 +2668,7 @@ msgstr "Nombre d'arguments"
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:327
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:150
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:79
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:322
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:321
msgid "Arguments"
msgstr "Arguments"
@@ -2797,8 +2692,8 @@ msgstr "Type renvoyé"
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:182
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:98
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:100
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:289
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:493
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:288
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:492
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:154
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:155
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:209
@@ -2866,7 +2761,7 @@ msgstr "Fonction support"
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:338
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:245
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1119
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:405
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:402
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:508
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:366
#: pgadmin/tools/debugger/static/js/direct.js:1707
@@ -2906,7 +2801,7 @@ msgstr "Le symbole de lien ne peut pas être vide."
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:406
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js:200
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:314
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:338
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:337
msgid "Code cannot be empty."
msgstr "Le code ne peut pas être vide."
@@ -3096,7 +2991,7 @@ msgstr "L'en-tête ne peut pas être vide."
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:56
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:25
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:450
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:428
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:425
msgid "Sequences"
msgstr "Séquences"
@@ -3259,22 +3154,22 @@ msgid "System schema?"
msgstr "Schéma système ?"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:409
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:322
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:319
msgid "Default TABLE privileges"
msgstr "Droits par défaut de la table"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:412
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:325
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:322
msgid "Default SEQUENCE privileges"
msgstr "Droits par défaut de la séquence"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:415
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:328
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:325
msgid "Default FUNCTION privileges"
msgstr "Droits par défaut de la fonction"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:418
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:331
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:328
msgid "Default TYPE privileges"
msgstr "Droits par défaut du type"
@@ -3283,9 +3178,9 @@ msgid "Default privileges"
msgstr "Privilèges par défaut"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:443
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:53
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:29
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:422
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:419
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:130
msgid "Tables"
msgstr "Tables"
@@ -3293,7 +3188,7 @@ msgstr "Tables"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:464
#: pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py:58
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:24
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:445
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:442
msgid "Types"
msgstr "Types"
@@ -3354,8 +3249,8 @@ msgstr "Synonyme public ?"
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:185
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:221
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:527
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:791
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:808
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:789
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:806
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:275
#: pgadmin/browser/static/js/browser.js:630
#: pgadmin/browser/static/js/node.js:1283
@@ -3364,17 +3259,17 @@ msgstr "Synonyme public ?"
#: pgadmin/misc/file_manager/templates/file_manager/index.html:78
#: pgadmin/static/js/backform.pgadmin.js:538
#: pgadmin/static/js/backgrid.pgadmin.js:621
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1741
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1786
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2385
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1735
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1780
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2379
msgid "Yes"
msgstr "Oui"
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:185
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:221
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:527
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:792
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:809
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:790
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:807
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:275
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:147
#: pgadmin/browser/static/js/browser.js:631
@@ -3384,9 +3279,9 @@ msgstr "Oui"
#: pgadmin/misc/file_manager/templates/file_manager/index.html:77
#: pgadmin/static/js/backform.pgadmin.js:539
#: pgadmin/static/js/backgrid.pgadmin.js:622
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1742
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1787
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2386
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1736
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1781
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2380
msgid "No"
msgstr "No"
@@ -3398,32 +3293,32 @@ msgstr "Le schéma cible ne peut pas être vide."
msgid "Target object cannot be empty."
msgstr "L'objet cible ne peut pas être vide."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:359
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:357
msgid "Could not find the table."
msgstr "Impossible de trouver la table."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:596
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1271
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:630
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1305
msgid "The specified table could not be found."
msgstr "Impossible de trouver la table."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1054
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1088
msgid "The specified table could not be found.\n"
msgstr "Impossible de trouver la table.\n"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1067
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1101
msgid "Table dropped"
msgstr "Table supprimée"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1145
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1179
msgid "Trigger(s) have been disabled"
msgstr "Déclencheurs(s) désactivé(s)"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1147
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1181
msgid "Trigger(s) have been enabled"
msgstr "Déclencheur(s) activé(s)"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1501
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1535
#, python-format
msgid "Table rows counted: %s"
msgstr "Nombre de lignes du tableau : %s"
@@ -3476,7 +3371,7 @@ msgstr "Colonne supprimée"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:608
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:704
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:856
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:853
msgid "Could not find the column on the server."
msgstr "Impossible de trouver la colonne sur le serveur."
@@ -3503,7 +3398,7 @@ msgstr "Hérité de la table"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:353
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:114
msgid "Length/Precision"
-msgstr "Longueur/ précision"
+msgstr "Longueur/ Précision"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:409
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:144
@@ -3579,11 +3474,11 @@ msgstr "Le type de la colonne doit être renseigné."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:728
msgid "Length/Precision should not be less than: "
-msgstr "La longueur/précision ne doit pas être inférieure à : "
+msgstr "Longueur / précision ne doit pas être inférieur à : "
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:730
msgid "Length/Precision should not be greater than: "
-msgstr "La longueur/précision ne doit pas être supérieure à : "
+msgstr "Longueur / précision ne doit pas être supérieur à : "
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:744
msgid "Scale should not be less than: "
@@ -3623,73 +3518,72 @@ msgstr "Le déclencheur composé est supprimé"
msgid "Compound Trigger"
msgstr "Déclencheur composé"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:56
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:62
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:68
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:74
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:90
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:61
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:67
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:73
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:89
msgid "Compound Trigger..."
msgstr "Déclencheur composé..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:80
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:79
msgid "Enable compound trigger"
msgstr "Activer le déclencheur composé"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:85
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:84
msgid "Disable compound trigger"
msgstr "Désactiver le déclencheur composé"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:169
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:168
msgid "Disable compound trigger failed"
msgstr "La désactivation du déclencheur composé a échoué"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:188
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:190
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:187
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:189
msgid "Trigger enabled?"
msgstr "Déclencheur activé ?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:205
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:209
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:222
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:235
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:248
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:204
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:208
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:221
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:234
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:247
msgid "FOR Events"
msgstr "Événement FOR"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:207
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:389
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:388
msgid "INSERT"
msgstr "INSERT"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:220
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:402
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:219
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:401
msgid "UPDATE"
msgstr "UPDATE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:233
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:415
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:232
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:414
msgid "DELETE"
msgstr "DELETE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:246
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:428
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:245
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:427
msgid "TRUNCATE"
msgstr "TRUNCATE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:303
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:512
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:302
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:511
msgid "System trigger?"
msgstr "Déclencheur système ?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:328
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:543
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:327
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:542
msgid "Specify at least one event."
msgstr "Au moins un événement doit être renseigné."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:347
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:346
#, fuzzy
-msgid ""
-"-- Enter any global declarations below:\n"
+msgid "-- Enter any global declarations below:\n"
"\n"
"-- BEFORE STATEMENT block. Delete if not required.\n"
"BEFORE STATEMENT IS\n"
@@ -3725,8 +3619,7 @@ msgid ""
"BEGIN\n"
" -- Enter any required code here\n"
"END;"
-msgstr ""
-"-- Enter any global declarations below:\n"
+msgstr "-- Enter any global declarations below:\n"
"\n"
"-- BEFORE STATEMENT block. Delete if not required.\n"
"BEFORE STATEMENT IS\n"
@@ -3793,15 +3686,15 @@ msgstr "Impossible de trouver l'objet sur le serveur!."
msgid "Check constraint updated."
msgstr "Contrainte de vérification mise à jour."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:40
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:39
msgid "Check..."
msgstr "Vérification..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:46
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:45
msgid "Validate check constraint"
msgstr "Valider la contrainte de vérification"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:157
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:156
msgid "Don't validate?"
msgstr "Ne pas valider ?"
@@ -3837,7 +3730,7 @@ msgid "Exclusion constraint dropped."
msgstr "Contrainte d'exclusion supprimée."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:38
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:97
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:96
msgid "Operator class"
msgstr "Classe d'opérateur"
@@ -3865,10 +3758,10 @@ msgstr "Merci de renseigner l'opérateur pour la colonne : "
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:453
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:381
#: pgadmin/browser/server_groups/servers/static/js/variable.js:341
-#: pgadmin/static/js/backform.pgadmin.js:1260
-#: pgadmin/static/js/backform.pgadmin.js:1370
-#: pgadmin/static/js/backform.pgadmin.js:1550
-#: pgadmin/static/js/backform.pgadmin.js:1669
+#: pgadmin/static/js/backform.pgadmin.js:1259
+#: pgadmin/static/js/backform.pgadmin.js:1366
+#: pgadmin/static/js/backform.pgadmin.js:1546
+#: pgadmin/static/js/backform.pgadmin.js:1665
msgid "Add new row"
msgstr "Ajouter une nouvelle ligne"
@@ -3880,7 +3773,7 @@ msgstr "Contrainte d'exclusion"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:28
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:28
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:29
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:236
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:234
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/exclusion_constraint/sql/default/stats.sql:7
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/exclusion_constraint/sql/default/stats.sql:12
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/index_constraint/sql/default/stats.sql:7
@@ -3890,87 +3783,87 @@ msgstr "Contrainte d'exclusion"
msgid "Index size"
msgstr "Taille index"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:642
msgid "Exclusion constraint..."
msgstr "Contrainte d'exclusion..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:691
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:512
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:498
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:298
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:690
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:511
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:497
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:295
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:378
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:344
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:196
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:366
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:363
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:40
#: pgadmin/tools/backup/static/js/backup.js:366
#: pgadmin/tools/restore/static/js/restore.js:255
msgid "Tablespace"
msgstr "Tablespace"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:701
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:700
msgid "Access method"
msgstr "Méthode d'accès"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:716
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:326
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:715
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:322
msgid "Changing access method will clear columns collection"
msgstr "Modifier la méthode d'accès videra les colonnes de la collection"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:746
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:560
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:549
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:386
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:745
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:559
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:548
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:382
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:716
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:790
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:204
msgid "Fill factor"
msgstr "Facteur de remplissage"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:749
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:734
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:575
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:564
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:267
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:748
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:732
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:574
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:563
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:266
msgid "Deferrable?"
msgstr "Différable ?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:757
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:747
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:603
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:592
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:291
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:756
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:745
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:602
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:591
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:290
msgid "Deferred?"
msgstr "Différable ?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:779
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:413
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:778
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:409
msgid "Constraint"
msgstr "Contrainte"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:908
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:415
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:401
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:348
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:439
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:907
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:414
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:400
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:344
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:435
msgid "Include columns"
msgstr "Inclure les colonnes"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:931
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:242
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:438
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:228
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:424
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:370
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:461
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:930
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:241
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:437
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:227
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:423
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:366
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:457
msgid "Select the column(s)"
msgstr "Sélectionner la (les) colonne(s)"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1012
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1011
msgid "Please specify name for exclusion constraint."
msgstr "Merci de renseigner un nom pour la contrainte d'exclusion."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1018
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1017
msgid "Please specify columns for exclusion constraint."
msgstr "Merci de renseigner les colonnes pour la contrainte d'exclusion."
@@ -4028,53 +3921,53 @@ msgstr "Références"
msgid "Referencing"
msgstr "Références vers"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:616
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:615
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:585
msgid "Foreign key"
msgstr "Clé étrangère"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:637
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:635
msgid "Foreign key..."
msgstr "Clé étrangère..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:641
msgid "Validate foreign key"
msgstr "Valider la clé étrangère"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:771
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:769
msgid "Match type"
msgstr "Type de correspondance"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:788
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:786
msgid "Validated?"
msgstr "Validé ?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:804
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:802
msgid "Auto FK index?"
msgstr "Index FK auto ?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:852
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:850
msgid "Covering index"
msgstr "Couverture de l'index"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1002
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1000
msgid "On update"
msgstr "Lors d'une mise à jour"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1003
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1023
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1001
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1021
msgid "Action"
msgstr "Action"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1022
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1020
msgid "On delete"
msgstr "Lors d'une suppression"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1050
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1048
msgid "Please specify columns for Foreign key."
msgstr "Merci de préciser les colonnes pour la clé étrangère."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1059
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1057
msgid "Please specify covering index name."
msgstr "Merci de renseigner un nom pour la couverture d'index."
@@ -4119,7 +4012,7 @@ msgstr "{0} supprimé."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py:996
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:20
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:43
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:42
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:557
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:729
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:811
@@ -4128,7 +4021,7 @@ msgstr "Clé primaire"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py:1006
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:20
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:43
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:42
msgid "Unique constraint"
msgstr "Contrainte d'unicité"
@@ -4136,19 +4029,19 @@ msgstr "Contrainte d'unicité"
msgid "Could not find the constraint in the table."
msgstr "Impossible de trouver la contrainte dans la table."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:536
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:522
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:231
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:535
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:521
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:229
msgid "Index"
msgstr "Index"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:644
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:633
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:632
#, python-format
msgid "Please specify columns for %s"
msgstr "Merci de préciser les colonnes pour les %s"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:56
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:55
msgid "Oid"
msgstr "Oid"
@@ -4175,7 +4068,7 @@ msgid "Index is dropped"
msgstr "Index supprimé"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:29
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:236
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:234
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:45
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:33
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:49
@@ -4192,59 +4085,63 @@ msgstr "Index supprimé"
msgid "Size"
msgstr "Taille"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:130
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:128
msgid "Sort order"
msgstr "Ordre de tri"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:151
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:149
msgid "NULLs"
msgstr "NULLs"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:248
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:254
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:260
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:266
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:272
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:245
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:251
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:257
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:263
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:269
msgid "Index..."
msgstr "Index..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:311
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:308
msgid "Access Method"
msgstr "Méthode d'accès"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:390
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:386
msgid "Unique?"
msgstr "Unique ?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:394
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:390
msgid "Clustered?"
msgstr "Appartient à un cluster ?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:398
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:394
msgid "Valid?"
msgstr "Valide ?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:402
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:398
msgid "Primary?"
msgstr "Primaire ?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:406
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:402
msgid "System index?"
msgstr "Index système ?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:409
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:405
msgid "Concurrent build?"
msgstr "Sans verrouillage ?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:501
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:497
+msgid "Tablespace cannot be empty."
+msgstr "Tablespace ne peut pas être vide."
+
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:503
msgid "Access method cannot be empty."
msgstr "La méthode d'accès ne peut pas être vide."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:509
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:511
msgid "You must specify column name."
msgstr "Un nom de colonne doit être renseigné."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:514
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:516
msgid "You must specify at least one column."
msgstr "Au moins une colonne doit être renseignée."
@@ -4384,9 +4281,7 @@ msgstr "Réinitialiser les statistiques"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:213
#, python-format
msgid "Are you sure you want to reset the statistics for table \"%s\"?"
-msgstr ""
-"Êtes vous sûr de vouloir réinitialiser les statistiques pour la table \"%s"
-"\" ?"
+msgstr "Êtes vous sûr de vouloir réinitialiser les statistiques pour la table \"%s\" ?"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:276
#, python-format
@@ -4573,19 +4468,8 @@ msgid "Error fetching tables to be attached"
msgstr "Erreur lors de la récupération des tables à détacher"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:933
-msgid ""
-"The control above is used to Create/Attach/Detach partitions."
-"<br><ul><li>Create Mode: User will be able to create N number of partitions. "
-"Mode switch control is disabled in this scenario.</li><li>Edit Mode: User "
-"will be able to create/attach/detach N number of partitions. In attach mode "
-"there will be list of suitable tables to be attached.</li></ul>"
-msgstr ""
-"Le contrôle ci-dessus est utilisé pour Créer/Attacher/Détacher des "
-"partitions.<br><ul><li>Mode Création : L'utilisateur sera capable de créer "
-"un nombre N de partitions. Le mode \"switch control\" est désactivé dans ce "
-"scenario.</li><li>Mode Édition : L'utilisateur sera capable de créer/"
-"attacher/detacher un nombre N de partitions. Dans le mode \"attach\" il y a "
-"aura une liste de tables appropriées à attacher.</li></ul>"
+msgid "The control above is used to Create/Attach/Detach partitions.<br><ul><li>Create Mode: User will be able to create N number of partitions. Mode switch control is disabled in this scenario.</li><li>Edit Mode: User will be able to create/attach/detach N number of partitions. In attach mode there will be list of suitable tables to be attached.</li></ul>"
+msgstr "Le contrôle ci-dessus est utilisé pour Créer/Attacher/Détacher des partitions.<br><ul><li>Mode Création : L'utilisateur sera capable de créer un nombre N de partitions. Le mode \"switch control\" est désactivé dans ce scenario.</li><li>Mode Édition : L'utilisateur sera capable de créer/attacher/detacher un nombre N de partitions. Dans le mode \"attach\" il y a aura une liste de tables appropriées à attacher.</li></ul>"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:948
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:209
@@ -4642,39 +4526,39 @@ msgstr "Règle supprimée"
msgid "rule"
msgstr "règle"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:93
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:99
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:105
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:111
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:117
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:92
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:98
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:104
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:110
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:116
msgid "Rule..."
msgstr "Règle..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:165
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:164
#: pgadmin/static/js/sqleditor/query_tool_notifications.js:32
#: pgadmin/static/js/sqleditor/query_tool_notifications.js:80
msgid "Event"
msgstr "Événement"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:179
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:178
msgid "Do instead?"
msgstr "Faire à la place ?"
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:182
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:183
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:184
msgid "Condition"
msgstr "Condition"
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:188
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:189
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:190
msgid "Commands"
msgstr "Commandes"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:195
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:194
msgid "System rule?"
msgstr "Règle système ?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:215
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:214
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:241
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:183
msgid "Please specify name."
@@ -4739,30 +4623,23 @@ msgstr "Le nom de partition doit être renseigné."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:371
msgid "For range partition From field cannot be empty."
-msgstr ""
-"Pour le partitionnement par intervalles, le champ \"A partir de\" doit être "
-"renseigné."
+msgstr "Pour le partitionnement par intervalles, le champ \"A partir de\" doit être renseigné."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:376
msgid "For range partition To field cannot be empty."
-msgstr ""
-"Pour le partitionnement par intervalles, le champ \"Jusqu'à doit être "
-"renseigné."
+msgstr "Pour le partitionnement par intervalles, le champ \"Jusqu'à doit être renseigné."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:383
msgid "For list partition In field cannot be empty."
-msgstr ""
-"Pou le partitionnement par liste, le champ \"Dans\" doit être renseigné."
+msgstr "Pou le partitionnement par liste, le champ \"Dans\" doit être renseigné."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:390
msgid "For hash partition Modulus field cannot be empty."
-msgstr ""
-"Pour le partitionnement par hachage, le champ 'Modulo' doit être renseigné."
+msgstr "Pour le partitionnement par hachage, le champ 'Modulo' doit être renseigné."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:395
msgid "For hash partition Remainder field cannot be empty."
-msgstr ""
-"Pour le partitionnement par hachage, le champ 'Reste' doit être renseigné."
+msgstr "Pour le partitionnement par hachage, le champ 'Reste' doit être renseigné."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:67
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:73
@@ -4812,9 +4689,7 @@ msgstr "Colonne : "
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:995
msgid "User can select any column from the list of available columns."
-msgstr ""
-"L'utilisateur peut choisir n'importe quelle colonne dans la liste des "
-"colonnes disponibles."
+msgstr "L'utilisateur peut choisir n'importe quelle colonne dans la liste des colonnes disponibles."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:997
msgid "Expression: "
@@ -4822,99 +4697,63 @@ msgstr "Expression : "
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:998
msgid "User can specify expression to create partition key."
-msgstr ""
-"L'utilisateur peux renseigner l'expression pour créer la clé de partition."
+msgstr "L'utilisateur peux renseigner l'expression pour créer la clé de partition."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1000
msgid "Example: "
msgstr "Exemple : "
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1001
-msgid ""
-"Let's say, we want to create a partition table based per year for the column "
-"'saledate', having datatype 'date/timestamp', then we need to specify the "
-"expression as 'extract(YEAR from saledate)' as partition key."
-msgstr ""
-"Dans le cas où nous voudrions créer une table de partition par année basée "
-"sur une colonne 'saledate', avec pour type de données 'date/timestamp'. Il "
-"faut alors renseigner l'expression 'extract(YEAR from saledate)' comme clé "
-"de partition."
+msgid "Let's say, we want to create a partition table based per year for the column 'saledate', having datatype 'date/timestamp', then we need to specify the expression as 'extract(YEAR from saledate)' as partition key."
+msgstr "Dans le cas où nous voudrions créer une table de partition par année basée sur une colonne 'saledate', avec pour type de données 'date/timestamp'. Il faut alors renseigner l'expression 'extract(YEAR from saledate)' comme clé de partition."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1086
msgid "Create a table: "
msgstr "Créer une table : "
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1087
-msgid ""
-"User can create multiple partitions while creating new partitioned table. "
-"Operation switch is disabled in this scenario."
-msgstr ""
-"L'utilisateur peut créer plusieurs partitions en créant une nouvelle table "
-"de partition. \"Operation switch\" est désactivé dans ce scénario."
+msgid "User can create multiple partitions while creating new partitioned table. Operation switch is disabled in this scenario."
+msgstr "L'utilisateur peut créer plusieurs partitions en créant une nouvelle table de partition. \"Operation switch\" est désactivé dans ce scénario."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1089
msgid "Edit existing table: "
msgstr "Modifier une table existante : "
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1090
-msgid ""
-"User can create/attach/detach multiple partitions. In attach operation user "
-"can select table from the list of suitable tables to be attached."
-msgstr ""
-"L'utilisateur peut créer/attacher/détacher plusieurs partitions. Dans le cas "
-"de l'attache, l'utilisateur peut sélectionner une table dans la liste de "
-"tables disponibles pour l'attache."
+msgid "User can create/attach/detach multiple partitions. In attach operation user can select table from the list of suitable tables to be attached."
+msgstr "L'utilisateur peut créer/attacher/détacher plusieurs partitions. Dans le cas de l'attache, l'utilisateur peut sélectionner une table dans la liste de tables disponibles pour l'attache."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1092
msgid "Default: "
msgstr "Par défaut : "
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1093
-msgid ""
-"The default partition can store rows that do not fall into any existing "
-"partition’s range or list."
-msgstr ""
-"La partition par défaut peut stocker des lignes qui ne font pas partie d'une "
-"plage ou liste de partitions existantes."
+msgid "The default partition can store rows that do not fall into any existing partition’s range or list."
+msgstr "La partition par défaut peut stocker des lignes qui ne font pas partie d'une plage ou liste de partitions existantes."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1095
msgid "From/To/In input: "
msgstr "Entrées De /Jusqu'à /Dans : "
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1096
-msgid ""
-"From/To/In input: Values for these fields must be quoted with single quote. "
-"For more than one partition key values must be comma(,) separated."
-msgstr ""
-"Entrées De/Jusqu'à/Dans : Les valeurs pour ces champs doivent être "
-"mentionnés entre guillemets simples. Pour définir plusieurs valeurs de clés "
-"de partitions, ces dernières doivent être listées séparées par une "
-"virgule(,)."
+msgid "From/To/In input: Values for these fields must be quoted with single quote. For more than one partition key values must be comma(,) separated."
+msgstr "Entrées De/Jusqu'à/Dans : Les valeurs pour ces champs doivent être mentionnés entre guillemets simples. Pour définir plusieurs valeurs de clés de partitions, ces dernières doivent être listées séparées par une virgule(,)."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1098
msgid "Example: From/To: "
msgstr "Exemple : De / Jusqu'à : "
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1099
-msgid ""
-"Enabled for range partition. Consider partitioned table with multiple keys "
-"of type Integer, then values should be specified like '100','200'."
-msgstr ""
-"Disponible pour les partitions par intervalles. Si la table partitionnée "
-"présente plusieurs clés de type entier, les valeurs doivent être renseignées "
-"de cette façon : '100','200'."
+msgid "Enabled for range partition. Consider partitioned table with multiple keys of type Integer, then values should be specified like '100','200'."
+msgstr "Disponible pour les partitions par intervalles. Si la table partitionnée présente plusieurs clés de type entier, les valeurs doivent être renseignées de cette façon : '100','200'."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1101
msgid "In: "
msgstr "Dans : "
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1102
-msgid ""
-"Enabled for list partition. Values must be comma(,) separated and quoted "
-"with single quote."
-msgstr ""
-"Disponible pour le partitionnement par liste. Les valeurs doivent être "
-"séparées par des virgules (,) et encadrées par des guillemets simples (')"
+msgid "Enabled for list partition. Values must be comma(,) separated and quoted with single quote."
+msgstr "Disponible pour le partitionnement par liste. Les valeurs doivent être séparées par des virgules (,) et encadrées par des guillemets simples (')"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1104
msgid "Modulus/Remainder: "
@@ -5268,56 +5107,56 @@ msgstr "Déclencheur supprimé"
msgid "Trigger"
msgstr "Déclencheur"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:56
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:62
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:68
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:74
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:90
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:61
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:67
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:73
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:89
msgid "Trigger..."
msgstr "Déclencheur..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:80
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:79
msgid "Enable trigger"
msgstr "Activer le délencheur"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:85
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:84
msgid "Disable trigger"
msgstr "Désactiver le déclencheur"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:169
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:168
msgid "Disable trigger failed"
msgstr "La désactivation du déclencheur a échoué"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:205
msgid "Row trigger?"
msgstr "Déclencheur niveau ligne ?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:247
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:246
msgid "Constraint trigger?"
msgstr "Déclencheur contrainte ?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:346
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:345
msgid "Fires"
msgstr "Déclenchement"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:481
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:480
msgid "Old table"
msgstr "Ancienne table"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:482
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:488
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:481
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:487
msgid "Transition"
msgstr "Transition"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:487
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:486
msgid "New table"
msgstr "Nouvelle table"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:536
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:535
msgid "Trigger function cannot be empty."
msgstr "La fonction trigger ne peut pas être vide."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:556
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:555
msgid "Trigger code cannot be empty."
msgstr "Le code du trigger ne peut pas être vide."
@@ -5351,9 +5190,7 @@ msgstr "Le sous-type doit être défini pour un type intervalle de valeurs."
#: pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py:954
msgid "External types require both input and output conversion functions."
-msgstr ""
-"Les types externes nécessitent des fonctions de conversion d'entrée et de "
-"sortie."
+msgstr "Les types externes nécessitent des fonctions de conversion d'entrée et de sortie."
#: pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py:1099
msgid "The specified type could not be found.\n"
@@ -5651,14 +5488,8 @@ msgid "System view?"
msgstr "Vus système ?"
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:180
-msgid ""
-"Updating the definition will drop and re-create the materialized view. It "
-"may result in loss of information about its dependent objects. Do you want "
-"to continue?"
-msgstr ""
-"La mise à jour de la définition de la vue matérialisée supprimera et "
-"recréera celle-ci. Elle peut entraîner la perte d'informations sur ses "
-"objets dépendants. Voulez-vous continuer ?"
+msgid "Updating the definition will drop and re-create the materialized view. It may result in loss of information about its dependent objects. Do you want to continue?"
+msgstr "La mise à jour de la définition de la vue matérialisée supprimera et recréera lcelle-ci. Elle peut entraîner la perte d'informations sur ses objets dépendants. Voulez-vous continuer ?"
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:192
msgid "With data?"
@@ -5706,7 +5537,7 @@ msgid "Size of temporary files"
msgstr "Taille des fichiers temporaires"
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:45
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:309
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:306
#: pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.2_plus/stats.sql:2
#: pgadmin/browser/server_groups/servers/databases/templates/databases/sql/default/stats.sql:2
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:176
@@ -5760,35 +5591,35 @@ msgstr "Déconnecter la base de donnée"
msgid "Are you sure you want to disconnect the database - %s?"
msgstr "Êtes vous sûr de vouloir déconnecter la base de donnée - %s ?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:337
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:334
#: pgadmin/static/js/browser/server_groups/servers/databases/external_tables/external_tables.js:52
#: pgadmin/tools/backup/static/js/backup.js:192
#: pgadmin/tools/import_export/static/js/import_export.js:108
msgid "Encoding"
msgstr "Encodage"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:380
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:377
msgid "Character type"
msgstr "Type caractère"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:385
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:382
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:413
msgid "Connection limit"
msgstr "Limite de connexion"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:388
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:385
msgid "Template?"
msgstr "Modèle ?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:392
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:389
msgid "Allow connections?"
msgstr "Autoriser les connexions ?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:417
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:414
msgid "Default Privileges"
msgstr "Droits par défaut"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:499
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:496
msgid "Connect to database"
msgstr "Connecter la base de donnée"
@@ -5894,8 +5725,7 @@ msgstr "Échec de la mise à jour de la tâche planifiée."
#: pgadmin/browser/server_groups/servers/pgagent/schedules/__init__.py:504
#: pgadmin/browser/server_groups/servers/pgagent/steps/__init__.py:612
msgid "-- No SQL could be generated for the selected object."
-msgstr ""
-"-- Il n'est pas possible de générer un code SQL pour l'objet sélectionné."
+msgstr "-- Il n'est pas possible de générer un code SQL pour l'objet sélectionné."
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:34
msgid "Sunday"
@@ -6444,28 +6274,8 @@ msgid "Repeat"
msgstr "Répéter"
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:359
-msgid ""
-"Schedules are specified using a <b>cron-style</b> format.<br/><ul><li>For "
-"each selected time or date element, the schedule will execute.<br/>e.g. To "
-"execute at 5 minutes past every hour, simply select ‘05’ in the Minutes list "
-"box.<br/></li><li>Values from more than one field may be specified in order "
-"to further control the schedule.<br/>e.g. To execute at 12:05 and 14:05 "
-"every Monday and Thursday, you would click minute 05, hours 12 and 14, and "
-"weekdays Monday and Thursday.</li><li>For additional flexibility, the Month "
-"Days check list includes an extra Last Day option. This matches the last day "
-"of the month, whether it happens to be the 28th, 29th, 30th or 31st.</li></"
-"ul>"
-msgstr ""
-"Les planifications sont définies selon le format <b>CRON</b>.<br/><ul><li>La "
-"planification s’exécutera pour chaque entrée de date ou d'heure.<br/>par "
-"exemple : pour exécuter toutes les heures, passées de 5 minutes, simplement "
-"choisir ‘05’ dans la liste des minutes.<br/></li><li>La définition de "
-"plusieurs champs permet d'affiner le contrôle de la planification.<br/>par "
-"exemple : pour une exécution chaque lundi et jeudi à 12h05 et 14h05, il faut "
-"choisir 05 pour les minutes , 12 et 14 pour les heures, et lundi et jeudi "
-"pour les jours de semaine.</li><li>Pour plus de flexibilité, la liste des "
-"jours du mois présente une option supplémentaire de dernier jour. Il s'agit "
-"du dernier jour du mois, qu'il s'agisse du 28 du 29 du 30 ou du 31.</li></ul>"
+msgid "Schedules are specified using a <b>cron-style</b> format.<br/><ul><li>For each selected time or date element, the schedule will execute.<br/>e.g. To execute at 5 minutes past every hour, simply select ‘05’ in the Minutes list box.<br/></li><li>Values from more than one field may be specified in order to further control the schedule.<br/>e.g. To execute at 12:05 and 14:05 every Monday and Thursday, you would click minute 05, hours 12 and 14, and weekdays Monday and Thursday.</li><li>For additional flexibility, the Month Days check list includes an extra Last Day option. This matches the last day of the month, whether it happens to be the 28th, 29th, 30th or 31st.</li></ul>"
+msgstr "Les planifications sont définies selon le format <b>CRON</b>.<br/><ul><li>La planification s’exécutera pour chaque entrée de date ou d'heure.<br/>par exemple : pour exécuter toutes les heures, passées de 5 minutes, simplement choisir ‘05’ dans la liste des minutes.<br/></li><li>La définition de plusieurs champs permet d'affiner le contrôle de la planification.<br/>par exemple : pour une exécution chaque lundi et jeudi à 12h05 et 14h05, il faut choisir 05 pour les minutes , 12 et 14 pour les heures, et lundi et jeudi pour les jours de semaine.</li><li>Pour plus de flexibilité, la liste des jours du mois présente une option supplémentaire de dernier jour. Il s'agit du dernier jour du mois, qu'il s'agisse du 28 du 29 du 30 ou du 31.</li></ul>"
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:362
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:381
@@ -6548,12 +6358,8 @@ msgid "Job class"
msgstr "Catégorie de tâche"
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:113
-msgid ""
-"Please select a class to categorize the job. This option will not affect the "
-"way the job runs."
-msgstr ""
-"Merci de choisir une catégorie pour classer la tâche. Cette option "
-"n'affectera pas la manière dont la tâche s'exécute."
+msgid "Please select a class to categorize the job. This option will not affect the way the job runs."
+msgstr "Merci de choisir une catégorie pour classer la tâche. Cette option n'affectera pas la manière dont la tâche s'exécute."
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:115
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:119
@@ -6561,13 +6367,8 @@ msgid "Host agent"
msgstr "Agent hôte"
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:117
-msgid ""
-"Enter the hostname of a machine running pgAgent if you wish to ensure only "
-"that machine will run this job. Leave blank if any host may run the job."
-msgstr ""
-"Si vous souhaitez être certain qu'une seule machine exécute cette tâche, "
-"renseigner le nom d'hôte d'une machine exécutant pgAgent. Si n'importe quel "
-"hôte peut l'exécuter, laisser vide le ."
+msgid "Enter the hostname of a machine running pgAgent if you wish to ensure only that machine will run this job. Leave blank if any host may run the job."
+msgstr "Si vous souhaitez être certain qu'une seule machine exécute cette tâche, renseigner le nom d'hôte d'une machine exécutant pgAgent. Si n'importe quel hôte peut l'exécuter, laisser vide le ."
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:123
msgid "Created"
@@ -6625,7 +6426,7 @@ msgstr "Genre"
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:139
#: pgadmin/browser/static/js/browser.js:224
#: pgadmin/dashboard/static/js/dashboard.js:191
-#: pgadmin/static/js/backform.pgadmin.js:2032
+#: pgadmin/static/js/backform.pgadmin.js:2028
msgid "SQL"
msgstr "SQL"
@@ -6644,12 +6445,8 @@ msgid "Remote"
msgstr "Distant"
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:174
-msgid ""
-"Select <b>Local</b> if the job step will execute on the local database "
-"server, or <b>Remote</b> to specify a remote database server."
-msgstr ""
-"Choisir <b>Local</b> si l'étape doit s'exécuter sur le serveur local de base "
-"de données, ou <b>Distant</b> pour renseigner un serveur de données distant."
+msgid "Select <b>Local</b> if the job step will execute on the local database server, or <b>Remote</b> to specify a remote database server."
+msgstr "Choisir <b>Local</b> si l'étape doit s'exécuter sur le serveur local de base de données, ou <b>Distant</b> pour renseigner un serveur de données distant."
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:180
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:190
@@ -6658,27 +6455,12 @@ msgstr "Chaîne de connexion"
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:188
msgid "Please select the database on which the job step will run."
-msgstr ""
-"Merci de renseigner la base de données sur laquelle s'exécutera l'étape de "
-"la tâche."
+msgstr "Merci de renseigner la base de données sur laquelle s'exécutera l'étape de la tâche."
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:193
#, python-format
-msgid ""
-"Please specify the connection string for the remote database server. Each "
-"parameter setting is in the form keyword = value. Spaces around the equal "
-"sign are optional. To write an empty value, or a value containing spaces, "
-"surround it with single quotes, e.g., keyword = 'a value'. Single quotes and "
-"backslashes within the value must be escaped with a backslash, i.e., ' and "
-"\\.<br>For more information, please see the documentation on %s"
-msgstr ""
-"Merci de renseigner la chaîne de connexion pour le serveur distant de base "
-"de données. Chaque paramètre est défini sous la forme motcle = valeur. Les "
-"espaces de part et d'autre du signe égal sont optionnels. Pour écrire une "
-"valeur vide, ou une valeur contenant des espaces, les entourer d'apostrophes "
-"simples ('). Par exemple, motcle = 'une valeur'. Les apostrophes (') et les "
-"antislash (\\) à l'intérieur d'une valeur doivent être échappés avec un "
-"antislash.<br>Pour plus d'information consulter la documentation sur %s"
+msgid "Please specify the connection string for the remote database server. Each parameter setting is in the form keyword = value. Spaces around the equal sign are optional. To write an empty value, or a value containing spaces, surround it with single quotes, e.g., keyword = 'a value'. Single quotes and backslashes within the value must be escaped with a backslash, i.e., ' and \\.<br>For more information, please see the documentation on %s"
+msgstr "Merci de renseigner la chaîne de connexion pour le serveur distant de base de données. Chaque paramètre est défini sous la forme motcle = valeur. Les espaces de part et d'autre du signe égal sont optionnels. Pour écrire une valeur vide, ou une valeur contenant des espaces, les entourer d'apostrophes simples ('). Par exemple, motcle = 'une valeur'. Les apostrophes (') et les antislash (\\) à l'intérieur d'une valeur doivent être échappés avec un antislash.<br>Pour plus d'information consulter la documentation sur %s"
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:197
msgid "On error"
@@ -6821,10 +6603,8 @@ msgid "Connection limit must be an integer value or equal to -1."
msgstr "La limite de connexion doit être un entier ou égal à -1."
#: pgadmin/browser/server_groups/servers/roles/__init__.py:172
-msgid ""
-"\n"
-"Role membership information must be passed as an array of JSON objects in "
-"the\n"
+msgid "\n"
+"Role membership information must be passed as an array of JSON objects in the\n"
"following format:\n"
"\n"
"rolmembership:[{\n"
@@ -6833,10 +6613,8 @@ msgid ""
" },\n"
" ...\n"
"]"
-msgstr ""
-"\n"
-"Les informations d'appartenance au rôle doivent être transmises en tant que "
-"tableau d'objets JSON dans le format suivant (mode création) :\n"
+msgstr "\n"
+"Les informations d'appartenance au rôle doivent être transmises en tant que tableau d'objets JSON dans le format suivant (mode création) :\n"
"\n"
"rolmembership:[{\n"
" role: [rolename],\n"
@@ -6846,10 +6624,8 @@ msgstr ""
"]"
#: pgadmin/browser/server_groups/servers/roles/__init__.py:198
-msgid ""
-"\n"
-"Role membership information must be passed as a string representing an array "
-"of\n"
+msgid "\n"
+"Role membership information must be passed as a string representing an array of\n"
"JSON objects in the following format:\n"
"rolmembership:{\n"
" 'added': [{\n"
@@ -6870,10 +6646,8 @@ msgid ""
" },\n"
" ...\n"
" ]\n"
-msgstr ""
-"\n"
-"Les informations d'appartenance au rôle doivent être transmises en tant que "
-"tableau d'objets JSON dans le format suivant (mode mise à jour) :\n"
+msgstr "\n"
+"Les informations d'appartenance au rôle doivent être transmises en tant que tableau d'objets JSON dans le format suivant (mode mise à jour) :\n"
"rolmembership:{\n"
" 'added': [{\n"
" role: [rolename],\n"
@@ -6895,8 +6669,7 @@ msgstr ""
" ]\n"
#: pgadmin/browser/server_groups/servers/roles/__init__.py:278
-msgid ""
-"\n"
+msgid "\n"
"Security Label must be passed as an array of JSON objects in the following\n"
"format:\n"
"seclabels:[{\n"
@@ -6905,10 +6678,8 @@ msgid ""
" },\n"
" ...\n"
"]"
-msgstr ""
-"\n"
-"Le label de sécurité doit être transmis en tant que tableau d'objets JSON "
-"dans le format suivant (mode création) :\n"
+msgstr "\n"
+"Le label de sécurité doit être transmis en tant que tableau d'objets JSON dans le format suivant (mode création) :\n"
"seclabels:[{\n"
" provider: <provider>,\n"
" label: <label>\n"
@@ -6917,8 +6688,7 @@ msgstr ""
"]"
#: pgadmin/browser/server_groups/servers/roles/__init__.py:296
-msgid ""
-"\n"
+msgid "\n"
"Security Label must be passed as an array of JSON objects in the following\n"
"format:\n"
"seclabels:{\n"
@@ -6940,10 +6710,8 @@ msgid ""
" },\n"
" ...\n"
" ]\n"
-msgstr ""
-"\n"
-"Le label de sécurité doit être transmis en tant que tableau d'objets JSON "
-"dans le format suivant (mode mise à jour) :\n"
+msgstr "\n"
+"Le label de sécurité doit être transmis en tant que tableau d'objets JSON dans le format suivant (mode mise à jour) :\n"
"seclabels:{\n"
" 'added': [{\n"
" provider: <provider>,\n"
@@ -6965,10 +6733,8 @@ msgstr ""
" ]\n"
#: pgadmin/browser/server_groups/servers/roles/__init__.py:359
-msgid ""
-"\n"
-"Configuration parameters/variables must be passed as an array of JSON "
-"objects\n"
+msgid "\n"
+"Configuration parameters/variables must be passed as an array of JSON objects\n"
"in the following format in create mode:\n"
"variables:[{\n"
" database: <database> or null,\n"
@@ -6977,11 +6743,9 @@ msgid ""
" },\n"
" ...\n"
"]"
-msgstr ""
+msgstr "\n"
"\n"
-"\n"
-"Les paramètre de configuration doivent être transmis en tant que tableau "
-"d'objets JSON\n"
+"Les paramètre de configuration doivent être transmis en tant que tableau d'objets JSON\n"
"dans le format suivant (mode création) :\n"
"variables:[{\n"
" database: <database> or null,\n"
@@ -6992,10 +6756,8 @@ msgstr ""
"]"
#: pgadmin/browser/server_groups/servers/roles/__init__.py:377
-msgid ""
-"\n"
-"Configuration parameters/variables must be passed as an array of JSON "
-"objects\n"
+msgid "\n"
+"Configuration parameters/variables must be passed as an array of JSON objects\n"
"in the following format in update mode:\n"
"rolmembership:{\n"
" 'added': [{\n"
@@ -7019,10 +6781,8 @@ msgid ""
" },\n"
" ...\n"
" ]\n"
-msgstr ""
-"\n"
-"Les paramètre de configuration doivent être transmis en tant que tableau "
-"d'objets JSON\n"
+msgstr "\n"
+"Les paramètre de configuration doivent être transmis en tant que tableau d'objets JSON\n"
"dans le format suivant (mode mise à jour) :\n"
"rolmembership:{\n"
" 'added': [{\n"
@@ -7061,11 +6821,9 @@ msgstr "L'utilisateur connecté n'a pas le droit de créer le rôle."
#: pgadmin/browser/server_groups/servers/roles/__init__.py:533
#: pgadmin/browser/server_groups/servers/roles/__init__.py:712
-msgid ""
-"Error retrieving the role information.\n"
+msgid "Error retrieving the role information.\n"
"{0}"
-msgstr ""
-"Erreur lors de la récupération des informations sur le rôle.\n"
+msgstr "Erreur lors de la récupération des informations sur le rôle.\n"
"{0}"
#: pgadmin/browser/server_groups/servers/roles/__init__.py:540
@@ -7075,22 +6833,18 @@ msgstr "Impossible de trouver le rôle sur le serveur de base de données."
#: pgadmin/browser/server_groups/servers/roles/__init__.py:567
#: pgadmin/browser/server_groups/servers/roles/__init__.py:677
-msgid ""
-"Error retrieving roles from the database server.\n"
+msgid "Error retrieving roles from the database server.\n"
"{0}"
-msgstr ""
-"Erreur lors de la récupération des rôles sur le serveur de données.\\\n"
+msgstr "Erreur lors de la récupération des rôles sur le serveur de données.\\\n"
"{0}"
#: pgadmin/browser/server_groups/servers/roles/__init__.py:588
#: pgadmin/browser/server_groups/servers/roles/__init__.py:623
#: pgadmin/browser/server_groups/servers/roles/__init__.py:797
#: pgadmin/browser/server_groups/servers/roles/__init__.py:845
-msgid ""
-"Error fetching role information from the database server.\n"
+msgid "Error fetching role information from the database server.\n"
"{0}"
-msgstr ""
-"Erreur lors de l'extraction des informations de rôle sur le serveur.\n"
+msgstr "Erreur lors de l'extraction des informations de rôle sur le serveur.\n"
"{0}"
#: pgadmin/browser/server_groups/servers/roles/__init__.py:641
@@ -7101,19 +6855,15 @@ msgid "Could not find the role information."
msgstr "Impossible de trouver l'information du rôle."
#: pgadmin/browser/server_groups/servers/roles/__init__.py:731
-msgid ""
-"Could not drop the role.\n"
+msgid "Could not drop the role.\n"
"{0}"
-msgstr ""
-"Impossible de supprimer le rôle.\n"
+msgstr "Impossible de supprimer le rôle.\n"
"{0}"
#: pgadmin/browser/server_groups/servers/roles/__init__.py:748
-msgid ""
-"Could not generate reversed engineered query for the role.\n"
+msgid "Could not generate reversed engineered query for the role.\n"
"{0}"
-msgstr ""
-"Impossible de générer la requête pour le rôle.\n"
+msgstr "Impossible de générer la requête pour le rôle.\n"
"{0}"
#: pgadmin/browser/server_groups/servers/roles/__init__.py:756
@@ -7122,35 +6872,27 @@ msgstr "Impossible de générer la requête pour le rôle."
#: pgadmin/browser/server_groups/servers/roles/__init__.py:776
#: pgadmin/browser/server_groups/servers/roles/__init__.py:834
-msgid ""
-"Could not create the role.\n"
+msgid "Could not create the role.\n"
"{0}"
-msgstr ""
-"Impossible de créer le rôle.\n"
+msgstr "Impossible de créer le rôle.\n"
"{0}"
#: pgadmin/browser/server_groups/servers/roles/__init__.py:786
-msgid ""
-"Could not retrieve the role information.\n"
+msgid "Could not retrieve the role information.\n"
"{0}"
-msgstr ""
-"Impossible de récupérer les informations sur le rôle.\n"
+msgstr "Impossible de récupérer les informations sur le rôle.\n"
"{0}"
#: pgadmin/browser/server_groups/servers/roles/__init__.py:1069
-msgid ""
-"Error retrieving variable information for the role.\n"
+msgid "Error retrieving variable information for the role.\n"
"{0}"
-msgstr ""
-"Erreur lors de la récupération des informations de variable sur le rôle.\n"
+msgstr "Erreur lors de la récupération des informations de variable sur le rôle.\n"
"{0}"
#: pgadmin/browser/server_groups/servers/roles/__init__.py:1102
-msgid ""
-"Error retrieving the variable options for the role.\n"
+msgid "Error retrieving the variable options for the role.\n"
"{0}"
-msgstr ""
-"Erreur lors de la récupération des options de variable sur le rôle.\n"
+msgstr "Erreur lors de la récupération des options de variable sur le rôle.\n"
"{0}"
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:39
@@ -7264,8 +7006,8 @@ msgid "At least one privilege should be selected."
msgstr "Au mois un droit doit être sélectionné."
#: pgadmin/browser/server_groups/servers/static/js/server.js:46
-msgid "Security label must be specified."
-msgstr "L'étiquette de sécurité doit être spécifiée."
+msgid "Label must be specified."
+msgstr "Label doit être renseignée."
#: pgadmin/browser/server_groups/servers/static/js/server.js:79
#: pgadmin/browser/server_groups/servers/static/js/server.js:84
@@ -7324,8 +7066,7 @@ msgstr "Recharger la configuration du serveur"
#: pgadmin/browser/server_groups/servers/static/js/server.js:316
#, python-format
msgid "Are you sure you want to reload the server configuration on %s?"
-msgstr ""
-"Êtes vous sûr de vouloir recharger la configuration du serveur sur %s ?"
+msgstr "Êtes vous sûr de vouloir recharger la configuration du serveur sur %s ?"
#: pgadmin/browser/server_groups/servers/static/js/server.js:352
msgid "Enter the name of the restore point to add"
@@ -7365,20 +7106,20 @@ msgstr "Modifier le mot de passe "
#: pgadmin/misc/file_manager/static/js/create_dialogue.js:188
#: pgadmin/misc/file_manager/static/js/select_dialogue.js:86
#: pgadmin/misc/file_manager/static/js/select_dialogue.js:129
-#: pgadmin/preferences/static/js/preferences.js:435
+#: pgadmin/preferences/static/js/preferences.js:434
#: pgadmin/static/js/slickgrid/editors.js:50
-#: pgadmin/static/js/sqleditor/filter_dialog.js:79
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:62
-#: pgadmin/tools/datagrid/static/js/show_data.js:139
+#: pgadmin/static/js/sqleditor/filter_dialog.js:78
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:61
+#: pgadmin/tools/datagrid/static/js/show_data.js:138
#: pgadmin/tools/debugger/static/js/debugger_ui.js:588
#: pgadmin/tools/debugger/static/js/debugger_ui.js:893
#: pgadmin/tools/import_export/static/js/import_export.js:495
-#: pgadmin/tools/maintenance/static/js/maintenance.js:297
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:56
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2010
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2164
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4222
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4289
+#: pgadmin/tools/maintenance/static/js/maintenance.js:296
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:55
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2004
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2158
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4216
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4283
msgid "Cancel"
msgstr "Annuler"
@@ -7392,12 +7133,8 @@ msgid "Change Password"
msgstr "Modifier le mot de passe"
#: pgadmin/browser/server_groups/servers/static/js/server.js:525
-msgid ""
-"Please make sure to disconnect the server and update the new password in the "
-"pgpass file before performing any other operation"
-msgstr ""
-"Merci de vous de déconnecter du serveur et mettre à jour le nouveau mot de "
-"passe dans le fichier pgpass avant d'effectuer toute autre opération"
+msgid "Please make sure to disconnect the server and update the new password in the pgpass file before performing any other operation"
+msgstr "Merci de vous de déconnecter du serveur et mettre à jour le nouveau mot de passe dans le fichier pgpass avant d'effectuer toute autre opération"
#: pgadmin/browser/server_groups/servers/static/js/server.js:646
msgid "Clear saved password"
@@ -7406,9 +7143,7 @@ msgstr "Supprimer le mot de passe enregistré"
#: pgadmin/browser/server_groups/servers/static/js/server.js:647
#, python-format
msgid "Are you sure you want to clear the saved password for server %s?"
-msgstr ""
-"Êtes vous sûr de vouloir supprimer le mot de passe enregistré pour le "
-"serveur %s ?"
+msgstr "Êtes vous sûr de vouloir supprimer le mot de passe enregistré pour le serveur %s ?"
#: pgadmin/browser/server_groups/servers/static/js/server.js:684
msgid "Clear SSH Tunnel password"
@@ -7416,12 +7151,8 @@ msgstr "Supprimer le mot de passe du tunnel SSH"
#: pgadmin/browser/server_groups/servers/static/js/server.js:685
#, python-format
-msgid ""
-"Are you sure you want to clear the saved password of SSH Tunnel for server "
-"%s?"
-msgstr ""
-"Êtes vous sûr de vouloir supprimer le mot de passe enregistré du tunnel SSH "
-"pour le serveur %s ?"
+msgid "Are you sure you want to clear the saved password of SSH Tunnel for server %s?"
+msgstr "Êtes vous sûr de vouloir supprimer le mot de passe enregistré du tunnel SSH pour le serveur %s ?"
#: pgadmin/browser/server_groups/servers/static/js/server.js:758
msgid "Server group"
@@ -7605,7 +7336,7 @@ msgid "Connection timeout (seconds)"
msgstr "Limite de connexion (secondes)"
#: pgadmin/browser/server_groups/servers/static/js/server.js:1130
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2192
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2186
msgid "Connect to Server"
msgstr "Se connecter au serveur"
@@ -7702,31 +7433,20 @@ msgid "Location cannot be empty."
msgstr "L'emplacement ne peut pas être vide."
#: pgadmin/browser/server_groups/servers/templates/servers/password.html:3
-msgid ""
-"Please enter the password for the user '{0}' to connect the server - \"{1}\""
-msgstr ""
-"Merci de saisir le mot de passe de l'utilisateur '{0}' pour connecter le "
-"serveur - \"{1}\""
+msgid "Please enter the password for the user '{0}' to connect the server - \"{1}\""
+msgstr "Merci de saisir le mot de passe de l'utilisateur '{0}' pour connecter le serveur - \"{1}\""
#: pgadmin/browser/server_groups/servers/templates/servers/tunnel_password.html:5
-msgid ""
-"SSH Tunnel password for the identity file '{0}' to connect the server \"{1}\""
-msgstr ""
-"Mot de passe du tunnel SSH pour le fichier d'identité '{0}' permettant de "
-"connecter le serveur \"{1}\""
+msgid "SSH Tunnel password for the identity file '{0}' to connect the server \"{1}\""
+msgstr "Mot de passe du tunnel SSH pour le fichier d'identité '{0}' permettant de connecter le serveur \"{1}\""
#: pgadmin/browser/server_groups/servers/templates/servers/tunnel_password.html:7
msgid "SSH Tunnel password for the user '{0}' to connect the server \"{1}\""
-msgstr ""
-"Mot de passe du tunnel SSH pour l'utilisateur '{0}' se connectant au serveur "
-"\"{1}\""
+msgstr "Mot de passe du tunnel SSH pour l'utilisateur '{0}' se connectant au serveur \"{1}\""
#: pgadmin/browser/server_groups/servers/templates/servers/tunnel_password.html:24
-msgid ""
-"Database server password for the user '{0}' to connect the server \"{1}\""
-msgstr ""
-"Mot de passe du serveur de données pour l'utilisateur '{0}' se connectant "
-"au serveur \"{1}\""
+msgid "Database server password for the user '{0}' to connect the server \"{1}\""
+msgstr "Mot de passe du serveur de données pour l'utilisateur '{0}' se connectant au serveur \"{1}\""
#: pgadmin/browser/server_groups/servers/templates/servers/sql/10_plus/stats.sql:5
#: pgadmin/browser/server_groups/servers/templates/servers/sql/10_plus/stats.sql:31
@@ -7863,17 +7583,15 @@ msgid "Dependents"
msgstr "Dépendants"
#: pgadmin/browser/static/js/browser.js:348
-#: pgadmin/browser/static/js/toolbar.js:30
-#: pgadmin/browser/static/js/toolbar.js:31
-#: pgadmin/browser/static/js/toolbar.js:91
+#: pgadmin/browser/static/js/toolbar.js:29
+#: pgadmin/browser/static/js/toolbar.js:88
#: pgadmin/tools/datagrid/static/js/datagrid.js:74
msgid "View Data"
msgstr "Afficher les données"
#: pgadmin/browser/static/js/browser.js:349
#: pgadmin/browser/static/js/toolbar.js:20
-#: pgadmin/browser/static/js/toolbar.js:21
-#: pgadmin/browser/static/js/toolbar.js:93
+#: pgadmin/browser/static/js/toolbar.js:90
#: pgadmin/tools/datagrid/static/js/datagrid.js:75
msgid "Filtered Rows"
msgstr "Filtrer les données"
@@ -7892,14 +7610,8 @@ msgid "Reset Master Password"
msgstr "Réinitialiser le mot de passe maître"
#: pgadmin/browser/static/js/browser.js:620
-msgid ""
-"This will remove all the saved passwords. This will also remove established "
-"connections to the server and you may need to reconnect again. Do you wish "
-"to continue ?"
-msgstr ""
-"Cela supprimera tous les mots de passe enregistrés. Cela supprimera "
-"également les connexions établies au serveur et vous aurez peut-être besoin "
-"de vous reconnecter à nouveau. Souhaitez-vous continuer ?"
+msgid "This will remove all the saved passwords. This will also remove established connections to the server and you may need to reconnect again. Do you wish to continue ?"
+msgstr "Cela supprimera tous les mots de passe enregistrés. Cela supprimera également les connexions établies au serveur et vous aurez peut-être besoin de vous reconnecter à nouveau. Souhaitez-vous continuer ?"
#: pgadmin/browser/static/js/browser.js:730
#, python-format
@@ -7963,12 +7675,8 @@ msgid "Please select at least one object to delete."
msgstr "Sélectionner au moins un objet à supprimer."
#: pgadmin/browser/static/js/collection.js:355
-msgid ""
-"Are you sure you want to drop all the selected objects and all the objects "
-"that depend on them?"
-msgstr ""
-"Êtes vous sûr de vouloir supprimer tous les objets sélectionnés ainsi que "
-"tous les objets qui en dépendent ?"
+msgid "Are you sure you want to drop all the selected objects and all the objects that depend on them?"
+msgstr "Êtes vous sûr de vouloir supprimer tous les objets sélectionnés ainsi que tous les objets qui en dépendent ?"
#: pgadmin/browser/static/js/collection.js:356
msgid "DROP CASCADE multiple objects?"
@@ -8014,11 +7722,8 @@ msgid "%s Script"
msgstr "%s Script"
#: pgadmin/browser/static/js/node.js:503
-msgid ""
-"Please wait while we fetch information about the node from the server..."
-msgstr ""
-"Merci de patienter pendant que s’effectue le parcours des informations "
-"concernant le noeud sur le serveur..."
+msgid "Please wait while we fetch information about the node from the server..."
+msgstr "Merci de patienter pendant que s’effectue le parcours des informations concernant le noeud sur le serveur..."
#: pgadmin/browser/static/js/node.js:685
#, python-format
@@ -8028,18 +7733,12 @@ msgstr "Créer - %s"
#: pgadmin/browser/static/js/node.js:701
#, python-format
msgid "Are you sure want to stop editing the properties of %s \"%s\"?"
-msgstr ""
-"Êtes vous sûr de vouloir mettre un terme à l'édition des propriétés de %s "
-"\"%s\"?"
+msgstr "Êtes vous sûr de vouloir mettre un terme à l'édition des propriétés de %s \"%s\"?"
#: pgadmin/browser/static/js/node.js:703
#, python-format
-msgid ""
-"Are you sure want to reset the current changes and re-open the panel for %s "
-"\"%s\"?"
-msgstr ""
-"Êtes vous sûr de vouloir réinitialiser les modifications en cours et rouvrir "
-"la fenêtre pour %s \"%s\"?"
+msgid "Are you sure want to reset the current changes and re-open the panel for %s \"%s\"?"
+msgstr "Êtes vous sûr de vouloir réinitialiser les modifications en cours et rouvrir la fenêtre pour %s \"%s\"?"
#: pgadmin/browser/static/js/node.js:707
msgid "Edit in progress?"
@@ -8047,12 +7746,8 @@ msgstr "Édition en cours ?"
#: pgadmin/browser/static/js/node.js:762
#, python-format
-msgid ""
-"Are you sure you want to drop %s \"%s\" and all the objects that depend on "
-"it?"
-msgstr ""
-"Êtes vous sûr de vouloir supprimer %s \"%s\" et tous les objets qui en "
-"dépendent ?"
+msgid "Are you sure you want to drop %s \"%s\" and all the objects that depend on it?"
+msgstr "Êtes vous sûr de vouloir supprimer %s \"%s\" et tous les objets qui en dépendent ?"
#: pgadmin/browser/static/js/node.js:763
#, python-format
@@ -8124,14 +7819,13 @@ msgstr "Réinitialiser les champs dans cette fenêtre de dialogue."
#: pgadmin/browser/static/js/node.js:1503
msgid "Changes will be lost. Are you sure you want to reset?"
-msgstr ""
-"Les changements seront perdus. Êtes-vous sûr de vouloir réinitialiser ?"
+msgstr "Les changements seront perdus. Êtes-vous sûr de vouloir réinitialiser ?"
#: pgadmin/browser/static/js/node.js:1513
-#: pgadmin/preferences/static/js/preferences.js:439
-#: pgadmin/preferences/static/js/preferences.js:464
+#: pgadmin/preferences/static/js/preferences.js:438
+#: pgadmin/preferences/static/js/preferences.js:463
#: pgadmin/tools/datagrid/templates/datagrid/index.html:37
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4297
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4291
msgid "Save"
msgstr "Enregistrer"
@@ -8141,9 +7835,7 @@ msgstr "Enregistrer cet objet."
#: pgadmin/browser/static/js/node.js:1642
msgid "Changes will be lost. Are you sure you want to close the dialog?"
-msgstr ""
-"Les changements seront perdus. Êtes-vous sûr de vouloir fermer la boîte de "
-"dialogue ?"
+msgstr "Les changements seront perdus. Êtes-vous sûr de vouloir fermer la boîte de dialogue ?"
#: pgadmin/browser/static/js/node.ui.js:37
msgid "Select All"
@@ -8153,20 +7845,17 @@ msgstr "Sélectionner tout"
msgid "Unselect All"
msgstr "Désélectionner tout"
-#: pgadmin/browser/static/js/toolbar.js:40
-#: pgadmin/browser/static/js/toolbar.js:41
-#: pgadmin/browser/static/js/toolbar.js:89
+#: pgadmin/browser/static/js/toolbar.js:38
+#: pgadmin/browser/static/js/toolbar.js:86
#: pgadmin/tools/datagrid/static/js/datagrid.js:103
#: pgadmin/tools/datagrid/static/js/datagrid.js:115
#: pgadmin/tools/sqleditor/__init__.py:68
msgid "Query Tool"
msgstr "Éditeur de requêtes"
-#: pgadmin/browser/static/js/wizard.js:85
#: pgadmin/browser/static/js/wizard.js:86
#: pgadmin/static/js/alertify.pgadmin.defaults.js:261
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:263
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:457
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:455
#: pgadmin/templates/security/messages.html:7
#: pgadmin/tools/user_management/static/js/user_management.js:81
#: pgadmin/tools/user_management/static/js/user_management.js:174
@@ -8174,11 +7863,9 @@ msgstr "Éditeur de requêtes"
msgid "Close"
msgstr "Fermer"
-#: pgadmin/browser/static/js/wizard.js:88
#: pgadmin/browser/static/js/wizard.js:89
#: pgadmin/static/js/alertify.pgadmin.defaults.js:262
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:264
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:458
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:456
msgid "Maximize"
msgstr "Maximiser"
@@ -8186,22 +7873,6 @@ msgstr "Maximiser"
msgid "Left panel logo"
msgstr "Emplacement logo gauche"
-#: pgadmin/browser/static/js/wizard.js:124
-msgid "Close error bar"
-msgstr "Fermer la barre d'erreur"
-
-#: pgadmin/browser/static/js/wizard.js:131
-#: pgadmin/browser/templates/browser/index.html:135 pgadmin/help/__init__.py:59
-#: pgadmin/help/__init__.py:70 pgadmin/preferences/static/js/preferences.js:427
-#: pgadmin/static/js/sqleditor/filter_dialog.js:72
-#: pgadmin/static/js/sqleditor/filter_dialog.js:73
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:56
-#: pgadmin/tools/datagrid/static/js/show_data.js:133
-#: pgadmin/tools/maintenance/static/js/maintenance.js:289
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:50
-msgid "Help"
-msgstr "Aide"
-
#: pgadmin/browser/static/js/wizard.js:139
#: pgadmin/misc/file_manager/templates/file_manager/index.html:15
msgid "Back"
@@ -8239,25 +7910,22 @@ msgstr "Gestion"
msgid "Tools"
msgstr "Outils"
+#: pgadmin/browser/templates/browser/index.html:135 pgadmin/help/__init__.py:59
+#: pgadmin/help/__init__.py:70 pgadmin/static/js/sqleditor/filter_dialog.js:72
+msgid "Help"
+msgstr "Aide"
+
#: pgadmin/browser/templates/browser/index.html:157
msgid "Logout"
msgstr "Déconnexion"
#: pgadmin/browser/templates/browser/upgrade.html:1
-msgid ""
-"You are currently running version {0} of {1}, however the current version is "
-"{2}."
-msgstr ""
-"Vous utilisez actuellement la version {0} de {1}, mais la version actuelle "
-"est {2}."
+msgid "You are currently running version {0} of {1}, however the current version is {2}."
+msgstr "Vous utilisez actuellement la version {0} de {1}, mais la version actuelle est {2}."
#: pgadmin/browser/templates/browser/upgrade.html:3
-msgid ""
-"Please click <a class=\"alert-link\" href=\"{0}\" target=\"_new\">here</a> "
-"for more information."
-msgstr ""
-"Cliquer sur <a class=\"alert-link\" href=\"{0}\" target=\"_new\">here</a> "
-"pour plus d'information."
+msgid "Please click <a class=\"alert-link\" href=\"{0}\" target=\"_new\">here</a> for more information."
+msgstr "Cliquer sur <a class=\"alert-link\" href=\"{0}\" target=\"_new\">here</a> pour plus d'information."
#: pgadmin/dashboard/__init__.py:56
msgid "Dashboard"
@@ -8305,8 +7973,7 @@ msgstr "Afficher les graphiques ?"
#: pgadmin/dashboard/__init__.py:121
msgid "If set to True, graphs will be displayed on dashboards."
-msgstr ""
-"Si défini à Vrai, les graphiques sont affichés dans le tableau de bord."
+msgstr "Si défini à Vrai, les graphiques sont affichés dans le tableau de bord."
#: pgadmin/dashboard/__init__.py:127
msgid "Show activity?"
@@ -8314,9 +7981,7 @@ msgstr "Afficher l'activité ?"
#: pgadmin/dashboard/__init__.py:129
msgid "If set to True, activity tables will be displayed on dashboards."
-msgstr ""
-"Si défini à Vrai, les informations d'activités sont affichées dans le "
-"tableau de bord."
+msgstr "Si défini à Vrai, les informations d'activités sont affichées dans le tableau de bord."
#: pgadmin/dashboard/__init__.py:135
msgid "Show graph data points?"
@@ -8331,12 +7996,8 @@ msgid "Show mouse hover tooltip?"
msgstr "Afficher l'infobulle au survol de la souris ?"
#: pgadmin/dashboard/__init__.py:145
-msgid ""
-"If set to True, tooltip will appear on mouse hover on the graph lines giving "
-"the data point details"
-msgstr ""
-"Si défini à Vrai, une infobulle s'affiche lors du survol des points de "
-"données du graphiques et affiche les valeurs"
+msgid "If set to True, tooltip will appear on mouse hover on the graph lines giving the data point details"
+msgstr "Si défini à Vrai, une infobulle s'affiche lors du survol des points de données du graphiques et affiche les valeurs"
#: pgadmin/dashboard/__init__.py:202 pgadmin/dashboard/__init__.py:232
#: pgadmin/dashboard/static/js/dashboard.js:736
@@ -8346,19 +8007,15 @@ msgstr "Merci de connecter le serveur sélectionné pour visualiser la table."
#: pgadmin/dashboard/__init__.py:207 pgadmin/dashboard/__init__.py:237
#: pgadmin/dashboard/static/js/dashboard.js:601
msgid "Please connect to the selected server to view the graph."
-msgstr ""
-"Merci de connecter le serveur sélectionné pour visualiser le graphique."
+msgstr "Merci de connecter le serveur sélectionné pour visualiser le graphique."
#: pgadmin/dashboard/__init__.py:217
msgid "Please connect to the selected database to view the table."
-msgstr ""
-"Merci de connecter la base de données sélectionnée pour visualiser la table."
+msgstr "Merci de connecter la base de données sélectionnée pour visualiser la table."
#: pgadmin/dashboard/__init__.py:222
msgid "Please connect to the selected database to view the graph."
-msgstr ""
-"Merci de connecter la base de données sélectionnée pour visualiser le "
-"graphqiue."
+msgstr "Merci de connecter la base de données sélectionnée pour visualiser le graphqiue."
#: pgadmin/dashboard/__init__.py:464 pgadmin/dashboard/__init__.py:491
msgid "Failed"
@@ -8444,8 +8101,7 @@ msgstr "Chargement du tableau de bord..."
#: pgadmin/dashboard/static/js/dashboard.js:405
msgid "Please connect to the selected server to view the dashboard."
-msgstr ""
-"Merci de connecter le serveur sélectionné pour visualiser le tableau de bord."
+msgstr "Merci de connecter le serveur sélectionné pour visualiser le tableau de bord."
#: pgadmin/dashboard/static/js/dashboard.js:604
msgid "An error occurred whilst rendering the graph."
@@ -8642,7 +8298,7 @@ msgstr "Recherche"
#: pgadmin/dashboard/templates/dashboard/database_dashboard.html:88
#: pgadmin/dashboard/templates/dashboard/server_dashboard.html:92
#: pgadmin/misc/file_manager/templates/file_manager/index.html:27
-#: pgadmin/preferences/static/js/preferences.js:492
+#: pgadmin/preferences/static/js/preferences.js:491
msgid "Refresh"
msgstr "Réactualiser"
@@ -8676,18 +8332,8 @@ msgid "Open Source"
msgstr "Open Source"
#: pgadmin/dashboard/templates/dashboard/welcome_dashboard.html:69
-msgid ""
-"pgAdmin is an Open Source administration and management tool for the "
-"PostgreSQL database. It includes a graphical administration interface, an "
-"SQL query tool, a procedural code debugger and much more. The tool is "
-"designed to answer the needs of developers, DBAs and system administrators "
-"alike."
-msgstr ""
-"pgAdmin est un outil Open Source d’administration et de gestion de bases de "
-"données PostgreSQL. Il présente une interface graphique d’administration, un "
-"éditeur de requêtes SQL, un debugger de code et bien d'autres choses. "
-"L'outil est conçu aussi bien pour répondre aux attentes des développeurs que "
-"des administrateurs de bases de données."
+msgid "pgAdmin is an Open Source administration and management tool for the PostgreSQL database. It includes a graphical administration interface, an SQL query tool, a procedural code debugger and much more. The tool is designed to answer the needs of developers, DBAs and system administrators alike."
+msgstr "pgAdmin est un outil Open Source d’administration et de gestion de bases de données PostgreSQL. Il présente une interface graphique d’administration, un éditeur de requêtes SQL, un debugger de code et bien d'autres choses. L'outil est conçu aussi bien pour répondre aux attentes des développeurs que des administrateurs de bases de données."
#: pgadmin/dashboard/templates/dashboard/welcome_dashboard.html:78
msgid "Quick Links"
@@ -8811,24 +8457,16 @@ msgid "PostgreSQL Help Path"
msgstr "Chemin aide PostgreSQL"
#: pgadmin/help/__init__.py:60
-msgid ""
-"Path to the PostgreSQL documentation. $VERSION$ will be replaced with the "
-"major.minor version number."
-msgstr ""
-"Chemin vers la documentation PostgreSQL. $VERSION$ sera remplacé remplacé "
-"par l’indication au format majeur.mineur."
+msgid "Path to the PostgreSQL documentation. $VERSION$ will be replaced with the major.minor version number."
+msgstr "Chemin vers la documentation PostgreSQL. $VERSION$ sera remplacé remplacé par l’indication au format majeur.mineur."
#: pgadmin/help/__init__.py:68
msgid "EDB Advanced Server Help Path"
msgstr "Chemin aide EDB Advanced Server"
#: pgadmin/help/__init__.py:71
-msgid ""
-"Path to the EDB Advanced Server documentation. $VERSION$ will be replaced "
-"with the major.minor version number."
-msgstr ""
-"Chemin vers la documentation EDB Advanced Server. $VERSION$ sera remplacé "
-"remplacé par la valeur au format majeur.mineur."
+msgid "Path to the EDB Advanced Server documentation. $VERSION$ will be replaced with the major.minor version number."
+msgstr "Chemin vers la documentation EDB Advanced Server. $VERSION$ sera remplacé remplacé par la valeur au format majeur.mineur."
#: pgadmin/misc/__init__.py:25 pgadmin/tools/backup/static/js/backup.js:76
#: pgadmin/tools/backup/static/js/backup.js:83
@@ -8860,11 +8498,8 @@ msgid "Themes"
msgstr "Thèmes"
#: pgadmin/misc/__init__.py:88
-msgid ""
-"A refresh is required to apply the theme. Below is the preview of the theme"
-msgstr ""
-"Une actualisation est nécessaire pour appliquer le thème. Ci-dessous un "
-"aperçu du thème"
+msgid "A refresh is required to apply the theme. Below is the preview of the theme"
+msgstr "Une actualisation est nécessaire pour appliquer le thème. Ci-dessous un aperçu du thème"
#: pgadmin/misc/bgprocess/processes.py:86
#: pgadmin/misc/bgprocess/processes.py:649
@@ -8924,9 +8559,7 @@ msgstr "Temps d'exécution"
#: pgadmin/misc/dependencies/static/js/dependencies.js:136
msgid "No dependency information is available for the selected object."
-msgstr ""
-"Aucune information relative à des objets rattachés n'est disponible pour "
-"l'objet sélectionné."
+msgstr "Aucune information relative à des objets rattachés n'est disponible pour l'objet sélectionné."
#: pgadmin/misc/dependencies/static/js/dependencies.js:145
#: pgadmin/misc/dependents/static/js/dependents.js:150
@@ -8945,9 +8578,7 @@ msgstr "Erreur lors de la récupération des données sur le serveur : %s"
#: pgadmin/misc/dependents/static/js/dependents.js:137
msgid "No dependent information is available for the selected object."
-msgstr ""
-"Aucune information relative à des objets dépendants n'est disponible pour "
-"l'objet sélectionné."
+msgstr "Aucune information relative à des objets dépendants n'est disponible pour l'objet sélectionné."
#: pgadmin/misc/dependents/static/js/dependents.js:168
msgid "Fetching dependent information from the server..."
@@ -9018,8 +8649,7 @@ msgstr "Une erreur est survenue lors du renommage du fichier :"
#: pgadmin/misc/file_manager/static/js/create_dialogue.js:139
#: pgadmin/misc/file_manager/static/js/utility.js:429
msgid "Error occurred while checking access permission."
-msgstr ""
-"Une erreur est survenue lors de la vérification des permissions d'accès."
+msgstr "Une erreur est survenue lors de la vérification des permissions d'accès."
#: pgadmin/misc/file_manager/static/js/select_dialogue.js:90
#: pgadmin/misc/file_manager/static/js/select_dialogue.js:115
@@ -9117,6 +8747,7 @@ msgid "Rows X"
msgstr "Lignes X"
#: pgadmin/misc/static/explain/js/explain.js:159
+#, fuzzy
msgid "Actual"
msgstr "Actuel"
@@ -9175,33 +8806,13 @@ msgstr "Graphique"
msgid "Analysis"
msgstr "Analyse"
-#: pgadmin/misc/static/explain/js/explain.js:1286
-#: pgadmin/misc/static/explain/js/explain.js:1287
-msgid "Zoom in"
-msgstr "Zoomer"
-
-#: pgadmin/misc/static/explain/js/explain.js:1295
-#: pgadmin/misc/static/explain/js/explain.js:1296
-msgid "Zoom to original"
-msgstr "Zoom initial"
-
-#: pgadmin/misc/static/explain/js/explain.js:1304
-#: pgadmin/misc/static/explain/js/explain.js:1305
-msgid "Zoom out"
-msgstr "Dézoomer"
-
-#: pgadmin/misc/static/explain/js/explain.js:1319
-#: pgadmin/misc/static/explain/js/explain.js:1320
-msgid "Download"
-msgstr "Télécharger"
-
#: pgadmin/misc/statistics/static/js/statistics.js:214
msgid "No statistics are available for the selected object."
msgstr "Aucune statistique n'est disponible pour l'objet sélectionné."
#: pgadmin/preferences/__init__.py:55
#: pgadmin/preferences/static/js/preferences.js:426
-#: pgadmin/preferences/static/js/preferences.js:449
+#: pgadmin/preferences/static/js/preferences.js:448
msgid "Preferences"
msgstr "Préférences"
@@ -9226,19 +8837,15 @@ msgstr "Cacher"
msgid "Category is not selected."
msgstr "La catégorie n'est pas sélectionnée."
-#: pgadmin/preferences/static/js/preferences.js:483
+#: pgadmin/preferences/static/js/preferences.js:482
msgid "Refresh required"
msgstr "Actualisation nécessaire"
-#: pgadmin/preferences/static/js/preferences.js:484
-msgid ""
-"A page refresh is required to apply the theme. Do you wish to refresh the "
-"page now?"
-msgstr ""
-"Une actualisation de la page est nécessaire pour appliquer le thème. "
-"Souhaitez-vous actualiser la page maintenant ?"
+#: pgadmin/preferences/static/js/preferences.js:483
+msgid "A page refresh is required to apply the theme. Do you wish to refresh the page now?"
+msgstr "Une actualisation de la page est nécessaire pour appliquer le thème. Souhaitez-vous actualiser la page maintenant ?"
-#: pgadmin/preferences/static/js/preferences.js:493
+#: pgadmin/preferences/static/js/preferences.js:492
#, fuzzy
msgid "Later"
msgstr "Plus tard"
@@ -9261,13 +8868,8 @@ msgid "Reset layout"
msgstr "Réinitialiser affichage"
#: pgadmin/settings/static/js/settings.js:36
-msgid ""
-"Are you sure you want to reset the current layout? This will cause the "
-"application to reload and any un-saved data will be lost."
-msgstr ""
-"Êtes vous sûr de vouloir réinitialiser l'affichage ? Ceci va conduire au "
-"rechargement de toute l'application et toute donnée qui na pas été "
-"enregistrée sera perdue."
+msgid "Are you sure you want to reset the current layout? This will cause the application to reload and any un-saved data will be lost."
+msgstr "Êtes vous sûr de vouloir réinitialiser l'affichage ? Ceci va conduire au rechargement de toute l'application et toute donnée qui na pas été enregistrée sera perdue."
#: pgadmin/static/js/alertify.pgadmin.defaults.js:103
msgid "Connection Lost"
@@ -9286,37 +8888,33 @@ msgstr "Erreur Inconnue"
msgid "INTERNAL SERVER ERROR"
msgstr "ERREUR INTERNE DU SERVEUR"
-#: pgadmin/static/js/backform.pgadmin.js:1550
-msgid "Add"
-msgstr "Ajouter"
-
-#: pgadmin/static/js/backform.pgadmin.js:1841
+#: pgadmin/static/js/backform.pgadmin.js:1837
msgid "No updates."
msgstr "Pas de mise à jour."
-#: pgadmin/static/js/backform.pgadmin.js:1956
+#: pgadmin/static/js/backform.pgadmin.js:1952
msgid "General"
msgstr "General"
-#: pgadmin/static/js/backform.pgadmin.js:2157
+#: pgadmin/static/js/backform.pgadmin.js:2153
msgid "Preview not available..."
msgstr "Aperçu non disponible..."
-#: pgadmin/static/js/backform.pgadmin.js:2618
+#: pgadmin/static/js/backform.pgadmin.js:2605
#: pgadmin/tools/backup/static/js/backup.js:95
#: pgadmin/tools/backup/static/js/backup.js:230
msgid "Note"
msgstr "Note"
-#: pgadmin/static/js/backform.pgadmin.js:2974
+#: pgadmin/static/js/backform.pgadmin.js:2961
msgid "More"
msgstr "Plus"
-#: pgadmin/static/js/backform.pgadmin.js:2975
+#: pgadmin/static/js/backform.pgadmin.js:2962
msgid "Less"
msgstr "Moins"
-#: pgadmin/static/js/backform.pgadmin.js:3059
+#: pgadmin/static/js/backform.pgadmin.js:3046
msgid "Space"
msgstr "Espace"
@@ -9345,7 +8943,7 @@ msgstr "Fichier objet ne peut pas être supprimé."
msgid "Delete row"
msgstr "Supprimer la ligne"
-#: pgadmin/static/js/backgrid.pgadmin.js:1098
+#: pgadmin/static/js/backgrid.pgadmin.js:1091
msgid "Array Values"
msgstr "Tableau de valeurs"
@@ -9354,11 +8952,8 @@ msgid "Alt"
msgstr "Alt"
#: pgadmin/static/js/sqleditor_utils.js:153
-msgid ""
-"An unexpected error occurred - ensure you are logged into the application."
-msgstr ""
-"Une erreur inattendue s'est produite - vérifiez que vous êtes bien connecté "
-"à l'application."
+msgid "An unexpected error occurred - ensure you are logged into the application."
+msgstr "Une erreur inattendue s'est produite - vérifiez que vous êtes bien connecté à l'application."
#: pgadmin/static/js/sqleditor_utils.js:165
#: pgadmin/tools/sqleditor/__init__.py:1381
@@ -9369,35 +8964,24 @@ msgstr "Échec de vérification du statut de transaction."
#: pgadmin/static/js/alertify/dialog.js:59
#: pgadmin/static/js/alertify/dialog.js:143
-msgid ""
-"Databases with = symbols in the name cannot be backed up or restored using "
-"this utility."
-msgstr ""
-"Les bases de données avec un symbole = dans leur nom ne peuvent pas être "
-"sauvegardée ou restaurée avec cet utilitaire."
+msgid "Databases with = symbols in the name cannot be backed up or restored using this utility."
+msgstr "Les bases de données avec un symbole = dans leur nom ne peuvent pas être sauvegardée ou restaurée avec cet utilitaire."
#: pgadmin/static/js/alertify/dialog.js:76
msgid "Please select server or child node from the browser tree."
-msgstr ""
-"Merci de sélectionner un serveur ou un éléments sous_jacent dans "
-"l'arborescence."
+msgstr "Merci de sélectionner un serveur ou un éléments sous_jacent dans l'arborescence."
#: pgadmin/static/js/alertify/dialog.js:86
#: pgadmin/tools/import_export/static/js/import_export.js:447
#: pgadmin/tools/maintenance/static/js/maintenance.js:221
msgid "Please configure the PostgreSQL Binary Path in the Preferences dialog."
-msgstr ""
-"Merci de configurer le chemin des binaires PostgreSQL dans les préférences."
+msgstr "Merci de configurer le chemin des binaires PostgreSQL dans les préférences."
#: pgadmin/static/js/alertify/dialog.js:91
#: pgadmin/tools/import_export/static/js/import_export.js:452
#: pgadmin/tools/maintenance/static/js/maintenance.js:226
-msgid ""
-"Please configure the EDB Advanced Server Binary Path in the Preferences "
-"dialog."
-msgstr ""
-"Merci de configurer le chemin des binaires EDB Advanced Server dans les "
-"préférences."
+msgid "Please configure the EDB Advanced Server Binary Path in the Preferences dialog."
+msgstr "Merci de configurer le chemin des binaires EDB Advanced Server dans les préférences."
#: pgadmin/static/js/alertify/dialog.js:97
#: pgadmin/tools/import_export/static/js/import_export.js:459
@@ -9507,13 +9091,13 @@ msgstr "Requête exécutée avec succès en %s."
msgid "Sort/Filter options"
msgstr "Options de Filtre/Tri"
-#: pgadmin/static/js/sqleditor/filter_dialog.js:239
+#: pgadmin/static/js/sqleditor/filter_dialog.js:238
msgid "Filter updated successfully"
msgstr "Filtre mis à jour avec succès"
-#: pgadmin/static/js/sqleditor/filter_dialog.js:245
-#: pgadmin/tools/datagrid/static/js/show_data.js:238
-#: pgadmin/tools/datagrid/static/js/show_data.js:245
+#: pgadmin/static/js/sqleditor/filter_dialog.js:244
+#: pgadmin/tools/datagrid/static/js/show_data.js:237
+#: pgadmin/tools/datagrid/static/js/show_data.js:244
msgid "Validation Error"
msgstr "Erreur de validation"
@@ -9590,11 +9174,10 @@ msgstr "Ouvrir fichier"
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:35
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:36
msgid "Save File"
-msgstr "Enregistrer le fichier"
+msgstr "Enregistrer fichier"
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:40
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:41
-#: pgadmin/tools/datagrid/templates/datagrid/index.html:56
#: pgadmin/tools/datagrid/templates/datagrid/index.html:68
msgid "Find"
msgstr "Recherche unitaire"
@@ -9614,20 +9197,21 @@ msgstr "Coller"
msgid "Delete"
msgstr "Supprimer"
+# Filtre ou filtrer
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:60
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:61
msgid "Filter"
-msgstr "Filtrer"
+msgstr "Filtre"
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:65
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:66
msgid "Filter options"
-msgstr "Options de filtre"
+msgstr "Options des filtres"
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:70
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:71
msgid "Rows limit"
-msgstr "Nombre de lignes max"
+msgstr "Limite nombre de lignes"
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:75
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:76
@@ -9642,7 +9226,7 @@ msgstr "Annuler la requête"
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:85
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:86
msgid "Clear"
-msgstr "Effacer"
+msgstr "Éffacer"
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:99
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:101
@@ -9669,7 +9253,7 @@ msgstr "EXPLAIN ANALYSE"
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:117
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:119
msgid "Download as CSV"
-msgstr "Télécharger au format CSV"
+msgstr "Télécharger CSV"
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:123
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:125
@@ -9678,14 +9262,14 @@ msgstr "Enregistrer les modifications de données"
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:129
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:131
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4230
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4224
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:663
msgid "Commit"
msgstr "COMMIT"
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:135
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:137
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4227
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4221
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:681
msgid "Rollback"
msgstr "Rollback"
@@ -9696,8 +9280,7 @@ msgstr "Copier dans l'éditeur de requête"
#: pgadmin/static/js/tree/pgadmin_tree_save_state.js:89
msgid "Error resetting the tree saved state.\""
-msgstr ""
-"Erreur lors de la réinitialisation de l'état de l'arborescence enregistré.\""
+msgstr "Erreur lors de la réinitialisation de l'état de l'arborescence enregistré.\""
#: pgadmin/static/js/tree/pgadmin_tree_save_state.js:121
msgid "Error saving the tree state.\""
@@ -9728,11 +9311,8 @@ msgid "Recover Password"
msgstr "Récupérer le mot de passe"
#: pgadmin/templates/security/forgot_password.html:10
-msgid ""
-"Enter the email address for the user account you wish to recover the "
-"password for:"
-msgstr ""
-"Saisir l'adresse de courriel correspondant au mot de passe à récupérer :"
+msgid "Enter the email address for the user account you wish to recover the password for:"
+msgstr "Saisir l'adresse de courriel correspondant au mot de passe à récupérer :"
#: pgadmin/templates/security/login_user.html:4
#: pgadmin/templates/security/login_user.html:7
@@ -9763,7 +9343,7 @@ msgstr "Cette URL ne peut pas être appelée directement."
#: pgadmin/tools/backup/__init__.py:43
#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:46
#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:55
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:67
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:66
msgid "Backup"
msgstr "Sauvegarde"
@@ -9785,8 +9365,7 @@ msgstr "Sauvegarde inconnue"
#: pgadmin/tools/backup/__init__.py:149
msgid "Backing up an object on the server '{0}' from database '{1}'"
-msgstr ""
-"Sauvegarde un objet sur le serveur '{0}' depuis la base de données '{1}'"
+msgstr "Sauvegarde un objet sur le serveur '{0}' depuis la base de données '{1}'"
#: pgadmin/tools/backup/__init__.py:159
msgid "Backing up the global objects on the server '{0}'"
@@ -9798,8 +9377,7 @@ msgstr "Sauvegarde du serveur '{0}'"
#: pgadmin/tools/backup/__init__.py:181
msgid "Backing up an object on the server '{0}' from database '{1}'..."
-msgstr ""
-"Sauvegarder un objet sur le serveur '{0}' depuis la base de données '{1}'..."
+msgstr "Sauvegarder un objet sur le serveur '{0}' depuis la base de données '{1}'..."
#: pgadmin/tools/backup/__init__.py:192
msgid "Backing up the global objects on the server '{0}'..."
@@ -9851,15 +9429,11 @@ msgstr "Messages verbeux"
#: pgadmin/tools/backup/static/js/backup.js:86
#: pgadmin/tools/backup/static/js/backup.js:536
msgid "Force double quote on identifiers"
-msgstr ""
-"Forcer les guillemets doubles des identifiants ( --quote-all-identifiers )"
+msgstr "Forcer les guillemets doubles des identifiants ( --quote-all-identifiers )"
#: pgadmin/tools/backup/static/js/backup.js:96
-msgid ""
-"Only objects global to the entire database will be backed up, in PLAIN format"
-msgstr ""
-"Seuls les objets globaux (rôles, tablespaces...) de la base de données "
-"seront sauvegardé au format PLAIN (--globals-only)"
+msgid "Only objects global to the entire database will be backed up, in PLAIN format"
+msgstr "Seuls les objets globaux (rôles, tablespaces...) de la base de données seront sauvegardé au format PLAIN (--globals-only)"
#: pgadmin/tools/backup/static/js/backup.js:143
#: pgadmin/tools/import_export/static/js/import_export.js:87
@@ -10047,8 +9621,8 @@ msgstr "Sauvegarder..."
#: pgadmin/tools/backup/static/js/backup_dialog.js:71
#: pgadmin/tools/import_export/static/js/import_export.js:685
#: pgadmin/tools/import_export/static/js/import_export.js:699
-#: pgadmin/tools/maintenance/static/js/maintenance.js:477
-#: pgadmin/tools/maintenance/static/js/maintenance.js:488
+#: pgadmin/tools/maintenance/static/js/maintenance.js:476
+#: pgadmin/tools/maintenance/static/js/maintenance.js:487
#: pgadmin/tools/restore/static/js/restore_dialog.js:51
#: pgadmin/tools/restore/static/js/restore_dialog.js:75
msgid "Utility not found"
@@ -10056,25 +9630,25 @@ msgstr "Utilitaire non trouvé"
#: pgadmin/tools/backup/static/js/backup_dialog.js:72
#: pgadmin/tools/import_export/static/js/import_export.js:700
-#: pgadmin/tools/maintenance/static/js/maintenance.js:489
+#: pgadmin/tools/maintenance/static/js/maintenance.js:488
#: pgadmin/tools/restore/static/js/restore_dialog.js:76
msgid "Failed to fetch Utility information"
msgstr "Impossible d'extraire les informations sur l'utilitaire"
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:159
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:158
msgid "Backup job created."
msgstr "Tâche de sauvegarde créée."
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:163
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:162
msgid "Backup job creation failed."
msgstr "Échec de la création de la tâche de restauration."
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:171
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:170
msgid "Backup job failed."
msgstr "Tâche de sauvegarde échouée."
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:242
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:229
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:241
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:228
msgid "Please provide a filename"
msgstr "Merci de renseigner un nom de fichier"
@@ -10123,7 +9697,7 @@ msgstr "Aucun objet n'est sélectionné."
msgid "Data Filter"
msgstr "Filtre de données"
-#: pgadmin/tools/datagrid/static/js/show_data.js:161
+#: pgadmin/tools/datagrid/static/js/show_data.js:160
msgid "Use SHIFT + ENTER to apply filter..."
msgstr "Utiliser SHIFT + ENTRÉE pour appliquer le filtre..."
@@ -10302,6 +9876,7 @@ msgid "Timing"
msgstr "Chronométrage"
#: pgadmin/tools/datagrid/templates/datagrid/index.html:311
+#, fuzzy
msgid "Summary"
msgstr "Synthèse"
@@ -10330,9 +9905,7 @@ msgstr "Ouvrir dans un nouvel onglet du navigateur"
#: pgadmin/tools/debugger/__init__.py:76
msgid "If set to True, the Debugger will be opened in a new browser tab."
-msgstr ""
-"Si défini à Vrai, le debugger s'ouvrira dans une nouvelle fenêtre du "
-"navigateur."
+msgstr "Si défini à Vrai, le debugger s'ouvrira dans une nouvelle fenêtre du navigateur."
#: pgadmin/tools/debugger/__init__.py:82
msgid "Accesskey (Continue/Start)"
@@ -10372,7 +9945,8 @@ msgstr "Précédent"
msgid "Next tab"
msgstr "Suivant"
-# switch utilisé comme verbe ou comme substantif ?soit Cahnger le panneau soit panneau de commande
+# switch utilisé comme verbe ou comme substantif ?soit Cahnger le panneau soit
+# panneau de commande
#: pgadmin/tools/debugger/__init__.py:215
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:449
#, fuzzy
@@ -10385,23 +9959,15 @@ msgstr "n'est pas défini dans le corps du paquet."
#: pgadmin/tools/debugger/__init__.py:413
msgid "Functions with a colon in the name cannot be debugged."
-msgstr ""
-"Les fonctions avec deux points (:) dans le noms ne peuvent pas être "
-"analysées par le debugger."
+msgstr "Les fonctions avec deux points (:) dans le noms ne peuvent pas être analysées par le debugger."
#: pgadmin/tools/debugger/__init__.py:418
msgid "EDB Advanced Server wrapped functions cannot be debugged."
-msgstr ""
-"Les fonctions embarquées de EDB Advanced Server ne peuvent pas être "
-"analysées par le debugger."
+msgstr "Les fonctions embarquées de EDB Advanced Server ne peuvent pas être analysées par le debugger."
#: pgadmin/tools/debugger/__init__.py:425
-msgid ""
-"An 'edbspl' target with a variadic argument is not supported and cannot be "
-"debugged."
-msgstr ""
-"Une cible 'edbspl' avec un argument VARIADIC n'est pas supporté et ne peut "
-"pas être analysée par le debugger."
+msgid "An 'edbspl' target with a variadic argument is not supported and cannot be debugged."
+msgstr "Une cible 'edbspl' avec un argument VARIADIC n'est pas supporté et ne peut pas être analysée par le debugger."
#: pgadmin/tools/debugger/__init__.py:438
#: pgadmin/tools/debugger/__init__.py:452
@@ -10409,45 +9975,28 @@ msgid "Failed to find the pldbgapi extension in this database."
msgstr "Impossible de trouver l'extension pldbgapi dans la base de données."
#: pgadmin/tools/debugger/__init__.py:459
-msgid ""
-"The debugger plugin is not enabled. Please create the pldbgapi extension in "
-"this database."
-msgstr ""
-"Le module de débogage n'est pas disponible. Merci de créer l'extension "
-"pldbgapi dans la base de données."
+msgid "The debugger plugin is not enabled. Please create the pldbgapi extension in this database."
+msgstr "Le module de débogage n'est pas disponible. Merci de créer l'extension pldbgapi dans la base de données."
#: pgadmin/tools/debugger/__init__.py:466
msgid "The function/procedure cannot be debugged"
msgstr "La fonction / procédure ne peut pas être analysée par le debugger"
#: pgadmin/tools/debugger/__init__.py:661
-msgid ""
-"You must be a superuser to set a global breakpoint and perform indirect "
-"debugging."
-msgstr ""
-"Il faut être administrateur pour définir un point d'arrêt global et réaliser "
-"un débogage indirect."
+msgid "You must be a superuser to set a global breakpoint and perform indirect debugging."
+msgstr "Il faut être administrateur pour définir un point d'arrêt global et réaliser un débogage indirect."
#: pgadmin/tools/debugger/__init__.py:670
msgid "Could not fetch debugger plugin information."
-msgstr ""
-"Impossible de de trouver les informations concernant le plugin de débogage."
+msgstr "Impossible de de trouver les informations concernant le plugin de débogage."
#: pgadmin/tools/debugger/__init__.py:676
-msgid ""
-"The debugger plugin is not enabled. Please add the plugin to the "
-"shared_preload_libraries setting in the postgresql.conf file and restart the "
-"database server for indirect debugging."
-msgstr ""
-"L'extension de débogage n'est pas disponible. Merci d'ajouter l'extension au "
-"paramètre shared_preload_libraries dans le fichier postgresql.conf suivi "
-"d'un redémarrage du cluster de données pour effectuer un débogage indirect."
+msgid "The debugger plugin is not enabled. Please add the plugin to the shared_preload_libraries setting in the postgresql.conf file and restart the database server for indirect debugging."
+msgstr "L'extension de débogage n'est pas disponible. Merci d'ajouter l'extension au paramètre shared_preload_libraries dans le fichier postgresql.conf suivi d'un redémarrage du cluster de données pour effectuer un débogage indirect."
#: pgadmin/tools/debugger/__init__.py:698
msgid "Please upgrade the pldbgapi extension to 1.1 or above and try again."
-msgstr ""
-"Merci de mettre à jour l'extension pldbgapi vers une version 1.1 ou "
-"supérieure et essayer à nouveau."
+msgstr "Merci de mettre à jour l'extension pldbgapi vers une version 1.1 ou supérieure et essayer à nouveau."
#: pgadmin/tools/debugger/__init__.py:821
#: pgadmin/tools/debugger/__init__.py:864
@@ -10730,30 +10279,6 @@ msgstr "Pile"
msgid "Debugger - "
msgstr "Débogage - "
-#: pgadmin/tools/debugger/templates/debugger/direct.html:59
-msgid "Step into"
-msgstr "Étape sélectionnée (step into)"
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:67
-msgid "Step over"
-msgstr "Étape sélectionnée et fonctions dépendantes (step over)"
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:75
-msgid "Continue/Start"
-msgstr "Continuer / démarrer"
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:85
-msgid "Toggle breakpoint"
-msgstr "Activer/désactiver le point d'arrêt"
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:93
-msgid "Clear all breakpoints"
-msgstr "Effacer tous les points d'arrêts"
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:103
-msgid "Stop"
-msgstr "Stop"
-
#: pgadmin/tools/grant_wizard/__init__.py:327
msgid "Unable to fetch the {} objects"
msgstr "Impossible d'extraire les {} objets"
@@ -10811,13 +10336,8 @@ msgid "Final (Review Selection) (step 3 of 3)"
msgstr "Fin - vérification des opérations (étape 3 sur 3)"
#: pgadmin/tools/grant_wizard/static/js/grant_wizard.js:1056
-msgid ""
-"The SQL below will be executed on the database server to grant the selected "
-"privileges. Please click on <b>Finish</b> to complete the process."
-msgstr ""
-"Le code SQL ci-dessous sera exécuté sur le serveur de base de données pour "
-"accorder les droits déterminés. Merci de cliquer sur <b>Terminer</b> pour "
-"l'appliquer."
+msgid "The SQL below will be executed on the database server to grant the selected privileges. Please click on <b>Finish</b> to complete the process."
+msgstr "Le code SQL ci-dessous sera exécuté sur le serveur de base de données pour accorder les droits déterminés. Merci de cliquer sur <b>Terminer</b> pour l'appliquer."
#: pgadmin/tools/grant_wizard/static/js/grant_wizard.js:1115
msgid "Grant Wizard"
@@ -10830,9 +10350,7 @@ msgstr "Import / Export"
#: pgadmin/tools/import_export/__init__.py:114
msgid "Copying table data '{0}.{1}' on database '{2}' and server ({3}:{4})"
-msgstr ""
-"Copie des données de la table '{0}.{1}' sur la base de données '{2}' et le "
-"serveur ({3}:{4})"
+msgstr "Copie des données de la table '{0}.{1}' sur la base de données '{2}' et le serveur ({3}:{4})"
#: pgadmin/tools/import_export/__init__.py:127
msgid "Copying table data"
@@ -10840,9 +10358,7 @@ msgstr "Copie des données de la table"
#: pgadmin/tools/import_export/__init__.py:136
msgid "Copying table data '{0}.{1}' on database '{2}' for the server '{3}'"
-msgstr ""
-"Copie des données de la table '{0}.{1}' sur la base de données '{2}' pour le "
-"serveur '{3}'"
+msgstr "Copie des données de la table '{0}.{1}' sur la base de données '{2}' pour le serveur '{3}'"
#: pgadmin/tools/import_export/__init__.py:225
#: pgadmin/tools/maintenance/__init__.py:201
@@ -10884,12 +10400,8 @@ msgstr "Colonnes pour l'import..."
#: pgadmin/tools/import_export/static/js/import_export.js:188
#: pgadmin/tools/import_export/static/js/import_export.js:231
-msgid ""
-"An optional list of columns to be copied. If no column list is specified, "
-"all columns of the table will be copied."
-msgstr ""
-"Liste optionnelle de colonnes à copier. Si aucune colonne n'est choisie, "
-"alors toutes les colonnes de la table seront copiées."
+msgid "An optional list of columns to be copied. If no column list is specified, all columns of the table will be copied."
+msgstr "Liste optionnelle de colonnes à copier. Si aucune colonne n'est choisie, alors toutes les colonnes de la table seront copiées."
#: pgadmin/tools/import_export/static/js/import_export.js:191
msgid "Columns to export"
@@ -10904,19 +10416,8 @@ msgid "NULL Strings"
msgstr "Chaîne pour les"
#: pgadmin/tools/import_export/static/js/import_export.js:240
-msgid ""
-"Specifies the string that represents a null value. The default is \\N "
-"(backslash-N) in text format, and an unquoted empty string in CSV format. "
-"You might prefer an empty string even in text format for cases where you "
-"don't want to distinguish nulls from empty strings. This option is not "
-"allowed when using binary format."
-msgstr ""
-"Définit la chaîne de caractère qui représente la valeur NULL. Par défaut, il "
-"s'agit de \\N (antislash-N) pour le format texte, et une chaîne vide sans "
-"guillemet pour le format CSV. Vous pouvez préférer une chaîne vide dans le "
-"format texte si vous ne souhaitez pas établir de distinction entre les "
-"valeurs nulles (NULL) et les chaînes vides (''). Cette option n'est pas "
-"disponible en utilisant le format binaire."
+msgid "Specifies the string that represents a null value. The default is \\N (backslash-N) in text format, and an unquoted empty string in CSV format. You might prefer an empty string even in text format for cases where you don't want to distinguish nulls from empty strings. This option is not allowed when using binary format."
+msgstr "Définit la chaîne de caractère qui représente la valeur NULL. Par défaut, il s'agit de \\N (antislash-N) pour le format texte, et une chaîne vide sans guillemet pour le format CSV. Vous pouvez préférer une chaîne vide dans le format texte si vous ne souhaitez pas établir de distinction entre les valeurs nulles (NULL) et les chaînes vides (''). Cette option n'est pas disponible en utilisant le format binaire."
#: pgadmin/tools/import_export/static/js/import_export.js:243
msgid "Not null columns"
@@ -10927,19 +10428,8 @@ msgid "Not null columns..."
msgstr "Colonnes non nulles..."
#: pgadmin/tools/import_export/static/js/import_export.js:258
-msgid ""
-"Do not match the specified column values against the null string. In the "
-"default case where the null string is empty, this means that empty values "
-"will be read as zero-length strings rather than nulls, even when they are "
-"not quoted. This option is allowed only in import, and only when using CSV "
-"format."
-msgstr ""
-"Ne pas faire correspondre les valeurs des colonnes spécifiées à la chaîne "
-"NULL. Dans le cas par défaut où la chaîne nulle est vide, cela signifie que "
-"les valeurs vides seront lues comme des chaînes de longueur zéro plutôt que "
-"des NULL, même lorsqu'elles ne sont pas entre guillemets. Cette option est "
-"uniquement autorisée lors de l'importation et uniquement lors de "
-"l'utilisation du format CSV."
+msgid "Do not match the specified column values against the null string. In the default case where the null string is empty, this means that empty values will be read as zero-length strings rather than nulls, even when they are not quoted. This option is allowed only in import, and only when using CSV format."
+msgstr "Ne pas faire correspondre les valeurs des colonnes spécifiées à la chaîne NULL. Dans le cas par défaut où la chaîne nulle est vide, cela signifie que les valeurs vides seront lues comme des chaînes de longueur zéro plutôt que des NULL, même lorsqu'elles ne sont pas entre guillemets. Cette option est uniquement autorisée lors de l'importation et uniquement lors de l'utilisation du format CSV."
#: pgadmin/tools/import_export/static/js/import_export.js:309
#: pgadmin/tools/import_export/static/js/import_export.js:336
@@ -10948,48 +10438,24 @@ msgid "Select from list..."
msgstr "Sélectionner dans la liste..."
#: pgadmin/tools/import_export/static/js/import_export.js:311
-msgid ""
-"Specifies the character that separates columns within each row (line) of the "
-"file. The default is a tab character in text format, a comma in CSV format. "
-"This must be a single one-byte character. This option is not allowed when "
-"using binary format."
-msgstr ""
-"Définit le caractère séparateur de colonnes dans le fichier. Par défaut, il "
-"s'agit d'une tabulation (Tab) en format texte, une virgule (,) en format "
-"CSV. Ce doit être un caractère unique basé sur un octet. Cette option n'est "
-"pas autorisée en format binaire."
+msgid "Specifies the character that separates columns within each row (line) of the file. The default is a tab character in text format, a comma in CSV format. This must be a single one-byte character. This option is not allowed when using binary format."
+msgstr "Définit le caractère séparateur de colonnes dans le fichier. Par défaut, il s'agit d'une tabulation (Tab) en format texte, une virgule (,) en format CSV. Ce doit être un caractère unique basé sur un octet. Cette option n'est pas autorisée en format binaire."
#: pgadmin/tools/import_export/static/js/import_export.js:315
msgid "Quote"
msgstr "Guillemet"
#: pgadmin/tools/import_export/static/js/import_export.js:338
-msgid ""
-"Specifies the quoting character to be used when a data value is quoted. The "
-"default is double-quote. This must be a single one-byte character. This "
-"option is allowed only when using CSV format."
-msgstr ""
-"Renseigner le caractère guillemet à utiliser quand une valeur doit en être "
-"encadrée. Ce doit être un caractère unique basé sur un octet. Cette option "
-"n'est autorisée que dans le format CSV."
+msgid "Specifies the quoting character to be used when a data value is quoted. The default is double-quote. This must be a single one-byte character. This option is allowed only when using CSV format."
+msgstr "Renseigner le caractère guillemet à utiliser quand une valeur doit en être encadrée. Ce doit être un caractère unique basé sur un octet. Cette option n'est autorisée que dans le format CSV."
#: pgadmin/tools/import_export/static/js/import_export.js:342
msgid "Escape"
msgstr "Caractère d'échappement"
#: pgadmin/tools/import_export/static/js/import_export.js:365
-msgid ""
-"Specifies the character that should appear before a data character that "
-"matches the QUOTE value. The default is the same as the QUOTE value (so that "
-"the quoting character is doubled if it appears in the data). This must be a "
-"single one-byte character. This option is allowed only when using CSV format."
-msgstr ""
-"Définit le caractère qui doit être présent avant un caractère propre à la "
-"donnée qui correspond à une valeur de guillemet. Par défaut il s'agit du "
-"même caractère que celui définit comme guillemet séparateur de texte (c'est "
-"pour cette raison que ce caractère apparaît comme doublé dans les données). "
-"Ce doit être un caractère unique basé sur un octet. Cette option n'est "
-"autorisée que dans le format CSV."
+msgid "Specifies the character that should appear before a data character that matches the QUOTE value. The default is the same as the QUOTE value (so that the quoting character is doubled if it appears in the data). This must be a single one-byte character. This option is allowed only when using CSV format."
+msgstr "Définit le caractère qui doit être présent avant un caractère propre à la donnée qui correspond à une valeur de guillemet. Par défaut il s'agit du même caractère que celui définit comme guillemet séparateur de texte (c'est pour cette raison que ce caractère apparaît comme doublé dans les données). Ce doit être un caractère unique basé sur un octet. Cette option n'est autorisée que dans le format CSV."
#: pgadmin/tools/import_export/static/js/import_export.js:411
msgid "Import/Export..."
@@ -10998,9 +10464,7 @@ msgstr "Import/Export..."
#: pgadmin/tools/import_export/static/js/import_export.js:436
#: pgadmin/tools/maintenance/static/js/maintenance.js:210
msgid "Please select server or child node from tree."
-msgstr ""
-"Merci de sélectionner un serveur ou un élément sous- jacent dans "
-"l'arborescenc"
+msgstr "Merci de sélectionner un serveur ou un élément sous- jacent dans l'arborescenc"
#: pgadmin/tools/import_export/static/js/import_export.js:548
msgid "Import/Export job created."
@@ -11120,7 +10584,7 @@ msgstr "Messages verbeux"
#: pgadmin/tools/maintenance/static/js/maintenance.js:167
#: pgadmin/tools/maintenance/static/js/maintenance.js:183
-#: pgadmin/tools/maintenance/static/js/maintenance.js:483
+#: pgadmin/tools/maintenance/static/js/maintenance.js:482
msgid "Maintenance..."
msgstr "Maintenance..."
@@ -11129,23 +10593,18 @@ msgid "Maintenance error"
msgstr "Erreur de maintenance"
#: pgadmin/tools/maintenance/static/js/maintenance.js:257
-msgid ""
-"Maintenance job creation failed. Databases with = symbols in the name cannot "
-"be maintained using this utility."
-msgstr ""
-"Échec de la création de la tâche de maintenance. Les bases de données "
-"comportant un symbole = dans leur nom ne peuvent pas être maintenue avec cet "
-"utilitaire."
+msgid "Maintenance job creation failed. Databases with = symbols in the name cannot be maintained using this utility."
+msgstr "Échec de la création de la tâche de maintenance. Les bases de données comportant un symbole = dans leur nom ne peuvent pas être maintenue avec cet utilitaire."
-#: pgadmin/tools/maintenance/static/js/maintenance.js:387
-#: pgadmin/tools/maintenance/static/js/maintenance.js:394
+#: pgadmin/tools/maintenance/static/js/maintenance.js:386
+#: pgadmin/tools/maintenance/static/js/maintenance.js:393
msgid "Maintenance job creation failed."
msgstr "Échec de création de la tâche de maintenance."
#: pgadmin/tools/restore/__init__.py:41
#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:40
#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:49
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:62
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:61
msgid "Restore"
msgstr "Restaurer"
@@ -11211,15 +10670,15 @@ msgstr "Restaurer..."
msgid "Restore (%s: %s)"
msgstr "Resture (%s: %s)"
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:149
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:148
msgid "Restore job created."
msgstr "Tâche de restauration créée."
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:153
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:152
msgid "Restore job creation failed."
msgstr "Échec de la création de la tâche de restauration."
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:161
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:160
msgid "Restore job failed."
msgstr "Échec de la tâche de restauration."
@@ -11256,9 +10715,7 @@ msgstr "******* Erreur *******"
#: pgadmin/tools/sqleditor/__init__.py:706
msgid "No primary key found for this object, so unable to save records."
-msgstr ""
-"Aucune clé primaires n'a été trouvée, il n'est par conséquent pas possible "
-"de sauvegarder l'enregistrement."
+msgstr "Aucune clé primaires n'a été trouvée, il n'est par conséquent pas possible de sauvegarder l'enregistrement."
#: pgadmin/tools/sqleditor/__init__.py:1015
#: pgadmin/tools/sqleditor/utils/start_running_query.py:103
@@ -11271,8 +10728,7 @@ msgstr "Type de fichier non supporté"
#: pgadmin/tools/sqleditor/command.py:74
msgid "This feature has not been implemented for object type '{0}'."
-msgstr ""
-"Cette fonctionnalité n'a pas été implémentée pour le type d'objet '{0}'."
+msgstr "Cette fonctionnalité n'a pas été implémentée pour le type d'objet '{0}'."
#: pgadmin/tools/sqleditor/command.py:419
msgid "Data cannot be saved for the current object."
@@ -11306,257 +10762,231 @@ msgstr "Notifications"
msgid "Geometry Viewer"
msgstr "Visualisation cartographique"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:832
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:826
msgid "Editable column"
msgstr "Colonne modifiable"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:834
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:828
msgid "Read-only column"
msgstr "Colonne en lecture seule"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1261
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1255
msgid "Fetching all records..."
msgstr "Récupérer tous les enregistrements..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1730
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2369
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3314
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1724
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2363
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3308
msgid "Unsaved changes"
msgstr "Modifications non enregistrées"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1731
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3315
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1725
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3309
msgid "Are you sure you wish to discard the current changes?"
msgstr "Êtes vous sûr de vouloir ignorer les modifications en cours ?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1759
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1753
msgid "Clear history"
msgstr "Effacer l'historique"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1760
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1754
msgid "Are you sure you wish to clear the history?"
msgstr "Êtes vous sûr de vouloir effacer l'historique ?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1761
-msgid ""
-"This will remove all of your query history from this and other sessions for "
-"this database."
-msgstr ""
-"Cela supprimera tout l'historique de vos requêtes pour toutes les sessions "
-"pour cette base de données."
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1755
+msgid "This will remove all of your query history from this and other sessions for this database."
+msgstr "Cela supprimera tout l'historique de vos requêtes pour toutes les sessions pour cette base de données."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2125
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2119
msgid "Connection Warning"
msgstr "Avertissement de connexion"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2132
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2126
msgid "The application has lost the database connection:"
msgstr "L'application a perdu la connexion à la base de données :"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2136
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2130
msgid "⁃ If the connection was idle it may have been forcibly disconnected."
-msgstr ""
-"⁃ Si la connexion était inactive, il se peut qu'elle ait été déconnectée de "
-"force."
+msgstr "⁃ Si la connexion était inactive, il se peut qu'elle ait été déconnectée de force."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2138
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2132
msgid "⁃ The application server or database server may have been restarted."
msgstr "⁃ Le serveur d'application ou de base de données a pu être redémarré."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2140
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2134
msgid "⁃ The user session may have timed out."
msgstr "⁃ La session de l'utilisateur a pu expirer."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2144
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2138
msgid "Do you want to continue and establish a new session?"
msgstr "Souhaitez vous continuer et établir une nouvelle connexion ?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2163
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2157
msgid "Continue"
msgstr "Continuer"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2299
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2293
#, python-format
msgid "Error fetching SQL for script: %s."
msgstr "Erreur SQL pour le script : %s."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2370
-msgid ""
-"The data has been modified, but not saved. Are you sure you wish to discard "
-"the changes?"
-msgstr ""
-"Les données ont été modifiées mais non enregistrées. Êtes vous sûr de "
-"vouloir annuler ?"
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2364
+msgid "The data has been modified, but not saved. Are you sure you wish to discard the changes?"
+msgstr "Les données ont été modifiées mais non enregistrées. Êtes vous sûr de vouloir annuler ?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2414
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2408
msgid "Running query..."
msgstr "Requête en cours d'exécution..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2422
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2416
msgid "Waiting for the query to complete..."
msgstr "Attente de la fin d'exécution de la requête..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2579
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2573
msgid "Loading data from the database server and rendering..."
msgstr "Chargement des données depuis le serveur et affichage..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2588
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2582
#, python-format
msgid "Successfully run. Total query runtime: %s."
msgstr "Exécution réussie. Temps total : %s."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2589
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2583
#, python-format
msgid "%s rows affected."
msgstr "%s lignes affectées."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2865
-msgid ""
-"This query was generated by pgAdmin as part of a \"View/Edit Data\" operation"
-msgstr ""
-"Cette requête a été générée par pgAdmin dans le cadre d'une opération "
-"\"Afficher/Éditer les données\""
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2859
+msgid "This query was generated by pgAdmin as part of a \"View/Edit Data\" operation"
+msgstr "Cette requête a été générée par pgAdmin dans le cadre d'une opération \"Afficher/Éditer les données\""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2966
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2960
msgid "Row(s) deleted."
msgstr "Ligne(s) supprimées."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3040
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3034
msgid "Saving the updated data..."
msgstr "Sauvegarde des données mises à jour..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3156
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3150
msgid "Data saved successfully."
msgstr "Donnés enregistrées avec succès."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3159
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3153
msgid "Auto-commit is off. You still need to commit changes to the database."
-msgstr ""
-"Auto-commit est désactivé. Vous devez encore engager les modifications dans "
-"la base de données."
+msgstr "Auto-commit est désactivé. Vous devez encore engager les modifications dans la base de données."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3165
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3159
#, python-format
msgid "%s."
msgstr "%s."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3170
-msgid ""
-"Saving data changes was rolled back but the current transaction is still "
-"active; previous queries are unaffected."
-msgstr ""
-"L’enregistrement des données a été annulé, mais la transaction en cours est "
-"toujours active ; les requêtes précédentes ne sont pas affectées."
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3164
+msgid "Saving data changes was rolled back but the current transaction is still active; previous queries are unaffected."
+msgstr "L’enregistrement des données a été annulé, mais la transaction en cours est toujours active ; les requêtes précédentes ne sont pas affectées."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3192
-msgid ""
-"This query was generated by pgAdmin as part of a \"Save Data\" operation"
-msgstr ""
-"Cette requête a été générée par pgAdmin dans le cadre d'une opération "
-"\"Enregistrer les données\""
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3186
+msgid "This query was generated by pgAdmin as part of a \"Save Data\" operation"
+msgstr "Cette requête a été générée par pgAdmin dans le cadre d'une opération \"Enregistrer les données\""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3353
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3347
msgid "Loading the file..."
msgstr "Chargement du fichier..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3404
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3398
msgid "Saving the queries in the file..."
msgstr "Enregistrement de la requête dans le fichier..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3416
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3410
msgid "File saved successfully."
msgstr "Fichier enregistré avec succès."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3538
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3597
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3532
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3591
msgid "Applying the new filter..."
msgstr "Application du nouveau filtre..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3558
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3568
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3552
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3562
msgid "Filter By Selection Error"
msgstr "!!erreur de filtre incluant la sélection"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3617
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3627
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3611
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3621
msgid "Filter Exclude Selection Error"
msgstr "!!erreur de filtre excluant la sélection"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3637
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3631
msgid "Removing the filter..."
msgstr "Supprimer le filtre..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3655
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3665
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3649
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3659
msgid "Remove Filter Error"
msgstr "Erreur de suppression du filtre"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3768
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3762
msgid "Setting the limit on the result..."
msgstr "Définit la limite sur le résultat affiché..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3787
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3796
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3781
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3790
msgid "Change limit Error"
msgstr "Erreur dans la modification de limite"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3922
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3941
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3916
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3935
msgid "Cancel Query Error"
msgstr "Erreur d’annulation de requête"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3960
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3954
msgid "Downloading CSV..."
msgstr "Téléchargement CSV..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4014
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4008
msgid "CSV Download cancelled."
msgstr "Téléchargement CSV annulé."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4017
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4011
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:395
msgid "Download CSV"
msgstr "Télécharger CSV"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4020
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4014
msgid "Download CSV error"
msgstr "Erreur de téléchargement CSV"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4054
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4061
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4048
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4055
msgid "Auto Rollback Error"
msgstr "Erreur Auto Rollback"
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4081
#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4087
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4093
msgid "Auto Commit Error"
msgstr "Erreur Auto Commit"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4182
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4176
msgid "The data has changed. Do you want to save changes?"
msgstr "Les données ont changé. Souhaitez vous enregistrer les modifications ?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4188
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4182
msgid "The text has changed. Do you want to save changes?"
msgstr "Le texte a changé. Souhaitez vous enregistrer les modifications ?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4268
-msgid ""
-"The current transaction is not commited to the database.Do you want to "
-"commit or rollback the transaction?"
-msgstr ""
-"La transaction en cours n'est pas validée dans la base de données, voulez-"
-"vous valider ou annuler la transaction ?"
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4262
+msgid "The current transaction is not commited to the database.Do you want to commit or rollback the transaction?"
+msgstr "La transaction en cours n'est pas validée dans la base de données, voulez-vous valider ou annuler la transaction ?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4271
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4265
msgid "Commit transaction?"
msgstr "Confirmer la transaction ?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4294
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4288
msgid "Don't save"
msgstr "Ne pas enregistrer"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4337
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4331
msgid "Save changes?"
msgstr "Enregistrer ?"
@@ -11573,21 +11003,12 @@ msgid "Query info notifier timeout"
msgstr "Délais d'attente du notificateur de requête dépassé"
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:24
-msgid ""
-"The length of time to display the query info notifier after execution has "
-"completed. A value of -1 disables the notifier and a value of 0 displays it "
-"until clicked. Values greater than 0 display the notifier for the number of "
-"seconds specified."
-msgstr ""
-"Durée d'affichage des informations du notificateur de requête une fois "
-"l'exécution terminée. Une valeur de -1 désactive le notificateur et une "
-"valeur de 0 l'affiche jusqu'à ce que vous cliquiez dessus. Les valeurs "
-"supérieures à 0 affichent le notificateur pour le nombre de secondes indiqué."
+msgid "The length of time to display the query info notifier after execution has completed. A value of -1 disables the notifier and a value of 0 displays it until clicked. Values greater than 0 display the notifier for the number of seconds specified."
+msgstr "Durée d'affichage des informations du notificateur de requête une fois l'exécution terminée. Une valeur de -1 désactive le notificateur et une valeur de 0 l'affiche jusqu'à ce que vous cliquiez dessus. Les valeurs supérieures à 0 affichent le notificateur pour le nombre de secondes indiqué."
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:37
msgid "If set to True, the Query Tool will be opened in a new browser tab."
-msgstr ""
-"Si Vrai, l'éditeur de requête s'ouvrira dans un nouvel onglet du navigateur."
+msgstr "Si Vrai, l'éditeur de requête s'ouvrira dans un nouvel onglet du navigateur."
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:43
msgid "Verbose output?"
@@ -11606,6 +11027,7 @@ msgid "Show timing?"
msgstr "Afficher le chronomètre ?"
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:67
+#, fuzzy
msgid "Show summary?"
msgstr "Afficher la synthèse ?"
@@ -11615,52 +11037,35 @@ msgstr "Afficher les paramètres ?"
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:81
msgid "Set auto commit on or off by default in new Query Tool tabs."
-msgstr ""
-"Activer ou désactiver AUTO COMMIT par défaut dans les nouveaux onglets de "
-"l’éditeur de requête."
+msgstr "Activer ou désactiver AUTO COMMIT par défaut dans les nouveaux onglets de l’éditeur de requête."
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:89
msgid "Set auto rollback on or off by default in new Query Tool tabs."
-msgstr ""
-"Activer ou désactiver AUTO ROLLBACK par défaut dans les nouveaux onglets de "
-"l’éditeur de requête."
+msgstr "Activer ou désactiver AUTO ROLLBACK par défaut dans les nouveaux onglets de l’éditeur de requête."
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:95
msgid "Prompt to save unsaved query changes?"
msgstr "Afficher message si code non sauvegardé ?"
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:97
-msgid ""
-"Specifies whether or not to prompt user to save unsaved query on query tool "
-"exit."
-msgstr ""
-"Indique si un message doit avertir l'utilisateur lors de la fermeture de "
-"l'éditeur pour sauvegarder le texte de la requête."
+msgid "Specifies whether or not to prompt user to save unsaved query on query tool exit."
+msgstr "Indique si un message doit avertir l'utilisateur lors de la fermeture de l'éditeur pour sauvegarder le texte de la requête."
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:105
msgid "Prompt to save unsaved data changes?"
msgstr "Afficher message si données non enregistrées ?"
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:107
-msgid ""
-"Specifies whether or not to prompt user to save unsaved data on data grid "
-"exit."
-msgstr ""
-"Indique si un message doit avertir l'utilisateur lors de la fermeture pour "
-"sauvegarder les données non enregistrées."
+msgid "Specifies whether or not to prompt user to save unsaved data on data grid exit."
+msgstr "Indique si un message doit avertir l'utilisateur lors de la fermeture pour sauvegarder les données non enregistrées."
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:115
msgid "Prompt to commit/rollback active transactions?"
-msgstr ""
-"Afficher les informations pour valider/rétablir les transactions actives ?"
+msgstr "Afficher les informations pour valider/rétablir les transactions actives ?"
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:118
-msgid ""
-"Specifies whether or not to prompt user to commit or rollback an active "
-"transaction on Query Tool exit."
-msgstr ""
-"Indique s'il faut ou non inviter l'utilisateur à valider ou à annuler une "
-"transaction active à la sortie de l'éditeur de requêtes."
+msgid "Specifies whether or not to prompt user to commit or rollback an active transaction on Query Tool exit."
+msgstr "Indique s'il faut ou non inviter l'utilisateur à valider ou à annuler une transaction active à la sortie de l'éditeur de requêtes."
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:126
msgid "Plain text mode?"
@@ -11672,44 +11077,24 @@ msgid "Editor"
msgstr "Éditeur"
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:128
-msgid ""
-"When set to True, keywords wont be highlighted and code folding will be "
-"disabled. Plain text mode will improve editor performance with large files."
-msgstr ""
-"Si Vrai, les mots-clés ne seront pas mis en évidence et le pliage du code "
-"sera désactivé. Le mode texte brut améliore les performances de l'éditeur "
-"pour les fichiers volumineux."
+msgid "When set to True, keywords wont be highlighted and code folding will be disabled. Plain text mode will improve editor performance with large files."
+msgstr "Si Vrai, les mots-clés ne seront pas mis en évidence et le pliage du code sera désactivé. Le mode texte brut améliore les performances de l'éditeur pour les fichiers volumineux."
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:137
msgid "Code folding?"
msgstr "Pliage du code ?"
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:139
-msgid ""
-"Enable or disable code folding. In plain text mode, this will have no effect "
-"as code folding is always disabled in that mode. Disabling will improve "
-"editor performance with large files."
-msgstr ""
-"Active ou désactive le pliage du code. En mode texte brut, cela n'aura aucun "
-"effet car le pliage du code est toujours désactivé dans ce mode. Désactiver "
-"améliorera les performances de l'éditeur pour les fichiers volumineux."
+msgid "Enable or disable code folding. In plain text mode, this will have no effect as code folding is always disabled in that mode. Disabling will improve editor performance with large files."
+msgstr "Active ou désactive le pliage du code. En mode texte brut, cela n'aura aucun effet car le pliage du code est toujours désactivé dans ce mode. Désactiver améliorera les performances de l'éditeur pour les fichiers volumineux."
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:148
msgid "Font size"
msgstr "Taille des caractères"
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:152
-msgid ""
-"The font size to use for the SQL text boxes and editors. The value specified "
-"is in \"em\" units, in which 1 is the default relative font size. For "
-"example, to increase the font size by 20 percent use a value of 1.2, or to "
-"reduce by 20 percent, use a value of 0.8. Minimum 0.1, maximum 10."
-msgstr ""
-"Taille des caractères à utiliser dans les boites de code SQL. La valeur "
-"indiquée utilise l'unité \"em\", pour laquelle 1 est la valeur relative par "
-"défaut. Par exemple, pour augmenter la taille de 20 pour cent il faut "
-"indiquer 1.2, pour la réduire de 20 pour cent indiquer 0.8. Le minimum est "
-"0.1, le maximum est 10."
+msgid "The font size to use for the SQL text boxes and editors. The value specified is in \"em\" units, in which 1 is the default relative font size. For example, to increase the font size by 20 percent use a value of 1.2, or to reduce by 20 percent, use a value of 0.8. Minimum 0.1, maximum 10."
+msgstr "Taille des caractères à utiliser dans les boites de code SQL. La valeur indiquée utilise l'unité \"em\", pour laquelle 1 est la valeur relative par défaut. Par exemple, pour augmenter la taille de 20 pour cent il faut indiquer 1.2, pour la réduire de 20 pour cent indiquer 0.8. Le minimum est 0.1, le maximum est 10."
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:163
msgid "Tab size"
@@ -11724,12 +11109,8 @@ msgid "Use spaces?"
msgstr "Utiliser des espaces ?"
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:176
-msgid ""
-"Specifies whether or not to insert spaces instead of tabs when the tab key "
-"or auto-indent are used."
-msgstr ""
-"Indique si il faut utiliser des espaces à la place de tabulation lorsque la "
-"touche Tab est utilisée ou dans le cas d'auto indentation."
+msgid "Specifies whether or not to insert spaces instead of tabs when the tab key or auto-indent are used."
+msgstr "Indique si il faut utiliser des espaces à la place de tabulation lorsque la touche Tab est utilisée ou dans le cas d'auto indentation."
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:184
msgid "Line wrapping?"
@@ -11745,9 +11126,7 @@ msgstr "Insérer les délimiteur par paire ?"
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:195
msgid "Specifies whether or not to insert paired brackets in the editor."
-msgstr ""
-"Indique si les crochets/parenthèses/guillemets doivent être inséré par "
-"paires."
+msgstr "Indique si les crochets/parenthèses/guillemets doivent être inséré par paires."
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:203
msgid "Brace matching?"
@@ -11755,9 +11134,7 @@ msgstr "Correspondance des parenthèses ?"
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:205
msgid "Specifies whether or not to highlight matched braces in the editor."
-msgstr ""
-"Indique si les ouvertures / fermeture de parenthèses qui se correspondent "
-"doivent être surlignées."
+msgstr "Indique si les ouvertures / fermeture de parenthèses qui se correspondent doivent être surlignées."
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:213
msgid "CSV quoting"
@@ -11786,15 +11163,8 @@ msgid "Replace null values with"
msgstr "Remplacer les valeurs NULL par"
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:254
-msgid ""
-"Specifies the string that represents a null value while downloading query "
-"results as CSV. You can specify any arbitrary string to represent a null "
-"value, with quotes if desired."
-msgstr ""
-"Indique la chaîne de caractère qui représente une valeur NULL lors du "
-"téléchargement des données au format CSV. Il est possible de renseigner "
-"n'importe quelle chaîne pour représenter une valeur NULL, avec des "
-"guillemets si souhaité."
+msgid "Specifies the string that represents a null value while downloading query results as CSV. You can specify any arbitrary string to represent a null value, with quotes if desired."
+msgstr "Indique la chaîne de caractère qui représente une valeur NULL lors du téléchargement des données au format CSV. Il est possible de renseigner n'importe quelle chaîne pour représenter une valeur NULL, avec des guillemets si souhaité."
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:263
msgid "Result copy quoting"
@@ -11819,12 +11189,8 @@ msgid "Connection status"
msgstr "Statut de connexion"
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:304
-msgid ""
-"If set to True, the Query Tool will monitor and display the connection and "
-"transaction status."
-msgstr ""
-"Si défini à Vrai, l'outil requête surveille et affiche les statuts de "
-"connexions et de transactions."
+msgid "If set to True, the Query Tool will monitor and display the connection and transaction status."
+msgstr "Si défini à Vrai, l'outil requête surveille et affiche les statuts de connexions et de transactions."
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:311
msgid "Connection status refresh rate"
@@ -11832,9 +11198,7 @@ msgstr "Taux de rafraîchissement des statuts de connexions"
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:314
msgid "The number of seconds between connection/transaction status polls."
-msgstr ""
-"Le nombre de secondes pour l'échantillonnage des statuts de connexions/"
-"transactions."
+msgstr "Le nombre de secondes pour l'échantillonnage des statuts de connexions/transactions."
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:323
msgid "Execute query"
@@ -11854,7 +11218,7 @@ msgstr "Requête EXPLAIN ANALYSE"
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:467
msgid "Accesskey (Open file)"
-msgstr "Accesskey (Open file)"
+msgstr "Accesskey (Ouvrir fichier)"
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:480
msgid "Accesskey (Save file)"
@@ -11917,10 +11281,8 @@ msgid "Auto completion"
msgstr "Auto complétion"
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:656
-msgid ""
-"If set to True, Keywords will be displayed in upper case for auto completion."
-msgstr ""
-"Si vrai, les mots clés seront affichés en majuscule avec l'auto complétion."
+msgid "If set to True, Keywords will be displayed in upper case for auto completion."
+msgstr "Si vrai, les mots clés seront affichés en majuscule avec l'auto complétion."
#: pgadmin/tools/user_management/__init__.py:107
msgid "Invalid email address."
@@ -11983,15 +11345,13 @@ msgstr "Le mot de passe doit être renseigné pour l'utilisateur %s."
#: pgadmin/tools/user_management/static/js/user_management.js:466
#, python-format
msgid "Password must be at least 6 characters for user %s."
-msgstr ""
-"Le mot de passe doit présenter au moins 6 caractères pour l'utilisateur %s."
+msgstr "Le mot de passe doit présenter au moins 6 caractères pour l'utilisateur %s."
#: pgadmin/tools/user_management/static/js/user_management.js:419
#: pgadmin/tools/user_management/static/js/user_management.js:476
#, python-format
msgid "Confirm Password cannot be empty for user %s."
-msgstr ""
-"La confirmation du mot de passe doit être renseignée pour l'utilisateur %s."
+msgstr "La confirmation du mot de passe doit être renseignée pour l'utilisateur %s."
#: pgadmin/tools/user_management/static/js/user_management.js:432
#: pgadmin/tools/user_management/static/js/user_management.js:485
@@ -12050,19 +11410,13 @@ msgid "Discard unsaved changes?"
msgstr "Ignorer les modifications non enregistrées ?"
#: pgadmin/tools/user_management/static/js/user_management.js:880
-msgid ""
-"Are you sure you want to close the dialog? Any unsaved changes will be lost."
-msgstr ""
-"Êtes vous sûr de vouloir fermer la fenêtre de dialogue ? Toutes les "
-"modifications non enregistrées seront perdues."
+msgid "Are you sure you want to close the dialog? Any unsaved changes will be lost."
+msgstr "Êtes vous sûr de vouloir fermer la fenêtre de dialogue ? Toutes les modifications non enregistrées seront perdues."
#: pgadmin/utils/__init__.py:297
#, python-format
-msgid ""
-"'%s' file not found. Please correct the Binary Path in the Preferences dialog"
-msgstr ""
-"fichier '%s' non trouvé. Merci de corriger le chemin des binaires dans les "
-"préférences"
+msgid "'%s' file not found. Please correct the Binary Path in the Preferences dialog"
+msgstr "fichier '%s' non trouvé. Merci de corriger le chemin des binaires dans les préférences"
#: pgadmin/utils/ajax.py:156
msgid "Not implemented."
@@ -12073,12 +11427,8 @@ msgid "Service Unavailable"
msgstr "Service indisponible"
#: pgadmin/utils/exception.py:68
-msgid ""
-"Connection to the SSH Tunnel for host '{0}' has been lost. Reconnect to the "
-"database server."
-msgstr ""
-"La connexion du tunnel SSH pour l'hôte '{0}' a été perdue. Reconnectez le "
-"serveur de base de données."
+msgid "Connection to the SSH Tunnel for host '{0}' has been lost. Reconnect to the database server."
+msgstr "La connexion du tunnel SSH pour l'hôte '{0}' a été perdue. Reconnectez le serveur de base de données."
#: pgadmin/utils/exception.py:99
msgid "Crypt key is missing."
@@ -12133,38 +11483,26 @@ msgid "Driver '{0}' has not been implemented."
msgstr "Le pilote '{0}' n'est pas disponible."
#: pgadmin/utils/driver/psycopg2/connection.py:275
-msgid ""
-"Failed to decrypt the saved password.\n"
+msgid "Failed to decrypt the saved password.\n"
"Error: {0}"
-msgstr ""
-"Impossible de décrypter les mots de passe enregistrés.\n"
+msgstr "Impossible de décrypter les mots de passe enregistrés.\n"
"Erreur : {0}"
#: pgadmin/utils/driver/psycopg2/connection.py:446
-msgid ""
-"Failed to setup the role with error message:\n"
+msgid "Failed to setup the role with error message:\n"
"{0}"
-msgstr ""
-"Échec de définition du rôle avec pour message d'erreur:\n"
+msgstr "Échec de définition du rôle avec pour message d'erreur:\n"
"{0}"
#: pgadmin/utils/driver/psycopg2/connection.py:585
-msgid ""
-"Failed to create cursor for psycopg2 connection with error message for the "
-"server#{1}:{2}:\n"
+msgid "Failed to create cursor for psycopg2 connection with error message for the server#{1}:{2}:\n"
"{0}"
-msgstr ""
-"Échec de création du curseur pour la connexion psycopg2 avec ce message "
-"d'erreur pour le serveur #{1}:{2}:\n"
+msgstr "Échec de création du curseur pour la connexion psycopg2 avec ce message d'erreur pour le serveur #{1}:{2}:\n"
"{0}"
#: pgadmin/utils/driver/psycopg2/connection.py:597
-msgid ""
-"Attempting to reconnect to the database server (#{server_id}) for the "
-"connection - '{conn_id}'."
-msgstr ""
-"Tentative de reconnexion au serveur de base de donnée (#{server_id}) pour la "
-"connexion - '{conn_id}'."
+msgid "Attempting to reconnect to the database server (#{server_id}) for the connection - '{conn_id}'."
+msgstr "Tentative de reconnexion au serveur de base de donnée (#{server_id}) pour la connexion - '{conn_id}'."
#: pgadmin/utils/driver/psycopg2/connection.py:722
#: pgadmin/utils/driver/psycopg2/connection.py:802
@@ -12182,12 +11520,10 @@ msgid "Asynchronous query execution/operation underway."
msgstr "Exécution de requête asynchrone en cours."
#: pgadmin/utils/driver/psycopg2/connection.py:1330
-msgid ""
-"\n"
+msgid "\n"
"Failed to reset the connection to the server due to following error:\n"
"{0}"
-msgstr ""
-"\n"
+msgstr "\n"
"échec de connexion au serveur dû à l'erreur suivant :\n"
"erreur :\n"
"{0}"
@@ -12197,16 +11533,11 @@ msgid "Not connected to the database server."
msgstr "Non connecté au serveur de base de données."
#: pgadmin/utils/driver/psycopg2/connection.py:1656
-msgid ""
-"Asynchronous notification \"{0}\" with payload \"{1}\" received from server "
-"process with PID {2}\n"
-msgstr ""
-"Notification asynchrone \"{0}\" avec coût \"{1}\" \" reçue du processus "
-"serveur avec le PID {2}\n"
+msgid "Asynchronous notification \"{0}\" with payload \"{1}\" received from server process with PID {2}\n"
+msgstr "Notification asynchrone \"{0}\" avec coût \"{1}\" \" reçue du processus serveur avec le PID {2}\n"
#: pgadmin/utils/driver/psycopg2/connection.py:1662
-msgid ""
-"Asynchronous notification \"{0}\" received from server process with PID {1}\n"
+msgid "Asynchronous notification \"{0}\" received from server process with PID {1}\n"
msgstr "Notification asynchrone \"{0}\" reçue du serveur avec le PID {1}\n"
#: pgadmin/utils/driver/psycopg2/connection.py:1756
@@ -12233,55 +11564,6 @@ msgstr "Contexte : "
msgid "Could not find the specified database."
msgstr "Impossible de trouver la base de données."
-#~ msgid "Tablespace cannot be empty."
-#~ msgstr "Tablespace ne peut pas être vide."
-
-#~ msgid "Label must be specified."
-#~ msgstr "Label doit être renseignée."
-
-#~ msgid "-- definition incomplete for {0} constraint"
-#~ msgstr "-- définition incomplète de la contrainte {0}"
-
-#~ msgid "-- definition incomplete for foreign_key constraint"
-#~ msgstr "-- définition incomplète de la contrainte de clé étrangère"
-
-#~ msgid "-- definition incomplete for check_constraint"
-#~ msgstr "-- définition incomplète de la contrainte de vérification"
-
-#~ msgid "-- definition incomplete for exclusion_constraint"
-#~ msgstr "-- définition incomplète de la contrainte d'exclusion"
-
-#~ msgid "Length should not be less than: "
-#~ msgstr "La longueur ne doit pas être inférieure à : "
-
-#~ msgid "Length should not be greater than: "
-#~ msgstr "La longueur ne doit pas être supérieure à : "
-
-#~ msgid "Precision should not be less than: "
-#~ msgstr "La précision ne doit pas être inférieure à : "
-
-#~ msgid "Precision should not be greater than: "
-#~ msgstr "La précision ne doit pas être supérieure à : "
-
-#~ msgid "Length/precision"
-#~ msgstr "Longueur/ précision"
-
-#~ msgid "Length/precision should not be less than %s"
-#~ msgstr "La longueur/précision ne doit pas être inférieure à %s"
-
-#~ msgid "Length/precision should not be greater than %s"
-#~ msgstr "La longueur/précision ne doit pas être supérieure à %s"
-
-#, fuzzy
-#~ msgid "The %s \"%s\" cannot be removed."
-#~ msgstr "Les %s \"%s\" ne peuvent pas être supprimés."
-
-#~ msgid "Error removing %s: \"%s\""
-#~ msgstr "Erreur de suppression de %s: \"%s\""
-
-#~ msgid "Error dropping %s: \"%s\""
-#~ msgstr "Erreur lors de la suppression de %s: \"%s\""
-
#~ msgid ""
#~ "-- Enter any global declarations below:\n"
#~ "\n"
@@ -12365,11 +11647,13 @@ msgstr "Impossible de trouver la base de données."
#~ msgstr "Êtes vous sûr de vouloir déconnecter le serveur %(server)s ?"
#~ msgid ""
-#~ "Are you sure you wish to move the objects from %(old_tablespace)s to "
+#~ "Are you sure you wish to move "
+#~ "the objects from %(old_tablespace)s to "
#~ "%(new_tablespace)s?"
#~ msgstr ""
-#~ "Etes vous sûr de vouloir déplacer les objets depuis %(old_tablespace)s "
-#~ "vers %(new_tablespace)s ?"
+#~ "Etes vous sûr de vouloir déplacer "
+#~ "les objets depuis %(old_tablespace)s vers "
+#~ "%(new_tablespace)s ?"
#~ msgid "Are you sure you want to drop %s \"%s\"?"
#~ msgstr "Êtes vous sûr de vouloir supprimer %s \"%s\" ?"
@@ -12412,8 +11696,9 @@ msgstr "Impossible de trouver la base de données."
#~ msgid "Error occurred while setting %(subItem)s option in explain."
#~ msgstr ""
-#~ "Une erreur est survenue lors de la définition de l'option %(subItem)s "
-#~ "dans EXPLAIN."
+#~ "Une erreur est survenue lors de la"
+#~ " définition de l'option %(subItem)s dans"
+#~ " EXPLAIN."
#~ msgid "Script - "
#~ msgstr "Script - "
@@ -12432,56 +11717,74 @@ msgstr "Impossible de trouver la base de données."
#~ msgid "Unable to fetch the database objects due to an error"
#~ msgstr ""
-#~ "Impossible d’extraire les objets de la base de données du fait d'une "
+#~ "Impossible d’extraire les objets de la"
+#~ " base de données du fait d'une "
#~ "erreur"
-#~ msgid ""
-#~ "Column: User can select any column from the list of available columns."
+#~ msgid "Column: User can select any column from the list of available columns."
#~ msgstr ""
-#~ "Colonne : L'utilisateur peut choisir n'importe quelle colonne dans la "
-#~ "liste des colonnes disponibles."
+#~ "Colonne : L'utilisateur peut choisir "
+#~ "n'importe quelle colonne dans la liste"
+#~ " des colonnes disponibles."
#~ msgid "Expression: User can specify expression to create partition key."
#~ msgstr ""
-#~ "Expression : L'utilisateur peux renseigner l'expression pour créer la clé "
-#~ "de partition."
+#~ "Expression : L'utilisateur peux renseigner "
+#~ "l'expression pour créer la clé de "
+#~ "partition."
#~ msgid "Example"
#~ msgstr "Exemple"
#~ msgid ""
-#~ "Create a table: User can create multiple partitions while creating new "
-#~ "partitioned table. Operation switch is disabled in this scenario."
+#~ "Create a table: User can create "
+#~ "multiple partitions while creating new "
+#~ "partitioned table. Operation switch is "
+#~ "disabled in this scenario."
#~ msgstr ""
-#~ "Création d'une table : L'utilisateur peut créer plusieurs partitions tant "
-#~ "qu'il est possible de créer une nouvelle table de partition. \"Operation "
+#~ "Création d'une table : L'utilisateur "
+#~ "peut créer plusieurs partitions tant "
+#~ "qu'il est possible de créer une "
+#~ "nouvelle table de partition. \"Operation "
#~ "switch\" est désactivé dans ce scénario."
#~ msgid ""
-#~ "Edit existing table: User can create/attach/detach multiple partitions. "
-#~ "In attach operation user can select table from the list of suitable "
-#~ "tables to be attached."
+#~ "Edit existing table: User can "
+#~ "create/attach/detach multiple partitions. In "
+#~ "attach operation user can select table"
+#~ " from the list of suitable tables "
+#~ "to be attached."
#~ msgstr ""
-#~ "Modifier une table existante : L'utilisateur peut créer/attacher/détacher "
-#~ "plusieurs parititons. Dans le cas de l'attache, l'utilisateur peut "
-#~ "sélectionner une table dans la liste de tables disponibles pour l'attache."
+#~ "Modifier une table existante : "
+#~ "L'utilisateur peut créer/attacher/détacher plusieurs"
+#~ " parititons. Dans le cas de "
+#~ "l'attache, l'utilisateur peut sélectionner une"
+#~ " table dans la liste de tables "
+#~ "disponibles pour l'attache."
#~ msgid ""
-#~ "From/To: Enabled for range partition. Consider partitioned table with "
-#~ "multiple keys of type Integer, then values should be specified like "
-#~ "'100','200'."
+#~ "From/To: Enabled for range partition. "
+#~ "Consider partitioned table with multiple "
+#~ "keys of type Integer, then values "
+#~ "should be specified like '100','200'."
#~ msgstr ""
-#~ "De/Jusqu'à : Disponible pour les partitions par intervalles. Si la table "
-#~ "partitionnée présente plusieurs clés de type entier, les valeurs doivent "
-#~ "être renseignées de cette façon : '100','200'."
+#~ "De/Jusqu'à : Disponible pour les "
+#~ "partitions par intervalles. Si la table"
+#~ " partitionnée présente plusieurs clés de"
+#~ " type entier, les valeurs doivent "
+#~ "être renseignées de cette façon : "
+#~ "'100','200'."
#~ msgid ""
-#~ "In: Enabled for list partition. Values must be comma(,) separated and "
+#~ "In: Enabled for list partition. Values"
+#~ " must be comma(,) separated and "
#~ "quoted with single quote."
#~ msgstr ""
-#~ "Dans : Disponible pour le partitionnement par liste. Les valeurs doivent "
-#~ "être séparées par des virgules (,) et encadrées par des guillemets "
-#~ "simples (')"
+#~ "Dans : Disponible pour le "
+#~ "partitionnement par liste. Les valeurs "
+#~ "doivent être séparées par des virgules"
+#~ " (,) et encadrées par des guillemets"
+#~ " simples (')"
#~ msgid "Modulus/Remainder: Enabled for hash partition."
#~ msgstr "Modulo/Reste: Disponibles pour la partition par hachage."
@@ -12490,11 +11793,14 @@ msgstr "Impossible de trouver la base de données."
#~ msgstr "Échec de l'opération"
#~ msgid ""
-#~ "There are unsaved changes in the grid. Please save them first to avoid "
-#~ "data inconsistencies."
+#~ "There are unsaved changes in the "
+#~ "grid. Please save them first to "
+#~ "avoid data inconsistencies."
#~ msgstr ""
-#~ "Il y a des modifications non enregistrées dans la grille. Merci de les "
-#~ "enregistrer pour éviter les incohérences de données."
+#~ "Il y a des modifications non "
+#~ "enregistrées dans la grille. Merci de"
+#~ " les enregistrer pour éviter les "
+#~ "incohérences de données."
#~ msgid "Delete Row(s)"
#~ msgstr "Supprimer ligne(s)"
@@ -12505,10 +11811,10 @@ msgstr "Impossible de trouver la base de données."
#~ msgid "More details..."
#~ msgstr "Plus de détails..."
-#~ msgid ""
-#~ "Please select the objects to grant privileges to from the list below."
+#~ msgid "Please select the objects to grant privileges to from the list below."
#~ msgstr ""
-#~ "Merci de sélectionner les objets auxquels accorder des droits dans la "
+#~ "Merci de sélectionner les objets "
+#~ "auxquels accorder des droits dans la "
#~ "liste ci-dessous."
#~ msgid "Show hidden files and folders"
@@ -12627,20 +11933,25 @@ msgstr "Impossible de trouver la base de données."
#~ msgid "No dependent information is available for the current object."
#~ msgstr ""
-#~ "Aucune information relative à des objets dépendants n'est disponible pour "
-#~ "l'objet actif"
+#~ "Aucune information relative à des objets"
+#~ " dépendants n'est disponible pour l'objet"
+#~ " actif"
#~ msgid "No dependency information is available for the current object."
#~ msgstr ""
-#~ "Aucune information relative à des objets rattachés n'est disponible pour "
-#~ "l'objet actif."
+#~ "Aucune information relative à des objets"
+#~ " rattachés n'est disponible pour l'objet"
+#~ " actif."
#~ msgid ""
-#~ "Only objects global to the entire database will be backed up in PLAIN "
-#~ "format"
+#~ "Only objects global to the entire "
+#~ "database will be backed up in "
+#~ "PLAIN format"
#~ msgstr ""
-#~ "Seuls les objets globaux (rôles, tablespaces...) de la base de données "
-#~ "seront sauvegardé au format PLAIN (--globals-only)"
+#~ "Seuls les objets globaux (rôles, "
+#~ "tablespaces...) de la base de données"
+#~ " seront sauvegardé au format PLAIN "
+#~ "(--globals-only)"
#~ msgid "Edit Data - "
#~ msgstr "Édition des données - "
@@ -12662,7 +11973,9 @@ msgstr "Impossible de trouver la base de données."
#~ msgid "Please select any database object type."
#~ msgstr ""
-#~ "Merci de sélectionner n'importe quel type d’objet de la base de données."
+#~ "Merci de sélectionner n'importe quel "
+#~ "type d’objet de la base de "
+#~ "données."
#~ msgid "Initializing query execution."
#~ msgstr "Initialisation de l'exécution."
@@ -12676,17 +11989,17 @@ msgstr "Impossible de trouver la base de données."
#~ msgid "Apply Filter Error"
#~ msgstr "Erreur d'application du filtre"
-#~ msgid ""
-#~ "Copying table data '{0}.{1}' on database '{2}' and server ({3}:{4})..."
+#~ msgid "Copying table data '{0}.{1}' on database '{2}' and server ({3}:{4})..."
#~ msgstr ""
-#~ "Copie des données de la table '{0}.{1}' de la base de données '{2}' et d "
-#~ "serveur ({3}:{4})..."
+#~ "Copie des données de la table "
+#~ "'{0}.{1}' de la base de données "
+#~ "'{2}' et d serveur ({3}:{4})..."
-#~ msgid ""
-#~ "Copying table data '{0}.{1}' on database '{2}' for the server '{3}'..."
+#~ msgid "Copying table data '{0}.{1}' on database '{2}' for the server '{3}'..."
#~ msgstr ""
-#~ "Copie des données de la table '{0}.{1}' de la base de données '{2}' pour "
-#~ "le serveur '{3}'..."
+#~ "Copie des données de la table "
+#~ "'{0}.{1}' de la base de données "
+#~ "'{2}' pour le serveur '{3}'..."
#~ msgid "Database activity"
#~ msgstr "Activité de la base de données"
@@ -12738,8 +12051,9 @@ msgstr "Impossible de trouver la base de données."
#~ msgid ""
#~ "\n"
-#~ "Configuration parameters/variables must be passed as an array of JSON "
-#~ "objects in\n"
+#~ "Configuration parameters/variables must be "
+#~ "passed as an array of JSON objects"
+#~ " in\n"
#~ "the following format in create mode:\n"
#~ "variables:[{\n"
#~ " database: <database> or null,\n"
@@ -12750,8 +12064,10 @@ msgstr "Impossible de trouver la base de données."
#~ "]"
#~ msgstr ""
#~ "\n"
-#~ "Les paramètre de configuration doivent être transmis en tant que tableau "
-#~ "d'objets JSON dans le format suivant (mode création) :\n"
+#~ "Les paramètre de configuration doivent "
+#~ "être transmis en tant que tableau "
+#~ "d'objets JSON dans le format suivant "
+#~ "(mode création) :\n"
#~ "variables:[{\n"
#~ " database: <database> or null,\n"
#~ " name: <configuration>,\n"
@@ -12762,8 +12078,9 @@ msgstr "Impossible de trouver la base de données."
#~ msgid ""
#~ "\n"
-#~ "Configuration parameters/variables must be passed as an array of JSON "
-#~ "objects in\n"
+#~ "Configuration parameters/variables must be "
+#~ "passed as an array of JSON objects"
+#~ " in\n"
#~ "the following format in update mode:\n"
#~ "rolmembership:{\n"
#~ " 'added': [{\n"
@@ -12789,8 +12106,10 @@ msgstr "Impossible de trouver la base de données."
#~ " ]\n"
#~ msgstr ""
#~ "\n"
-#~ "Les paramètre de configuration doivent être transmis en tant que tableau "
-#~ "d'objets JSON dans le format suivant (mode mise à jour) :\n"
+#~ "Les paramètre de configuration doivent "
+#~ "être transmis en tant que tableau "
+#~ "d'objets JSON dans le format suivant "
+#~ "(mode mise à jour) :\n"
#~ "rolmembership:{\n"
#~ " 'added': [{\n"
#~ " database: <database> or null,\n"
@@ -12879,7 +12198,8 @@ msgstr "Impossible de trouver la base de données."
#~ msgid "Error occurred while getting query tool options."
#~ msgstr ""
-#~ "Une erreur est survenue lors du chargement des options de l'outil de "
+#~ "Une erreur est survenue lors du "
+#~ "chargement des options de l'outil de "
#~ "requête."
#~ msgid "Unable to run pgagent job."
@@ -12893,14 +12213,16 @@ msgstr "Impossible de trouver la base de données."
#~ msgid "Please set binary path for PostgreSQL Server from preferences."
#~ msgstr ""
-#~ "Merci de configurer le chemin des binaires PostgreSQL dans les "
-#~ "préférences."
+#~ "Merci de configurer le chemin des "
+#~ "binaires PostgreSQL dans les préférences."
#~ msgid ""
-#~ "Please set binary path for EDB Postgres Advanced Server from preferences."
+#~ "Please set binary path for EDB "
+#~ "Postgres Advanced Server from preferences."
#~ msgstr ""
-#~ "Merci de configurer le chemin des binaires EDB Advanced Server dans les "
-#~ "préférences."
+#~ "Merci de configurer le chemin des "
+#~ "binaires EDB Advanced Server dans les"
+#~ " préférences."
#~ msgid "Backup (%s: %s)"
#~ msgstr "Sauvegarde (%s: %s)"
@@ -12911,30 +12233,73 @@ msgstr "Impossible de trouver la base de données."
#~ msgid "Restore failed."
#~ msgstr "Échec de restauration"
+#~ msgid "Open File"
+#~ msgstr "Ouvrir fichier"
+
#~ msgid "Find options"
#~ msgstr "Options de recherche"
+#~ msgid "Copy"
+#~ msgstr "Copier"
+
+#~ msgid "Paste"
+#~ msgstr "Coller"
+
+#~ msgid "Delete"
+#~ msgstr "Supprimer"
+
+#~ msgid "Filter"
+#~ msgstr "Filtrer"
+
+#~ msgid "Filter options"
+#~ msgstr "Options de filtre"
+
+#~ msgid "Rows limit"
+#~ msgstr "Nombre de lignes max"
+
+#~ msgid "Execute/Refresh"
+#~ msgstr "Exécuter / Actualiser"
+
+#~ msgid "Execute options"
+#~ msgstr "Options d'exécution"
+
+#~ msgid "Explain Analyze"
+#~ msgstr "EXPLAIN ANALYSE"
+
+#~ msgid "Cancel query"
+#~ msgstr "Annuler la requête"
+
+#~ msgid "Clear"
+#~ msgstr "Effacer"
+
+#~ msgid "Download as CSV"
+#~ msgstr "Télécharger au format CSV"
+
#~ msgid "Execution completed with error"
#~ msgstr "Exécution terminée avec erreur."
#~ msgid "Error occurred while setting verbose option in explain."
#~ msgstr ""
-#~ "Une erreur est survenue lors de la définition de l'option d'affichage "
-#~ "verbeux (VERBOSE) dans EXPLAIN."
+#~ "Une erreur est survenue lors de la"
+#~ " définition de l'option d'affichage verbeux"
+#~ " (VERBOSE) dans EXPLAIN."
#~ msgid "Error occurred while setting costs option in explain."
#~ msgstr ""
-#~ "Une erreur est survenue lors de la définition de l'option de coût estimé "
-#~ "(COSTS) dans EXPLAIN."
+#~ "Une erreur est survenue lors de la"
+#~ " définition de l'option de coût "
+#~ "estimé (COSTS) dans EXPLAIN."
#~ msgid "Error occurred while setting buffers option in explain."
#~ msgstr ""
-#~ "Une erreur est survenue lors de la définition de l'option de tampon "
+#~ "Une erreur est survenue lors de la"
+#~ " définition de l'option de tampon "
#~ "(BUFFER) dans EXPLAIN."
#~ msgid "Error occurred while setting timing option in explain."
#~ msgstr ""
-#~ "Une erreur et survenue lors de la définition des options de chronomètre "
+#~ "Une erreur et survenue lors de la"
+#~ " définition des options de chronomètre "
#~ "dans EXPLAIN."
#~ msgid "Get Preferences error"
@@ -12942,3 +12307,63 @@ msgstr "Impossible de trouver la base de données."
#~ msgid "Dashboard has been disabled by user."
#~ msgstr "Le tableau de bord a été désactivé par l'utilisateur."
+
+#~ msgid "Step into"
+#~ msgstr "Étape sélectionnée (step into)"
+
+#~ msgid "Step over"
+#~ msgstr "Étape sélectionnée et fonctions dépendantes (step over)"
+
+#~ msgid "Continue/Start"
+#~ msgstr "Continuer / démarrer"
+
+#~ msgid "Toggle breakpoint"
+#~ msgstr "Activer/désactiver le point d'arrêt"
+
+#~ msgid "Clear all breakpoints"
+#~ msgstr "Effacer tous les points d'arrêts"
+
+#~ msgid "Stop"
+#~ msgstr "Stop"
+
+#~ msgid "-- definition incomplete for {0} constraint"
+#~ msgstr "-- définition incomplète de la contrainte {0}"
+
+#~ msgid "-- definition incomplete for foreign_key constraint"
+#~ msgstr "-- définition incomplète de la contrainte de clé étrangère"
+
+#~ msgid "-- definition incomplete for check_constraint"
+#~ msgstr "-- définition incomplète de la contrainte de vérification"
+
+#~ msgid "-- definition incomplete for exclusion_constraint"
+#~ msgstr "-- définition incomplète de la contrainte d'exclusion"
+
+#~ msgid "Length should not be less than: "
+#~ msgstr "La longueur ne doit pas être inférieure à : "
+
+#~ msgid "Length should not be greater than: "
+#~ msgstr "La longueur ne doit pas être supérieure à : "
+
+#~ msgid "Precision should not be less than: "
+#~ msgstr "La précision ne doit pas être inférieure à : "
+
+#~ msgid "Precision should not be greater than: "
+#~ msgstr "La précision ne doit pas être supérieure à : "
+
+#~ msgid "Length/precision"
+#~ msgstr "Longueur/ précision"
+
+#~ msgid "Length/precision should not be less than %s"
+#~ msgstr "La longueur/précision ne doit pas être inférieure à %s"
+
+#~ msgid "Length/precision should not be greater than %s"
+#~ msgstr "La longueur/précision ne doit pas être supérieure à %s"
+
+#~ msgid "The %s \"%s\" cannot be removed."
+#~ msgstr "Les %s \"%s\" ne peuvent pas être supprimés."
+
+#~ msgid "Error removing %s: \"%s\""
+#~ msgstr "Erreur de suppression de %s: \"%s\""
+
+#~ msgid "Error dropping %s: \"%s\""
+#~ msgstr "Erreur lors de la suppression de %s: \"%s\""
diff --git a/web/pgadmin/translations/it/LC_MESSAGES/messages.mo b/web/pgadmin/translations/it/LC_MESSAGES/messages.mo
index fcf927b67fa7e77cff64c38504973758168e5246..fc35679a44b87b060ee2598eedf9c73188e0831b 100644
GIT binary patch
delta 46218
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
Ye9axx-Pie<{H>eq4b9=3+&9<y7rzOf(EtDd
delta 46753
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
WGV~c1`aPcH@Q3FPKE2sd5%pgiaq^Y`
diff --git a/web/pgadmin/translations/it/LC_MESSAGES/messages.po b/web/pgadmin/translations/it/LC_MESSAGES/messages.po
index a369755bf..c089de081 100644
--- a/web/pgadmin/translations/it/LC_MESSAGES/messages.po
+++ b/web/pgadmin/translations/it/LC_MESSAGES/messages.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PgAdmin 4\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-01-03 19:02+0530\n"
-"PO-Revision-Date: 2020-01-03 15:56+0100\n"
+"POT-Creation-Date: 2019-12-06 19:29+0530\n"
+"PO-Revision-Date: 2019-12-07 10:46+0100\n"
"Last-Translator: Domenico Sgarbossa <[email protected]>\n"
"Language: it_IT\n"
"Language-Team: Sgarbossa Domenico\n"
@@ -48,13 +48,13 @@ msgstr "Scrivania"
#: pgadmin/static/js/slickgrid/editors.js:50
#: pgadmin/static/js/slickgrid/editors.js:60
#: pgadmin/static/js/slickgrid/editors.js:61
-#: pgadmin/static/js/sqleditor/filter_dialog.js:84
-#: pgadmin/tools/datagrid/static/js/show_data.js:143
-#: pgadmin/tools/datagrid/static/js/show_data.js:218
+#: pgadmin/static/js/sqleditor/filter_dialog.js:83
+#: pgadmin/tools/datagrid/static/js/show_data.js:142
+#: pgadmin/tools/datagrid/static/js/show_data.js:217
#: pgadmin/tools/import_export/static/js/import_export.js:500
-#: pgadmin/tools/maintenance/static/js/maintenance.js:302
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2005
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2035
+#: pgadmin/tools/maintenance/static/js/maintenance.js:301
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1999
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2029
msgid "OK"
msgstr "OK"
@@ -467,7 +467,7 @@ msgstr "Mancano le proprietà richieste."
#: pgadmin/browser/server_groups/servers/tablespaces/__init__.py:121
#: pgadmin/browser/utils.py:386 pgadmin/static/js/alertify.pgadmin.defaults.js:102
#: pgadmin/static/js/alertify.pgadmin.defaults.js:163
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:305
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:303
#: pgadmin/tools/grant_wizard/__init__.py:129 pgadmin/utils/exception.py:35
msgid "Connection to the server has been lost."
msgstr "La connessione al server è stata persa."
@@ -586,7 +586,7 @@ msgid "No parameters were changed."
msgstr "Nessun parametro è stato modificato."
#: pgadmin/browser/server_groups/servers/__init__.py:767
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:567
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:562
#: pgadmin/browser/server_groups/servers/databases/casts/__init__.py:370
#: pgadmin/browser/server_groups/servers/databases/extensions/__init__.py:264
#: pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py:395
@@ -608,7 +608,7 @@ msgstr "Nessun parametro è stato modificato."
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:365
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:569
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/__init__.py:436
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:888
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:922
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:393
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py:484
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py:478
@@ -783,33 +783,33 @@ msgstr "Impossibile trovare l'utilità per l'operazione ' %s '"
msgid "PostgreSQL"
msgstr "PostgreSQL"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:38
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:37
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:21
msgid "Databases"
msgstr "Database"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:375
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:391
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:654
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:724
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:849
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:1021
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:374
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:390
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:649
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:719
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:844
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:1016
msgid "Could not find the database on the server."
msgstr "Impossibile trovare il database sul server."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:469
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:468
msgid "Database connected."
msgstr "Database connesso."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:488
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:485
msgid "Database could not be disconnected."
msgstr "Il database non può essere disconesso."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:492
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:489
msgid "Database disconnected."
msgstr "Database disconnesso."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:777
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:772
#: pgadmin/browser/server_groups/servers/databases/casts/__init__.py:483
#: pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py:522
#: pgadmin/browser/server_groups/servers/databases/extensions/__init__.py:357
@@ -824,10 +824,10 @@ msgstr "Database disconnesso."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py:548
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py:488
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py:453
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:830
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:829
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py:441
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:462
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1051
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1085
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:474
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py:565
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py:591
@@ -845,11 +845,11 @@ msgstr "Database disconnesso."
msgid "Error: Object not found."
msgstr "Errore: oggetto non trovato."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:780
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:775
msgid "The specified database could not be found.\n"
msgstr "Impossibile trovare il database specificato. \n"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:876
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:871
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:728
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:1561
msgid " -- definition incomplete"
@@ -943,19 +943,19 @@ msgstr "Conversione..."
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:93
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:39
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:210
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:182
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:107
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:670
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:712
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:119
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:105
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:53
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:292
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:181
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:106
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:669
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:710
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:118
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:104
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:52
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:289
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:358
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:131
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:130
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:265
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:324
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:184
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:183
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:324
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:148
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:112
@@ -1007,22 +1007,22 @@ msgstr "Nome"
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:114
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog.js:65
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:393
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:185
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:110
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:673
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:716
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:123
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:109
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:295
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:184
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:109
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:672
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:714
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:122
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:108
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:292
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:361
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:146
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:145
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:254
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:327
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:187
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:186
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:328
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:151
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:115
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:312
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:309
#: pgadmin/browser/server_groups/servers/resource_groups/static/js/resource_group.js:87
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:391
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:344
@@ -1137,56 +1137,56 @@ msgstr "Tipo di origine"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:654
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:658
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:662
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:137
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:158
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:692
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:702
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:747
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:750
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:758
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:781
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:735
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:748
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:772
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:789
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:805
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:853
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:144
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:416
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:513
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:538
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:561
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:576
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:604
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:130
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:402
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:499
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:523
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:550
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:565
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:593
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:315
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:346
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:349
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:136
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:157
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:691
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:701
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:746
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:749
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:757
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:780
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:733
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:746
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:770
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:787
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:803
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:851
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:143
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:415
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:512
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:537
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:560
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:575
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:603
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:129
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:401
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:498
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:522
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:549
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:564
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:592
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:311
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:342
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:345
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:384
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:388
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:392
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:396
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:400
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:404
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:407
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:411
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:415
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:418
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:440
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:166
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:179
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:191
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:207
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:250
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:268
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:292
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:318
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:323
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:414
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:436
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:165
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:190
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:249
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:267
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:291
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:317
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:322
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:350
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:375
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:385
@@ -1198,14 +1198,14 @@ msgstr "Tipo di origine"
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:173
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:136
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:140
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:338
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:343
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:367
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:376
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:381
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:335
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:340
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:364
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:373
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:378
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:383
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:386
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:389
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:393
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:390
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:395
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:408
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:412
@@ -1260,22 +1260,22 @@ msgstr "Cast di sistema?"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog.js:74
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:403
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:674
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:306
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:113
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:676
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:719
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:127
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:113
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:59
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:477
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:305
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:112
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:675
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:717
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:126
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:112
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:58
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:473
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:411
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:203
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:202
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:397
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:515
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:514
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:762
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:169
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:132
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:334
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:331
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:465
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:140
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:206
@@ -1358,7 +1358,7 @@ msgstr "Trigger evento ..."
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:331
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:154
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:118
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:315
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:312
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:355
#: pgadmin/dashboard/static/js/dashboard.js:1129
#: pgadmin/dashboard/static/js/dashboard.js:1387
@@ -1370,7 +1370,7 @@ msgstr "Proprietario"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:111
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:155
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:242
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:199
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:198
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:286
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:103
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:144
@@ -1379,28 +1379,28 @@ msgstr "Abilitato?"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:120
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:39
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:316
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:315
msgid "Trigger function"
msgstr "Funzione di Trigger"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:124
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:205
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:267
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:272
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:347
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:387
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:391
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:404
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:417
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:429
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:459
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:464
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:204
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:266
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:271
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:346
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:386
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:390
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:403
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:416
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:428
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:458
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:463
msgid "Events"
msgstr "Eventi"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:132
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:264
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:456
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:263
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:455
msgid "When"
msgstr "Quando"
@@ -1419,7 +1419,7 @@ msgstr "Quando"
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:784
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:222
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:169
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:409
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:406
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:514
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:378
msgid "Security labels"
@@ -1452,14 +1452,14 @@ msgstr "Etichetta di sicurezza"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1124
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:167
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:130
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:317
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:320
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:323
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:326
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:329
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:332
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:400
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:412
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:467
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:397
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:409
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:464
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:516
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:360
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:372
@@ -1566,11 +1566,11 @@ msgstr "Relocatable?"
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:189
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:479
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:195
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:321
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:495
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:530
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:320
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:491
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:529
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:811
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:455
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:452
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:473
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:163
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:221
@@ -1770,8 +1770,8 @@ msgstr "Tipo"
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:214
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:129
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:161
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:319
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:396
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:316
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:393
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:420
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:427
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:440
@@ -1954,7 +1954,7 @@ msgid "Schema dropped"
msgstr "Schema eliminato"
#: pgadmin/browser/server_groups/servers/databases/schemas/__init__.py:781
-#: pgadmin/static/js/backform.pgadmin.js:1837
+#: pgadmin/static/js/backform.pgadmin.js:1833
msgid "Definition incomplete."
msgstr "Definizione incompleta."
@@ -1973,23 +1973,23 @@ msgstr "Impossibile trovare l'oggetto catalogo specificato."
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:594
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:60
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:23
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:269
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:268
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:786
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:787
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:788
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:909
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:898
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:899
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:143
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:344
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:417
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:908
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:896
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:897
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:142
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:340
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:413
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:421
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:427
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:428
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:401
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:495
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:496
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:461
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:460
#: pgadmin/tools/import_export/static/js/import_export.js:179
#: pgadmin/tools/import_export/static/js/import_export.js:199
#: pgadmin/tools/import_export/static/js/import_export.js:237
@@ -2038,7 +2038,7 @@ msgstr "Tipo dato"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:85
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:171
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:449
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:375
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:372
msgid "Collation"
msgstr "Collation"
@@ -2157,7 +2157,7 @@ msgstr "Vincoli di dominio..."
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/static/js/domain.js:65
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:415
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:21
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:127
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:614
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:679
msgid "Check"
@@ -2165,7 +2165,7 @@ msgstr "Controllo"
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js:97
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:419
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:136
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:135
msgid "No inherit?"
msgstr "Nessuna eredità?"
@@ -2176,7 +2176,7 @@ msgid "Validate?"
msgstr "Validare?"
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:177
msgid "Check cannot be empty."
msgstr "Il controllo non può essere vuoto."
@@ -2281,8 +2281,8 @@ msgstr "Tabella esterna eliminata"
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py:1285
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py:1330
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1367
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1417
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1401
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1451
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:1356
msgid "-- Please create column(s) first..."
msgstr "-- Gentilmente creare prima la colonna(e)..."
@@ -2291,8 +2291,6 @@ msgstr "-- Gentilmente creare prima la colonna(e)..."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:487
#: pgadmin/browser/static/js/browser.js:213
#: pgadmin/misc/static/explain/js/explain.js:1219
-#: pgadmin/misc/static/explain/js/explain.js:1348
-#: pgadmin/misc/static/explain/js/explain.js:1349
#: pgadmin/misc/statistics/static/js/statistics.js:129
msgid "Statistics"
msgstr "Statistiche"
@@ -2302,7 +2300,7 @@ msgid "Inherited From"
msgstr "Eredita da"
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:259
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:176
msgid "Column Name cannot be empty."
msgstr "Il nome della colonna non può essere vuoto."
@@ -2503,7 +2501,7 @@ msgid "FTS Dictionary..."
msgstr "Dizionario FTS ..."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/static/js/fts_dictionary.js:153
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:342
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:339
msgid "Template"
msgstr "Template"
@@ -2652,7 +2650,7 @@ msgstr "La funzione Lexize deve essere selezionata."
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:59
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:21
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:457
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:434
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:431
msgid "Functions"
msgstr "Funzioni"
@@ -2665,29 +2663,29 @@ msgstr "Impossibile trovare %s specificato."
msgid "Could not find the function node in the database."
msgstr "Impossibile trovare il nodo funzione nel database."
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:833
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:832
msgid "The specified function could not be found.\n"
msgstr "Impossibile trovare la funzione specificata. \n"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:850
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:849
msgid "Function dropped."
msgstr "Funzione eliminata."
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1141
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1320
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1140
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1319
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:334
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:511
msgid "Could not find the function in the database."
msgstr "Impossibile trovare la funzione nel database."
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1628
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1627
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js:24
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:621
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbproc.js:24
msgid "Procedures"
msgstr "Procedure"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1728
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1727
msgid "Trigger Functions"
msgstr "Funzioni di Trigger"
@@ -2727,7 +2725,7 @@ msgstr "Conteggio argomenti"
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:327
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:150
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:79
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:322
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:321
msgid "Arguments"
msgstr "Argumenti"
@@ -2751,8 +2749,8 @@ msgstr "Tipo ritornato"
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:182
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:98
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:100
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:289
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:493
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:288
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:492
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:154
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:155
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:209
@@ -2820,7 +2818,7 @@ msgstr "Funzione di supporto"
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:338
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:245
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1119
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:405
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:402
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:508
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:366
#: pgadmin/tools/debugger/static/js/direct.js:1707
@@ -2860,7 +2858,7 @@ msgstr "Il simbolo di collegamento non può essere vuoto."
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:406
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js:200
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:314
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:338
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:337
msgid "Code cannot be empty."
msgstr "Il codice non può essere vuoto."
@@ -3050,7 +3048,7 @@ msgstr "L'intestazione non può essere vuota."
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:56
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:25
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:450
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:428
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:425
msgid "Sequences"
msgstr "Sequenze"
@@ -3213,22 +3211,22 @@ msgid "System schema?"
msgstr "Schema di sistema?"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:409
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:322
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:319
msgid "Default TABLE privileges"
msgstr "Privilegi TABELLA predefiniti"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:412
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:325
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:322
msgid "Default SEQUENCE privileges"
msgstr "Privilegi SEQUENCE predefiniti"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:415
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:328
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:325
msgid "Default FUNCTION privileges"
msgstr "Privilegi FUNZIONE predefiniti"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:418
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:331
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:328
msgid "Default TYPE privileges"
msgstr "Privilegi TYPE predefiniti"
@@ -3237,9 +3235,9 @@ msgid "Default privileges"
msgstr "Privilegi di default"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:443
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:53
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:29
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:422
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:419
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:130
msgid "Tables"
msgstr "Tabelle"
@@ -3247,7 +3245,7 @@ msgstr "Tabelle"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:464
#: pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py:58
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:24
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:445
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:442
msgid "Types"
msgstr "Tipi"
@@ -3308,8 +3306,8 @@ msgstr "Sinonimo Pubblico?"
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:185
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:221
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:527
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:791
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:808
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:789
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:806
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:275
#: pgadmin/browser/static/js/browser.js:630 pgadmin/browser/static/js/node.js:1283
#: pgadmin/browser/static/js/node.js:1317
@@ -3317,17 +3315,17 @@ msgstr "Sinonimo Pubblico?"
#: pgadmin/misc/file_manager/templates/file_manager/index.html:78
#: pgadmin/static/js/backform.pgadmin.js:538
#: pgadmin/static/js/backgrid.pgadmin.js:621
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1741
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1786
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2385
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1735
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1780
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2379
msgid "Yes"
msgstr "Si"
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:185
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:221
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:527
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:792
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:809
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:790
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:807
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:275
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:147
#: pgadmin/browser/static/js/browser.js:631 pgadmin/browser/static/js/node.js:1284
@@ -3336,9 +3334,9 @@ msgstr "Si"
#: pgadmin/misc/file_manager/templates/file_manager/index.html:77
#: pgadmin/static/js/backform.pgadmin.js:539
#: pgadmin/static/js/backgrid.pgadmin.js:622
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1742
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1787
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2386
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1736
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1781
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2380
msgid "No"
msgstr "No"
@@ -3350,32 +3348,32 @@ msgstr "Lo schema di destinazione non può essere vuota."
msgid "Target object cannot be empty."
msgstr "L'oggetto di destinazione non può essere vuoto."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:359
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:357
msgid "Could not find the table."
msgstr "Impossibile trovare il tavolo."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:596
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1271
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:630
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1305
msgid "The specified table could not be found."
msgstr "La tabella specificata non è stata trovata."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1054
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1088
msgid "The specified table could not be found.\n"
msgstr "Impossibile trovare la tabella specificata. \n"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1067
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1101
msgid "Table dropped"
msgstr "Tabella eliminata"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1145
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1179
msgid "Trigger(s) have been disabled"
msgstr "I trigger(s) sono stati disabilitati"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1147
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1181
msgid "Trigger(s) have been enabled"
msgstr "I trigger(s) sono stati abilitati"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1501
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1535
#, python-format
msgid "Table rows counted: %s"
msgstr "Righe tabella rilevate: %s"
@@ -3428,7 +3426,7 @@ msgstr "La colonna è stata eliminata"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:608
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:704
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:856
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:853
msgid "Could not find the column on the server."
msgstr "Impossibile trovare la colonna sul server."
@@ -3574,70 +3572,70 @@ msgstr "Il trigger composto è stato eliminato"
msgid "Compound Trigger"
msgstr "Trigger composto"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:56
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:62
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:68
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:74
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:90
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:61
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:67
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:73
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:89
msgid "Compound Trigger..."
msgstr "Trigger composto..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:80
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:79
msgid "Enable compound trigger"
msgstr "Abilita il trigger composto"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:85
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:84
msgid "Disable compound trigger"
msgstr "Disabilita il trigger composto"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:169
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:168
msgid "Disable compound trigger failed"
msgstr "Disattivazione del trigger fallita"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:188
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:190
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:187
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:189
msgid "Trigger enabled?"
msgstr "Trigger abilitato?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:205
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:209
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:222
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:235
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:248
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:204
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:208
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:221
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:234
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:247
msgid "FOR Events"
msgstr "FOR Events"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:207
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:389
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:388
msgid "INSERT"
msgstr "INSERT"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:220
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:402
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:219
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:401
msgid "UPDATE"
msgstr "UPDATE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:233
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:415
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:232
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:414
msgid "DELETE"
msgstr "DELETE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:246
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:428
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:245
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:427
msgid "TRUNCATE"
msgstr "TRUNCATE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:303
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:512
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:302
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:511
msgid "System trigger?"
msgstr "Trigger di sistema?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:328
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:543
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:327
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:542
msgid "Specify at least one event."
msgstr "Specifica almeno un evento."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:347
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:346
msgid ""
"-- Enter any global declarations below:\n"
"\n"
@@ -3743,15 +3741,15 @@ msgstr "Impossibile trovare l'oggetto sul server."
msgid "Check constraint updated."
msgstr "Vincolo di controllo aggiornato."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:40
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:39
msgid "Check..."
msgstr "Controllo..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:46
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:45
msgid "Validate check constraint"
msgstr "Validazione vincolo di controllo"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:157
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:156
msgid "Don't validate?"
msgstr "Non convalidare?"
@@ -3787,7 +3785,7 @@ msgid "Exclusion constraint dropped."
msgstr "Vincolo di esclusione eliminato."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:38
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:97
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:96
msgid "Operator class"
msgstr "Classe operatore"
@@ -3815,10 +3813,10 @@ msgstr "Si prega di specificare l'operatore per la colonna: "
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:453
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:381
#: pgadmin/browser/server_groups/servers/static/js/variable.js:341
-#: pgadmin/static/js/backform.pgadmin.js:1260
-#: pgadmin/static/js/backform.pgadmin.js:1370
-#: pgadmin/static/js/backform.pgadmin.js:1550
-#: pgadmin/static/js/backform.pgadmin.js:1669
+#: pgadmin/static/js/backform.pgadmin.js:1259
+#: pgadmin/static/js/backform.pgadmin.js:1366
+#: pgadmin/static/js/backform.pgadmin.js:1546
+#: pgadmin/static/js/backform.pgadmin.js:1665
msgid "Add new row"
msgstr "Aggiungi nuova riga"
@@ -3830,7 +3828,7 @@ msgstr "Vincolo di esclusione"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:28
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:28
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:29
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:236
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:234
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/exclusion_constraint/sql/default/stats.sql:7
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/exclusion_constraint/sql/default/stats.sql:12
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/index_constraint/sql/default/stats.sql:7
@@ -3840,87 +3838,87 @@ msgstr "Vincolo di esclusione"
msgid "Index size"
msgstr "Dimensione dell'indice"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:642
msgid "Exclusion constraint..."
msgstr "Vincolo di esclusione..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:691
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:512
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:498
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:298
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:690
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:511
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:497
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:295
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:378
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:344
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:196
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:366
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:363
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:40
#: pgadmin/tools/backup/static/js/backup.js:366
#: pgadmin/tools/restore/static/js/restore.js:255
msgid "Tablespace"
msgstr "Tablespace"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:701
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:700
msgid "Access method"
msgstr "Metodo di accesso"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:716
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:326
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:715
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:322
msgid "Changing access method will clear columns collection"
msgstr "La modifica del metodo di accesso cancella la raccolta delle colonne"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:746
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:560
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:549
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:386
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:745
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:559
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:548
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:382
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:716
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:790
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:204
msgid "Fill factor"
msgstr "Fattore di riempimento"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:749
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:734
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:575
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:564
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:267
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:748
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:732
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:574
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:563
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:266
msgid "Deferrable?"
msgstr "Differibile?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:757
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:747
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:603
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:592
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:291
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:756
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:745
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:602
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:591
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:290
msgid "Deferred?"
msgstr "Differito?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:779
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:413
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:778
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:409
msgid "Constraint"
msgstr "Vincolo"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:908
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:415
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:401
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:348
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:439
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:907
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:414
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:400
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:344
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:435
msgid "Include columns"
msgstr "Include le colonne"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:931
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:242
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:438
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:228
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:424
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:370
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:461
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:930
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:241
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:437
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:227
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:423
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:366
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:457
msgid "Select the column(s)"
msgstr "Seleziona le colonne"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1012
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1011
msgid "Please specify name for exclusion constraint."
msgstr "Specificare il nome per il vincolo di esclusione."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1018
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1017
msgid "Please specify columns for exclusion constraint."
msgstr "Specificare le colonne per il vincolo di esclusione."
@@ -3978,53 +3976,53 @@ msgstr "Collegamenti"
msgid "Referencing"
msgstr "Referente"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:616
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:615
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:585
msgid "Foreign key"
msgstr "Chiave esterna"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:637
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:635
msgid "Foreign key..."
msgstr "Chiave esterna..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:641
msgid "Validate foreign key"
msgstr "Validazione chiave esterna"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:771
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:769
msgid "Match type"
msgstr "Tipo coincidenza"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:788
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:786
msgid "Validated?"
msgstr "Convalidato?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:804
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:802
msgid "Auto FK index?"
msgstr "Indice FK automatico?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:852
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:850
msgid "Covering index"
msgstr "Indice di copertura"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1002
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1000
msgid "On update"
msgstr "In aggiornamento"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1003
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1023
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1001
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1021
msgid "Action"
msgstr "Azione"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1022
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1020
msgid "On delete"
msgstr "In eliminazione"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1050
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1048
msgid "Please specify columns for Foreign key."
msgstr "Specificare le colonne per la chiave esterna."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1059
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1057
msgid "Please specify covering index name."
msgstr "Si prega di specificare il nome dell'indice di copertura."
@@ -4069,7 +4067,7 @@ msgstr "{0} eliminato."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py:996
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:20
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:43
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:42
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:557
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:729
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:811
@@ -4078,7 +4076,7 @@ msgstr "Chiave Primaria"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py:1006
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:20
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:43
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:42
msgid "Unique constraint"
msgstr "Vincolo di unicità"
@@ -4086,19 +4084,19 @@ msgstr "Vincolo di unicità"
msgid "Could not find the constraint in the table."
msgstr "Vincolo non trovato nella tabella."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:536
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:522
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:231
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:535
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:521
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:229
msgid "Index"
msgstr "Indice"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:644
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:633
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:632
#, python-format
msgid "Please specify columns for %s"
msgstr "Indica le colonne per %s"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:56
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:55
msgid "Oid"
msgstr "Oid"
@@ -4125,7 +4123,7 @@ msgid "Index is dropped"
msgstr "Indice eliminato"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:29
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:236
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:234
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:45
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:33
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:49
@@ -4142,59 +4140,63 @@ msgstr "Indice eliminato"
msgid "Size"
msgstr "Dimensione"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:130
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:128
msgid "Sort order"
msgstr "Ordine di classificazione"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:151
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:149
msgid "NULLs"
msgstr "NULLs"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:248
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:254
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:260
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:266
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:272
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:245
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:251
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:257
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:263
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:269
msgid "Index..."
msgstr "Indice..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:311
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:308
msgid "Access Method"
msgstr "Metodo di accesso"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:390
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:386
msgid "Unique?"
msgstr "Unico?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:394
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:390
msgid "Clustered?"
msgstr "Clustered?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:398
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:394
msgid "Valid?"
msgstr "Valido?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:402
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:398
msgid "Primary?"
msgstr "Primario?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:406
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:402
msgid "System index?"
msgstr "Índice di sistema?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:409
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:405
msgid "Concurrent build?"
msgstr "Build simultaneo?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:501
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:497
+msgid "Tablespace cannot be empty."
+msgstr "Tablespace non può essere vuoto."
+
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:503
msgid "Access method cannot be empty."
msgstr "Il metodo di accesso non può essere vuoto."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:509
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:511
msgid "You must specify column name."
msgstr "Devi specificare il nome della colonna."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:514
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:516
msgid "You must specify at least one column."
msgstr "Devi specificare almeno una colonna."
@@ -4590,39 +4592,39 @@ msgstr "Regola eliminata"
msgid "rule"
msgstr "regola"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:93
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:99
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:105
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:111
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:117
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:92
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:98
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:104
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:110
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:116
msgid "Rule..."
msgstr "Regola..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:165
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:164
#: pgadmin/static/js/sqleditor/query_tool_notifications.js:32
#: pgadmin/static/js/sqleditor/query_tool_notifications.js:80
msgid "Event"
msgstr "Evento"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:179
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:178
msgid "Do instead?"
msgstr "Fare invece?"
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:182
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:183
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:184
msgid "Condition"
msgstr "Condizione"
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:188
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:189
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:190
msgid "Commands"
msgstr "Comandi"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:195
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:194
msgid "System rule?"
msgstr "Regola di sistema?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:215
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:214
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:241
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:183
msgid "Please specify name."
@@ -5205,56 +5207,56 @@ msgstr "Trigger eliminato"
msgid "Trigger"
msgstr "Trigger"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:56
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:62
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:68
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:74
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:90
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:61
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:67
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:73
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:89
msgid "Trigger..."
msgstr "Trigger..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:80
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:79
msgid "Enable trigger"
msgstr "Abilita trigger"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:85
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:84
msgid "Disable trigger"
msgstr "Disabilita il trigger"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:169
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:168
msgid "Disable trigger failed"
msgstr "Disabilitazione del trigger non riuscita"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:205
msgid "Row trigger?"
msgstr "Trigger di riga?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:247
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:246
msgid "Constraint trigger?"
msgstr "Trigger del vincolo?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:346
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:345
msgid "Fires"
msgstr "Incendi"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:481
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:480
msgid "Old table"
msgstr "Vecchia tabella"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:482
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:488
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:481
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:487
msgid "Transition"
msgstr "Transazione"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:487
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:486
msgid "New table"
msgstr "Nuova tabella"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:536
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:535
msgid "Trigger function cannot be empty."
msgstr "La funzione di trigger non può essere vuota."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:556
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:555
msgid "Trigger code cannot be empty."
msgstr "Il codice del Trigger non può essere vuoto."
@@ -5642,7 +5644,7 @@ msgid "Size of temporary files"
msgstr "Dimensione dei files temporanei"
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:45
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:309
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:306
#: pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.2_plus/stats.sql:2
#: pgadmin/browser/server_groups/servers/databases/templates/databases/sql/default/stats.sql:2
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:176
@@ -5696,35 +5698,35 @@ msgstr "Disconnetti il database"
msgid "Are you sure you want to disconnect the database - %s?"
msgstr "Sei sicuro di voler disconnettere il database - %s?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:337
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:334
#: pgadmin/static/js/browser/server_groups/servers/databases/external_tables/external_tables.js:52
#: pgadmin/tools/backup/static/js/backup.js:192
#: pgadmin/tools/import_export/static/js/import_export.js:108
msgid "Encoding"
msgstr "Codifica"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:380
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:377
msgid "Character type"
msgstr "Tipo carattere"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:385
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:382
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:413
msgid "Connection limit"
msgstr "Limite di connessione"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:388
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:385
msgid "Template?"
msgstr "Template?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:392
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:389
msgid "Allow connections?"
msgstr "Connessioni concesse?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:417
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:414
msgid "Default Privileges"
msgstr "Privilegi predefiniti"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:499
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:496
msgid "Connect to database"
msgstr "Connettere al database"
@@ -6559,7 +6561,7 @@ msgstr "Tipo"
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:139
#: pgadmin/browser/static/js/browser.js:224
#: pgadmin/dashboard/static/js/dashboard.js:191
-#: pgadmin/static/js/backform.pgadmin.js:2032
+#: pgadmin/static/js/backform.pgadmin.js:2028
msgid "SQL"
msgstr "SQL"
@@ -7184,8 +7186,8 @@ msgid "At least one privilege should be selected."
msgstr "È necessario selezionare almeno un privilegio."
#: pgadmin/browser/server_groups/servers/static/js/server.js:46
-msgid "Security label must be specified."
-msgstr "È necessario specificare un'etichetta di sicurezza."
+msgid "Label must be specified."
+msgstr "Il nome dell'etichetta deve essere indicato."
#: pgadmin/browser/server_groups/servers/static/js/server.js:79
#: pgadmin/browser/server_groups/servers/static/js/server.js:84
@@ -7283,20 +7285,20 @@ msgstr "Cambia la password "
#: pgadmin/misc/file_manager/static/js/create_dialogue.js:188
#: pgadmin/misc/file_manager/static/js/select_dialogue.js:86
#: pgadmin/misc/file_manager/static/js/select_dialogue.js:129
-#: pgadmin/preferences/static/js/preferences.js:435
+#: pgadmin/preferences/static/js/preferences.js:434
#: pgadmin/static/js/slickgrid/editors.js:50
-#: pgadmin/static/js/sqleditor/filter_dialog.js:79
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:62
-#: pgadmin/tools/datagrid/static/js/show_data.js:139
+#: pgadmin/static/js/sqleditor/filter_dialog.js:78
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:61
+#: pgadmin/tools/datagrid/static/js/show_data.js:138
#: pgadmin/tools/debugger/static/js/debugger_ui.js:588
#: pgadmin/tools/debugger/static/js/debugger_ui.js:893
#: pgadmin/tools/import_export/static/js/import_export.js:495
-#: pgadmin/tools/maintenance/static/js/maintenance.js:297
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:56
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2010
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2164
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4222
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4289
+#: pgadmin/tools/maintenance/static/js/maintenance.js:296
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:55
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2004
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2158
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4216
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4283
msgid "Cancel"
msgstr "Annulla"
@@ -7518,7 +7520,7 @@ msgid "Connection timeout (seconds)"
msgstr "Timeout connessione (secondi)"
#: pgadmin/browser/server_groups/servers/static/js/server.js:1130
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2192
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2186
msgid "Connect to Server"
msgstr "Connettere al Server"
@@ -7773,14 +7775,14 @@ msgstr "Dipendenze"
msgid "Dependents"
msgstr "Dipendenti da"
-#: pgadmin/browser/static/js/browser.js:348 pgadmin/browser/static/js/toolbar.js:30
-#: pgadmin/browser/static/js/toolbar.js:31 pgadmin/browser/static/js/toolbar.js:91
+#: pgadmin/browser/static/js/browser.js:348 pgadmin/browser/static/js/toolbar.js:29
+#: pgadmin/browser/static/js/toolbar.js:88
#: pgadmin/tools/datagrid/static/js/datagrid.js:74
msgid "View Data"
msgstr "Vista dati"
#: pgadmin/browser/static/js/browser.js:349 pgadmin/browser/static/js/toolbar.js:20
-#: pgadmin/browser/static/js/toolbar.js:21 pgadmin/browser/static/js/toolbar.js:93
+#: pgadmin/browser/static/js/toolbar.js:90
#: pgadmin/tools/datagrid/static/js/datagrid.js:75
msgid "Filtered Rows"
msgstr "Righe filtrate"
@@ -8023,10 +8025,10 @@ msgid "Changes will be lost. Are you sure you want to reset?"
msgstr "Le modifiche saranno perse. Sei sicuro di voler effettuare il ripristino?"
#: pgadmin/browser/static/js/node.js:1513
-#: pgadmin/preferences/static/js/preferences.js:439
-#: pgadmin/preferences/static/js/preferences.js:464
+#: pgadmin/preferences/static/js/preferences.js:438
+#: pgadmin/preferences/static/js/preferences.js:463
#: pgadmin/tools/datagrid/templates/datagrid/index.html:37
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4297
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4291
msgid "Save"
msgstr "Salva"
@@ -8047,18 +8049,16 @@ msgstr "Seleziona tutto"
msgid "Unselect All"
msgstr "Deseleziona tutto"
-#: pgadmin/browser/static/js/toolbar.js:40 pgadmin/browser/static/js/toolbar.js:41
-#: pgadmin/browser/static/js/toolbar.js:89
+#: pgadmin/browser/static/js/toolbar.js:38 pgadmin/browser/static/js/toolbar.js:86
#: pgadmin/tools/datagrid/static/js/datagrid.js:103
#: pgadmin/tools/datagrid/static/js/datagrid.js:115
#: pgadmin/tools/sqleditor/__init__.py:68
msgid "Query Tool"
msgstr "Query editor"
-#: pgadmin/browser/static/js/wizard.js:85 pgadmin/browser/static/js/wizard.js:86
+#: pgadmin/browser/static/js/wizard.js:86
#: pgadmin/static/js/alertify.pgadmin.defaults.js:261
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:263
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:457
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:455
#: pgadmin/templates/security/messages.html:7
#: pgadmin/tools/user_management/static/js/user_management.js:81
#: pgadmin/tools/user_management/static/js/user_management.js:174
@@ -8066,10 +8066,9 @@ msgstr "Query editor"
msgid "Close"
msgstr "Chiudi"
-#: pgadmin/browser/static/js/wizard.js:88 pgadmin/browser/static/js/wizard.js:89
+#: pgadmin/browser/static/js/wizard.js:89
#: pgadmin/static/js/alertify.pgadmin.defaults.js:262
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:264
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:458
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:456
msgid "Maximize"
msgstr "Massimizzare"
@@ -8077,22 +8076,6 @@ msgstr "Massimizzare"
msgid "Left panel logo"
msgstr "Logo del pannello sinistro"
-#: pgadmin/browser/static/js/wizard.js:124
-msgid "Close error bar"
-msgstr "Chiudi la barra degli errori"
-
-#: pgadmin/browser/static/js/wizard.js:131
-#: pgadmin/browser/templates/browser/index.html:135 pgadmin/help/__init__.py:59
-#: pgadmin/help/__init__.py:70 pgadmin/preferences/static/js/preferences.js:427
-#: pgadmin/static/js/sqleditor/filter_dialog.js:72
-#: pgadmin/static/js/sqleditor/filter_dialog.js:73
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:56
-#: pgadmin/tools/datagrid/static/js/show_data.js:133
-#: pgadmin/tools/maintenance/static/js/maintenance.js:289
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:50
-msgid "Help"
-msgstr "Aiuto"
-
#: pgadmin/browser/static/js/wizard.js:139
#: pgadmin/misc/file_manager/templates/file_manager/index.html:15
msgid "Back"
@@ -8130,6 +8113,11 @@ msgstr "Administrazione"
msgid "Tools"
msgstr "Strumenti"
+#: pgadmin/browser/templates/browser/index.html:135 pgadmin/help/__init__.py:59
+#: pgadmin/help/__init__.py:70 pgadmin/static/js/sqleditor/filter_dialog.js:72
+msgid "Help"
+msgstr "Aiuto"
+
#: pgadmin/browser/templates/browser/index.html:157
msgid "Logout"
msgstr "Disconnettersi"
@@ -8526,7 +8514,7 @@ msgstr "Ricerca"
#: pgadmin/dashboard/templates/dashboard/database_dashboard.html:88
#: pgadmin/dashboard/templates/dashboard/server_dashboard.html:92
#: pgadmin/misc/file_manager/templates/file_manager/index.html:27
-#: pgadmin/preferences/static/js/preferences.js:492
+#: pgadmin/preferences/static/js/preferences.js:491
msgid "Refresh"
msgstr "Aggiorna"
@@ -9051,33 +9039,13 @@ msgstr "Grafico"
msgid "Analysis"
msgstr "Analisi"
-#: pgadmin/misc/static/explain/js/explain.js:1286
-#: pgadmin/misc/static/explain/js/explain.js:1287
-msgid "Zoom in"
-msgstr "Ingrandisci"
-
-#: pgadmin/misc/static/explain/js/explain.js:1295
-#: pgadmin/misc/static/explain/js/explain.js:1296
-msgid "Zoom to original"
-msgstr "Zoom sull'originale"
-
-#: pgadmin/misc/static/explain/js/explain.js:1304
-#: pgadmin/misc/static/explain/js/explain.js:1305
-msgid "Zoom out"
-msgstr "Rimpicciolisci"
-
-#: pgadmin/misc/static/explain/js/explain.js:1319
-#: pgadmin/misc/static/explain/js/explain.js:1320
-msgid "Download"
-msgstr "Scaricare"
-
#: pgadmin/misc/statistics/static/js/statistics.js:214
msgid "No statistics are available for the selected object."
msgstr "Non sono disponibili statistiche per l'oggetto selezionato."
#: pgadmin/preferences/__init__.py:55
#: pgadmin/preferences/static/js/preferences.js:426
-#: pgadmin/preferences/static/js/preferences.js:449
+#: pgadmin/preferences/static/js/preferences.js:448
msgid "Preferences"
msgstr "Preferenze"
@@ -9102,11 +9070,11 @@ msgstr "Nascondere"
msgid "Category is not selected."
msgstr "Non è stata selezionata la categoria."
-#: pgadmin/preferences/static/js/preferences.js:483
+#: pgadmin/preferences/static/js/preferences.js:482
msgid "Refresh required"
msgstr "Rinfresco necessario"
-#: pgadmin/preferences/static/js/preferences.js:484
+#: pgadmin/preferences/static/js/preferences.js:483
msgid ""
"A page refresh is required to apply the theme. Do you wish to refresh the page "
"now?"
@@ -9114,7 +9082,7 @@ msgstr ""
"Un rinfresco della pagina è necessario per mostrare il tema. Vuoi rinfrescare la "
"pagina adesso?"
-#: pgadmin/preferences/static/js/preferences.js:493
+#: pgadmin/preferences/static/js/preferences.js:492
msgid "Later"
msgstr "Più tardi"
@@ -9159,37 +9127,33 @@ msgstr "Errore sconosciuto"
msgid "INTERNAL SERVER ERROR"
msgstr "ERRORE INTERNO DEL SERVER"
-#: pgadmin/static/js/backform.pgadmin.js:1550
-msgid "Add"
-msgstr "Aggiungi"
-
-#: pgadmin/static/js/backform.pgadmin.js:1841
+#: pgadmin/static/js/backform.pgadmin.js:1837
msgid "No updates."
msgstr "Nessun aggiornamento."
-#: pgadmin/static/js/backform.pgadmin.js:1956
+#: pgadmin/static/js/backform.pgadmin.js:1952
msgid "General"
msgstr "Generale"
-#: pgadmin/static/js/backform.pgadmin.js:2157
+#: pgadmin/static/js/backform.pgadmin.js:2153
msgid "Preview not available..."
msgstr "Anteprima non disponibile..."
-#: pgadmin/static/js/backform.pgadmin.js:2618
+#: pgadmin/static/js/backform.pgadmin.js:2605
#: pgadmin/tools/backup/static/js/backup.js:95
#: pgadmin/tools/backup/static/js/backup.js:230
msgid "Note"
msgstr "Nota"
-#: pgadmin/static/js/backform.pgadmin.js:2974
+#: pgadmin/static/js/backform.pgadmin.js:2961
msgid "More"
msgstr "Di più"
-#: pgadmin/static/js/backform.pgadmin.js:2975
+#: pgadmin/static/js/backform.pgadmin.js:2962
msgid "Less"
msgstr "Meno"
-#: pgadmin/static/js/backform.pgadmin.js:3059
+#: pgadmin/static/js/backform.pgadmin.js:3046
msgid "Space"
msgstr "Spazio"
@@ -9218,7 +9182,7 @@ msgstr "Questo oggetto non può essere cancellato."
msgid "Delete row"
msgstr "Eliminare riga"
-#: pgadmin/static/js/backgrid.pgadmin.js:1098
+#: pgadmin/static/js/backgrid.pgadmin.js:1091
msgid "Array Values"
msgstr "Valori dell'array"
@@ -9375,13 +9339,13 @@ msgstr "La query è stata restituita correttamente in %s."
msgid "Sort/Filter options"
msgstr "Opzioni di Ordinamento/Filtro"
-#: pgadmin/static/js/sqleditor/filter_dialog.js:239
+#: pgadmin/static/js/sqleditor/filter_dialog.js:238
msgid "Filter updated successfully"
msgstr "Filtro aggiornato correttamente"
-#: pgadmin/static/js/sqleditor/filter_dialog.js:245
-#: pgadmin/tools/datagrid/static/js/show_data.js:238
-#: pgadmin/tools/datagrid/static/js/show_data.js:245
+#: pgadmin/static/js/sqleditor/filter_dialog.js:244
+#: pgadmin/tools/datagrid/static/js/show_data.js:237
+#: pgadmin/tools/datagrid/static/js/show_data.js:244
msgid "Validation Error"
msgstr "Errore di convalida"
@@ -9462,7 +9426,6 @@ msgstr "Salva file"
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:40
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:41
-#: pgadmin/tools/datagrid/templates/datagrid/index.html:56
#: pgadmin/tools/datagrid/templates/datagrid/index.html:68
msgid "Find"
msgstr "Cerca"
@@ -9546,14 +9509,14 @@ msgstr "Salva le modifiche ai dati"
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:129
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:131
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4230
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4224
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:663
msgid "Commit"
msgstr "Commettere"
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:135
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:137
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4227
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4221
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:681
msgid "Rollback"
msgstr "Rollback"
@@ -9631,7 +9594,7 @@ msgstr "Questo URL non può essere richiesto direttamente."
#: pgadmin/tools/backup/__init__.py:43
#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:46
#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:55
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:67
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:66
msgid "Backup"
msgstr "Backup"
@@ -9910,8 +9873,8 @@ msgstr "Backup..."
#: pgadmin/tools/backup/static/js/backup_dialog.js:71
#: pgadmin/tools/import_export/static/js/import_export.js:685
#: pgadmin/tools/import_export/static/js/import_export.js:699
-#: pgadmin/tools/maintenance/static/js/maintenance.js:477
-#: pgadmin/tools/maintenance/static/js/maintenance.js:488
+#: pgadmin/tools/maintenance/static/js/maintenance.js:476
+#: pgadmin/tools/maintenance/static/js/maintenance.js:487
#: pgadmin/tools/restore/static/js/restore_dialog.js:51
#: pgadmin/tools/restore/static/js/restore_dialog.js:75
msgid "Utility not found"
@@ -9919,25 +9882,25 @@ msgstr "Utilità non trovata"
#: pgadmin/tools/backup/static/js/backup_dialog.js:72
#: pgadmin/tools/import_export/static/js/import_export.js:700
-#: pgadmin/tools/maintenance/static/js/maintenance.js:489
+#: pgadmin/tools/maintenance/static/js/maintenance.js:488
#: pgadmin/tools/restore/static/js/restore_dialog.js:76
msgid "Failed to fetch Utility information"
msgstr "Impossibile recuperare le informazioni sull'utilità"
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:159
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:158
msgid "Backup job created."
msgstr "Processo di backup creato."
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:163
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:162
msgid "Backup job creation failed."
msgstr "Creazione del processo di backup non riuscita."
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:171
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:170
msgid "Backup job failed."
msgstr "Processo di backup non riuscito."
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:242
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:229
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:241
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:228
msgid "Please provide a filename"
msgstr "Gentilmente fornisci un nome per il file"
@@ -9986,7 +9949,7 @@ msgstr "Nessun oggetto selezionato."
msgid "Data Filter"
msgstr "Filtro dati"
-#: pgadmin/tools/datagrid/static/js/show_data.js:161
+#: pgadmin/tools/datagrid/static/js/show_data.js:160
msgid "Use SHIFT + ENTER to apply filter..."
msgstr "Usa SHIFT + ENTER per applicare il filtro..."
@@ -10569,30 +10532,6 @@ msgstr "Pila"
msgid "Debugger - "
msgstr "Debugger - "
-#: pgadmin/tools/debugger/templates/debugger/direct.html:59
-msgid "Step into"
-msgstr "Entra"
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:67
-msgid "Step over"
-msgstr "Passa oltre"
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:75
-msgid "Continue/Start"
-msgstr "Continua/Comincia"
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:85
-msgid "Toggle breakpoint"
-msgstr "Rimuovi punto di interruzione"
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:93
-msgid "Clear all breakpoints"
-msgstr "Rimuovi tutti i punti di interruzione"
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:103
-msgid "Stop"
-msgstr "Fermati"
-
#: pgadmin/tools/grant_wizard/__init__.py:327
msgid "Unable to fetch the {} objects"
msgstr "Impossibile recuperare gli oggetti {}"
@@ -10952,7 +10891,7 @@ msgstr "Messaggi dettagliati"
#: pgadmin/tools/maintenance/static/js/maintenance.js:167
#: pgadmin/tools/maintenance/static/js/maintenance.js:183
-#: pgadmin/tools/maintenance/static/js/maintenance.js:483
+#: pgadmin/tools/maintenance/static/js/maintenance.js:482
msgid "Maintenance..."
msgstr "Manutenzione..."
@@ -10968,15 +10907,15 @@ msgstr ""
"Creazione dell'operazione di manutenzione fallita. I database con il simbolo = "
"nel nome non possono essere manutenuti con questa utility."
-#: pgadmin/tools/maintenance/static/js/maintenance.js:387
-#: pgadmin/tools/maintenance/static/js/maintenance.js:394
+#: pgadmin/tools/maintenance/static/js/maintenance.js:386
+#: pgadmin/tools/maintenance/static/js/maintenance.js:393
msgid "Maintenance job creation failed."
msgstr "Creazione dell'operazione di manutenzione fallita."
#: pgadmin/tools/restore/__init__.py:41
#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:40
#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:49
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:62
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:61
msgid "Restore"
msgstr "Ripristina"
@@ -11042,15 +10981,15 @@ msgstr "Ripristina..."
msgid "Restore (%s: %s)"
msgstr "Ripristinare (%s: %s)"
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:149
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:148
msgid "Restore job created."
msgstr "Operazione di ripristino creata."
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:153
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:152
msgid "Restore job creation failed."
msgstr "Ripristino creazione operazione non riuscita."
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:161
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:160
msgid "Restore job failed."
msgstr "Operazione di ripristino fallita."
@@ -11130,38 +11069,38 @@ msgstr "Notifiche"
msgid "Geometry Viewer"
msgstr "Visualizzatore delle geometrie"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:832
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:826
msgid "Editable column"
msgstr "Colonna modificabile"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:834
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:828
msgid "Read-only column"
msgstr "Colonna di sola lettura"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1261
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1255
msgid "Fetching all records..."
msgstr "Recupero di tutti i record ..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1730
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2369
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3314
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1724
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2363
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3308
msgid "Unsaved changes"
msgstr "Modifiche non salvate"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1731
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3315
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1725
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3309
msgid "Are you sure you wish to discard the current changes?"
msgstr "Sei sicuro di voler annullare le modifiche correnti?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1759
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1753
msgid "Clear history"
msgstr "Pulisci cronologia"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1760
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1754
msgid "Are you sure you wish to clear the history?"
msgstr "Sei sicuro di voler cancellare la cronologia?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1761
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1755
msgid ""
"This will remove all of your query history from this and other sessions for this "
"database."
@@ -11169,42 +11108,42 @@ msgstr ""
"Ciò rimuoverà tutta la cronologia delle query da questa e altre sessioni per "
"questo database."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2125
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2119
msgid "Connection Warning"
msgstr "Advertencia de Conexión"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2132
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2126
msgid "The application has lost the database connection:"
msgstr "L'applicativo ha perso la connessione col database:"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2136
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2130
msgid "⁃ If the connection was idle it may have been forcibly disconnected."
msgstr ""
"- Se la connessione era inattiva potrebbe essere stata chiusa forzatamente."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2138
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2132
msgid "⁃ The application server or database server may have been restarted."
msgstr ""
"- L'application server o il database server potrebbero essere stati riavviati."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2140
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2134
msgid "⁃ The user session may have timed out."
msgstr "- La sessione utente potrebbe essere scaduta."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2144
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2138
msgid "Do you want to continue and establish a new session?"
msgstr "Vuoi continuare e stabilire una nuova sessione?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2163
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2157
msgid "Continue"
msgstr "Continua"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2299
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2293
#, python-format
msgid "Error fetching SQL for script: %s."
msgstr "Errore durante il recupero di SQL per lo script: %s ."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2370
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2364
msgid ""
"The data has been modified, but not saved. Are you sure you wish to discard the "
"changes?"
@@ -11212,59 +11151,59 @@ msgstr ""
"I dati sono stati modificati, ma non salvati. Sei sicuro di voler annullare le "
"modifiche?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2414
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2408
msgid "Running query..."
msgstr "Esecuzione della query ..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2422
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2416
msgid "Waiting for the query to complete..."
msgstr "In attesa del completamento della query ..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2579
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2573
msgid "Loading data from the database server and rendering..."
msgstr "Caricamento dati dal server dei database e renderizzazione..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2588
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2582
#, python-format
msgid "Successfully run. Total query runtime: %s."
msgstr "Eseguito con successo. Durata totale della query: %s."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2589
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2583
#, python-format
msgid "%s rows affected."
msgstr "%s righe interessate."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2865
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2859
msgid ""
"This query was generated by pgAdmin as part of a \"View/Edit Data\" operation"
msgstr ""
"Questa query è stata generata da pgAdmin come parte di una operazione di vista/"
"modifica dati"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2966
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2960
msgid "Row(s) deleted."
msgstr "Fila (e) cancellata."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3040
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3034
msgid "Saving the updated data..."
msgstr "Salvataggio dei dati aggiornati ..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3156
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3150
msgid "Data saved successfully."
msgstr "Dati salvati correttamente."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3159
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3153
msgid "Auto-commit is off. You still need to commit changes to the database."
msgstr ""
"Il commit automatico è disattivato. È ancora necessario eseguire il commit delle "
"modifiche al database."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3165
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3159
#, python-format
msgid "%s."
msgstr "%s."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3170
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3164
msgid ""
"Saving data changes was rolled back but the current transaction is still active; "
"previous queries are unaffected."
@@ -11272,98 +11211,98 @@ msgstr ""
"Il salvataggio delle modifiche ai dati è stato eseguito il rollback ma la "
"transazione corrente è ancora attiva; le query precedenti non sono interessate."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3192
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3186
msgid "This query was generated by pgAdmin as part of a \"Save Data\" operation"
msgstr ""
"Questa query è stata generata da pgAdmin come parte di una operazione di "
"salvataggio dati"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3353
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3347
msgid "Loading the file..."
msgstr "Caricare il file..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3404
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3398
msgid "Saving the queries in the file..."
msgstr "Salvataggio delle query nel file ..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3416
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3410
msgid "File saved successfully."
msgstr "FIle salvati correttamente."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3538
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3597
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3532
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3591
msgid "Applying the new filter..."
msgstr "Applica il nuovo filtro..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3558
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3568
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3552
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3562
msgid "Filter By Selection Error"
msgstr "Filtra per errore di selezione"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3617
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3627
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3611
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3621
msgid "Filter Exclude Selection Error"
msgstr "Il filtro esclude l'errore di selezione"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3637
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3631
msgid "Removing the filter..."
msgstr "Rimuovi il filtro..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3655
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3665
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3649
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3659
msgid "Remove Filter Error"
msgstr "Rimuovi errore filtro"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3768
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3762
msgid "Setting the limit on the result..."
msgstr "Impostazione del limite sul risultato ..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3787
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3796
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3781
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3790
msgid "Change limit Error"
msgstr "Errore limite di modifica"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3922
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3941
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3916
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3935
msgid "Cancel Query Error"
msgstr "Annulla errore query"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3960
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3954
msgid "Downloading CSV..."
msgstr "Scarica CSV..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4014
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4008
msgid "CSV Download cancelled."
msgstr "Scaricamento CSV annullato."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4017
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4011
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:395
msgid "Download CSV"
msgstr "Scarica CSV"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4020
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4014
msgid "Download CSV error"
msgstr "Errore scaricamento CSV"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4054
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4061
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4048
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4055
msgid "Auto Rollback Error"
msgstr "Errore di rollback automatico"
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4081
#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4087
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4093
msgid "Auto Commit Error"
msgstr "Error en Auto Commit"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4182
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4176
msgid "The data has changed. Do you want to save changes?"
msgstr "La data è cambiata. Vuoi salvare le modifiche?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4188
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4182
msgid "The text has changed. Do you want to save changes?"
msgstr "Il testo è cambiato Vuoi salvare le modifiche?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4268
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4262
msgid ""
"The current transaction is not commited to the database.Do you want to commit or "
"rollback the transaction?"
@@ -11371,15 +11310,15 @@ msgstr ""
"La transazione corrente non è sottoposta a commit nel database. Vuoi eseguire il "
"commit o il rollback della transazione?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4271
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4265
msgid "Commit transaction?"
msgstr "Effettua transazione?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4294
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4288
msgid "Don't save"
msgstr "Non salvare"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4337
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4331
msgid "Save changes?"
msgstr "Salvare le modifiche?"
@@ -12145,9 +12084,3 @@ msgstr "Impossibile trovare il database richiesto."
#~ msgid "Error dropping %s: \"%s\""
#~ msgstr "Errore durante la caduta di %s : \\ \" %s \""
-
-#~ msgid "Tablespace cannot be empty."
-#~ msgstr "Tablespace non può essere vuoto."
-
-#~ msgid "Label must be specified."
-#~ msgstr "Il nome dell'etichetta deve essere indicato."
diff --git a/web/pgadmin/translations/ja/LC_MESSAGES/messages.mo b/web/pgadmin/translations/ja/LC_MESSAGES/messages.mo
index 4d5cb88885f7a060052c65cd82129aeb7e9f7435..4cd55a66b397034c935870150d300d4ed6de1deb 100644
GIT binary patch
delta 34862
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
H0rCGIGku}c
delta 35320
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
diff --git a/web/pgadmin/translations/ja/LC_MESSAGES/messages.po b/web/pgadmin/translations/ja/LC_MESSAGES/messages.po
index 94ccaec17..378a88cca 100644
--- a/web/pgadmin/translations/ja/LC_MESSAGES/messages.po
+++ b/web/pgadmin/translations/ja/LC_MESSAGES/messages.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: pgAdmin 4\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-01-03 19:02+0530\n"
-"PO-Revision-Date: 2020-01-05 22:04+0900\n"
+"POT-Creation-Date: 2019-12-06 19:29+0530\n"
+"PO-Revision-Date: 2019-12-07 19:19+0900\n"
"Last-Translator: \n"
"Language: ja\n"
"Language-Team: ja\n"
@@ -47,13 +47,13 @@ msgstr "デスクトップ"
#: pgadmin/static/js/slickgrid/editors.js:50
#: pgadmin/static/js/slickgrid/editors.js:60
#: pgadmin/static/js/slickgrid/editors.js:61
-#: pgadmin/static/js/sqleditor/filter_dialog.js:84
-#: pgadmin/tools/datagrid/static/js/show_data.js:143
-#: pgadmin/tools/datagrid/static/js/show_data.js:218
+#: pgadmin/static/js/sqleditor/filter_dialog.js:83
+#: pgadmin/tools/datagrid/static/js/show_data.js:142
+#: pgadmin/tools/datagrid/static/js/show_data.js:217
#: pgadmin/tools/import_export/static/js/import_export.js:500
-#: pgadmin/tools/maintenance/static/js/maintenance.js:302
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2005
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2035
+#: pgadmin/tools/maintenance/static/js/maintenance.js:301
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1999
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2029
msgid "OK"
msgstr "OK"
@@ -462,7 +462,7 @@ msgstr "必須のプロパティが入力されていません"
#: pgadmin/browser/utils.py:386
#: pgadmin/static/js/alertify.pgadmin.defaults.js:102
#: pgadmin/static/js/alertify.pgadmin.defaults.js:163
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:305
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:303
#: pgadmin/tools/grant_wizard/__init__.py:129 pgadmin/utils/exception.py:35
msgid "Connection to the server has been lost."
msgstr "サーバへの接続が切断されました"
@@ -581,7 +581,7 @@ msgid "No parameters were changed."
msgstr "パラメータは変更されませんでした"
#: pgadmin/browser/server_groups/servers/__init__.py:767
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:567
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:562
#: pgadmin/browser/server_groups/servers/databases/casts/__init__.py:370
#: pgadmin/browser/server_groups/servers/databases/extensions/__init__.py:264
#: pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py:395
@@ -603,7 +603,7 @@ msgstr "パラメータは変更されませんでした"
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:365
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:569
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/__init__.py:436
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:888
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:922
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:393
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py:484
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py:478
@@ -774,33 +774,33 @@ msgstr "処理「%s」のユーティリティが見つかりませんでした"
msgid "PostgreSQL"
msgstr "PostgreSQL"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:38
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:37
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:21
msgid "Databases"
msgstr "データベース"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:375
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:391
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:654
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:724
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:849
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:1021
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:374
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:390
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:649
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:719
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:844
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:1016
msgid "Could not find the database on the server."
msgstr "データベースがサーバ内に見つかりませんでした"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:469
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:468
msgid "Database connected."
msgstr "データベースに接続しました"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:488
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:485
msgid "Database could not be disconnected."
msgstr "データベースへの接続を切断できませんでした"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:492
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:489
msgid "Database disconnected."
msgstr "データベースへの接続を切断しました"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:777
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:772
#: pgadmin/browser/server_groups/servers/databases/casts/__init__.py:483
#: pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py:522
#: pgadmin/browser/server_groups/servers/databases/extensions/__init__.py:357
@@ -815,10 +815,10 @@ msgstr "データベースへの接続を切断しました"
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py:548
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py:488
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py:453
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:830
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:829
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py:441
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:462
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1051
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1085
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:474
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py:565
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py:591
@@ -836,11 +836,11 @@ msgstr "データベースへの接続を切断しました"
msgid "Error: Object not found."
msgstr "エラー: オブジェクトが見つかりません"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:780
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:775
msgid "The specified database could not be found.\n"
msgstr "指定されたデータべースが見つかりませんでした\n"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:876
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:871
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:728
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:1561
msgid " -- definition incomplete"
@@ -936,19 +936,19 @@ msgstr "キャスト..."
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:93
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:39
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:210
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:182
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:107
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:670
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:712
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:119
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:105
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:53
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:292
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:181
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:106
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:669
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:710
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:118
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:104
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:52
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:289
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:358
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:131
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:130
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:265
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:324
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:184
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:183
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:324
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:148
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:112
@@ -1000,22 +1000,22 @@ msgstr "名称"
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:114
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog.js:65
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:393
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:185
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:110
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:673
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:716
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:123
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:109
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:295
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:184
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:109
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:672
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:714
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:122
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:108
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:292
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:361
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:146
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:145
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:254
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:327
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:187
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:186
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:328
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:151
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:115
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:312
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:309
#: pgadmin/browser/server_groups/servers/resource_groups/static/js/resource_group.js:87
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:391
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:344
@@ -1130,56 +1130,56 @@ msgstr "変換元のタイプ"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:654
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:658
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:662
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:137
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:158
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:692
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:702
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:747
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:750
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:758
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:781
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:735
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:748
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:772
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:789
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:805
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:853
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:144
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:416
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:513
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:538
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:561
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:576
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:604
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:130
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:402
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:499
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:523
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:550
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:565
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:593
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:315
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:346
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:349
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:136
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:157
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:691
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:701
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:746
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:749
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:757
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:780
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:733
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:746
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:770
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:787
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:803
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:851
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:143
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:415
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:512
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:537
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:560
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:575
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:603
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:129
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:401
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:498
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:522
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:549
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:564
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:592
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:311
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:342
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:345
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:384
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:388
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:392
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:396
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:400
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:404
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:407
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:411
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:415
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:418
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:440
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:166
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:179
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:191
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:207
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:250
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:268
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:292
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:318
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:323
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:414
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:436
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:165
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:190
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:249
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:267
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:291
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:317
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:322
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:350
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:375
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:385
@@ -1191,14 +1191,14 @@ msgstr "変換元のタイプ"
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:173
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:136
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:140
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:338
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:343
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:367
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:376
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:381
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:335
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:340
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:364
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:373
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:378
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:383
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:386
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:389
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:393
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:390
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:395
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:408
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:412
@@ -1253,22 +1253,22 @@ msgstr "システムキャスト"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog.js:74
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:403
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:674
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:306
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:113
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:676
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:719
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:127
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:113
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:59
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:477
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:305
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:112
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:675
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:717
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:126
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:112
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:58
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:473
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:411
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:203
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:202
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:397
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:515
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:514
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:762
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:169
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:132
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:334
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:331
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:465
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:140
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:206
@@ -1351,7 +1351,7 @@ msgstr "イベントトリガ..."
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:331
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:154
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:118
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:315
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:312
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:355
#: pgadmin/dashboard/static/js/dashboard.js:1129
#: pgadmin/dashboard/static/js/dashboard.js:1387
@@ -1363,7 +1363,7 @@ msgstr "所有者"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:111
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:155
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:242
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:199
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:198
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:286
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:103
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:144
@@ -1372,28 +1372,28 @@ msgstr "有効"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:120
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:39
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:316
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:315
msgid "Trigger function"
msgstr "トリガ関数"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:124
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:205
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:267
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:272
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:347
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:387
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:391
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:404
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:417
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:429
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:459
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:464
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:204
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:266
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:271
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:346
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:386
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:390
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:403
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:416
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:428
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:458
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:463
msgid "Events"
msgstr "イベント"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:132
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:264
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:456
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:263
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:455
msgid "When"
msgstr "条件"
@@ -1412,7 +1412,7 @@ msgstr "条件"
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:784
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:222
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:169
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:409
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:406
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:514
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:378
msgid "Security labels"
@@ -1445,14 +1445,14 @@ msgstr "セキュリティラベル"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1124
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:167
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:130
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:317
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:320
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:323
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:326
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:329
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:332
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:400
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:412
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:467
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:397
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:409
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:464
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:516
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:360
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:372
@@ -1559,11 +1559,11 @@ msgstr "再配置可能"
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:189
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:479
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:195
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:321
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:495
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:530
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:320
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:491
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:529
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:811
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:455
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:452
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:473
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:163
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:221
@@ -1763,8 +1763,8 @@ msgstr "タイプ"
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:214
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:129
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:161
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:319
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:396
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:316
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:393
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:420
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:427
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:440
@@ -1944,7 +1944,7 @@ msgid "Schema dropped"
msgstr "スキーマが削除されました"
#: pgadmin/browser/server_groups/servers/databases/schemas/__init__.py:781
-#: pgadmin/static/js/backform.pgadmin.js:1837
+#: pgadmin/static/js/backform.pgadmin.js:1833
msgid "Definition incomplete."
msgstr "定義が不完全です"
@@ -1963,23 +1963,23 @@ msgstr "指定されたカタログオブジェクトが見つかりませんで
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:594
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:60
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:23
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:269
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:268
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:786
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:787
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:788
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:909
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:898
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:899
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:143
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:344
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:417
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:908
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:896
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:897
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:142
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:340
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:413
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:421
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:427
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:428
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:401
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:495
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:496
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:461
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:460
#: pgadmin/tools/import_export/static/js/import_export.js:179
#: pgadmin/tools/import_export/static/js/import_export.js:199
#: pgadmin/tools/import_export/static/js/import_export.js:237
@@ -2028,7 +2028,7 @@ msgstr "データ型"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:85
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:171
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:449
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:375
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:372
msgid "Collation"
msgstr "照合順序"
@@ -2144,7 +2144,7 @@ msgstr "ドメイン制約..."
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/static/js/domain.js:65
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:415
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:21
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:127
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:614
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:679
msgid "Check"
@@ -2152,7 +2152,7 @@ msgstr "検査"
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js:97
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:419
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:136
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:135
msgid "No inherit?"
msgstr "継承しない"
@@ -2163,7 +2163,7 @@ msgid "Validate?"
msgstr "検証"
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:177
msgid "Check cannot be empty."
msgstr "検査は必須です"
@@ -2268,8 +2268,8 @@ msgstr "外部データラッパが削除されました"
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py:1285
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py:1330
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1367
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1417
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1401
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1451
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:1356
msgid "-- Please create column(s) first..."
msgstr "-- まず列を作成してください..."
@@ -2278,8 +2278,6 @@ msgstr "-- まず列を作成してください..."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:487
#: pgadmin/browser/static/js/browser.js:213
#: pgadmin/misc/static/explain/js/explain.js:1219
-#: pgadmin/misc/static/explain/js/explain.js:1348
-#: pgadmin/misc/static/explain/js/explain.js:1349
#: pgadmin/misc/statistics/static/js/statistics.js:129
msgid "Statistics"
msgstr "統計情報"
@@ -2289,7 +2287,7 @@ msgid "Inherited From"
msgstr "継承元"
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:259
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:176
msgid "Column Name cannot be empty."
msgstr "列名は必須です"
@@ -2488,7 +2486,7 @@ msgid "FTS Dictionary..."
msgstr "全文検索辞書..."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/static/js/fts_dictionary.js:153
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:342
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:339
msgid "Template"
msgstr "テンプレート"
@@ -2638,7 +2636,7 @@ msgstr "Lexize 関数は必須です"
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:59
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:21
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:457
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:434
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:431
msgid "Functions"
msgstr "関数"
@@ -2651,29 +2649,29 @@ msgstr "指定された %s が見つかりませんでした"
msgid "Could not find the function node in the database."
msgstr "データベースに関数ノードが見つかりませんでした"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:833
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:832
msgid "The specified function could not be found.\n"
msgstr "指定された関数ノードが見つかりませんでした\n"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:850
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:849
msgid "Function dropped."
msgstr "関数が削除されました"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1141
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1320
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1140
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1319
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:334
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:511
msgid "Could not find the function in the database."
msgstr "関数がデータベースに見つかりませんでした"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1628
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1627
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js:24
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:621
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbproc.js:24
msgid "Procedures"
msgstr "プロシージャ"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1728
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1727
msgid "Trigger Functions"
msgstr "トリガ関数"
@@ -2713,7 +2711,7 @@ msgstr "引数の数"
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:327
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:150
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:79
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:322
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:321
msgid "Arguments"
msgstr "引数"
@@ -2737,8 +2735,8 @@ msgstr "返り値の型"
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:182
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:98
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:100
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:289
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:493
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:288
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:492
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:154
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:155
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:209
@@ -2806,7 +2804,7 @@ msgstr "サポート関数"
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:338
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:245
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1119
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:405
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:402
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:508
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:366
#: pgadmin/tools/debugger/static/js/direct.js:1707
@@ -2846,7 +2844,7 @@ msgstr "リンクシンボルは必須です"
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:406
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js:200
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:314
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:338
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:337
msgid "Code cannot be empty."
msgstr "コードは必須です"
@@ -3036,7 +3034,7 @@ msgstr "ヘッダは必須です"
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:56
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:25
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:450
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:428
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:425
msgid "Sequences"
msgstr "シーケンス"
@@ -3199,22 +3197,22 @@ msgid "System schema?"
msgstr "システムスキーマ"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:409
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:322
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:319
msgid "Default TABLE privileges"
msgstr "デフォルトのテーブル権限"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:412
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:325
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:322
msgid "Default SEQUENCE privileges"
msgstr "デフォルトのシーケンス権限"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:415
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:328
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:325
msgid "Default FUNCTION privileges"
msgstr "デフォルトの関数権限"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:418
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:331
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:328
msgid "Default TYPE privileges"
msgstr "デフォルトのデータ型権限"
@@ -3223,9 +3221,9 @@ msgid "Default privileges"
msgstr "デフォルトの権限"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:443
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:53
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:29
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:422
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:419
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:130
msgid "Tables"
msgstr "テーブル"
@@ -3233,7 +3231,7 @@ msgstr "テーブル"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:464
#: pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py:58
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:24
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:445
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:442
msgid "Types"
msgstr "データ型"
@@ -3294,8 +3292,8 @@ msgstr "パブリックシノニム"
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:185
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:221
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:527
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:791
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:808
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:789
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:806
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:275
#: pgadmin/browser/static/js/browser.js:630
#: pgadmin/browser/static/js/node.js:1283
@@ -3304,17 +3302,17 @@ msgstr "パブリックシノニム"
#: pgadmin/misc/file_manager/templates/file_manager/index.html:78
#: pgadmin/static/js/backform.pgadmin.js:538
#: pgadmin/static/js/backgrid.pgadmin.js:621
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1741
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1786
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2385
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1735
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1780
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2379
msgid "Yes"
msgstr "Yes"
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:185
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:221
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:527
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:792
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:809
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:790
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:807
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:275
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:147
#: pgadmin/browser/static/js/browser.js:631
@@ -3324,9 +3322,9 @@ msgstr "Yes"
#: pgadmin/misc/file_manager/templates/file_manager/index.html:77
#: pgadmin/static/js/backform.pgadmin.js:539
#: pgadmin/static/js/backgrid.pgadmin.js:622
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1742
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1787
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2386
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1736
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1781
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2380
msgid "No"
msgstr "No"
@@ -3338,32 +3336,32 @@ msgstr "対象スキーマは必須です"
msgid "Target object cannot be empty."
msgstr "対象オブジェクトは必須です"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:359
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:357
msgid "Could not find the table."
msgstr "テーブルが見つかりませんでした"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:596
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1271
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:630
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1305
msgid "The specified table could not be found."
msgstr "指定されたテーブルが見つかりませんでした"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1054
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1088
msgid "The specified table could not be found.\n"
msgstr "指定されたテーブルが見つかりませんでした\n"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1067
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1101
msgid "Table dropped"
msgstr "テーブルが削除されました"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1145
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1179
msgid "Trigger(s) have been disabled"
msgstr "トリガが無効化されました"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1147
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1181
msgid "Trigger(s) have been enabled"
msgstr "トリガが有効化されました"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1501
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1535
#, python-format
msgid "Table rows counted: %s"
msgstr "テーブルから %s 行を算出しました"
@@ -3416,7 +3414,7 @@ msgstr "列は削除されています"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:608
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:704
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:856
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:853
msgid "Could not find the column on the server."
msgstr "列がサーバ内に見つかりませんでした"
@@ -3562,70 +3560,70 @@ msgstr "複合トリガが削除されました"
msgid "Compound Trigger"
msgstr "複合トリガ"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:56
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:62
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:68
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:74
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:90
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:61
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:67
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:73
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:89
msgid "Compound Trigger..."
msgstr "複合トリガ..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:80
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:79
msgid "Enable compound trigger"
msgstr "複合トリガを有効化"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:85
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:84
msgid "Disable compound trigger"
msgstr "複合トリガを無効化"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:169
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:168
msgid "Disable compound trigger failed"
msgstr "複合トリガの無効化に失敗しました"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:188
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:190
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:187
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:189
msgid "Trigger enabled?"
msgstr "トリガを有効化"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:205
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:209
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:222
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:235
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:248
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:204
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:208
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:221
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:234
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:247
msgid "FOR Events"
msgstr "FOR イベント"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:207
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:389
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:388
msgid "INSERT"
msgstr "INSERT"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:220
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:402
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:219
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:401
msgid "UPDATE"
msgstr "UPDATE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:233
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:415
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:232
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:414
msgid "DELETE"
msgstr "DELETE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:246
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:428
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:245
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:427
msgid "TRUNCATE"
msgstr "TRUNCATE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:303
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:512
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:302
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:511
msgid "System trigger?"
msgstr "システムトリガ"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:328
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:543
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:327
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:542
msgid "Specify at least one event."
msgstr "少なくとも1つのイベントを指定してください"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:347
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:346
msgid ""
"-- Enter any global declarations below:\n"
"\n"
@@ -3731,15 +3729,15 @@ msgstr "オブジェクトがサーバ内に見つかりませんでした"
msgid "Check constraint updated."
msgstr "検査制約が更新されました"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:40
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:39
msgid "Check..."
msgstr "検査制約..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:46
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:45
msgid "Validate check constraint"
msgstr "検査制約を有効化"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:157
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:156
msgid "Don't validate?"
msgstr "検証しない"
@@ -3775,7 +3773,7 @@ msgid "Exclusion constraint dropped."
msgstr "排他制約が削除されました"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:38
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:97
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:96
msgid "Operator class"
msgstr "演算子クラス"
@@ -3803,10 +3801,10 @@ msgstr "列の演算子を指定してください:"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:453
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:381
#: pgadmin/browser/server_groups/servers/static/js/variable.js:341
-#: pgadmin/static/js/backform.pgadmin.js:1260
-#: pgadmin/static/js/backform.pgadmin.js:1370
-#: pgadmin/static/js/backform.pgadmin.js:1550
-#: pgadmin/static/js/backform.pgadmin.js:1669
+#: pgadmin/static/js/backform.pgadmin.js:1259
+#: pgadmin/static/js/backform.pgadmin.js:1366
+#: pgadmin/static/js/backform.pgadmin.js:1546
+#: pgadmin/static/js/backform.pgadmin.js:1665
msgid "Add new row"
msgstr "新しい行を追加"
@@ -3818,7 +3816,7 @@ msgstr "排他制約"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:28
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:28
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:29
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:236
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:234
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/exclusion_constraint/sql/default/stats.sql:7
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/exclusion_constraint/sql/default/stats.sql:12
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/index_constraint/sql/default/stats.sql:7
@@ -3828,87 +3826,87 @@ msgstr "排他制約"
msgid "Index size"
msgstr "インデックスサイズ"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:642
msgid "Exclusion constraint..."
msgstr "排他制約..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:691
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:512
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:498
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:298
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:690
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:511
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:497
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:295
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:378
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:344
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:196
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:366
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:363
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:40
#: pgadmin/tools/backup/static/js/backup.js:366
#: pgadmin/tools/restore/static/js/restore.js:255
msgid "Tablespace"
msgstr "テーブル空間"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:701
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:700
msgid "Access method"
msgstr "アクセスメソッド"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:716
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:326
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:715
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:322
msgid "Changing access method will clear columns collection"
msgstr "アクセスメソッドを変更すると列の一覧が消去されます"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:746
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:560
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:549
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:386
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:745
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:559
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:548
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:382
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:716
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:790
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:204
msgid "Fill factor"
msgstr "フィルファクタ"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:749
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:734
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:575
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:564
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:267
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:748
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:732
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:574
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:563
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:266
msgid "Deferrable?"
msgstr "遅延可能"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:757
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:747
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:603
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:592
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:291
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:756
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:745
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:602
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:591
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:290
msgid "Deferred?"
msgstr "遅延させる"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:779
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:413
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:778
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:409
msgid "Constraint"
msgstr "制約"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:908
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:415
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:401
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:348
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:439
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:907
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:414
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:400
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:344
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:435
msgid "Include columns"
msgstr "INCLUDEする列"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:931
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:242
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:438
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:228
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:424
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:370
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:461
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:930
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:241
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:437
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:227
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:423
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:366
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:457
msgid "Select the column(s)"
msgstr "列を選択"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1012
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1011
msgid "Please specify name for exclusion constraint."
msgstr "排他制約の名前を指定してください"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1018
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1017
msgid "Please specify columns for exclusion constraint."
msgstr "排他制約の列を指定してください"
@@ -3966,53 +3964,53 @@ msgstr "参照テーブル"
msgid "Referencing"
msgstr "参照列"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:616
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:615
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:585
msgid "Foreign key"
msgstr "外部キー"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:637
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:635
msgid "Foreign key..."
msgstr "外部キー..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:641
msgid "Validate foreign key"
msgstr "外部キーを有効化"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:771
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:769
msgid "Match type"
msgstr "一致タイプ"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:788
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:786
msgid "Validated?"
msgstr "検証済"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:804
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:802
msgid "Auto FK index?"
msgstr "自動外部キーインデックス"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:852
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:850
msgid "Covering index"
msgstr "カバリングインデックス"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1002
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1000
msgid "On update"
msgstr "UPDATE 時"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1003
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1023
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1001
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1021
msgid "Action"
msgstr "動作"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1022
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1020
msgid "On delete"
msgstr "DELETE 時"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1050
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1048
msgid "Please specify columns for Foreign key."
msgstr "外部キーの列を指定してください"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1059
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1057
msgid "Please specify covering index name."
msgstr "カバリングインデックスの名前を指定してください"
@@ -4057,7 +4055,7 @@ msgstr "{0} が削除されました"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py:996
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:20
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:43
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:42
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:557
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:729
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:811
@@ -4066,7 +4064,7 @@ msgstr "主キー"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py:1006
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:20
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:43
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:42
msgid "Unique constraint"
msgstr "一意性制約"
@@ -4074,19 +4072,19 @@ msgstr "一意性制約"
msgid "Could not find the constraint in the table."
msgstr "テーブルに制約が見つかりませんでした"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:536
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:522
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:231
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:535
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:521
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:229
msgid "Index"
msgstr "インデックス"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:644
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:633
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:632
#, python-format
msgid "Please specify columns for %s"
msgstr "%sの列を指定してください"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:56
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:55
msgid "Oid"
msgstr "OID"
@@ -4113,7 +4111,7 @@ msgid "Index is dropped"
msgstr "インデックスが削除されました"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:29
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:236
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:234
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:45
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:33
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:49
@@ -4130,59 +4128,63 @@ msgstr "インデックスが削除されました"
msgid "Size"
msgstr "サイズ"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:130
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:128
msgid "Sort order"
msgstr "ソート順"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:151
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:149
msgid "NULLs"
msgstr "NULL"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:248
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:254
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:260
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:266
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:272
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:245
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:251
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:257
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:263
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:269
msgid "Index..."
msgstr "インデックス..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:311
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:308
msgid "Access Method"
msgstr "アクセスメソッド"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:390
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:386
msgid "Unique?"
msgstr "一意"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:394
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:390
msgid "Clustered?"
msgstr "クラスタ"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:398
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:394
msgid "Valid?"
msgstr "有効"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:402
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:398
msgid "Primary?"
msgstr "プライマリ"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:406
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:402
msgid "System index?"
msgstr "システムインデックス"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:409
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:405
msgid "Concurrent build?"
msgstr "並行作成"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:501
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:497
+msgid "Tablespace cannot be empty."
+msgstr "テーブル空間は必須です"
+
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:503
msgid "Access method cannot be empty."
msgstr "アクセスメソッドは必須です"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:509
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:511
msgid "You must specify column name."
msgstr "列名を指定しなければなりません"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:514
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:516
msgid "You must specify at least one column."
msgstr "少なくとも1つの列を指定してください"
@@ -4576,39 +4578,39 @@ msgstr "ルールが削除されました"
msgid "rule"
msgstr "ルール"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:93
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:99
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:105
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:111
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:117
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:92
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:98
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:104
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:110
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:116
msgid "Rule..."
msgstr "ルール..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:165
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:164
#: pgadmin/static/js/sqleditor/query_tool_notifications.js:32
#: pgadmin/static/js/sqleditor/query_tool_notifications.js:80
msgid "Event"
msgstr "イベント"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:179
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:178
msgid "Do instead?"
msgstr "代わりに実行"
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:182
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:183
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:184
msgid "Condition"
msgstr "条件"
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:188
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:189
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:190
msgid "Commands"
msgstr "コマンド"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:195
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:194
msgid "System rule?"
msgstr "システムルール"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:215
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:214
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:241
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:183
msgid "Please specify name."
@@ -5175,56 +5177,56 @@ msgstr "トリガが削除されました"
msgid "Trigger"
msgstr "トリガ"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:56
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:62
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:68
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:74
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:90
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:61
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:67
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:73
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:89
msgid "Trigger..."
msgstr "トリガ..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:80
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:79
msgid "Enable trigger"
msgstr "トリガを有効化"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:85
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:84
msgid "Disable trigger"
msgstr "トリガを無効化"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:169
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:168
msgid "Disable trigger failed"
msgstr "トリガの無効化に失敗しました"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:205
msgid "Row trigger?"
msgstr "行トリガ"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:247
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:246
msgid "Constraint trigger?"
msgstr "制約トリガ"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:346
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:345
msgid "Fires"
msgstr "発動"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:481
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:480
msgid "Old table"
msgstr "古いテーブル"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:482
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:488
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:481
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:487
msgid "Transition"
msgstr "遷移"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:487
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:486
msgid "New table"
msgstr "新しいテーブル"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:536
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:535
msgid "Trigger function cannot be empty."
msgstr "トリガの関数は必須です"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:556
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:555
msgid "Trigger code cannot be empty."
msgstr "トリガコードは必須です"
@@ -5560,7 +5562,9 @@ msgid ""
"Updating the definition will drop and re-create the materialized view. It"
" may result in loss of information about its dependent objects. Do you "
"want to continue?"
-msgstr "定義を更新すると、マテリアライズドビューが削除・再作成されます。これにより、依存関係の情報が失われるかもしれません。続行しますか?"
+msgstr ""
+"定義を更新すると、マテリアライズドビューが削除・再作成されます。これにより、依存関係の情報が"
+"失われるかもしれません。続行しますか?"
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:192
msgid "With data?"
@@ -5608,7 +5612,7 @@ msgid "Size of temporary files"
msgstr "一時ファイルサイズ"
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:45
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:309
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:306
#: pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.2_plus/stats.sql:2
#: pgadmin/browser/server_groups/servers/databases/templates/databases/sql/default/stats.sql:2
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:176
@@ -5662,35 +5666,35 @@ msgstr "データベースの接続を切断"
msgid "Are you sure you want to disconnect the database - %s?"
msgstr "データベース %s への接続を切断しますか?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:337
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:334
#: pgadmin/static/js/browser/server_groups/servers/databases/external_tables/external_tables.js:52
#: pgadmin/tools/backup/static/js/backup.js:192
#: pgadmin/tools/import_export/static/js/import_export.js:108
msgid "Encoding"
msgstr "エンコーディング"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:380
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:377
msgid "Character type"
msgstr "文字の分類"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:385
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:382
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:413
msgid "Connection limit"
msgstr "接続制限"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:388
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:385
msgid "Template?"
msgstr "テンプレート"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:392
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:389
msgid "Allow connections?"
msgstr "接続を許可"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:417
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:414
msgid "Default Privileges"
msgstr "デフォルトの権限"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:499
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:496
msgid "Connect to database"
msgstr "データベースに接続"
@@ -6516,7 +6520,7 @@ msgstr "種別"
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:139
#: pgadmin/browser/static/js/browser.js:224
#: pgadmin/dashboard/static/js/dashboard.js:191
-#: pgadmin/static/js/backform.pgadmin.js:2032
+#: pgadmin/static/js/backform.pgadmin.js:2028
msgid "SQL"
msgstr "SQL"
@@ -7141,8 +7145,8 @@ msgid "At least one privilege should be selected."
msgstr "権限を少なくとも1つは指定してください"
#: pgadmin/browser/server_groups/servers/static/js/server.js:46
-msgid "Security label must be specified."
-msgstr "セキュリティラベルは必須です"
+msgid "Label must be specified."
+msgstr "ラベルは必須です"
#: pgadmin/browser/server_groups/servers/static/js/server.js:79
#: pgadmin/browser/server_groups/servers/static/js/server.js:84
@@ -7241,20 +7245,20 @@ msgstr "パスワードを変更"
#: pgadmin/misc/file_manager/static/js/create_dialogue.js:188
#: pgadmin/misc/file_manager/static/js/select_dialogue.js:86
#: pgadmin/misc/file_manager/static/js/select_dialogue.js:129
-#: pgadmin/preferences/static/js/preferences.js:435
+#: pgadmin/preferences/static/js/preferences.js:434
#: pgadmin/static/js/slickgrid/editors.js:50
-#: pgadmin/static/js/sqleditor/filter_dialog.js:79
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:62
-#: pgadmin/tools/datagrid/static/js/show_data.js:139
+#: pgadmin/static/js/sqleditor/filter_dialog.js:78
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:61
+#: pgadmin/tools/datagrid/static/js/show_data.js:138
#: pgadmin/tools/debugger/static/js/debugger_ui.js:588
#: pgadmin/tools/debugger/static/js/debugger_ui.js:893
#: pgadmin/tools/import_export/static/js/import_export.js:495
-#: pgadmin/tools/maintenance/static/js/maintenance.js:297
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:56
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2010
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2164
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4222
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4289
+#: pgadmin/tools/maintenance/static/js/maintenance.js:296
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:55
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2004
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2158
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4216
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4283
msgid "Cancel"
msgstr "キャンセル"
@@ -7475,7 +7479,7 @@ msgid "Connection timeout (seconds)"
msgstr "接続タイムアウト(秒)"
#: pgadmin/browser/server_groups/servers/static/js/server.js:1130
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2192
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2186
msgid "Connect to Server"
msgstr "サーバに接続"
@@ -7726,17 +7730,15 @@ msgid "Dependents"
msgstr "依存"
#: pgadmin/browser/static/js/browser.js:348
-#: pgadmin/browser/static/js/toolbar.js:30
-#: pgadmin/browser/static/js/toolbar.js:31
-#: pgadmin/browser/static/js/toolbar.js:91
+#: pgadmin/browser/static/js/toolbar.js:29
+#: pgadmin/browser/static/js/toolbar.js:88
#: pgadmin/tools/datagrid/static/js/datagrid.js:74
msgid "View Data"
msgstr "データを表示"
#: pgadmin/browser/static/js/browser.js:349
#: pgadmin/browser/static/js/toolbar.js:20
-#: pgadmin/browser/static/js/toolbar.js:21
-#: pgadmin/browser/static/js/toolbar.js:93
+#: pgadmin/browser/static/js/toolbar.js:90
#: pgadmin/tools/datagrid/static/js/datagrid.js:75
msgid "Filtered Rows"
msgstr "フィルタリングした行"
@@ -7976,10 +7978,10 @@ msgid "Changes will be lost. Are you sure you want to reset?"
msgstr "未保存の変更は失われます。リセットしますか?"
#: pgadmin/browser/static/js/node.js:1513
-#: pgadmin/preferences/static/js/preferences.js:439
-#: pgadmin/preferences/static/js/preferences.js:464
+#: pgadmin/preferences/static/js/preferences.js:438
+#: pgadmin/preferences/static/js/preferences.js:463
#: pgadmin/tools/datagrid/templates/datagrid/index.html:37
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4297
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4291
msgid "Save"
msgstr "保存"
@@ -7999,20 +8001,17 @@ msgstr "全選択"
msgid "Unselect All"
msgstr "全解除"
-#: pgadmin/browser/static/js/toolbar.js:40
-#: pgadmin/browser/static/js/toolbar.js:41
-#: pgadmin/browser/static/js/toolbar.js:89
+#: pgadmin/browser/static/js/toolbar.js:38
+#: pgadmin/browser/static/js/toolbar.js:86
#: pgadmin/tools/datagrid/static/js/datagrid.js:103
#: pgadmin/tools/datagrid/static/js/datagrid.js:115
#: pgadmin/tools/sqleditor/__init__.py:68
msgid "Query Tool"
msgstr "クエリツール"
-#: pgadmin/browser/static/js/wizard.js:85
#: pgadmin/browser/static/js/wizard.js:86
#: pgadmin/static/js/alertify.pgadmin.defaults.js:261
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:263
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:457
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:455
#: pgadmin/templates/security/messages.html:7
#: pgadmin/tools/user_management/static/js/user_management.js:81
#: pgadmin/tools/user_management/static/js/user_management.js:174
@@ -8020,11 +8019,9 @@ msgstr "クエリツール"
msgid "Close"
msgstr "閉じる"
-#: pgadmin/browser/static/js/wizard.js:88
#: pgadmin/browser/static/js/wizard.js:89
#: pgadmin/static/js/alertify.pgadmin.defaults.js:262
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:264
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:458
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:456
msgid "Maximize"
msgstr "最大化"
@@ -8032,22 +8029,6 @@ msgstr "最大化"
msgid "Left panel logo"
msgstr "左パネルのロゴ"
-#: pgadmin/browser/static/js/wizard.js:124
-msgid "Close error bar"
-msgstr "エラーバーを閉じる"
-
-#: pgadmin/browser/static/js/wizard.js:131
-#: pgadmin/browser/templates/browser/index.html:135 pgadmin/help/__init__.py:59
-#: pgadmin/help/__init__.py:70 pgadmin/preferences/static/js/preferences.js:427
-#: pgadmin/static/js/sqleditor/filter_dialog.js:72
-#: pgadmin/static/js/sqleditor/filter_dialog.js:73
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:56
-#: pgadmin/tools/datagrid/static/js/show_data.js:133
-#: pgadmin/tools/maintenance/static/js/maintenance.js:289
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:50
-msgid "Help"
-msgstr "ヘルプ"
-
#: pgadmin/browser/static/js/wizard.js:139
#: pgadmin/misc/file_manager/templates/file_manager/index.html:15
msgid "Back"
@@ -8085,6 +8066,11 @@ msgstr "管理"
msgid "Tools"
msgstr "ツール"
+#: pgadmin/browser/templates/browser/index.html:135 pgadmin/help/__init__.py:59
+#: pgadmin/help/__init__.py:70 pgadmin/static/js/sqleditor/filter_dialog.js:72
+msgid "Help"
+msgstr "ヘルプ"
+
#: pgadmin/browser/templates/browser/index.html:157
msgid "Logout"
msgstr "ログアウト"
@@ -8475,7 +8461,7 @@ msgstr "検索"
#: pgadmin/dashboard/templates/dashboard/database_dashboard.html:88
#: pgadmin/dashboard/templates/dashboard/server_dashboard.html:92
#: pgadmin/misc/file_manager/templates/file_manager/index.html:27
-#: pgadmin/preferences/static/js/preferences.js:492
+#: pgadmin/preferences/static/js/preferences.js:491
msgid "Refresh"
msgstr "再読み込み"
@@ -8993,33 +8979,13 @@ msgstr "グラフィカル"
msgid "Analysis"
msgstr "分析"
-#: pgadmin/misc/static/explain/js/explain.js:1286
-#: pgadmin/misc/static/explain/js/explain.js:1287
-msgid "Zoom in"
-msgstr "ズームイン"
-
-#: pgadmin/misc/static/explain/js/explain.js:1295
-#: pgadmin/misc/static/explain/js/explain.js:1296
-msgid "Zoom to original"
-msgstr "ズーム倍率をリセット"
-
-#: pgadmin/misc/static/explain/js/explain.js:1304
-#: pgadmin/misc/static/explain/js/explain.js:1305
-msgid "Zoom out"
-msgstr "ズームアウト"
-
-#: pgadmin/misc/static/explain/js/explain.js:1319
-#: pgadmin/misc/static/explain/js/explain.js:1320
-msgid "Download"
-msgstr "ダウンロード"
-
#: pgadmin/misc/statistics/static/js/statistics.js:214
msgid "No statistics are available for the selected object."
msgstr "選択されたオブジェクトに表示できる統計情報はありません"
#: pgadmin/preferences/__init__.py:55
#: pgadmin/preferences/static/js/preferences.js:426
-#: pgadmin/preferences/static/js/preferences.js:449
+#: pgadmin/preferences/static/js/preferences.js:448
msgid "Preferences"
msgstr "設定"
@@ -9044,17 +9010,17 @@ msgstr "非表示"
msgid "Category is not selected."
msgstr "カテゴリが選択されていません"
-#: pgadmin/preferences/static/js/preferences.js:483
+#: pgadmin/preferences/static/js/preferences.js:482
msgid "Refresh required"
msgstr "再読み込みが必要です"
-#: pgadmin/preferences/static/js/preferences.js:484
+#: pgadmin/preferences/static/js/preferences.js:483
msgid ""
"A page refresh is required to apply the theme. Do you wish to refresh the"
" page now?"
msgstr "テーマを適用するには、ページを再読み込みする必要があります。今すぐページを再読み込みしますか?"
-#: pgadmin/preferences/static/js/preferences.js:493
+#: pgadmin/preferences/static/js/preferences.js:492
msgid "Later"
msgstr "後で"
@@ -9098,37 +9064,33 @@ msgstr "不明なエラー"
msgid "INTERNAL SERVER ERROR"
msgstr "内部サーバエラー"
-#: pgadmin/static/js/backform.pgadmin.js:1550
-msgid "Add"
-msgstr "追加"
-
-#: pgadmin/static/js/backform.pgadmin.js:1841
+#: pgadmin/static/js/backform.pgadmin.js:1837
msgid "No updates."
msgstr "更新なし"
-#: pgadmin/static/js/backform.pgadmin.js:1956
+#: pgadmin/static/js/backform.pgadmin.js:1952
msgid "General"
msgstr "一般"
-#: pgadmin/static/js/backform.pgadmin.js:2157
+#: pgadmin/static/js/backform.pgadmin.js:2153
msgid "Preview not available..."
msgstr "プレビューがありません..."
-#: pgadmin/static/js/backform.pgadmin.js:2618
+#: pgadmin/static/js/backform.pgadmin.js:2605
#: pgadmin/tools/backup/static/js/backup.js:95
#: pgadmin/tools/backup/static/js/backup.js:230
msgid "Note"
msgstr "ノート"
-#: pgadmin/static/js/backform.pgadmin.js:2974
+#: pgadmin/static/js/backform.pgadmin.js:2961
msgid "More"
msgstr "詳細"
-#: pgadmin/static/js/backform.pgadmin.js:2975
+#: pgadmin/static/js/backform.pgadmin.js:2962
msgid "Less"
msgstr "簡易"
-#: pgadmin/static/js/backform.pgadmin.js:3059
+#: pgadmin/static/js/backform.pgadmin.js:3046
msgid "Space"
msgstr "スペース"
@@ -9157,7 +9119,7 @@ msgstr "このオブジェクトは削除できません"
msgid "Delete row"
msgstr "行を削除"
-#: pgadmin/static/js/backgrid.pgadmin.js:1098
+#: pgadmin/static/js/backgrid.pgadmin.js:1091
msgid "Array Values"
msgstr "配列値"
@@ -9309,13 +9271,13 @@ msgstr "クエリが %s で成功しました"
msgid "Sort/Filter options"
msgstr "ソート/フィルタのオプション"
-#: pgadmin/static/js/sqleditor/filter_dialog.js:239
+#: pgadmin/static/js/sqleditor/filter_dialog.js:238
msgid "Filter updated successfully"
msgstr "フィルタは正常に更新されました"
-#: pgadmin/static/js/sqleditor/filter_dialog.js:245
-#: pgadmin/tools/datagrid/static/js/show_data.js:238
-#: pgadmin/tools/datagrid/static/js/show_data.js:245
+#: pgadmin/static/js/sqleditor/filter_dialog.js:244
+#: pgadmin/tools/datagrid/static/js/show_data.js:237
+#: pgadmin/tools/datagrid/static/js/show_data.js:244
msgid "Validation Error"
msgstr "検証エラー"
@@ -9396,7 +9358,6 @@ msgstr "ファイルを保存"
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:40
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:41
-#: pgadmin/tools/datagrid/templates/datagrid/index.html:56
#: pgadmin/tools/datagrid/templates/datagrid/index.html:68
msgid "Find"
msgstr "検索"
@@ -9480,14 +9441,14 @@ msgstr "変更データを保存"
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:129
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:131
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4230
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4224
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:663
msgid "Commit"
msgstr "コミット"
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:135
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:137
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4227
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4221
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:681
msgid "Rollback"
msgstr "ロールバック"
@@ -9563,7 +9524,7 @@ msgstr "この URL は直接呼び出せません"
#: pgadmin/tools/backup/__init__.py:43
#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:46
#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:55
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:67
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:66
msgid "Backup"
msgstr "バックアップ"
@@ -9843,8 +9804,8 @@ msgstr "バックアップ..."
#: pgadmin/tools/backup/static/js/backup_dialog.js:71
#: pgadmin/tools/import_export/static/js/import_export.js:685
#: pgadmin/tools/import_export/static/js/import_export.js:699
-#: pgadmin/tools/maintenance/static/js/maintenance.js:477
-#: pgadmin/tools/maintenance/static/js/maintenance.js:488
+#: pgadmin/tools/maintenance/static/js/maintenance.js:476
+#: pgadmin/tools/maintenance/static/js/maintenance.js:487
#: pgadmin/tools/restore/static/js/restore_dialog.js:51
#: pgadmin/tools/restore/static/js/restore_dialog.js:75
msgid "Utility not found"
@@ -9852,25 +9813,25 @@ msgstr "ユーティリティが存在しません"
#: pgadmin/tools/backup/static/js/backup_dialog.js:72
#: pgadmin/tools/import_export/static/js/import_export.js:700
-#: pgadmin/tools/maintenance/static/js/maintenance.js:489
+#: pgadmin/tools/maintenance/static/js/maintenance.js:488
#: pgadmin/tools/restore/static/js/restore_dialog.js:76
msgid "Failed to fetch Utility information"
msgstr "ユーティリティ情報を取得できませんでした"
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:159
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:158
msgid "Backup job created."
msgstr "バックアップジョブが作成されました"
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:163
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:162
msgid "Backup job creation failed."
msgstr "バックアップジョブの作成に失敗しました"
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:171
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:170
msgid "Backup job failed."
msgstr "バックアップジョブが失敗しました"
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:242
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:229
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:241
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:228
msgid "Please provide a filename"
msgstr "ファイル名を指定してください"
@@ -9919,7 +9880,7 @@ msgstr "オブジェクトが選択されていません"
msgid "Data Filter"
msgstr "データのフィルタリング"
-#: pgadmin/tools/datagrid/static/js/show_data.js:161
+#: pgadmin/tools/datagrid/static/js/show_data.js:160
msgid "Use SHIFT + ENTER to apply filter..."
msgstr "Shift + Enter を押すと、フィルタリングを行います..."
@@ -10508,30 +10469,6 @@ msgstr "スタック"
msgid "Debugger - "
msgstr "デバッガ - "
-#: pgadmin/tools/debugger/templates/debugger/direct.html:59
-msgid "Step into"
-msgstr "ステップイン"
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:67
-msgid "Step over"
-msgstr "ステップオーバー"
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:75
-msgid "Continue/Start"
-msgstr "続行/開始"
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:85
-msgid "Toggle breakpoint"
-msgstr "ブレークポイントの設定/解除"
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:93
-msgid "Clear all breakpoints"
-msgstr "すべてのブレークポイントを削除"
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:103
-msgid "Stop"
-msgstr "停止"
-
#: pgadmin/tools/grant_wizard/__init__.py:327
msgid "Unable to fetch the {} objects"
msgstr "{} オブジェクトを取得できませんでした"
@@ -10873,7 +10810,7 @@ msgstr "詳細メッセージ"
#: pgadmin/tools/maintenance/static/js/maintenance.js:167
#: pgadmin/tools/maintenance/static/js/maintenance.js:183
-#: pgadmin/tools/maintenance/static/js/maintenance.js:483
+#: pgadmin/tools/maintenance/static/js/maintenance.js:482
msgid "Maintenance..."
msgstr "メンテナンス..."
@@ -10887,15 +10824,15 @@ msgid ""
"cannot be maintained using this utility."
msgstr "メンテナンスジョブの作成に失敗しました。名前に「=」記号の入ったデータベースは、このユーティリティではメンテナンスできません"
-#: pgadmin/tools/maintenance/static/js/maintenance.js:387
-#: pgadmin/tools/maintenance/static/js/maintenance.js:394
+#: pgadmin/tools/maintenance/static/js/maintenance.js:386
+#: pgadmin/tools/maintenance/static/js/maintenance.js:393
msgid "Maintenance job creation failed."
msgstr "メンテナンスジョブの作成に失敗しました"
#: pgadmin/tools/restore/__init__.py:41
#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:40
#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:49
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:62
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:61
msgid "Restore"
msgstr "リストア"
@@ -10961,15 +10898,15 @@ msgstr "リストア..."
msgid "Restore (%s: %s)"
msgstr "リストア(%s: %s)"
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:149
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:148
msgid "Restore job created."
msgstr "リストアジョブが作成されました"
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:153
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:152
msgid "Restore job creation failed."
msgstr "リストアジョブの作成に失敗しました"
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:161
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:160
msgid "Restore job failed."
msgstr "リストアジョブが失敗しました"
@@ -11053,241 +10990,241 @@ msgstr "通知"
msgid "Geometry Viewer"
msgstr "幾何データビューア"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:832
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:826
msgid "Editable column"
msgstr "編集可能な列"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:834
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:828
msgid "Read-only column"
msgstr "読み取り専用の列"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1261
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1255
msgid "Fetching all records..."
msgstr "すべての行を取得中です..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1730
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2369
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3314
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1724
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2363
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3308
msgid "Unsaved changes"
msgstr "保存されていない変更"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1731
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3315
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1725
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3309
msgid "Are you sure you wish to discard the current changes?"
msgstr "この変更を破棄しますか?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1759
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1753
msgid "Clear history"
msgstr "履歴を削除"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1760
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1754
msgid "Are you sure you wish to clear the history?"
msgstr "履歴を削除しますか?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1761
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1755
msgid ""
"This will remove all of your query history from this and other sessions "
"for this database."
msgstr "このデータベースを使用する、すべてのセッションのクエリ履歴が削除されます"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2125
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2119
msgid "Connection Warning"
msgstr "接続に関する警告"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2132
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2126
msgid "The application has lost the database connection:"
msgstr "アプリケーションのデータベース接続が失われました:"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2136
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2130
msgid "⁃ If the connection was idle it may have been forcibly disconnected."
msgstr "・ 接続がアイドル状態だったために、強制的に切断させられた"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2138
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2132
msgid "⁃ The application server or database server may have been restarted."
msgstr "・ アプリケーションサーバか、データベースサーバが再起動された"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2140
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2134
msgid "⁃ The user session may have timed out."
msgstr "・ ユーザのセッションがタイムアウトになった"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2144
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2138
msgid "Do you want to continue and establish a new session?"
msgstr "新しいセッションを確立します。続行しますか?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2163
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2157
msgid "Continue"
msgstr "続行"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2299
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2293
#, python-format
msgid "Error fetching SQL for script: %s."
msgstr "SQL スクリプトの取得中にエラーが発生しました: %s."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2370
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2364
msgid ""
"The data has been modified, but not saved. Are you sure you wish to "
"discard the changes?"
msgstr "変更されたデータがありますが、保存されていません。変更を破棄してもよろしいですか?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2414
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2408
msgid "Running query..."
msgstr "クエリを実行中..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2422
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2416
msgid "Waiting for the query to complete..."
msgstr "クエリの完了を待機しています..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2579
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2573
msgid "Loading data from the database server and rendering..."
msgstr "データベースサーバからのデータを読み込み中..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2588
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2582
#, python-format
msgid "Successfully run. Total query runtime: %s."
msgstr "実行に成功しました。合計クエリ実行時間: %s"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2589
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2583
#, python-format
msgid "%s rows affected."
msgstr "%s 行を取得しました"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2865
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2859
msgid ""
"This query was generated by pgAdmin as part of a \"View/Edit Data\" "
"operation"
msgstr "このクエリは pgAdmin が「データの閲覧/編集」操作の一環として生成したものです"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2966
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2960
msgid "Row(s) deleted."
msgstr "行が削除されました"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3040
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3034
msgid "Saving the updated data..."
msgstr "更新データを保存中..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3156
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3150
msgid "Data saved successfully."
msgstr "データの保存に成功しました"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3159
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3153
msgid "Auto-commit is off. You still need to commit changes to the database."
msgstr "自動コミットが無効です。データベースへの変更は、手動でコミットを行わない限り反映されません"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3165
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3159
#, python-format
msgid "%s."
msgstr "%s"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3170
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3164
msgid ""
"Saving data changes was rolled back but the current transaction is still "
"active; previous queries are unaffected."
msgstr "保存しようとした変更データはロールバックされましたが、現在のトランザクションはまだ続行中です。今までに実行したクエリへの影響はありません"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3192
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3186
msgid "This query was generated by pgAdmin as part of a \"Save Data\" operation"
msgstr "このクエリは pgAdmin が「データを保存」操作の一環として生成したものです"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3353
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3347
msgid "Loading the file..."
msgstr "ファイルの読み込み中..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3404
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3398
msgid "Saving the queries in the file..."
msgstr "ファイル内のクエリを保存中..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3416
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3410
msgid "File saved successfully."
msgstr "ファイル保存に成功しました"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3538
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3597
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3532
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3591
msgid "Applying the new filter..."
msgstr "新しいフィルタを適用中..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3558
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3568
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3552
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3562
msgid "Filter By Selection Error"
msgstr "フィルタエラー"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3617
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3627
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3611
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3621
msgid "Filter Exclude Selection Error"
msgstr "フィルタ除外エラー"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3637
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3631
msgid "Removing the filter..."
msgstr "フィルタを解除中..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3655
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3665
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3649
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3659
msgid "Remove Filter Error"
msgstr "フィルタ解除エラー"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3768
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3762
msgid "Setting the limit on the result..."
msgstr "結果の上限を設定中..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3787
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3796
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3781
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3790
msgid "Change limit Error"
msgstr "上限変更エラー"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3922
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3941
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3916
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3935
msgid "Cancel Query Error"
msgstr "クエリキャンセルエラー"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3960
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3954
msgid "Downloading CSV..."
msgstr "CSV をダウンロード中..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4014
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4008
msgid "CSV Download cancelled."
msgstr "CSV のダウンロードをキャンセルしました"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4017
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4011
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:395
msgid "Download CSV"
msgstr "CSV をダウンロード"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4020
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4014
msgid "Download CSV error"
msgstr "CSV ダウンロードエラー"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4054
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4061
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4048
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4055
msgid "Auto Rollback Error"
msgstr "自動ロールバックエラー"
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4081
#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4087
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4093
msgid "Auto Commit Error"
msgstr "自動コミットエラー"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4182
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4176
msgid "The data has changed. Do you want to save changes?"
msgstr "データが変更されています。保存しますか?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4188
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4182
msgid "The text has changed. Do you want to save changes?"
msgstr "テキストが変更されています。保存しますか?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4268
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4262
msgid ""
"The current transaction is not commited to the database.Do you want to "
"commit or rollback the transaction?"
msgstr "現在のトランザクションが、まだデータベースにコミットされていません。トランザクションのコミット、もしくはロールバックを行いますか?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4271
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4265
msgid "Commit transaction?"
msgstr "トランザクションをコミットしますか?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4294
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4288
msgid "Don't save"
msgstr "保存しない"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4337
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4331
msgid "Save changes?"
msgstr "変更を保存"
@@ -13204,9 +13141,3 @@ msgstr "指定されたデータベースが見つかりませんでした"
#~ msgid "Error dropping %s: \"%s\""
#~ msgstr "%s の削除エラー: 「%s」"
-#~ msgid "Tablespace cannot be empty."
-#~ msgstr "テーブル空間は必須です"
-
-#~ msgid "Label must be specified."
-#~ msgstr "ラベルは必須です"
-
diff --git a/web/pgadmin/translations/ko/LC_MESSAGES/messages.mo b/web/pgadmin/translations/ko/LC_MESSAGES/messages.mo
index 10157ef2bde4f2812dd1a934238a615dd1964d32..6844b2236d7c12097a8f2bb8ff09457e028359a0 100644
GIT binary patch
delta 27093
zcmYM+2iT8g|M>Cm9oaK08TW1Po$M8%5UGqx0|{kBNaQPplv2rP)1ZNpij-(;QBp?Q
zX{q$Ix8M7HpP&Ene~#mKyspoAo!5DO&UIa1ex7Il?84W~DV+W2n1V|({AY2YOr|P6
zalFz0|4-jBnarhx{csR&#gnn(*i5Dfo*#}0CxtVx6!)(Q7h_T4d&4!!Z04yb*oLL4
z@Oro(ZQ$F8|HR6~MK4Yb)xzV5n?&3j%MuU70yr}6kH&VyS7Qa-g01mgtd+^q*d>|F
zu@p4HJnV@_;YH!ta9lVsoE%OKr-w7cY&a*Ji_X}!=uF&<1s8A08GMqxZ8yR<(D?0$
z-;H>0#2-ZbNyML{!~J^k(4$6VeX{Df)KV@Q*N(Ve#Em0v7V+^Bw?SL#80B4~ynDpG
zBkmLNfbjHi&^Tt(4u?j;IpKNX@bE&kqtOvx5>5ywg;T=I!x`bM@T%~daQ-+}(}u5$
zf*a8pzd7RD!@I&2;eFw%@S$)`_-Obz+WwQ_)8Urz`D|Rgj7L-PHLQX=u`nJ&7x`y&
zul|81SZsVIQxeNzIjj+JYphP(9o?eCu?EgS_x@d22{)m8JNtHAd>Q_OWw>$7giNLy
z)<O?iH{`%)P78-%ZQ}FLhOfa=cn=oGbyxy7V`+R9O?(eJ&`+=_{b#=9!p&V_Vycjf
zR;Z81U{gE;yP>CWDK^75u?hYYHsqai0`U->gp2SLJc_`X?1!cCOe}*JVsTIN)F_yP
zj$|>Kz&h-RPhemCA2!6!lQWqXI0o(T4)p#m?1H(MWipNMJe-Z!V<#*zC6%9oK0no%
z{xc79(ExX&9sGxmu))+c;-P4~2%X}s=#1?^r+6<m$Ajqe6{n@8>W1eL_m22M^!Z1z
zEIx->3*P3U9Da;8_%k|Hnak4yWv~NbE?VzwJO(FVd7Oi8#%1VceIVk8(e^f>YyUDj
zLp$(zEH$0^&)==nQ^v#5%*LQ=Gz0B$A==>zbmSY*rP>nlUUbPmLp%H$-Sxl5{YqD)
zxCT0~?r8g`U%~vF`A7<i;UskTUWtxm0s6p==q9=w?O;{J8^UKWm+}|Uc0NZF{~_X|
zW~8_z+I|f*;U-xw{D`(f*LVQhz-;umU5`%jE$9raMrUj@R>FN)5C4aDSb1hDZ-Ul8
z37z^O=zuOj2QUg9P<ApGW-=oRu0r?30(9id(FPt2*JEYk%~%C@qxF77r!;eA>bNZ0
zL2Yb_jnOqf4_o7{NI%)k>s&Y``_M!VqI=*FR>XhNhRe@N9oGrFpi4ItP4FW0`HAR^
zO^y54qcd?^#A_nnjD<Y^Z$-gww8O8^hW<lGP>?z<NeOfcD`5q!if+c1Xu=)QsXY~~
ze>S>=qc9Ks)>OqC(fW@V^M9EwabrK);O}V1IkVF{yeRrW&G2}1?R%p2&P8WnRKyb^
zo)+<J^!aPirM*4khcN4nXSlHAx6mowgU-Z3^!`8S5|p|sy>fHWxF5Rd&P5xZgwDWK
z=yNy5{T1kpJP~e1_sr{8G5@a3ehO^x`?&ER+CZr}X}9O0aTjz7Ps4L?Jl4ZE&<1}-
zJ1TH>n(|U;g3Zu9)*YR({^)=QU(HlIbr(?J2*$>Z>F6G~8mr?1wBrY{F}{q=@F#Rv
z*SsbrG8nrMXVLPl*bslgj+i?)z5CBW6TdObMO!YO!X|haYhkr{X$0M{Hu3OqKHBga
zw1H2tJ{Fyy-iR&H4*Q|)U5*~NRcO5f*Z_~dHhqk;&A6yZ!P#iTv+xAmfNk(w%*C1u
z^1s)a6VZ`hik|<K=!|T^7Wge%zv^|FOkM1V^>GBY!i87|x21Bv|6DYpp!D^r!47EV
zgRvpb#Rm8oHp2Z87h0HRsyRA<Gtiluh9-C?+R>YM2L6PNvDXc0DKEo3&;QL_)Z@nE
z`2}=<&58d;8*Y4KdayrQZzkH&{pbi^Lp%I2%JUYbKR%p<CY(i|djx$GzKbSO=qB#d
zf2I`|HgsM%5A9$rI(54u{u`Z<yqnXE^g&<6Q_%87Xv3S)P5Tx4e4$&C&CvTpum#S=
zth;(67bdV9kHx>yO;~<0zjm-KcEV}c9iPM=_$T(n&bMYV?Qt$ze;b<65wydGOVY6%
zjD?7YV{sg_g!wPa#S{v3K9<DW!qr%q_(?2-Td)M~i2EO)BmD+jVUeY&gN|5^xI5b3
z;3&TkOA%iZ@r<R+e?bc7P+$l1u_!LbVt6lle=U~A$I;AR!2Cqe5q^NqT#;pIs%xO_
zoPtI03^bu(=*(V<6>&+Hi(Xu;K^y)BeK4~;bzBT95tfd)9-3%lbjCX2G1wn{emMI4
zcsv>}M-!M8_vfQCuoyk2*?YNgv%P>d@GG=|qPL|A<<JINp-a&bJ@-A(j?a&HG9F93
z2u=7wbOyJfBYgwU#Lv*@+TNajKbz^pg=;h@6=X)DQ#%12(agAiEt<emG{L*E5k834
z-;H+oDf--ZX#GFX8Oz*}22vI+KMqTH{%dk!g=T2OU9ke5g3ieK=mT@mhOa~S!cuf(
ztI&~eiTHhVX}%ASpfghT&eTo=Y?i|j#NwX+3+_t0b{tkFz6{Ibjp$U}hpyREXo4@J
z3GGBjya!F_Gjt|?LTB^{daO&{oyw07yP->ZDrVi4gSl`sT#VK5dTfUep)>J0+Tfq)
zX()V8nz0h-NUNbU(F|?4C$_=<cmmExH{)|y9bZCc^7DI`e@Aeb0!R24+Cb42$z!kp
zaTRoAxo888(RzJwAfAB@aW&e}F06uk(Zqkj=6KY~G@w@K%$&S3n?AD>Dez-)Gn)BE
ztb~Wd!uO_Al8eVv-UA)kbZm`}g<ql_RlP607y6-zU4ixRfr#Hi6Z|8~g|Fc9_osJy
z3v>z2#`-uNeehn)!`IQxb_kuhf)Av<QyQ&b5uM2{;i-5u@i25IMxdMhQnX%n4i~QR
z&DaE2V{Lp7?f5UOg*8{D@}5|T_+m7HN$6(065XtG(e{?3n|K{Mpcl~@{S@=}Qo5hb
z6keS&sfylcgf`d?3t>03qu%K5KONn4!_Yl3A@0vaM>ZcF*>dz$tVY}2h$rI9XuCxo
zv>n#JG#4Jb8feBH(2)#48ytZ)cp19OuSOHN9ZhTvT7M(j(d+2$-is#q1={Za(1Z#-
zl<HMP|7?+|?FBYKGi!=YRckyK`=Oh14K~0pus)W0IBm8z=#q`bqwxl`<HcA6S72d$
z2yJ&gw#3&k+k%UKxG;gHkEAJXg>JG==nM=(XW*hJpNclL2<>1sI<m*mUA+x`?f}-s
z@6q<luSqjk8H*A(TEqN1WvwZ&gYIZNFe;pnjfux%GhBvE@KvmVzoJuHX>B@1jnTwT
zMmOOFSRAKe3A`HZ=O%P1?^(<IyOvK;;0U&3N!*Jz@FhBuf6xa@u1gJ8MLVt^cEVD`
z1JRByh<H5a5?_ff?OkX;_oInDk>$b%wqY@R3$3^pZ^Vz$DIWi5N^~0f-~x0Cm!L1A
zd(bt0ADw}Z(7o~-md3otQa{bnxD(oLwjUQhI4C?9O<)wdtH+_Q+}Y?F-h(E3Kl<FG
zXd)ZY=blFs*pANZCuoO1VHrGXeQKv1GQ-)-u~E<zZJ<@e?ZYnU4E4a~cpAEPbI?R?
z!?Jiky8EBPqwra@y{+hyzJd;5H}=DQ*wyo2@9}iJMq@W_tibO08G8KcZb%Ky4Hu#f
zE=JdOB|5U_(M`E4%74Lf#O0qzGgKe*h+CoqI316s|IAn}Y+xdm#j7G-9Nv$P^htE>
zw?+IWmM7kWKKC8ErvIT!Q~1d=bEUBkaaAmZC!)`thFRBY6c=VR3+-qL+RzF#v4_wR
zZ${q>+wnO36m9SybS8>Fl}=3~G=XmD+MkTp8;TWiH2Qq@Ddyiby`2I-GH+lW9>&^O
zW@9?<t<n1<(DM1=8nmN#(3#nXZpMS?N9Qp5LMpi_z2X~SCF1VrUO0Ob^Y7+5KMKa7
zBcFs7a7L8hjLytbw8NF?W_t*a#YfT2wjF(bC;Cm<i_YLrXo3ZvP6?JqXS8yb3lpe^
zRy-b^vXjt;&O{$PH{!8qVw1xKasM7XhVn<yM4v+wdJP@v+qfIwL)(9NbK0!g&0N%^
z-~hUbj-U^eeI_MP5na1n^oL4QG@(9dy}=QmgC`J=MtA)^;RZCJSJ4^Ug${Txl1Mgl
zkP9>Y6&>+ESQ(FgHceG7`e1{w8QNfLbjG@(9iD~`;6k*$X=tLeqWn5^*WZctaD9F`
z>%WhSJPHn>Q(Iz78gWguqZVia9V0#w?WiBx;CblOUlz`f^4rk?J&Nv`O;`=Lp>NcW
zuz=_PUoOlv=ebm|B-(KWw1K=RZ-CW_TVPWh5an5PGtI|iaS58(I&_I%#1^<6eL?+&
z&QR5@%)cGg;zFCEH`<{Oc18EbN$3biqnl?2x`x-IGqW76e>XaV_o2t^Y0SfS(E2}x
zN6=$hVjJu4=Bl_YHBbi~al^0``Y!K?EwKx_HzuJ8EyVoIhE<3+U?bd#UGZ;p03DxC
zKikhk6TTIl@!OxzroX{hMZrlFe2;ao)eGtWr!y4YWUIoBXouUeA|60T{xiA+f1m>>
z^kSN+(wKjGumI&v@hEJG&UEW67gf3Fh)&5+td1kl4CjP5qKVv&PURy}z6sr2FNJT0
zyRiV}2hesu3BN_#{UzdT=A~3n3~O+sV#ICHUETv-%R%Vck4GDvg^u)Ebc8pfBU*vh
zUyUZVHOgN_pWlIb_z|)c*~}3xoXVqLP8nB4AIw7^sE=mc7Tu&h(2o0KK^zkCFf_4I
zXuXMOLNlU#4w~pfbSCe}k6HgUT)3vsU>)3v4e(d2g}JY!uUmI)L_7lRU=f<g?dWs&
zp-cA~x);92R`?s*PQzEz%$$njiAUju^q+Z;i;>u2JB{NCJR1wXmUip;Xo92ACAlKX
z7e;&wo<;fn*dLEzPwfAC`phoH_QdPM@313ry*HTuwp@(lLhnK|eIFgsU+A95do#T<
zPsHPh$3{FCPa$55ZsI?%8di8K9n)6mUg(E4@xq9&jr%L!V*PWuv6+GfxF6eL!5!(l
z-x+<QU4o8aZp7Qr1oxrm{s{W<sj@RI)j+IAJPDiQ?dZVXK;IvSu?ZG^oB8)u+2-x^
z!=f+R;ic$|T!$w1BG$+6u?JRsCnaz;_9ngx-HflJBi@Nc@GC5eKVmWb3-dSouJi({
zn&rX{o1uyHjvK?!1}35nOvmDQHTsHOgeCBSD1SVBF3Mj=pWlN%{|TDFw-Nt}KA$}j
zH%h#lDpbPS+^C68ajz&Jhb4(GN2hik+QB+3g&VOnz7p~KSeW=A9*y6l&;N`jlCwMi
z7-lmixbQ|bbdxkfM|x_ikU0x|;NmEsiZ(b0P2^g%qsP#8HifUC^>(Ar?~nK(mLWcb
zCE0(Of1;q+d#Rx+=+xB0^4J`0;H0=e03G>|xPJk<38$jZ-GYVi9`v-VLf8CxJO=k-
z1w4d>JpVcGr;dxDBQJw?P!;pA4my&aXa{}KDIbcCWOS5Ik9Z#DQN9eVw+Soat5_C4
zLYL}C%sO?MJ*lB0=!h$0Ic$nnJQ2-&AUYElqEkN+9qDqkoqN#dSEEb$EIOc%(f7k4
zbYMmHro_tbW&S-jc@+4fse|s;Ug(HVi+C`)wiloyo`BB8Y&5|e(2?F1_t(VzEofq|
zqwVd&0=PHI5A0?BeeeqkZ20G>P;g%wX%Y0DUJe~e%P8-Rj__n`gqL6+T#hH=7jeJd
z{`5B>r=T5Qiq60kw7*%|C|DFOM`vUun)xbp<m=ExpGDX34Rppn#N+S?+VF87q(p0>
zGuaGXqIOsbyQ1w3!DBId5f@gRjdpk)`VPMZZSb-1X>_VzKpWhJ?uC75f?uF}<|nj+
zLI=_wsetZ@PU!uC=<XkdB#_O_j0#JzGB+MZck4?Le}Jy_uV@2DeV96|h$dbeO|&UG
zrESoq>K*sbi1KsMb|;_%n1}g)|9=A)j_mgEVRX$mqf@;Po$5pA$Vz^cMpP9|tOd5m
z&S?GVXnWVAiQIuEx*DC~_2JW4&h!5~7rFQz=HajCh$?=ZI?P2MY>IBW6VN>}H13~^
zF2Ojo!x?B|^RYVKiY~#1DBq6G<a?O)Tz|ub4gP~}lAKS{+Ezvztc^a<JmMZ$jd%e5
zj^nXu4r}@;gCSn>85@mw@aO4oQkH*_{$}L>j^KXvgXxFLoP(_YX%y_Dpe@$^GQCQN
zp(CD-p4+R!`REedfO&W)x(T;n9o&vB@CR&)d0(Y=`lIa(M(Yp5LOA-XZ2BoQfdXe>
zO;lWug^4$!n`$e%Yu}FYFC+c|>r-Cv>og-x&`s6{3*&HfM#o}9oP&0}Hts)><-*PK
zESlMySOoW=YxoH|;_t(M(1ePAlh(W{`g}ul^R-8x>x(`&6x|!6(Rx$k{=6`|n2RFZ
zSP?#iPSxY+gPYLAUcoB(4pznQ(LGS?+jPG^<`K6-J30excO*LEaaas5L)*zBdoP>0
zg9|%ahi<lKu>fw5@;A|4ydQ1&&nPc?D3w=2pF06f=tQ*R^RXz7L7$t9ZuYCurCf^D
z=|8iE3tv2MU@jiSPI&Zp>0iBdN8>CG!7bPlD}K*k$>GU(79PRcc-9Z;H)9t47CeNF
z@jGmVl@F)Q+7H{&e`Ycljc{$;*oVgxA3=BX@js?ttD~?P@vYbtUqT!F85>}||D}4T
zq3vbSb{;|Re}c`i*iY#%JUd|4%qB;{3bf(9*a8dxoE~V0HaHgR<5FyhThZsg#a3A9
zmsGzG`ut3+hwIP;-bdTX{F?sxPUByhe;ZmrK@)reP2e-^fMtJ65B5VFnuaED4_bda
z`uuNkzXoq3XXs?K{&Z}KE7AAEZmflWVO^~L2lMadI_Zz}jvtBc?s@1Yx)1Z;3+Sm>
zkM8D;SO%ZNvbYl~;-^>%|A_l#{!I02pwHJ2n_@BI<Fi~iqAr++qtOf(U<q7{Hn<sm
zU>Evg`4H{+AiC>+M-!^>SF$eFAZ~-@a41@T93F#N^ttRUTsY##&<@^0N4^&w`KJ+o
ziKU1SNBkd}Na4TJ@hcrxK}T9I;wI=o+F?oTi6(Fc(q1-mQM$-XMbGP8bSf8NX<UUS
z_7pl3&qw(_G@);>0{($^RO+AfTop9IMrcB<(2m=oGtw9H|NY<jT;x%35xPsS4If7v
zK7ekvpU}OM_itL$F6fl@42Pf{jzwo~QpD5Hk!R74Z$JmS5=(pjAK}8xpRoY9V;=5B
z8~hW^Jm<gEKzXc2Tp#ljz~aP1(2hr<dtnUP-W6#3*I{{F7UgR&Yi7@Kp|6K~(LL}b
zR>8yQ6c#^{8Y+t>RvkSJb<w405^+bYOxzvqa2Pt`N$66}L=&8Ug!T8vatiF=UUcmr
z#HzRzy?+4h@JsZ;AHpN(2+L%0^6%%NGf*ELaT9c4?a_96NBKZB;qx-tocs}vry!St
z>(GuKjtY;Xi9L^I{%W`jo%#>a1P+Hs&^KY}oSgg_?2dNaHyjk6kM=V*%SHZXiGpe9
zT3YUd*W<Cc1Rc>jbV;7U#<&OlS{6Ji-7kWUtO7bywb8^|qxHJtY1jh?Vs<GPb-4Hj
z-BhIu<mB)ACg>jMj?O?|G|_?RhzExkVci^F&1m9x7fjDTj3%-TO?)TX-T}0ogUAeI
zGv7vqpU|~B5^>3+a~L&$qQRw<KUOHme_NdCRX8XAADO+3HdwGovSe5>%taHZAGSef
zv}ZUV-z?wjC>V*3Y<xHiZQ#a;@4_0yYomN8`g8oFxSvxr&0tw{s+*y^zZLev-stAO
z347pbtV{oy@4Ucr#d7k$e(mun;xXYR;e>EfI3>J1oDt3nuL`dT=c6-l9l9rO#jI<4
zPgHmSjUSA7UBv4n-Wc)bh_^-jV#KdS{AR?vB7QI84<i03;xCHjWb-@xDhj@j3O}No
z<hLmQJIeoyxM1;=Xkm1wN=95J;))ShjyN~sni1EJxKVM=zYVmAg5#q?`-nS5+&$u+
z5%-O_Kbq*7QGQmG4~uw2#G@j<B%BaV%ErZ%@bYj*I4isg?dY0_7laGLMd2;sl5lx=
zM|gL*GR)r3g$=Kcf;H$Sc{Jju!)L>-;S1r*;r8&2a7XwK+WzivU-(fnoB2EnzD76S
z_vnl0XY>_WwnS>6GWr#)jwaXweP47yKQ<>vJOVwYmqz(w^mMI_cz5_izMQ`zC3EsW
zHZ{?TUC@q3p+Ci@qwj^g(68Ov@Co$%KZ7Rx5&BK|CoEMeo&P-a4cIz75pAbGcJurX
z;=++E4_8HnC(swrGdK}n$4=Oxbb13$$JWG~umk>p?XY2)oc#X=)JW`3ya%1hDrM6v
zx)$1BGtB?<e<v=S!U5>VW-Pj9S7QUb7Kh{G=!h#Elav299&ND+@npOJS7J*nP%eE_
zPQb^A&%qP0Wcie64{T06yFBOL2G>)dyRkn0j{ZR*uR?05FB(rmGrt?1!ZqldYy&pK
z=kO%_A?_bvF(uXk9nf9qbN8aJ=7%cA_y4&l*pE*6VYH+FA}&!WO=T5yFPw+gn}9Yn
z3$4Ex?O-Lk<`1Hu;V02e`wDi&x6!34n>{vdx<2TGlh9we)6oZS#@cvq_$u1acM<=F
z)~ixEb=Vk9q#f49Ug!*sM`v(4n(zZ*c5_tNi9WbL{2EQ@H}t32zi7wD9ha<)-fxO-
zuGVM=ozM=)paZ!q;)Q6(%g}z-AkSwro4N4#JdbXQkI`dPrb_CdCb|h5puc=hN2hKA
z+R#JT1~+0Z9!5uAx@wx46VSwap-XZa`WZeKOVfX5O5B(m-h%#4zXz?jA<AD5_h3EB
zzd%P=qFSn78y#U=^tpa$$0KnNj>nVnW$cBet1|%4|6nfsC37J<rQ^{Arl4=K1ra|I
z@z(HDbOs9KrjE*nRnQr$gC^J?kHd@5y)p+I;$qCYo1f#tjCY{#frDrwN6@t`l$RbX
zg_h@{4c0}cv>W=|sc3tnqx^ET{#<kuFGL5l9!=!kJkGxbUqppMHPT2Lp%1o36YGf1
z$m!ulQ9c8$cT0F%xFTE~u0x-H67Bdk%-`%avgyV1byO@~Gc|Y&+Hqy{oHs`s=z^W`
z^oVakPsb{>!57gt=sOXAi_Xj+=&3lSR%*W*TEBKSE?S0N!&Ad^&|N<k&3qo(!7@A>
zA46xbMD5gIQ*=o>qMP(&bPrq_<qN{4=$^~o$Awe41|8uBbl1Kb<?o<h!M&J=|Ddnh
zYISn*|H`%>_932!9>ZNY0E_X50^bK`V=J7GJ@FZAjz`tYKc?ACD=vCda29&5??XHI
z5F2C3`spjz9^KUwu`k|^eht6E_E@Jux_>_U)w>S8zXMOf5)D(kgV99iV@J>bRxa%5
zpZo$|G>uZGqp%<4Yq1XgjXqeTar*r}6#Z!3jgIX3ut<|szdv@Qd<vS#<LCf?MEh&l
zl*IGTKNr3jZb5GxKszehERCoeo<MvtT7EA!!Tspe7HOW|cpcI55$FuujLyt^I0MVH
zNQo{)6Mq-8uElR$w7_~T(-aLwKcfrK@||erIjz$7y#t!)_=xX7N4f)Dy5h&@<o~ze
zI-t+ZKoflu+u}D7*KE!CcVvTFrwTWq4?K@{@ON1Mgfzl4(fTvdk!?Wh{eV7KrA->)
zndlFZJJG~;qBC5gZF+7HI>4LT#`)hvfernIb+KN%^x&yz#p}@q-a)6fO8cDr|5Dj`
zcq;J|*Z~W4NF(opCYVKMa5H**zr&*VFZy07ob8x4OGP}6f{tj#!RQNUH2Q$`Je~{U
z{#{YN4*hy=LTBK8^f;I4l-?Va(64DLwEQHry}l7=2XRq?f?;UKV<VmsUW-1s1S{d4
z=$q?_@CEEj{5JZxWo0|3uV6j2qmJmW>7Hn!L(w0t(~uWeHnWzCGbq@JHc-1udZ0bp
zaX<78cm@{0iRfqcGBlwD;YxG>Poo2R9Zg_Q_-T|MLhJp3H9Y@CyQWuYBdo=Ze&~aj
zqOZ^ycr@M@<qx4twE<m{9q7nD3p3qPTpb-iNA&C09p~X_^!dY>|NSp^V#?@PbZQ%*
z722Q;3`F<B(1<6ZpV?{XcYHoN;>W|S=yPvI{4P4;Pp~-tFUtSLtQCuOPZi3d4b?=K
zq8a*g{G=!!kB)c-n$RM2<g3u*_7eIv{2g7Q@;#CbFps!1+TVG|Unyor_2B$F;tNko
zQ$88<h_A%TcsJV7CbZ+7Xo8=kOY~#Jf1zK+!adWT$V2P5#rD`2ozeMdfA@xu^~|P<
z&r!f`%<Mwf>KE*Xm3yTTTolekM{sk*%fq#32QQ!<e2Bgm4xtIO@0}8!g0`PUm*oEc
zckv_zX8a2JLt#HU!h`6pKa4i~Gn#15$tkXd-H2PDFPh0{f)AjZc@5gp+vxk@Q}lgM
z<&<;`vrV`#qY-#KUW>lTwqP#)iLP<wKIx6v2K}5~hJA4>`u#7_H#r1PCcYni*Z+WB
zuwK9P{6%PdKk}`}X1?IU%~Sr=^gu6k^UX%z-AluFu`6+z{wbl;(A_)%Jq<I^8Mq#u
zsV(Tp-#};b06N28qI>GE{Fw7!c0g*d4*F*5j?Tn%Y>Ml`577=voR%8wj81j$us_<t
zpm1zB3#(Ip3)=B|G{NmyivBb2N5MgK7ypd@>@G1d?e_BM2x>&!2z~RlMMpj$%Fjm|
z9*2&6Mz}D%3;md_Llgf6vsV0@3wLjc)6)p*q2(RW&Db{_jGpV^Xh+k~5zj^U$ZhBd
zH%9pmwBBcE!at(z7C9r8S3ZODUyy=&6qr%tuoXIG?Xf=&MUT@%*b4tZm!|QV=>>H*
z`r^3;eO0eSJ6eslzX@%B3%c1~LO1z0XLA0%s52;4xB$&~H2M>1Dw_Fi=*ZWjoAVX)
z7#=`hNdKYriVsdNuv+Mh^uSykjwUb%ov{UIKX+y0;t@3Cr_lyqkMcd}raOp^ywZ>q
z_d(zNSE8TS2hon6K@<ES%KwM%oq|J?rO=L#MVCBVmkT@Y7B>b)e12586wP>Hl&?S=
zT#t_UnebgS@k8jI`2+2!z*%Xg%AzyS3N3G+%w~FX;TvfX`rv4^gUPrOuS6frJv-H_
zi{5XGmY;~efKHBh3Hp2CPUHoX*@O=8YxK1IiOyKjbL@}vSCtDJtQWQjJD{8DB+SF%
zQGPX==nWAskN93Rp|$AVcmkcd_tCxcZFmIjulz8MyXU_;7e3eq{WDo-v_dcR-G3T7
zf-~_%9EGm^L+EkajV{F@w0?ne(_d;AM%yihPI=jgbFmk3UCa*WVmudJ@EttGisz+c
zcMe`kyasKk`uS;%>!6?Kmgwf}i_X+6bl2a3F2U32F@6sn&@XZSKXkKJy@2!YjgA+j
z5%dhtMMpLjox&T?8CV(d;}O4t*4u;5zz^sqEHpfISPp%z8aBtK5uX=M9M1W-!c`R5
zz%A(7K8%j|Npy2Qi`LtLepWw5m!QCiG__69HSdVtKNo#|PTXIB4rCen0(u0Ufw!|<
z_^00=u>rOlnH&+`fORO}i2fA&Fv<&EnCdl0-*9K437!{D#74wdp>N8y5g&-S$f)#O
zwhb4hsL(MA`k*r~0A1s=(UDAv@|ozzX?~P1LT6%W#LuH6-H!F}0On!Ai_%inLGO1=
zW-|l0FoBWixtxqn`8>4a<>&+Vgd5OJ^(wmAzC?F-!O>|3jzR0!LZ5Gg?y=7J3id|#
zOzAPs5a+LM{slj?(LFE=ozkV~4~#p|&+=+??Y5y)eGu*7H#C8N(PLG7Y<jhxj=qY=
zqnq*?wEoR#{pDDO{xhq%FvE>e;d%7kydAChdEEbB_;-{aeQ|oRltUA*A8}W-!!ywi
zhetdHUDB!825-V)`D?{RV+szS9TvSLy(%lA4b($tq$zs86*>dm(B}t6JSv=quKl%(
zFBn)Z>v?#I5*O=hw53Ah(v!u}9&*tss2es9+hhKB6q|E@IQoiPj6SyveW~A#dAKgh
zcj5`e?~mgR<5!^M_|!os^ub=?sc3^|#{HpKmv{s^#OuO4&|SI)9l$eaJKNBM{3^O;
zU!lk0s0r!$CKKWf)0qP2u0Og6!_Wq%Ma5a@xm$!s;qB-zle^Hl+=ni5&cw7EE2A%l
zme?1E;Hmfk`s?)<^kdN=dui(E5_GX9V}G0<?!hj^^(Li1@?3<TuP4#-xEtNZUq$)9
zXyR2TCu^a<xf-HN*c?r?Jvy`5fn4~&pl}#EMI+G%7NLpVhR)Dh^ngBtem8faOYv3Q
z{{wBW&}FIPlIR{Nhjv&Cy<abx%{1l04qBrfo{XN4)6oNcKHBkIH1ox1$B%^D&<5W_
zpFe=M_hpp-g|2<hlvJ;3SPS$28wL%z@axbPZQv|)SC2$9o)hKs(1ve96S^Nw^zpdA
zHGB<C=-s%#Kl}=viC@ru3QnaR-!P@Pa0;u2P0%&&jD97CVN+ayCb|ionf=%kkDv|q
zoR$(AfF8$T=!gDBH1UVAA3ld}!V;JB3&W}G#>Kff2+zbP@k%T{J^h`?0=$g4%oS;5
zbJ3+(h(3Qmy2+kKKMq@QG`@rW_-j8S?e=--XYw`lRQxo9^Y2BMndvw!#ID5K!=hKF
z5ubu?%1h9ZFGFYM*|`5T`a&r-D-EC<I#bKgWB4@Y;m4u>u*hRuBg=)G<7BLhBjd*P
z=#+0jkKbq59c#``BN&D4i5H<Ay^byMJIuq}t5Vz*O?Wce;d1mh**3KOpR!!oK#e)6
zpgWq-B=pUA1G*WvU_1N(ZK%T4X$Cr>OE(7da61mfZ_rKH@tRcL9gRn#d*x#Eg_fPd
zh2PKF=$hV!uHkxg^Sl`4AEOWc9_GwV4Hn13lpljOcpO@<PS`BU+l4*QQ`0}0&72bj
zW6<L<HR5?#ig+>h!h6xB_%`l0oR>OkgFPtk7V$jvG~I*_WF>lBH=r}{e7HToob$Ic
zDtw6U=0j)$nfYnz%A&`oW!MvK@T_n&I^wD5TF*vj<bk-qHhcz6;5D@Ux3Q?_|I?^&
zC~o|TzG91Ao2IG;I<-yF@^<J<4M00OA8mLvI)Dl2p1B6?=-#-$0e!D*M(gdvtQr5n
zg?pgfg49rBbVRMt20BIgsp$DVGw#nq6S_9MCwwY=EBpeRQ}1uIy~fw2P2TA`&c9PT
zgaU6|f{x@$bcEMnO}rKT%56la{w;I_AE1f;h@Sty(C1rRpUT^!d*DQ@hi9Pu%tQx%
zgXi1_9;d*~_B8s=-;O@;COY-MMEMacLR?^BIxQv825X}owMG-`g%04H@DeofnP`94
zq5a&Pje;dn;ZC%nhr?&liaX-|E^JQx33`mm-jEWkj?IW0U}GGL18^SthTVg{32Wb&
z>YakNo4tYyM>q@pJ-r~}CFs<yKr?<AeKD;^Us!LVBmDv0R0S5L@|s}}^tn-JJL4jr
z7V#`(lV&s5a^W6Wl?pPO(UI*%A3TV5a2Rc{)J@3>=#*BCxFPyn3-l*kXLNH8L6>L(
zcEZ_l|2fS6{_oAd;0FU*@t25?zB&DAu^d|71|4~Cw1cr|;@6;wEXRVl3Qhcxxc?-Y
z*lSV#KAPAkSk3eQI~R_u!Ywf(w8MsI2OZGO*dN^+)37lvK<hn)o{m@1L_Wj;cnD3j
z<Kk34C>)6<I0>^}%#4D0=q9-d9qCi(S88wEFMMn2uq>KzP4sUT8bsU^O{5>1=m_*w
zO^Ns#^s~Jbec!xrE9XD|98+NCKVmKX5A!=%k~Ucb^nT~CZ<L>f&cFn;;o0~fuEAq-
zSc0WFnYW2wT9%XH?{zXumZx7pKi!s-xrFkrw{!l7ak2LHoXlh_en<M{lEtpXUt?Qr
zaA$he4o4Fki_YAoXks(a8CwwXBiMrYY4mr&A#9D+?@D{&478mKvQaQP3Z`IhZp@7M
z<?u~(6TOS>iBG~`&=*aSyVEH-7X3=LL1$zd`lh=N?QlDKjCaQU?6+Jvl8W~v^Uw|&
zq8)aQ@;>PAgEP^!9fvMmHsV_&UKKur)_)t_17An^?_r4*`Oot&OwvW>1hirw^c8y+
z`eGV^CO95V>~eI?7osD(3q2h#gx|*fV^*f}T4*AD&;gA=+nb0L{2PWVxM)DZO_+<D
z(cQT}zXE^ZkG?94-ka9CB)ZmB(1bdn37v)}G(6(@=n^bPJA4Tp(2lsj5B*;&&V0*-
zo9L+f($}sG+CeL9jAx>6t~uBdw}t<rzxCSRpN{Db_zUr~I2G4FkUrP-SEb*Mr{UR@
zUyly>E6o4%f7#V(x3<Os+_(tcM4Ql$${%PV^&d?2&P0Fx&d1~N1@y=1?@`|3q4ZB3
zF2Pom-;SQ59q2#`Kb$^dCq2yhx1p&N=z8>l@6Z=d-Xp1Ef3&07*an}(Cis2aud*i9
z>x(9QB|3n$=<kB>(dTNfO@EF!2b&YmUz<%2Y@%Qs1z)2L3|f~Sn1?3x9NOVe=>5D$
zlLOF(W}_Xg$A<WIl$U!fwbKJFpNYN~R^v&yFUy5LsdCq+5%)&dW*WNIE748$5xR*A
zJf6;R$*_D_1>NN}!}jPN8W>)Np8KWfdtg1<UUpLyynyb`*U(+N8~y2(*^pkzwb0|!
z3;lYXfo|H1(T1j@r{HQd;ak!7!_!f|Bg#KUPffum^6T@zFvf)i4bXRgC-gjDfOfb5
z?O-Vu#1-iK;Q@5S>(InsLF>JPCh`HA;CJYV|3d5KJekT%<jeUxjtk#t_2Wi+EKS@y
z9D+{e=(vAflrN9+2P1wx?(fHH)c+bCSfQs<hsU7<s*fhx8q0hByLf?TpqY+AXJR7y
z@wgS;Bd?;L+aJ->QgUPZT=zyB9FH!|<>4Z9#H%oW&Cvulp`YoOG3yV654f=6ub79K
zO)29V=pJZ>jd38_P!>&iUU&!Q5kD63I}v}0CRX_A^h2a9x-^Z#j!$#`ovMBmI8_(N
zjV#*1P3RgvfG)`fY=AGK4S$c0=yxoP1vjSzOP~WP7gk66X@Cy67n;Zgn>qh>JSht1
zp&czl-}$T2P4)=7M_xo{;5{^f1L*T#hJT?Su~N^ZdezW&YNPe)qXX&~o|27=A>k;r
zqs!2rV)M`r*Pt`90c~(Qn!uak`{*CnKS2}zCoKPL`m2}5=!{H2pSuF{m-3ppxE>w(
zEfL>~KJZZZ1e*C)^mx97CiE-%sxG!Az1iBK30{mY%>=Z=nc+NifHxuavYC6i7(l@)
zoQ}VvKb0<hE*-no=x%)tJ@+4@nSUJ~MyK{SG@)W!b23A7c%!0AF@0N_nQPIG??=m@
z!Xm!BU*^J$cZ9pp&G9}u;;+yLe#K0&#Wm)Y+t6*y>HW*)jhiz0vb^CJ=1rb>;fOJ#
z##}hE>4qCOz1U*$ecx2v(C6ECjw{uoU6U3qn>0TmuSL7|E!%Bucyvy+3rc=>*X+DQ
yk1ap6_|EUHzjN7}SLYnNvD>JeFWN6_-X`bhWxrjKQ)bzh*_;X+>#WRao%?@ugDjx{
delta 27014
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
U#<-2IPs;hM%f=lmbK2MXKNmC^j{pDw
diff --git a/web/pgadmin/translations/ko/LC_MESSAGES/messages.po b/web/pgadmin/translations/ko/LC_MESSAGES/messages.po
index 2b06ac311..533eceba5 100644
--- a/web/pgadmin/translations/ko/LC_MESSAGES/messages.po
+++ b/web/pgadmin/translations/ko/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: pgAdmin 4\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-01-03 19:02+0530\n"
+"POT-Creation-Date: 2019-12-06 19:29+0530\n"
"PO-Revision-Date: 2018-07-12 01:04+0900\n"
"Last-Translator: Ioseph Kim <[email protected]>\n"
"Language: ko\n"
@@ -47,13 +47,13 @@ msgstr "데스크탑"
#: pgadmin/static/js/slickgrid/editors.js:50
#: pgadmin/static/js/slickgrid/editors.js:60
#: pgadmin/static/js/slickgrid/editors.js:61
-#: pgadmin/static/js/sqleditor/filter_dialog.js:84
-#: pgadmin/tools/datagrid/static/js/show_data.js:143
-#: pgadmin/tools/datagrid/static/js/show_data.js:218
+#: pgadmin/static/js/sqleditor/filter_dialog.js:83
+#: pgadmin/tools/datagrid/static/js/show_data.js:142
+#: pgadmin/tools/datagrid/static/js/show_data.js:217
#: pgadmin/tools/import_export/static/js/import_export.js:500
-#: pgadmin/tools/maintenance/static/js/maintenance.js:302
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2005
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2035
+#: pgadmin/tools/maintenance/static/js/maintenance.js:301
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1999
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2029
msgid "OK"
msgstr "확인"
@@ -456,7 +456,7 @@ msgstr "필수 입력 항목이 빠졌습니다."
#: pgadmin/browser/utils.py:386
#: pgadmin/static/js/alertify.pgadmin.defaults.js:102
#: pgadmin/static/js/alertify.pgadmin.defaults.js:163
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:305
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:303
#: pgadmin/tools/grant_wizard/__init__.py:129 pgadmin/utils/exception.py:35
msgid "Connection to the server has been lost."
msgstr "서버 접속이 끊겼습니다."
@@ -575,7 +575,7 @@ msgid "No parameters were changed."
msgstr "바뀐 매개 변수가 없습니다."
#: pgadmin/browser/server_groups/servers/__init__.py:767
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:567
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:562
#: pgadmin/browser/server_groups/servers/databases/casts/__init__.py:370
#: pgadmin/browser/server_groups/servers/databases/extensions/__init__.py:264
#: pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py:395
@@ -597,7 +597,7 @@ msgstr "바뀐 매개 변수가 없습니다."
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:365
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:569
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/__init__.py:436
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:888
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:922
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:393
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py:484
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py:478
@@ -770,33 +770,33 @@ msgstr "'%s' 작업을 위한 응용 프로그램을 찾을 수 없습니다."
msgid "PostgreSQL"
msgstr "PostgreSQL"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:38
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:37
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:21
msgid "Databases"
msgstr "데이터베이스"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:375
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:391
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:654
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:724
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:849
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:1021
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:374
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:390
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:649
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:719
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:844
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:1016
msgid "Could not find the database on the server."
msgstr "해당 데이터베이스를 해당 서버에서 찾을 수 없음."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:469
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:468
msgid "Database connected."
msgstr "데이터베이스 접속됨."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:488
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:485
msgid "Database could not be disconnected."
msgstr "데이터베이스 접속을 끊을 수 없습니다."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:492
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:489
msgid "Database disconnected."
msgstr "데이터베이스 연결 끊김."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:777
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:772
#: pgadmin/browser/server_groups/servers/databases/casts/__init__.py:483
#: pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py:522
#: pgadmin/browser/server_groups/servers/databases/extensions/__init__.py:357
@@ -811,10 +811,10 @@ msgstr "데이터베이스 연결 끊김."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py:548
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py:488
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py:453
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:830
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:829
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py:441
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:462
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1051
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1085
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:474
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py:565
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py:591
@@ -832,11 +832,11 @@ msgstr "데이터베이스 연결 끊김."
msgid "Error: Object not found."
msgstr "오류: 해당 객체 없음."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:780
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:775
msgid "The specified database could not be found.\n"
msgstr "지정한 데이터베이스를 찾지 못했습니다.\n"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:876
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:871
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:728
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:1561
msgid " -- definition incomplete"
@@ -932,19 +932,19 @@ msgstr "형변환자..."
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:93
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:39
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:210
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:182
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:107
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:670
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:712
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:119
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:105
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:53
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:292
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:181
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:106
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:669
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:710
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:118
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:104
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:52
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:289
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:358
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:131
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:130
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:265
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:324
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:184
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:183
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:324
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:148
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:112
@@ -996,22 +996,22 @@ msgstr "이름"
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:114
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog.js:65
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:393
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:185
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:110
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:673
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:716
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:123
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:109
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:295
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:184
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:109
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:672
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:714
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:122
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:108
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:292
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:361
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:146
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:145
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:254
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:327
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:187
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:186
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:328
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:151
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:115
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:312
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:309
#: pgadmin/browser/server_groups/servers/resource_groups/static/js/resource_group.js:87
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:391
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:344
@@ -1126,56 +1126,56 @@ msgstr "소스 자료형"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:654
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:658
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:662
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:137
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:158
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:692
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:702
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:747
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:750
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:758
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:781
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:735
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:748
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:772
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:789
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:805
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:853
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:144
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:416
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:513
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:538
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:561
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:576
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:604
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:130
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:402
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:499
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:523
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:550
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:565
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:593
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:315
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:346
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:349
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:136
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:157
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:691
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:701
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:746
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:749
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:757
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:780
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:733
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:746
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:770
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:787
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:803
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:851
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:143
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:415
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:512
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:537
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:560
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:575
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:603
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:129
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:401
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:498
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:522
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:549
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:564
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:592
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:311
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:342
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:345
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:384
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:388
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:392
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:396
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:400
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:404
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:407
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:411
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:415
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:418
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:440
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:166
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:179
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:191
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:207
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:250
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:268
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:292
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:318
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:323
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:414
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:436
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:165
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:190
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:249
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:267
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:291
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:317
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:322
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:350
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:375
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:385
@@ -1187,14 +1187,14 @@ msgstr "소스 자료형"
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:173
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:136
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:140
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:338
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:343
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:367
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:376
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:381
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:335
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:340
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:364
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:373
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:378
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:383
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:386
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:389
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:393
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:390
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:395
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:408
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:412
@@ -1249,22 +1249,22 @@ msgstr "시스템 형변환자?"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog.js:74
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:403
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:674
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:306
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:113
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:676
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:719
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:127
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:113
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:59
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:477
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:305
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:112
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:675
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:717
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:126
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:112
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:58
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:473
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:411
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:203
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:202
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:397
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:515
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:514
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:762
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:169
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:132
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:334
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:331
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:465
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:140
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:206
@@ -1347,7 +1347,7 @@ msgstr "이벤트 트리거..."
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:331
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:154
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:118
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:315
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:312
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:355
#: pgadmin/dashboard/static/js/dashboard.js:1129
#: pgadmin/dashboard/static/js/dashboard.js:1387
@@ -1359,7 +1359,7 @@ msgstr "소유주"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:111
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:155
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:242
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:199
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:198
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:286
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:103
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:144
@@ -1368,28 +1368,28 @@ msgstr "활성화?"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:120
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:39
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:316
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:315
msgid "Trigger function"
msgstr "트리거 함수"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:124
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:205
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:267
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:272
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:347
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:387
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:391
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:404
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:417
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:429
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:459
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:464
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:204
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:266
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:271
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:346
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:386
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:390
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:403
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:416
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:428
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:458
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:463
msgid "Events"
msgstr "이벤트"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:132
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:264
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:456
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:263
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:455
msgid "When"
msgstr "언제"
@@ -1408,7 +1408,7 @@ msgstr "언제"
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:784
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:222
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:169
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:409
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:406
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:514
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:378
msgid "Security labels"
@@ -1441,14 +1441,14 @@ msgstr "보안 라벨"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1124
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:167
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:130
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:317
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:320
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:323
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:326
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:329
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:332
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:400
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:412
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:467
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:397
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:409
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:464
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:516
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:360
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:372
@@ -1555,11 +1555,11 @@ msgstr "재배치가능?"
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:189
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:479
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:195
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:321
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:495
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:530
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:320
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:491
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:529
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:811
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:455
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:452
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:473
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:163
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:221
@@ -1759,8 +1759,8 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:214
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:129
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:161
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:319
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:396
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:316
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:393
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:420
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:427
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:440
@@ -1941,7 +1941,7 @@ msgid "Schema dropped"
msgstr "스키마 삭제됨"
#: pgadmin/browser/server_groups/servers/databases/schemas/__init__.py:781
-#: pgadmin/static/js/backform.pgadmin.js:1837
+#: pgadmin/static/js/backform.pgadmin.js:1833
msgid "Definition incomplete."
msgstr "정의가 충분하지 않습니다."
@@ -1960,23 +1960,23 @@ msgstr "지정한 카탈로그 객체를 찾을 수 없습니다."
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:594
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:60
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:23
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:269
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:268
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:786
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:787
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:788
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:909
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:898
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:899
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:143
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:344
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:417
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:908
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:896
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:897
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:142
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:340
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:413
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:421
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:427
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:428
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:401
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:495
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:496
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:461
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:460
#: pgadmin/tools/import_export/static/js/import_export.js:179
#: pgadmin/tools/import_export/static/js/import_export.js:199
#: pgadmin/tools/import_export/static/js/import_export.js:237
@@ -2025,7 +2025,7 @@ msgstr "자료형"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:85
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:171
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:449
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:375
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:372
msgid "Collation"
msgstr "정렬규칙"
@@ -2142,7 +2142,7 @@ msgstr "도메인 제약조건..."
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/static/js/domain.js:65
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:415
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:21
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:127
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:614
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:679
msgid "Check"
@@ -2150,7 +2150,7 @@ msgstr "체크"
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js:97
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:419
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:136
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:135
msgid "No inherit?"
msgstr ""
@@ -2161,7 +2161,7 @@ msgid "Validate?"
msgstr "유효성검사?"
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:177
msgid "Check cannot be empty."
msgstr "체크 제약을 지정하세요."
@@ -2266,8 +2266,8 @@ msgstr "외부 테이블 삭제됨"
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py:1285
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py:1330
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1367
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1417
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1401
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1451
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:1356
msgid "-- Please create column(s) first..."
msgstr "-- 칼럼들을 먼저 만드세요..."
@@ -2276,8 +2276,6 @@ msgstr "-- 칼럼들을 먼저 만드세요..."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:487
#: pgadmin/browser/static/js/browser.js:213
#: pgadmin/misc/static/explain/js/explain.js:1219
-#: pgadmin/misc/static/explain/js/explain.js:1348
-#: pgadmin/misc/static/explain/js/explain.js:1349
#: pgadmin/misc/statistics/static/js/statistics.js:129
msgid "Statistics"
msgstr "통계정보"
@@ -2287,7 +2285,7 @@ msgid "Inherited From"
msgstr "상위 테이블"
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:259
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:176
msgid "Column Name cannot be empty."
msgstr "칼럼 이름을 지정하세요."
@@ -2484,7 +2482,7 @@ msgid "FTS Dictionary..."
msgstr "FTS 사전..."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/static/js/fts_dictionary.js:153
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:342
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:339
msgid "Template"
msgstr "템플릿"
@@ -2634,7 +2632,7 @@ msgstr "어휘소 분석 함수를 선택하세요."
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:59
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:21
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:457
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:434
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:431
msgid "Functions"
msgstr "함수"
@@ -2647,29 +2645,29 @@ msgstr "지정한 %s 객체를 찾을 수 없습니다."
msgid "Could not find the function node in the database."
msgstr "해당 데이터베이스에서 그 함수를 찾을 수 없습니다."
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:833
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:832
msgid "The specified function could not be found.\n"
msgstr "지정한 함수를 찾을 수 없습니다.\n"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:850
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:849
msgid "Function dropped."
msgstr "함수 없앴음."
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1141
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1320
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1140
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1319
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:334
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:511
msgid "Could not find the function in the database."
msgstr "해당 데이터베이스에서 그 함수를 찾을 수 없습니다."
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1628
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1627
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js:24
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:621
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbproc.js:24
msgid "Procedures"
msgstr "프로시져"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1728
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1727
msgid "Trigger Functions"
msgstr "트리거 함수"
@@ -2709,7 +2707,7 @@ msgstr "인자 개수"
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:327
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:150
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:79
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:322
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:321
msgid "Arguments"
msgstr "인자"
@@ -2733,8 +2731,8 @@ msgstr "반환 자료형"
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:182
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:98
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:100
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:289
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:493
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:288
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:492
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:154
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:155
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:209
@@ -2802,7 +2800,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:338
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:245
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1119
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:405
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:402
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:508
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:366
#: pgadmin/tools/debugger/static/js/direct.js:1707
@@ -2842,7 +2840,7 @@ msgstr "연결할 심블를 지정하세요."
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:406
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js:200
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:314
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:338
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:337
msgid "Code cannot be empty."
msgstr "코드를 입력하세요."
@@ -3032,7 +3030,7 @@ msgstr "헤더 내용을 입력하세요."
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:56
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:25
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:450
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:428
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:425
msgid "Sequences"
msgstr "시퀀스"
@@ -3195,22 +3193,22 @@ msgid "System schema?"
msgstr "시스템 스키마?"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:409
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:322
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:319
msgid "Default TABLE privileges"
msgstr "테이블 기본 접근권한"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:412
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:325
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:322
msgid "Default SEQUENCE privileges"
msgstr "시퀀스 기본 접근권한"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:415
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:328
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:325
msgid "Default FUNCTION privileges"
msgstr "함수 기본 접근권한"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:418
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:331
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:328
msgid "Default TYPE privileges"
msgstr "자료형 기본 접근권한"
@@ -3219,9 +3217,9 @@ msgid "Default privileges"
msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:443
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:53
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:29
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:422
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:419
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:130
msgid "Tables"
msgstr "테이블"
@@ -3229,7 +3227,7 @@ msgstr "테이블"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:464
#: pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py:58
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:24
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:445
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:442
msgid "Types"
msgstr "자료형"
@@ -3290,8 +3288,8 @@ msgstr "공용 시노님?"
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:185
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:221
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:527
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:791
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:808
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:789
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:806
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:275
#: pgadmin/browser/static/js/browser.js:630
#: pgadmin/browser/static/js/node.js:1283
@@ -3300,17 +3298,17 @@ msgstr "공용 시노님?"
#: pgadmin/misc/file_manager/templates/file_manager/index.html:78
#: pgadmin/static/js/backform.pgadmin.js:538
#: pgadmin/static/js/backgrid.pgadmin.js:621
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1741
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1786
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2385
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1735
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1780
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2379
msgid "Yes"
msgstr "Yes"
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:185
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:221
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:527
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:792
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:809
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:790
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:807
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:275
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:147
#: pgadmin/browser/static/js/browser.js:631
@@ -3320,9 +3318,9 @@ msgstr "Yes"
#: pgadmin/misc/file_manager/templates/file_manager/index.html:77
#: pgadmin/static/js/backform.pgadmin.js:539
#: pgadmin/static/js/backgrid.pgadmin.js:622
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1742
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1787
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2386
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1736
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1781
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2380
msgid "No"
msgstr "No"
@@ -3334,32 +3332,32 @@ msgstr "타겟 스키마를 지정하세요."
msgid "Target object cannot be empty."
msgstr "타켓 객체를 지정하세요."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:359
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:357
msgid "Could not find the table."
msgstr "해당 테이블을 찾을 수 없습니다."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:596
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1271
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:630
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1305
msgid "The specified table could not be found."
msgstr "지정한 테이블을 찾을 수 없습니다."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1054
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1088
msgid "The specified table could not be found.\n"
msgstr "지정한 테이블을 찾을 수 없습니다.\n"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1067
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1101
msgid "Table dropped"
msgstr "테이블 삭제됨"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1145
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1179
msgid "Trigger(s) have been disabled"
msgstr "트리거가 비활성화 되었음"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1147
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1181
msgid "Trigger(s) have been enabled"
msgstr "トリガーが有効になりました"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1501
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1535
#, python-format
msgid "Table rows counted: %s"
msgstr ""
@@ -3412,7 +3410,7 @@ msgstr "칼럼 삭제됨"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:608
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:704
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:856
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:853
msgid "Could not find the column on the server."
msgstr "해당 서버에서 그 칼럼을 찾을 수 없습니다."
@@ -3558,70 +3556,70 @@ msgstr ""
msgid "Compound Trigger"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:56
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:62
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:68
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:74
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:90
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:61
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:67
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:73
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:89
msgid "Compound Trigger..."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:80
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:79
msgid "Enable compound trigger"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:85
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:84
msgid "Disable compound trigger"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:169
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:168
msgid "Disable compound trigger failed"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:188
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:190
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:187
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:189
msgid "Trigger enabled?"
msgstr "트리거 활성화?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:205
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:209
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:222
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:235
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:248
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:204
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:208
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:221
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:234
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:247
msgid "FOR Events"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:207
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:389
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:388
msgid "INSERT"
msgstr "INSERT"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:220
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:402
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:219
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:401
msgid "UPDATE"
msgstr "UPDATE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:233
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:415
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:232
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:414
msgid "DELETE"
msgstr "DELETE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:246
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:428
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:245
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:427
msgid "TRUNCATE"
msgstr "TRUNCATE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:303
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:512
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:302
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:511
msgid "System trigger?"
msgstr "시스템 트리거?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:328
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:543
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:327
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:542
msgid "Specify at least one event."
msgstr "적어도 하나 이상의 이벤트를 지정하세요."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:347
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:346
msgid ""
"-- Enter any global declarations below:\n"
"\n"
@@ -3691,15 +3689,15 @@ msgstr "해당 서버에서 그 객체를 찾을 수 없습니다."
msgid "Check constraint updated."
msgstr "체크 제약조건을 고쳤음."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:40
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:39
msgid "Check..."
msgstr "체크..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:46
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:45
msgid "Validate check constraint"
msgstr "유효성 체크 제약조건"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:157
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:156
msgid "Don't validate?"
msgstr "유효성 검사 안함?"
@@ -3735,7 +3733,7 @@ msgid "Exclusion constraint dropped."
msgstr "제외 제약조건 삭제됨."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:38
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:97
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:96
msgid "Operator class"
msgstr "연산자 클래스"
@@ -3763,10 +3761,10 @@ msgstr "다음 칼럼용 연산자를 선택하세요: "
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:453
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:381
#: pgadmin/browser/server_groups/servers/static/js/variable.js:341
-#: pgadmin/static/js/backform.pgadmin.js:1260
-#: pgadmin/static/js/backform.pgadmin.js:1370
-#: pgadmin/static/js/backform.pgadmin.js:1550
-#: pgadmin/static/js/backform.pgadmin.js:1669
+#: pgadmin/static/js/backform.pgadmin.js:1259
+#: pgadmin/static/js/backform.pgadmin.js:1366
+#: pgadmin/static/js/backform.pgadmin.js:1546
+#: pgadmin/static/js/backform.pgadmin.js:1665
msgid "Add new row"
msgstr "새 로우 추가"
@@ -3778,7 +3776,7 @@ msgstr "제외 제약조건"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:28
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:28
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:29
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:236
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:234
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/exclusion_constraint/sql/default/stats.sql:7
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/exclusion_constraint/sql/default/stats.sql:12
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/index_constraint/sql/default/stats.sql:7
@@ -3788,87 +3786,87 @@ msgstr "제외 제약조건"
msgid "Index size"
msgstr "인덱스 크기"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:642
msgid "Exclusion constraint..."
msgstr "제외 제약조건..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:691
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:512
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:498
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:298
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:690
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:511
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:497
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:295
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:378
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:344
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:196
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:366
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:363
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:40
#: pgadmin/tools/backup/static/js/backup.js:366
#: pgadmin/tools/restore/static/js/restore.js:255
msgid "Tablespace"
msgstr "테이블스페이스"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:701
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:700
msgid "Access method"
msgstr "접근 방법"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:716
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:326
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:715
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:322
msgid "Changing access method will clear columns collection"
msgstr "접근 방법을 바꾸면서 칼럼 정렬 규칙도 함께 지웁니다"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:746
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:560
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:549
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:386
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:745
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:559
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:548
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:382
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:716
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:790
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:204
msgid "Fill factor"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:749
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:734
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:575
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:564
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:267
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:748
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:732
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:574
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:563
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:266
msgid "Deferrable?"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:757
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:747
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:603
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:592
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:291
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:756
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:745
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:602
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:591
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:290
msgid "Deferred?"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:779
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:413
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:778
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:409
msgid "Constraint"
msgstr "제약조건"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:908
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:415
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:401
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:348
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:439
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:907
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:414
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:400
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:344
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:435
msgid "Include columns"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:931
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:242
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:438
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:228
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:424
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:370
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:461
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:930
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:241
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:437
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:227
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:423
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:366
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:457
msgid "Select the column(s)"
msgstr "칼럼을 선택하세요"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1012
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1011
msgid "Please specify name for exclusion constraint."
msgstr "제외 제약조건 이름을 지정하세요."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1018
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1017
msgid "Please specify columns for exclusion constraint."
msgstr "제외 제약조건용 칼럼을 지정하세요."
@@ -3926,53 +3924,53 @@ msgstr ""
msgid "Referencing"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:616
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:615
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:585
msgid "Foreign key"
msgstr "참조키"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:637
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:635
msgid "Foreign key..."
msgstr "참조키..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:641
msgid "Validate foreign key"
msgstr "참조키 유효성검사"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:771
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:769
msgid "Match type"
msgstr "비교 방법"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:788
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:786
msgid "Validated?"
msgstr "유효성검사함?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:804
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:802
msgid "Auto FK index?"
msgstr "자동 참조키 인덱스?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:852
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:850
msgid "Covering index"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1002
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1000
msgid "On update"
msgstr "UPDATE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1003
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1023
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1001
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1021
msgid "Action"
msgstr "동작"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1022
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1020
msgid "On delete"
msgstr "DELETE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1050
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1048
msgid "Please specify columns for Foreign key."
msgstr "참조키용 칼럼을 지정하세요."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1059
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1057
msgid "Please specify covering index name."
msgstr "사용할 인덱스 이름을 지정하세요."
@@ -4017,7 +4015,7 @@ msgstr "{0} 삭제됨."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py:996
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:20
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:43
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:42
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:557
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:729
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:811
@@ -4026,7 +4024,7 @@ msgstr "기본키"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py:1006
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:20
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:43
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:42
msgid "Unique constraint"
msgstr "유니크 제약조건"
@@ -4034,19 +4032,19 @@ msgstr "유니크 제약조건"
msgid "Could not find the constraint in the table."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:536
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:522
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:231
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:535
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:521
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:229
msgid "Index"
msgstr "인덱스"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:644
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:633
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:632
#, python-format
msgid "Please specify columns for %s"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:56
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:55
msgid "Oid"
msgstr "OID"
@@ -4073,7 +4071,7 @@ msgid "Index is dropped"
msgstr "인덱스 삭제됨"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:29
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:236
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:234
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:45
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:33
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:49
@@ -4090,59 +4088,63 @@ msgstr "인덱스 삭제됨"
msgid "Size"
msgstr "크기"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:130
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:128
msgid "Sort order"
msgstr "정렬 순서"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:151
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:149
msgid "NULLs"
msgstr "NULL"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:248
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:254
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:260
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:266
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:272
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:245
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:251
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:257
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:263
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:269
msgid "Index..."
msgstr "인덱스..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:311
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:308
msgid "Access Method"
msgstr "접근 방법"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:390
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:386
msgid "Unique?"
msgstr "유니크?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:394
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:390
msgid "Clustered?"
msgstr "클러스트됨?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:398
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:394
msgid "Valid?"
msgstr "유효함?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:402
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:398
msgid "Primary?"
msgstr "기본키?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:406
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:402
msgid "System index?"
msgstr "시스템 인덱스?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:409
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:405
msgid "Concurrent build?"
msgstr "테이블 잠금 없는 만들기?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:501
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:497
+msgid "Tablespace cannot be empty."
+msgstr "테이블스페이스를 지정하세요."
+
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:503
msgid "Access method cannot be empty."
msgstr "접근 방법을 지정하세요."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:509
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:511
msgid "You must specify column name."
msgstr "칼럼 이름을 선택하세요."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:514
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:516
msgid "You must specify at least one column."
msgstr "적어도 하나 이상의 칼럼을 지정하세요."
@@ -4533,39 +4535,39 @@ msgstr "룰 삭제됨"
msgid "rule"
msgstr "룰"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:93
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:99
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:105
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:111
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:117
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:92
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:98
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:104
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:110
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:116
msgid "Rule..."
msgstr "룰..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:165
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:164
#: pgadmin/static/js/sqleditor/query_tool_notifications.js:32
#: pgadmin/static/js/sqleditor/query_tool_notifications.js:80
msgid "Event"
msgstr "이벤트"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:179
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:178
msgid "Do instead?"
msgstr ""
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:182
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:183
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:184
msgid "Condition"
msgstr "조건"
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:188
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:189
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:190
msgid "Commands"
msgstr "명령"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:195
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:194
msgid "System rule?"
msgstr "시스템 룰?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:215
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:214
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:241
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:183
msgid "Please specify name."
@@ -5129,56 +5131,56 @@ msgstr "트리거 삭제됨"
msgid "Trigger"
msgstr "트리거"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:56
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:62
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:68
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:74
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:90
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:61
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:67
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:73
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:89
msgid "Trigger..."
msgstr "트리거..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:80
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:79
msgid "Enable trigger"
msgstr "트리거 활성화"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:85
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:84
msgid "Disable trigger"
msgstr "트리거 비활성화"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:169
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:168
msgid "Disable trigger failed"
msgstr "트리거 비활성화 실패"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:205
msgid "Row trigger?"
msgstr "로우 트리거?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:247
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:246
msgid "Constraint trigger?"
msgstr "제약조건 트리거?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:346
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:345
msgid "Fires"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:481
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:480
msgid "Old table"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:482
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:488
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:481
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:487
msgid "Transition"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:487
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:486
msgid "New table"
msgstr "새 테이블"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:536
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:535
msgid "Trigger function cannot be empty."
msgstr "트리거 함수를 지정하세요."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:556
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:555
msgid "Trigger code cannot be empty."
msgstr "트리거 코드를 입력하세요."
@@ -5562,7 +5564,7 @@ msgid "Size of temporary files"
msgstr "임시 파일 크기"
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:45
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:309
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:306
#: pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.2_plus/stats.sql:2
#: pgadmin/browser/server_groups/servers/databases/templates/databases/sql/default/stats.sql:2
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:176
@@ -5616,35 +5618,35 @@ msgstr "데이터베이스 연결 끊기"
msgid "Are you sure you want to disconnect the database - %s?"
msgstr "%s 데이터베이스 연결을 끊을까요?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:337
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:334
#: pgadmin/static/js/browser/server_groups/servers/databases/external_tables/external_tables.js:52
#: pgadmin/tools/backup/static/js/backup.js:192
#: pgadmin/tools/import_export/static/js/import_export.js:108
msgid "Encoding"
msgstr "인코딩"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:380
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:377
msgid "Character type"
msgstr "문자 종류"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:385
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:382
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:413
msgid "Connection limit"
msgstr "연결 제한"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:388
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:385
msgid "Template?"
msgstr "템플릿?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:392
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:389
msgid "Allow connections?"
msgstr "접속 허용?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:417
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:414
msgid "Default Privileges"
msgstr "기본 접근권한"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:499
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:496
msgid "Connect to database"
msgstr "데이터베이스 연결"
@@ -6465,7 +6467,7 @@ msgstr "종류"
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:139
#: pgadmin/browser/static/js/browser.js:224
#: pgadmin/dashboard/static/js/dashboard.js:191
-#: pgadmin/static/js/backform.pgadmin.js:2032
+#: pgadmin/static/js/backform.pgadmin.js:2028
msgid "SQL"
msgstr "SQL"
@@ -6987,8 +6989,8 @@ msgid "At least one privilege should be selected."
msgstr "적어도 하나 이상의 접근 권한이 선택되어야합니다."
#: pgadmin/browser/server_groups/servers/static/js/server.js:46
-msgid "Security label must be specified."
-msgstr ""
+msgid "Label must be specified."
+msgstr "라벨은 반드시 지정해야합니다."
#: pgadmin/browser/server_groups/servers/static/js/server.js:79
#: pgadmin/browser/server_groups/servers/static/js/server.js:84
@@ -7087,20 +7089,20 @@ msgstr "비밀번호 변경 "
#: pgadmin/misc/file_manager/static/js/create_dialogue.js:188
#: pgadmin/misc/file_manager/static/js/select_dialogue.js:86
#: pgadmin/misc/file_manager/static/js/select_dialogue.js:129
-#: pgadmin/preferences/static/js/preferences.js:435
+#: pgadmin/preferences/static/js/preferences.js:434
#: pgadmin/static/js/slickgrid/editors.js:50
-#: pgadmin/static/js/sqleditor/filter_dialog.js:79
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:62
-#: pgadmin/tools/datagrid/static/js/show_data.js:139
+#: pgadmin/static/js/sqleditor/filter_dialog.js:78
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:61
+#: pgadmin/tools/datagrid/static/js/show_data.js:138
#: pgadmin/tools/debugger/static/js/debugger_ui.js:588
#: pgadmin/tools/debugger/static/js/debugger_ui.js:893
#: pgadmin/tools/import_export/static/js/import_export.js:495
-#: pgadmin/tools/maintenance/static/js/maintenance.js:297
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:56
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2010
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2164
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4222
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4289
+#: pgadmin/tools/maintenance/static/js/maintenance.js:296
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:55
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2004
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2158
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4216
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4283
msgid "Cancel"
msgstr "취소"
@@ -7321,7 +7323,7 @@ msgid "Connection timeout (seconds)"
msgstr "연결 제한시간(초)"
#: pgadmin/browser/server_groups/servers/static/js/server.js:1130
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2192
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2186
msgid "Connect to Server"
msgstr "서버 접속"
@@ -7572,17 +7574,15 @@ msgid "Dependents"
msgstr "하위의존"
#: pgadmin/browser/static/js/browser.js:348
-#: pgadmin/browser/static/js/toolbar.js:30
-#: pgadmin/browser/static/js/toolbar.js:31
-#: pgadmin/browser/static/js/toolbar.js:91
+#: pgadmin/browser/static/js/toolbar.js:29
+#: pgadmin/browser/static/js/toolbar.js:88
#: pgadmin/tools/datagrid/static/js/datagrid.js:74
msgid "View Data"
msgstr ""
#: pgadmin/browser/static/js/browser.js:349
#: pgadmin/browser/static/js/toolbar.js:20
-#: pgadmin/browser/static/js/toolbar.js:21
-#: pgadmin/browser/static/js/toolbar.js:93
+#: pgadmin/browser/static/js/toolbar.js:90
#: pgadmin/tools/datagrid/static/js/datagrid.js:75
msgid "Filtered Rows"
msgstr ""
@@ -7822,10 +7822,10 @@ msgid "Changes will be lost. Are you sure you want to reset?"
msgstr ""
#: pgadmin/browser/static/js/node.js:1513
-#: pgadmin/preferences/static/js/preferences.js:439
-#: pgadmin/preferences/static/js/preferences.js:464
+#: pgadmin/preferences/static/js/preferences.js:438
+#: pgadmin/preferences/static/js/preferences.js:463
#: pgadmin/tools/datagrid/templates/datagrid/index.html:37
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4297
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4291
msgid "Save"
msgstr "저장"
@@ -7845,20 +7845,17 @@ msgstr "전체선택"
msgid "Unselect All"
msgstr "전체 해제"
-#: pgadmin/browser/static/js/toolbar.js:40
-#: pgadmin/browser/static/js/toolbar.js:41
-#: pgadmin/browser/static/js/toolbar.js:89
+#: pgadmin/browser/static/js/toolbar.js:38
+#: pgadmin/browser/static/js/toolbar.js:86
#: pgadmin/tools/datagrid/static/js/datagrid.js:103
#: pgadmin/tools/datagrid/static/js/datagrid.js:115
#: pgadmin/tools/sqleditor/__init__.py:68
msgid "Query Tool"
msgstr "쿼리 도구"
-#: pgadmin/browser/static/js/wizard.js:85
#: pgadmin/browser/static/js/wizard.js:86
#: pgadmin/static/js/alertify.pgadmin.defaults.js:261
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:263
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:457
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:455
#: pgadmin/templates/security/messages.html:7
#: pgadmin/tools/user_management/static/js/user_management.js:81
#: pgadmin/tools/user_management/static/js/user_management.js:174
@@ -7866,11 +7863,9 @@ msgstr "쿼리 도구"
msgid "Close"
msgstr "닫기"
-#: pgadmin/browser/static/js/wizard.js:88
#: pgadmin/browser/static/js/wizard.js:89
#: pgadmin/static/js/alertify.pgadmin.defaults.js:262
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:264
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:458
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:456
msgid "Maximize"
msgstr "최대화"
@@ -7878,22 +7873,6 @@ msgstr "최대화"
msgid "Left panel logo"
msgstr ""
-#: pgadmin/browser/static/js/wizard.js:124
-msgid "Close error bar"
-msgstr ""
-
-#: pgadmin/browser/static/js/wizard.js:131
-#: pgadmin/browser/templates/browser/index.html:135 pgadmin/help/__init__.py:59
-#: pgadmin/help/__init__.py:70 pgadmin/preferences/static/js/preferences.js:427
-#: pgadmin/static/js/sqleditor/filter_dialog.js:72
-#: pgadmin/static/js/sqleditor/filter_dialog.js:73
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:56
-#: pgadmin/tools/datagrid/static/js/show_data.js:133
-#: pgadmin/tools/maintenance/static/js/maintenance.js:289
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:50
-msgid "Help"
-msgstr "도움말"
-
#: pgadmin/browser/static/js/wizard.js:139
#: pgadmin/misc/file_manager/templates/file_manager/index.html:15
msgid "Back"
@@ -7931,6 +7910,11 @@ msgstr "관리"
msgid "Tools"
msgstr "도구들"
+#: pgadmin/browser/templates/browser/index.html:135 pgadmin/help/__init__.py:59
+#: pgadmin/help/__init__.py:70 pgadmin/static/js/sqleditor/filter_dialog.js:72
+msgid "Help"
+msgstr "도움말"
+
#: pgadmin/browser/templates/browser/index.html:157
msgid "Logout"
msgstr "로그아웃"
@@ -8321,7 +8305,7 @@ msgstr ""
#: pgadmin/dashboard/templates/dashboard/database_dashboard.html:88
#: pgadmin/dashboard/templates/dashboard/server_dashboard.html:92
#: pgadmin/misc/file_manager/templates/file_manager/index.html:27
-#: pgadmin/preferences/static/js/preferences.js:492
+#: pgadmin/preferences/static/js/preferences.js:491
msgid "Refresh"
msgstr "새로고침"
@@ -8840,33 +8824,13 @@ msgstr ""
msgid "Analysis"
msgstr ""
-#: pgadmin/misc/static/explain/js/explain.js:1286
-#: pgadmin/misc/static/explain/js/explain.js:1287
-msgid "Zoom in"
-msgstr ""
-
-#: pgadmin/misc/static/explain/js/explain.js:1295
-#: pgadmin/misc/static/explain/js/explain.js:1296
-msgid "Zoom to original"
-msgstr ""
-
-#: pgadmin/misc/static/explain/js/explain.js:1304
-#: pgadmin/misc/static/explain/js/explain.js:1305
-msgid "Zoom out"
-msgstr ""
-
-#: pgadmin/misc/static/explain/js/explain.js:1319
-#: pgadmin/misc/static/explain/js/explain.js:1320
-msgid "Download"
-msgstr ""
-
#: pgadmin/misc/statistics/static/js/statistics.js:214
msgid "No statistics are available for the selected object."
msgstr "선택된 객체를 위한 사용가능한 통계정보가 없음."
#: pgadmin/preferences/__init__.py:55
#: pgadmin/preferences/static/js/preferences.js:426
-#: pgadmin/preferences/static/js/preferences.js:449
+#: pgadmin/preferences/static/js/preferences.js:448
msgid "Preferences"
msgstr "설정"
@@ -8891,17 +8855,17 @@ msgstr "숨김"
msgid "Category is not selected."
msgstr "카테고리가 선택되지 않았음."
-#: pgadmin/preferences/static/js/preferences.js:483
+#: pgadmin/preferences/static/js/preferences.js:482
msgid "Refresh required"
msgstr ""
-#: pgadmin/preferences/static/js/preferences.js:484
+#: pgadmin/preferences/static/js/preferences.js:483
msgid ""
"A page refresh is required to apply the theme. Do you wish to refresh the"
" page now?"
msgstr ""
-#: pgadmin/preferences/static/js/preferences.js:493
+#: pgadmin/preferences/static/js/preferences.js:492
msgid "Later"
msgstr ""
@@ -8945,37 +8909,33 @@ msgstr "알 수 없는 오류"
msgid "INTERNAL SERVER ERROR"
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:1550
-msgid "Add"
-msgstr ""
-
-#: pgadmin/static/js/backform.pgadmin.js:1841
+#: pgadmin/static/js/backform.pgadmin.js:1837
msgid "No updates."
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:1956
+#: pgadmin/static/js/backform.pgadmin.js:1952
msgid "General"
msgstr "일반"
-#: pgadmin/static/js/backform.pgadmin.js:2157
+#: pgadmin/static/js/backform.pgadmin.js:2153
msgid "Preview not available..."
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:2618
+#: pgadmin/static/js/backform.pgadmin.js:2605
#: pgadmin/tools/backup/static/js/backup.js:95
#: pgadmin/tools/backup/static/js/backup.js:230
msgid "Note"
msgstr "노트"
-#: pgadmin/static/js/backform.pgadmin.js:2974
+#: pgadmin/static/js/backform.pgadmin.js:2961
msgid "More"
msgstr "자세히"
-#: pgadmin/static/js/backform.pgadmin.js:2975
+#: pgadmin/static/js/backform.pgadmin.js:2962
msgid "Less"
msgstr "간략히"
-#: pgadmin/static/js/backform.pgadmin.js:3059
+#: pgadmin/static/js/backform.pgadmin.js:3046
msgid "Space"
msgstr ""
@@ -9004,7 +8964,7 @@ msgstr "이 객체는 삭제할 수 없습니다."
msgid "Delete row"
msgstr "로우 삭제"
-#: pgadmin/static/js/backgrid.pgadmin.js:1098
+#: pgadmin/static/js/backgrid.pgadmin.js:1091
msgid "Array Values"
msgstr "배열 값"
@@ -9156,13 +9116,13 @@ msgstr "쿼리 실행 완료 시간: %s."
msgid "Sort/Filter options"
msgstr "정렬/필터 옵션"
-#: pgadmin/static/js/sqleditor/filter_dialog.js:239
+#: pgadmin/static/js/sqleditor/filter_dialog.js:238
msgid "Filter updated successfully"
msgstr "검색 조건이 적용되었음"
-#: pgadmin/static/js/sqleditor/filter_dialog.js:245
-#: pgadmin/tools/datagrid/static/js/show_data.js:238
-#: pgadmin/tools/datagrid/static/js/show_data.js:245
+#: pgadmin/static/js/sqleditor/filter_dialog.js:244
+#: pgadmin/tools/datagrid/static/js/show_data.js:237
+#: pgadmin/tools/datagrid/static/js/show_data.js:244
msgid "Validation Error"
msgstr "유효성 오류"
@@ -9243,7 +9203,6 @@ msgstr ""
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:40
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:41
-#: pgadmin/tools/datagrid/templates/datagrid/index.html:56
#: pgadmin/tools/datagrid/templates/datagrid/index.html:68
msgid "Find"
msgstr "찾기"
@@ -9327,14 +9286,14 @@ msgstr ""
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:129
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:131
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4230
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4224
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:663
msgid "Commit"
msgstr ""
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:135
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:137
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4227
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4221
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:681
msgid "Rollback"
msgstr ""
@@ -9410,7 +9369,7 @@ msgstr "이 URL은 직접 호출 될 수 없습니다."
#: pgadmin/tools/backup/__init__.py:43
#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:46
#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:55
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:67
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:66
msgid "Backup"
msgstr "백업"
@@ -9690,8 +9649,8 @@ msgstr "백업..."
#: pgadmin/tools/backup/static/js/backup_dialog.js:71
#: pgadmin/tools/import_export/static/js/import_export.js:685
#: pgadmin/tools/import_export/static/js/import_export.js:699
-#: pgadmin/tools/maintenance/static/js/maintenance.js:477
-#: pgadmin/tools/maintenance/static/js/maintenance.js:488
+#: pgadmin/tools/maintenance/static/js/maintenance.js:476
+#: pgadmin/tools/maintenance/static/js/maintenance.js:487
#: pgadmin/tools/restore/static/js/restore_dialog.js:51
#: pgadmin/tools/restore/static/js/restore_dialog.js:75
msgid "Utility not found"
@@ -9699,25 +9658,25 @@ msgstr ""
#: pgadmin/tools/backup/static/js/backup_dialog.js:72
#: pgadmin/tools/import_export/static/js/import_export.js:700
-#: pgadmin/tools/maintenance/static/js/maintenance.js:489
+#: pgadmin/tools/maintenance/static/js/maintenance.js:488
#: pgadmin/tools/restore/static/js/restore_dialog.js:76
msgid "Failed to fetch Utility information"
msgstr ""
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:159
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:158
msgid "Backup job created."
msgstr "백업 작업을 만들었습니다."
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:163
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:162
msgid "Backup job creation failed."
msgstr ""
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:171
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:170
msgid "Backup job failed."
msgstr "백업 작업을 실패했습니다."
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:242
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:229
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:241
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:228
msgid "Please provide a filename"
msgstr "파일 이름을 지정하세요"
@@ -9766,7 +9725,7 @@ msgstr "선택한 객체 없음."
msgid "Data Filter"
msgstr ""
-#: pgadmin/tools/datagrid/static/js/show_data.js:161
+#: pgadmin/tools/datagrid/static/js/show_data.js:160
msgid "Use SHIFT + ENTER to apply filter..."
msgstr ""
@@ -10355,30 +10314,6 @@ msgstr "스택"
msgid "Debugger - "
msgstr "디버거 - "
-#: pgadmin/tools/debugger/templates/debugger/direct.html:59
-msgid "Step into"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:67
-msgid "Step over"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:75
-msgid "Continue/Start"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:85
-msgid "Toggle breakpoint"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:93
-msgid "Clear all breakpoints"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:103
-msgid "Stop"
-msgstr ""
-
#: pgadmin/tools/grant_wizard/__init__.py:327
msgid "Unable to fetch the {} objects"
msgstr ""
@@ -10722,7 +10657,7 @@ msgstr "자세한 메시지"
#: pgadmin/tools/maintenance/static/js/maintenance.js:167
#: pgadmin/tools/maintenance/static/js/maintenance.js:183
-#: pgadmin/tools/maintenance/static/js/maintenance.js:483
+#: pgadmin/tools/maintenance/static/js/maintenance.js:482
msgid "Maintenance..."
msgstr "유지보수..."
@@ -10736,15 +10671,15 @@ msgid ""
"cannot be maintained using this utility."
msgstr ""
-#: pgadmin/tools/maintenance/static/js/maintenance.js:387
-#: pgadmin/tools/maintenance/static/js/maintenance.js:394
+#: pgadmin/tools/maintenance/static/js/maintenance.js:386
+#: pgadmin/tools/maintenance/static/js/maintenance.js:393
msgid "Maintenance job creation failed."
msgstr "관리 작업 프로세스 만들기 실패."
#: pgadmin/tools/restore/__init__.py:41
#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:40
#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:49
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:62
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:61
msgid "Restore"
msgstr "복원"
@@ -10810,15 +10745,15 @@ msgstr "복원..."
msgid "Restore (%s: %s)"
msgstr "복원 (%s: %s)"
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:149
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:148
msgid "Restore job created."
msgstr "복원 작업 프로세스 만듬."
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:153
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:152
msgid "Restore job creation failed."
msgstr ""
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:161
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:160
msgid "Restore job failed."
msgstr "복원 작업 실패."
@@ -10902,241 +10837,241 @@ msgstr "알림"
msgid "Geometry Viewer"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:832
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:826
msgid "Editable column"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:834
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:828
msgid "Read-only column"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1261
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1255
msgid "Fetching all records..."
msgstr "모든 자료를 가져오는 중..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1730
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2369
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3314
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1724
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2363
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3308
msgid "Unsaved changes"
msgstr "저장되지 않은 변경사항"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1731
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3315
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1725
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3309
msgid "Are you sure you wish to discard the current changes?"
msgstr "현재 변경 내용을 버릴까요?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1759
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1753
msgid "Clear history"
msgstr "내역 지우기"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1760
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1754
msgid "Are you sure you wish to clear the history?"
msgstr "내역을 정말 다 지울까요?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1761
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1755
msgid ""
"This will remove all of your query history from this and other sessions "
"for this database."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2125
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2119
msgid "Connection Warning"
msgstr "접속 경고"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2132
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2126
msgid "The application has lost the database connection:"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2136
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2130
msgid "⁃ If the connection was idle it may have been forcibly disconnected."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2138
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2132
msgid "⁃ The application server or database server may have been restarted."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2140
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2134
msgid "⁃ The user session may have timed out."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2144
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2138
msgid "Do you want to continue and establish a new session?"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2163
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2157
msgid "Continue"
msgstr "계속"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2299
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2293
#, python-format
msgid "Error fetching SQL for script: %s."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2370
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2364
msgid ""
"The data has been modified, but not saved. Are you sure you wish to "
"discard the changes?"
msgstr "자료가 변경되었지만 아직 저장되지 않았습니다. 저장할까요?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2414
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2408
msgid "Running query..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2422
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2416
msgid "Waiting for the query to complete..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2579
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2573
msgid "Loading data from the database server and rendering..."
msgstr "데이터베이스 서버에서 자료를 불러와서 랜더링 중..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2588
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2582
#, python-format
msgid "Successfully run. Total query runtime: %s."
msgstr "실행 완료. 총 쿼리 실행시간: %s."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2589
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2583
#, python-format
msgid "%s rows affected."
msgstr "%s 로우가 영향받았음."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2865
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2859
msgid ""
"This query was generated by pgAdmin as part of a \"View/Edit Data\" "
"operation"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2966
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2960
msgid "Row(s) deleted."
msgstr "로우가 삭제됨."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3040
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3034
msgid "Saving the updated data..."
msgstr "변경된 자료를 저장 중..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3156
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3150
msgid "Data saved successfully."
msgstr "자료 저장 성공."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3159
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3153
msgid "Auto-commit is off. You still need to commit changes to the database."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3165
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3159
#, python-format
msgid "%s."
msgstr "%s."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3170
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3164
msgid ""
"Saving data changes was rolled back but the current transaction is still "
"active; previous queries are unaffected."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3192
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3186
msgid "This query was generated by pgAdmin as part of a \"Save Data\" operation"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3353
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3347
msgid "Loading the file..."
msgstr "파일 불러오는 중..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3404
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3398
msgid "Saving the queries in the file..."
msgstr "쿼리를 파일에 저장 중..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3416
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3410
msgid "File saved successfully."
msgstr "파일 저장 성공."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3538
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3597
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3532
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3591
msgid "Applying the new filter..."
msgstr "새 필터 적용 중..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3558
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3568
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3552
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3562
msgid "Filter By Selection Error"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3617
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3627
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3611
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3621
msgid "Filter Exclude Selection Error"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3637
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3631
msgid "Removing the filter..."
msgstr "필터 삭제 중..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3655
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3665
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3649
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3659
msgid "Remove Filter Error"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3768
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3762
msgid "Setting the limit on the result..."
msgstr "결과 제한 설정 중 ..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3787
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3796
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3781
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3790
msgid "Change limit Error"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3922
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3941
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3916
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3935
msgid "Cancel Query Error"
msgstr "쿼리 실행 취소 오류"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3960
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3954
msgid "Downloading CSV..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4014
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4008
msgid "CSV Download cancelled."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4017
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4011
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:395
msgid "Download CSV"
msgstr "CSV 파일 다운로드"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4020
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4014
msgid "Download CSV error"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4054
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4061
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4048
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4055
msgid "Auto Rollback Error"
msgstr "자동 롤백 오류"
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4081
#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4087
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4093
msgid "Auto Commit Error"
msgstr "자동 커밋 오류"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4182
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4176
msgid "The data has changed. Do you want to save changes?"
msgstr "자료가 바뀌었습니다. 저장할까요?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4188
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4182
msgid "The text has changed. Do you want to save changes?"
msgstr "텍스트가 바뀌었습니다. 저장할까요?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4268
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4262
msgid ""
"The current transaction is not commited to the database.Do you want to "
"commit or rollback the transaction?"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4271
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4265
msgid "Commit transaction?"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4294
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4288
msgid "Don't save"
msgstr "저장안함"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4337
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4331
msgid "Save changes?"
msgstr "바뀐 내용을 저장할까요?"
@@ -12346,9 +12281,3 @@ msgstr "지정한 데이터베이스를 찾을 수 없음."
#~ msgid "Error dropping %s: \"%s\""
#~ msgstr "%s 삭제 중 오류: \"%s\""
-#~ msgid "Tablespace cannot be empty."
-#~ msgstr "테이블스페이스를 지정하세요."
-
-#~ msgid "Label must be specified."
-#~ msgstr "라벨은 반드시 지정해야합니다."
-
diff --git a/web/pgadmin/translations/pl/LC_MESSAGES/messages.mo b/web/pgadmin/translations/pl/LC_MESSAGES/messages.mo
index 92ce4d981bc9e0045ffe011a33518e04e06a6e70..6ed1cbb0762c54218de08439ded511542039377e 100644
GIT binary patch
delta 26963
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
DQE(ql
delta 26886
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
NHs5h@T}r(Q{|{B5>~8=7
diff --git a/web/pgadmin/translations/pl/LC_MESSAGES/messages.po b/web/pgadmin/translations/pl/LC_MESSAGES/messages.po
index eba605275..21403493d 100644
--- a/web/pgadmin/translations/pl/LC_MESSAGES/messages.po
+++ b/web/pgadmin/translations/pl/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-01-03 19:02+0530\n"
+"POT-Creation-Date: 2019-12-06 19:29+0530\n"
"PO-Revision-Date: 2017-12-17 23:18+0200\n"
"Last-Translator: grzegorz <[email protected]>\n"
"Language: pl\n"
@@ -48,13 +48,13 @@ msgstr "Desktop"
#: pgadmin/static/js/slickgrid/editors.js:50
#: pgadmin/static/js/slickgrid/editors.js:60
#: pgadmin/static/js/slickgrid/editors.js:61
-#: pgadmin/static/js/sqleditor/filter_dialog.js:84
-#: pgadmin/tools/datagrid/static/js/show_data.js:143
-#: pgadmin/tools/datagrid/static/js/show_data.js:218
+#: pgadmin/static/js/sqleditor/filter_dialog.js:83
+#: pgadmin/tools/datagrid/static/js/show_data.js:142
+#: pgadmin/tools/datagrid/static/js/show_data.js:217
#: pgadmin/tools/import_export/static/js/import_export.js:500
-#: pgadmin/tools/maintenance/static/js/maintenance.js:302
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2005
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2035
+#: pgadmin/tools/maintenance/static/js/maintenance.js:301
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1999
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2029
msgid "OK"
msgstr "OK"
@@ -457,7 +457,7 @@ msgstr "Brak wymaganych atrybutów."
#: pgadmin/browser/utils.py:386
#: pgadmin/static/js/alertify.pgadmin.defaults.js:102
#: pgadmin/static/js/alertify.pgadmin.defaults.js:163
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:305
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:303
#: pgadmin/tools/grant_wizard/__init__.py:129 pgadmin/utils/exception.py:35
msgid "Connection to the server has been lost."
msgstr "Stracono połączenie z serwerem."
@@ -576,7 +576,7 @@ msgid "No parameters were changed."
msgstr "Parametry nie zmieniły się."
#: pgadmin/browser/server_groups/servers/__init__.py:767
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:567
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:562
#: pgadmin/browser/server_groups/servers/databases/casts/__init__.py:370
#: pgadmin/browser/server_groups/servers/databases/extensions/__init__.py:264
#: pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py:395
@@ -598,7 +598,7 @@ msgstr "Parametry nie zmieniły się."
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:365
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:569
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/__init__.py:436
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:888
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:922
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:393
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py:484
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py:478
@@ -775,33 +775,33 @@ msgstr "Nie można odnaleźć narzędzia dla operacji '%s'"
msgid "PostgreSQL"
msgstr "PostgreSQL"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:38
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:37
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:21
msgid "Databases"
msgstr "Bazy danych"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:375
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:391
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:654
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:724
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:849
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:1021
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:374
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:390
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:649
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:719
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:844
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:1016
msgid "Could not find the database on the server."
msgstr "Nie odnaleziono bazy danych na serwerze."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:469
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:468
msgid "Database connected."
msgstr "Połączono z bazą danych."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:488
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:485
msgid "Database could not be disconnected."
msgstr "Nie można było rozłączyć od bazy danych."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:492
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:489
msgid "Database disconnected."
msgstr "Odłączono od bazy danych."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:777
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:772
#: pgadmin/browser/server_groups/servers/databases/casts/__init__.py:483
#: pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py:522
#: pgadmin/browser/server_groups/servers/databases/extensions/__init__.py:357
@@ -816,10 +816,10 @@ msgstr "Odłączono od bazy danych."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py:548
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py:488
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py:453
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:830
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:829
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py:441
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:462
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1051
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1085
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:474
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py:565
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py:591
@@ -837,11 +837,11 @@ msgstr "Odłączono od bazy danych."
msgid "Error: Object not found."
msgstr "Błąd: nie znaleziono obiektów."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:780
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:775
msgid "The specified database could not be found.\n"
msgstr "Wskazana baza danych nie została znaleziona.\n"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:876
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:871
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:728
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:1561
msgid " -- definition incomplete"
@@ -937,19 +937,19 @@ msgstr "Rzutowanie..."
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:93
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:39
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:210
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:182
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:107
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:670
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:712
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:119
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:105
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:53
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:292
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:181
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:106
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:669
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:710
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:118
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:104
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:52
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:289
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:358
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:131
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:130
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:265
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:324
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:184
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:183
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:324
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:148
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:112
@@ -1001,22 +1001,22 @@ msgstr "Nazwa"
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:114
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog.js:65
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:393
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:185
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:110
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:673
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:716
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:123
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:109
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:295
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:184
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:109
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:672
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:714
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:122
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:108
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:292
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:361
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:146
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:145
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:254
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:327
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:187
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:186
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:328
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:151
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:115
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:312
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:309
#: pgadmin/browser/server_groups/servers/resource_groups/static/js/resource_group.js:87
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:391
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:344
@@ -1131,56 +1131,56 @@ msgstr "Typ źródłowy"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:654
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:658
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:662
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:137
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:158
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:692
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:702
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:747
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:750
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:758
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:781
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:735
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:748
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:772
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:789
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:805
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:853
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:144
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:416
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:513
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:538
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:561
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:576
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:604
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:130
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:402
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:499
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:523
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:550
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:565
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:593
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:315
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:346
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:349
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:136
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:157
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:691
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:701
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:746
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:749
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:757
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:780
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:733
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:746
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:770
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:787
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:803
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:851
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:143
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:415
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:512
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:537
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:560
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:575
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:603
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:129
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:401
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:498
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:522
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:549
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:564
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:592
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:311
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:342
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:345
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:384
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:388
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:392
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:396
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:400
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:404
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:407
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:411
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:415
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:418
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:440
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:166
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:179
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:191
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:207
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:250
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:268
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:292
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:318
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:323
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:414
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:436
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:165
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:190
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:249
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:267
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:291
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:317
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:322
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:350
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:375
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:385
@@ -1192,14 +1192,14 @@ msgstr "Typ źródłowy"
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:173
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:136
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:140
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:338
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:343
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:367
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:376
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:381
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:335
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:340
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:364
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:373
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:378
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:383
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:386
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:389
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:393
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:390
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:395
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:408
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:412
@@ -1254,22 +1254,22 @@ msgstr "Rzutowanie systemowe?"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog.js:74
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:403
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:674
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:306
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:113
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:676
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:719
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:127
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:113
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:59
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:477
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:305
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:112
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:675
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:717
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:126
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:112
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:58
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:473
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:411
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:203
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:202
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:397
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:515
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:514
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:762
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:169
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:132
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:334
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:331
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:465
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:140
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:206
@@ -1352,7 +1352,7 @@ msgstr "Wyzwalacz Zdarzeniowy..."
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:331
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:154
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:118
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:315
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:312
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:355
#: pgadmin/dashboard/static/js/dashboard.js:1129
#: pgadmin/dashboard/static/js/dashboard.js:1387
@@ -1364,7 +1364,7 @@ msgstr "Właściciel"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:111
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:155
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:242
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:199
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:198
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:286
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:103
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:144
@@ -1373,28 +1373,28 @@ msgstr "Włączono?"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:120
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:39
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:316
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:315
msgid "Trigger function"
msgstr "Funkcja wyzwalacza"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:124
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:205
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:267
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:272
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:347
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:387
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:391
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:404
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:417
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:429
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:459
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:464
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:204
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:266
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:271
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:346
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:386
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:390
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:403
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:416
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:428
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:458
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:463
msgid "Events"
msgstr "Zdarzenia"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:132
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:264
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:456
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:263
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:455
msgid "When"
msgstr "Kiedy"
@@ -1413,7 +1413,7 @@ msgstr "Kiedy"
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:784
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:222
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:169
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:409
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:406
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:514
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:378
msgid "Security labels"
@@ -1446,14 +1446,14 @@ msgstr "Etykiety bezpieczeństwa"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1124
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:167
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:130
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:317
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:320
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:323
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:326
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:329
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:332
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:400
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:412
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:467
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:397
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:409
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:464
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:516
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:360
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:372
@@ -1560,11 +1560,11 @@ msgstr "Przemieszczalne?"
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:189
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:479
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:195
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:321
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:495
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:530
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:320
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:491
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:529
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:811
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:455
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:452
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:473
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:163
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:221
@@ -1764,8 +1764,8 @@ msgstr "Typ"
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:214
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:129
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:161
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:319
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:396
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:316
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:393
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:420
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:427
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:440
@@ -1948,7 +1948,7 @@ msgid "Schema dropped"
msgstr "Usunięto schemat"
#: pgadmin/browser/server_groups/servers/databases/schemas/__init__.py:781
-#: pgadmin/static/js/backform.pgadmin.js:1837
+#: pgadmin/static/js/backform.pgadmin.js:1833
msgid "Definition incomplete."
msgstr "Definicja niepełna."
@@ -1967,23 +1967,23 @@ msgstr "Nie udało się znaleźć wskazanego obiektu katalogu."
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:594
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:60
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:23
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:269
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:268
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:786
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:787
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:788
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:909
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:898
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:899
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:143
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:344
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:417
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:908
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:896
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:897
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:142
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:340
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:413
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:421
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:427
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:428
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:401
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:495
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:496
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:461
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:460
#: pgadmin/tools/import_export/static/js/import_export.js:179
#: pgadmin/tools/import_export/static/js/import_export.js:199
#: pgadmin/tools/import_export/static/js/import_export.js:237
@@ -2032,7 +2032,7 @@ msgstr "Typ danych"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:85
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:171
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:449
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:375
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:372
msgid "Collation"
msgstr "Porównanie"
@@ -2152,7 +2152,7 @@ msgstr "Ograniczenie Domeny..."
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/static/js/domain.js:65
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:415
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:21
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:127
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:614
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:679
msgid "Check"
@@ -2160,7 +2160,7 @@ msgstr "Sprawdzenie"
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js:97
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:419
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:136
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:135
msgid "No inherit?"
msgstr ""
@@ -2171,7 +2171,7 @@ msgid "Validate?"
msgstr "Sprawdzić?"
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:177
msgid "Check cannot be empty."
msgstr "Sprawdzenie nie może być puste."
@@ -2276,8 +2276,8 @@ msgstr "Tabela obca skasowana"
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py:1285
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py:1330
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1367
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1417
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1401
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1451
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:1356
msgid "-- Please create column(s) first..."
msgstr "-- Należy najpierw utworzyć kolumnę(y)..."
@@ -2286,8 +2286,6 @@ msgstr "-- Należy najpierw utworzyć kolumnę(y)..."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:487
#: pgadmin/browser/static/js/browser.js:213
#: pgadmin/misc/static/explain/js/explain.js:1219
-#: pgadmin/misc/static/explain/js/explain.js:1348
-#: pgadmin/misc/static/explain/js/explain.js:1349
#: pgadmin/misc/statistics/static/js/statistics.js:129
msgid "Statistics"
msgstr "Statystyki"
@@ -2297,7 +2295,7 @@ msgid "Inherited From"
msgstr "Dziedziczone Z"
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:259
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:176
msgid "Column Name cannot be empty."
msgstr "Nazwa kolumny nie może być pusta."
@@ -2499,7 +2497,7 @@ msgid "FTS Dictionary..."
msgstr "Słownik FTS..."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/static/js/fts_dictionary.js:153
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:342
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:339
msgid "Template"
msgstr "Szablon"
@@ -2649,7 +2647,7 @@ msgstr "Funkcja lexize musi być wskazana."
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:59
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:21
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:457
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:434
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:431
msgid "Functions"
msgstr "Funkcje"
@@ -2662,29 +2660,29 @@ msgstr "Nie znaleziono wskazanego %s."
msgid "Could not find the function node in the database."
msgstr "Nie znaleziono węzła funkcji w bazie danych."
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:833
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:832
msgid "The specified function could not be found.\n"
msgstr "Nie znaleziono wskazanej funkcji.\n"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:850
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:849
msgid "Function dropped."
msgstr "Funkcja skasowana."
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1141
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1320
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1140
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1319
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:334
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:511
msgid "Could not find the function in the database."
msgstr "Nie znaleziono funkcji w bazie danych."
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1628
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1627
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js:24
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:621
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbproc.js:24
msgid "Procedures"
msgstr "Procedury"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1728
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1727
msgid "Trigger Functions"
msgstr "Funkcje Wyzwalaczy"
@@ -2724,7 +2722,7 @@ msgstr "Ilość argumentów"
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:327
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:150
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:79
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:322
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:321
msgid "Arguments"
msgstr "Argumenty"
@@ -2748,8 +2746,8 @@ msgstr "Zwracany typ"
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:182
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:98
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:100
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:289
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:493
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:288
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:492
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:154
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:155
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:209
@@ -2817,7 +2815,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:338
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:245
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1119
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:405
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:402
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:508
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:366
#: pgadmin/tools/debugger/static/js/direct.js:1707
@@ -2857,7 +2855,7 @@ msgstr "Symbol Linku nie może być pusty."
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:406
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js:200
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:314
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:338
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:337
msgid "Code cannot be empty."
msgstr "Kod nie może być pusty."
@@ -3047,7 +3045,7 @@ msgstr "Nagłówek nie może być pusty."
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:56
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:25
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:450
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:428
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:425
msgid "Sequences"
msgstr "Sekwencje"
@@ -3210,22 +3208,22 @@ msgid "System schema?"
msgstr "Schemat systemowy?"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:409
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:322
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:319
msgid "Default TABLE privileges"
msgstr "Domyślne uprawnienia TABLE"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:412
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:325
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:322
msgid "Default SEQUENCE privileges"
msgstr "Domyślne uprawnienia SEQUENCE"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:415
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:328
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:325
msgid "Default FUNCTION privileges"
msgstr "Domyślne uprawnienia FUNCTION"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:418
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:331
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:328
msgid "Default TYPE privileges"
msgstr "Domyślne uprawnienia TYPE"
@@ -3234,9 +3232,9 @@ msgid "Default privileges"
msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:443
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:53
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:29
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:422
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:419
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:130
msgid "Tables"
msgstr "Tabele"
@@ -3244,7 +3242,7 @@ msgstr "Tabele"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:464
#: pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py:58
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:24
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:445
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:442
msgid "Types"
msgstr "Typy"
@@ -3305,8 +3303,8 @@ msgstr "Synonim publiczny?"
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:185
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:221
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:527
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:791
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:808
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:789
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:806
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:275
#: pgadmin/browser/static/js/browser.js:630
#: pgadmin/browser/static/js/node.js:1283
@@ -3315,17 +3313,17 @@ msgstr "Synonim publiczny?"
#: pgadmin/misc/file_manager/templates/file_manager/index.html:78
#: pgadmin/static/js/backform.pgadmin.js:538
#: pgadmin/static/js/backgrid.pgadmin.js:621
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1741
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1786
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2385
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1735
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1780
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2379
msgid "Yes"
msgstr "Tak"
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:185
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:221
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:527
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:792
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:809
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:790
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:807
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:275
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:147
#: pgadmin/browser/static/js/browser.js:631
@@ -3335,9 +3333,9 @@ msgstr "Tak"
#: pgadmin/misc/file_manager/templates/file_manager/index.html:77
#: pgadmin/static/js/backform.pgadmin.js:539
#: pgadmin/static/js/backgrid.pgadmin.js:622
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1742
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1787
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2386
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1736
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1781
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2380
msgid "No"
msgstr "Nie"
@@ -3349,32 +3347,32 @@ msgstr "Schemat docelowy nie może być pusty."
msgid "Target object cannot be empty."
msgstr "Obiekt docelowy nie może być pusty."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:359
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:357
msgid "Could not find the table."
msgstr "Nie znaleziono tabeli."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:596
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1271
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:630
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1305
msgid "The specified table could not be found."
msgstr "Wskazana tabela nie została znaleziona."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1054
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1088
msgid "The specified table could not be found.\n"
msgstr "Wskazana tabela nie została znaleziona.\n"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1067
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1101
msgid "Table dropped"
msgstr "Tabela usunięta"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1145
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1179
msgid "Trigger(s) have been disabled"
msgstr "Wyzwalacz(e) zostały wyłączone"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1147
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1181
msgid "Trigger(s) have been enabled"
msgstr "Wyzwalacz(e) zostały włączone"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1501
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1535
#, python-format
msgid "Table rows counted: %s"
msgstr ""
@@ -3427,7 +3425,7 @@ msgstr "Kolumna została skasowana"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:608
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:704
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:856
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:853
msgid "Could not find the column on the server."
msgstr "Nie odnaleziono kolumny na serwerze."
@@ -3573,70 +3571,70 @@ msgstr ""
msgid "Compound Trigger"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:56
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:62
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:68
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:74
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:90
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:61
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:67
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:73
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:89
msgid "Compound Trigger..."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:80
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:79
msgid "Enable compound trigger"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:85
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:84
msgid "Disable compound trigger"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:169
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:168
msgid "Disable compound trigger failed"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:188
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:190
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:187
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:189
msgid "Trigger enabled?"
msgstr "Wyzwalacz włączony?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:205
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:209
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:222
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:235
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:248
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:204
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:208
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:221
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:234
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:247
msgid "FOR Events"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:207
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:389
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:388
msgid "INSERT"
msgstr "INSERT"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:220
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:402
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:219
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:401
msgid "UPDATE"
msgstr "UPDATE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:233
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:415
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:232
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:414
msgid "DELETE"
msgstr "DELETE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:246
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:428
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:245
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:427
msgid "TRUNCATE"
msgstr "TRUNCATE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:303
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:512
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:302
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:511
msgid "System trigger?"
msgstr "Wyzwalacz systemowy?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:328
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:543
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:327
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:542
msgid "Specify at least one event."
msgstr "Wskaż co najmniej jedno zdarzenie."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:347
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:346
msgid ""
"-- Enter any global declarations below:\n"
"\n"
@@ -3706,15 +3704,15 @@ msgstr "Nie odnaleziono obiektu na serwerze."
msgid "Check constraint updated."
msgstr "Ograniczenie sprawdzające zmodyfikowane."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:40
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:39
msgid "Check..."
msgstr "Sprawdzenie..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:46
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:45
msgid "Validate check constraint"
msgstr "Sprawdzenie poprawności ograniczenia sprawdzającego"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:157
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:156
msgid "Don't validate?"
msgstr "Bez weryfikacji?"
@@ -3750,7 +3748,7 @@ msgid "Exclusion constraint dropped."
msgstr "Ograniczenie wykluczające skasowane."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:38
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:97
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:96
msgid "Operator class"
msgstr "Klasa operatora"
@@ -3778,10 +3776,10 @@ msgstr "Należy wskazać operator kolumny: "
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:453
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:381
#: pgadmin/browser/server_groups/servers/static/js/variable.js:341
-#: pgadmin/static/js/backform.pgadmin.js:1260
-#: pgadmin/static/js/backform.pgadmin.js:1370
-#: pgadmin/static/js/backform.pgadmin.js:1550
-#: pgadmin/static/js/backform.pgadmin.js:1669
+#: pgadmin/static/js/backform.pgadmin.js:1259
+#: pgadmin/static/js/backform.pgadmin.js:1366
+#: pgadmin/static/js/backform.pgadmin.js:1546
+#: pgadmin/static/js/backform.pgadmin.js:1665
msgid "Add new row"
msgstr ""
@@ -3793,7 +3791,7 @@ msgstr "Ograniczenie wykluczające"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:28
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:28
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:29
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:236
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:234
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/exclusion_constraint/sql/default/stats.sql:7
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/exclusion_constraint/sql/default/stats.sql:12
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/index_constraint/sql/default/stats.sql:7
@@ -3803,87 +3801,87 @@ msgstr "Ograniczenie wykluczające"
msgid "Index size"
msgstr "Rozmiar indeksu"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:642
msgid "Exclusion constraint..."
msgstr "Ograniczenie wykluczające..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:691
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:512
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:498
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:298
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:690
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:511
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:497
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:295
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:378
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:344
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:196
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:366
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:363
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:40
#: pgadmin/tools/backup/static/js/backup.js:366
#: pgadmin/tools/restore/static/js/restore.js:255
msgid "Tablespace"
msgstr "Przestrzeń Tabel"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:701
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:700
msgid "Access method"
msgstr "Metoda dostępu"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:716
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:326
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:715
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:322
msgid "Changing access method will clear columns collection"
msgstr "Zmiana metody dostępu wyczyści kolekcję kolumn"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:746
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:560
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:549
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:386
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:745
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:559
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:548
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:382
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:716
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:790
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:204
msgid "Fill factor"
msgstr "Czynnik wypełnienia"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:749
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:734
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:575
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:564
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:267
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:748
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:732
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:574
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:563
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:266
msgid "Deferrable?"
msgstr "Odraczalny?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:757
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:747
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:603
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:592
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:291
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:756
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:745
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:602
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:591
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:290
msgid "Deferred?"
msgstr "Odroczony?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:779
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:413
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:778
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:409
msgid "Constraint"
msgstr "Ograniczenie"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:908
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:415
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:401
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:348
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:439
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:907
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:414
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:400
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:344
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:435
msgid "Include columns"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:931
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:242
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:438
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:228
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:424
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:370
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:461
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:930
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:241
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:437
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:227
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:423
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:366
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:457
msgid "Select the column(s)"
msgstr "Wskaż kolumnę(y)"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1012
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1011
msgid "Please specify name for exclusion constraint."
msgstr "Należy wskazać nazwę ograniczenia wykluczającego."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1018
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1017
msgid "Please specify columns for exclusion constraint."
msgstr "Należy wskazać kolumny ograniczenia wykluczającego."
@@ -3941,53 +3939,53 @@ msgstr "Odniesienia"
msgid "Referencing"
msgstr "Referencja"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:616
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:615
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:585
msgid "Foreign key"
msgstr "Klucz obcy"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:637
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:635
msgid "Foreign key..."
msgstr "Klucz obcy..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:641
msgid "Validate foreign key"
msgstr "Sprawdenie poprawności klucza obcego"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:771
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:769
msgid "Match type"
msgstr "Zestawienie typu"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:788
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:786
msgid "Validated?"
msgstr "Sprawdzić?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:804
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:802
msgid "Auto FK index?"
msgstr "Automatyczny indeks na FK?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:852
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:850
msgid "Covering index"
msgstr "Przykrywanie indeksu"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1002
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1000
msgid "On update"
msgstr "Przy modyfikacji"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1003
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1023
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1001
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1021
msgid "Action"
msgstr "Akcja"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1022
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1020
msgid "On delete"
msgstr "Przy usuwaniu"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1050
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1048
msgid "Please specify columns for Foreign key."
msgstr "Należy wskazać kolumny Klucza obcego."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1059
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1057
msgid "Please specify covering index name."
msgstr "Proszę podać nazwę indeksu obejmującego."
@@ -4032,7 +4030,7 @@ msgstr "{0} skasowano."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py:996
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:20
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:43
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:42
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:557
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:729
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:811
@@ -4041,7 +4039,7 @@ msgstr "Klucz główny"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py:1006
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:20
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:43
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:42
msgid "Unique constraint"
msgstr "Klucz unikatowy"
@@ -4049,19 +4047,19 @@ msgstr "Klucz unikatowy"
msgid "Could not find the constraint in the table."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:536
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:522
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:231
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:535
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:521
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:229
msgid "Index"
msgstr "Indeks"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:644
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:633
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:632
#, python-format
msgid "Please specify columns for %s"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:56
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:55
msgid "Oid"
msgstr "Oid"
@@ -4088,7 +4086,7 @@ msgid "Index is dropped"
msgstr "Indeks został skasowany"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:29
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:236
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:234
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:45
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:33
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:49
@@ -4105,59 +4103,63 @@ msgstr "Indeks został skasowany"
msgid "Size"
msgstr "Rozmiar"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:130
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:128
msgid "Sort order"
msgstr "Kolejność sortowania"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:151
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:149
msgid "NULLs"
msgstr "NULLe"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:248
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:254
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:260
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:266
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:272
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:245
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:251
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:257
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:263
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:269
msgid "Index..."
msgstr "Indeks..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:311
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:308
msgid "Access Method"
msgstr "Metoda Dostępu"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:390
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:386
msgid "Unique?"
msgstr "Unikalny?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:394
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:390
msgid "Clustered?"
msgstr "Sklastrowany?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:398
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:394
msgid "Valid?"
msgstr "Poprawny?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:402
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:398
msgid "Primary?"
msgstr "Główny?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:406
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:402
msgid "System index?"
msgstr "Indeks systemowy?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:409
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:405
msgid "Concurrent build?"
msgstr "Jednoczesne tworzenie?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:501
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:497
+msgid "Tablespace cannot be empty."
+msgstr "Przestrzeń tabel nie może być pusta."
+
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:503
msgid "Access method cannot be empty."
msgstr "Metoda dostępu nie może być pusta."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:509
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:511
msgid "You must specify column name."
msgstr "Należy podać nazwę kolumny."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:514
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:516
msgid "You must specify at least one column."
msgstr "Należy określić przynajmniej jedną kolumnę."
@@ -4554,39 +4556,39 @@ msgstr "Reguła skasowana"
msgid "rule"
msgstr "reguła"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:93
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:99
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:105
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:111
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:117
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:92
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:98
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:104
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:110
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:116
msgid "Rule..."
msgstr "Reguła..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:165
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:164
#: pgadmin/static/js/sqleditor/query_tool_notifications.js:32
#: pgadmin/static/js/sqleditor/query_tool_notifications.js:80
msgid "Event"
msgstr "Zdarzenie"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:179
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:178
msgid "Do instead?"
msgstr ""
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:182
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:183
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:184
msgid "Condition"
msgstr "Warunek"
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:188
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:189
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:190
msgid "Commands"
msgstr "Polecenia"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:195
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:194
msgid "System rule?"
msgstr "Reguła systemowa?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:215
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:214
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:241
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:183
msgid "Please specify name."
@@ -5154,56 +5156,56 @@ msgstr "Wyzwalacz skasowany"
msgid "Trigger"
msgstr "Wyzwalacz"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:56
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:62
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:68
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:74
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:90
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:61
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:67
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:73
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:89
msgid "Trigger..."
msgstr "Wyzwalacz..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:80
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:79
msgid "Enable trigger"
msgstr "Włączenie wyzwalacza"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:85
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:84
msgid "Disable trigger"
msgstr "Wyłączenie wyzwalacza"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:169
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:168
msgid "Disable trigger failed"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:205
msgid "Row trigger?"
msgstr "Wyzwalacz wierszowy?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:247
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:246
msgid "Constraint trigger?"
msgstr "Wyzwalacz ograniczenia?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:346
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:345
msgid "Fires"
msgstr "Odpalany"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:481
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:480
msgid "Old table"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:482
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:488
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:481
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:487
msgid "Transition"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:487
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:486
msgid "New table"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:536
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:535
msgid "Trigger function cannot be empty."
msgstr "Funkcja wyzwalacza nie może być pusta."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:556
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:555
msgid "Trigger code cannot be empty."
msgstr "Kod wyzwalacza nie może być pusty."
@@ -5587,7 +5589,7 @@ msgid "Size of temporary files"
msgstr "Rozmiar plików tymczasowych"
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:45
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:309
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:306
#: pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.2_plus/stats.sql:2
#: pgadmin/browser/server_groups/servers/databases/templates/databases/sql/default/stats.sql:2
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:176
@@ -5641,35 +5643,35 @@ msgstr "Rozłącz bazę danych"
msgid "Are you sure you want to disconnect the database - %s?"
msgstr "Czy na pewno rozłączyć bazę danych - %s?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:337
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:334
#: pgadmin/static/js/browser/server_groups/servers/databases/external_tables/external_tables.js:52
#: pgadmin/tools/backup/static/js/backup.js:192
#: pgadmin/tools/import_export/static/js/import_export.js:108
msgid "Encoding"
msgstr "Kodowanie"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:380
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:377
msgid "Character type"
msgstr "Typ znakowy"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:385
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:382
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:413
msgid "Connection limit"
msgstr "Limit połączenia"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:388
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:385
msgid "Template?"
msgstr "Szablon?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:392
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:389
msgid "Allow connections?"
msgstr "Zgoda na połączenia?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:417
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:414
msgid "Default Privileges"
msgstr "Domyślne Uprawnienia"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:499
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:496
msgid "Connect to database"
msgstr "Łączenie z bazą danych"
@@ -6506,7 +6508,7 @@ msgstr "Rodzaj"
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:139
#: pgadmin/browser/static/js/browser.js:224
#: pgadmin/dashboard/static/js/dashboard.js:191
-#: pgadmin/static/js/backform.pgadmin.js:2032
+#: pgadmin/static/js/backform.pgadmin.js:2028
msgid "SQL"
msgstr "SQL"
@@ -7112,8 +7114,8 @@ msgid "At least one privilege should be selected."
msgstr "Powinno być wskazane przynajmniej jedno uprawnienie."
#: pgadmin/browser/server_groups/servers/static/js/server.js:46
-msgid "Security label must be specified."
-msgstr ""
+msgid "Label must be specified."
+msgstr "Etykieta musi być określona."
#: pgadmin/browser/server_groups/servers/static/js/server.js:79
#: pgadmin/browser/server_groups/servers/static/js/server.js:84
@@ -7212,20 +7214,20 @@ msgstr "Zmień Hasło "
#: pgadmin/misc/file_manager/static/js/create_dialogue.js:188
#: pgadmin/misc/file_manager/static/js/select_dialogue.js:86
#: pgadmin/misc/file_manager/static/js/select_dialogue.js:129
-#: pgadmin/preferences/static/js/preferences.js:435
+#: pgadmin/preferences/static/js/preferences.js:434
#: pgadmin/static/js/slickgrid/editors.js:50
-#: pgadmin/static/js/sqleditor/filter_dialog.js:79
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:62
-#: pgadmin/tools/datagrid/static/js/show_data.js:139
+#: pgadmin/static/js/sqleditor/filter_dialog.js:78
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:61
+#: pgadmin/tools/datagrid/static/js/show_data.js:138
#: pgadmin/tools/debugger/static/js/debugger_ui.js:588
#: pgadmin/tools/debugger/static/js/debugger_ui.js:893
#: pgadmin/tools/import_export/static/js/import_export.js:495
-#: pgadmin/tools/maintenance/static/js/maintenance.js:297
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:56
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2010
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2164
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4222
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4289
+#: pgadmin/tools/maintenance/static/js/maintenance.js:296
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:55
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2004
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2158
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4216
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4283
msgid "Cancel"
msgstr "Anuluj"
@@ -7446,7 +7448,7 @@ msgid "Connection timeout (seconds)"
msgstr ""
#: pgadmin/browser/server_groups/servers/static/js/server.js:1130
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2192
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2186
msgid "Connect to Server"
msgstr "Połącz z Serwerem"
@@ -7697,17 +7699,15 @@ msgid "Dependents"
msgstr "Zależne"
#: pgadmin/browser/static/js/browser.js:348
-#: pgadmin/browser/static/js/toolbar.js:30
-#: pgadmin/browser/static/js/toolbar.js:31
-#: pgadmin/browser/static/js/toolbar.js:91
+#: pgadmin/browser/static/js/toolbar.js:29
+#: pgadmin/browser/static/js/toolbar.js:88
#: pgadmin/tools/datagrid/static/js/datagrid.js:74
msgid "View Data"
msgstr ""
#: pgadmin/browser/static/js/browser.js:349
#: pgadmin/browser/static/js/toolbar.js:20
-#: pgadmin/browser/static/js/toolbar.js:21
-#: pgadmin/browser/static/js/toolbar.js:93
+#: pgadmin/browser/static/js/toolbar.js:90
#: pgadmin/tools/datagrid/static/js/datagrid.js:75
msgid "Filtered Rows"
msgstr ""
@@ -7947,10 +7947,10 @@ msgid "Changes will be lost. Are you sure you want to reset?"
msgstr ""
#: pgadmin/browser/static/js/node.js:1513
-#: pgadmin/preferences/static/js/preferences.js:439
-#: pgadmin/preferences/static/js/preferences.js:464
+#: pgadmin/preferences/static/js/preferences.js:438
+#: pgadmin/preferences/static/js/preferences.js:463
#: pgadmin/tools/datagrid/templates/datagrid/index.html:37
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4297
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4291
msgid "Save"
msgstr "Zapisz"
@@ -7970,20 +7970,17 @@ msgstr "Zaznacz Wszystko"
msgid "Unselect All"
msgstr "Odznacz Wszystko"
-#: pgadmin/browser/static/js/toolbar.js:40
-#: pgadmin/browser/static/js/toolbar.js:41
-#: pgadmin/browser/static/js/toolbar.js:89
+#: pgadmin/browser/static/js/toolbar.js:38
+#: pgadmin/browser/static/js/toolbar.js:86
#: pgadmin/tools/datagrid/static/js/datagrid.js:103
#: pgadmin/tools/datagrid/static/js/datagrid.js:115
#: pgadmin/tools/sqleditor/__init__.py:68
msgid "Query Tool"
msgstr "Narzędzie Zapytania"
-#: pgadmin/browser/static/js/wizard.js:85
#: pgadmin/browser/static/js/wizard.js:86
#: pgadmin/static/js/alertify.pgadmin.defaults.js:261
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:263
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:457
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:455
#: pgadmin/templates/security/messages.html:7
#: pgadmin/tools/user_management/static/js/user_management.js:81
#: pgadmin/tools/user_management/static/js/user_management.js:174
@@ -7991,11 +7988,9 @@ msgstr "Narzędzie Zapytania"
msgid "Close"
msgstr "Zamknij"
-#: pgadmin/browser/static/js/wizard.js:88
#: pgadmin/browser/static/js/wizard.js:89
#: pgadmin/static/js/alertify.pgadmin.defaults.js:262
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:264
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:458
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:456
msgid "Maximize"
msgstr ""
@@ -8003,22 +7998,6 @@ msgstr ""
msgid "Left panel logo"
msgstr ""
-#: pgadmin/browser/static/js/wizard.js:124
-msgid "Close error bar"
-msgstr ""
-
-#: pgadmin/browser/static/js/wizard.js:131
-#: pgadmin/browser/templates/browser/index.html:135 pgadmin/help/__init__.py:59
-#: pgadmin/help/__init__.py:70 pgadmin/preferences/static/js/preferences.js:427
-#: pgadmin/static/js/sqleditor/filter_dialog.js:72
-#: pgadmin/static/js/sqleditor/filter_dialog.js:73
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:56
-#: pgadmin/tools/datagrid/static/js/show_data.js:133
-#: pgadmin/tools/maintenance/static/js/maintenance.js:289
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:50
-msgid "Help"
-msgstr "Pomoc"
-
#: pgadmin/browser/static/js/wizard.js:139
#: pgadmin/misc/file_manager/templates/file_manager/index.html:15
msgid "Back"
@@ -8056,6 +8035,11 @@ msgstr "Zarządzanie"
msgid "Tools"
msgstr "Narzędzia"
+#: pgadmin/browser/templates/browser/index.html:135 pgadmin/help/__init__.py:59
+#: pgadmin/help/__init__.py:70 pgadmin/static/js/sqleditor/filter_dialog.js:72
+msgid "Help"
+msgstr "Pomoc"
+
#: pgadmin/browser/templates/browser/index.html:157
msgid "Logout"
msgstr "Wylogowanie"
@@ -8446,7 +8430,7 @@ msgstr ""
#: pgadmin/dashboard/templates/dashboard/database_dashboard.html:88
#: pgadmin/dashboard/templates/dashboard/server_dashboard.html:92
#: pgadmin/misc/file_manager/templates/file_manager/index.html:27
-#: pgadmin/preferences/static/js/preferences.js:492
+#: pgadmin/preferences/static/js/preferences.js:491
msgid "Refresh"
msgstr "Odśwież"
@@ -8971,33 +8955,13 @@ msgstr ""
msgid "Analysis"
msgstr ""
-#: pgadmin/misc/static/explain/js/explain.js:1286
-#: pgadmin/misc/static/explain/js/explain.js:1287
-msgid "Zoom in"
-msgstr ""
-
-#: pgadmin/misc/static/explain/js/explain.js:1295
-#: pgadmin/misc/static/explain/js/explain.js:1296
-msgid "Zoom to original"
-msgstr ""
-
-#: pgadmin/misc/static/explain/js/explain.js:1304
-#: pgadmin/misc/static/explain/js/explain.js:1305
-msgid "Zoom out"
-msgstr ""
-
-#: pgadmin/misc/static/explain/js/explain.js:1319
-#: pgadmin/misc/static/explain/js/explain.js:1320
-msgid "Download"
-msgstr ""
-
#: pgadmin/misc/statistics/static/js/statistics.js:214
msgid "No statistics are available for the selected object."
msgstr "Żadne statystyki nie są dostępne dla wybranego obiektu."
#: pgadmin/preferences/__init__.py:55
#: pgadmin/preferences/static/js/preferences.js:426
-#: pgadmin/preferences/static/js/preferences.js:449
+#: pgadmin/preferences/static/js/preferences.js:448
msgid "Preferences"
msgstr "Preferencje"
@@ -9022,17 +8986,17 @@ msgstr "Ukryj"
msgid "Category is not selected."
msgstr "Nie wybrano kategorii."
-#: pgadmin/preferences/static/js/preferences.js:483
+#: pgadmin/preferences/static/js/preferences.js:482
msgid "Refresh required"
msgstr ""
-#: pgadmin/preferences/static/js/preferences.js:484
+#: pgadmin/preferences/static/js/preferences.js:483
msgid ""
"A page refresh is required to apply the theme. Do you wish to refresh the"
" page now?"
msgstr ""
-#: pgadmin/preferences/static/js/preferences.js:493
+#: pgadmin/preferences/static/js/preferences.js:492
msgid "Later"
msgstr ""
@@ -9078,37 +9042,33 @@ msgstr ""
msgid "INTERNAL SERVER ERROR"
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:1550
-msgid "Add"
-msgstr ""
-
-#: pgadmin/static/js/backform.pgadmin.js:1841
+#: pgadmin/static/js/backform.pgadmin.js:1837
msgid "No updates."
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:1956
+#: pgadmin/static/js/backform.pgadmin.js:1952
msgid "General"
msgstr "Ogólne"
-#: pgadmin/static/js/backform.pgadmin.js:2157
+#: pgadmin/static/js/backform.pgadmin.js:2153
msgid "Preview not available..."
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:2618
+#: pgadmin/static/js/backform.pgadmin.js:2605
#: pgadmin/tools/backup/static/js/backup.js:95
#: pgadmin/tools/backup/static/js/backup.js:230
msgid "Note"
msgstr "Adnotacja"
-#: pgadmin/static/js/backform.pgadmin.js:2974
+#: pgadmin/static/js/backform.pgadmin.js:2961
msgid "More"
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:2975
+#: pgadmin/static/js/backform.pgadmin.js:2962
msgid "Less"
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:3059
+#: pgadmin/static/js/backform.pgadmin.js:3046
msgid "Space"
msgstr ""
@@ -9137,7 +9097,7 @@ msgstr "Ten obiekt nie może być usunięty."
msgid "Delete row"
msgstr ""
-#: pgadmin/static/js/backgrid.pgadmin.js:1098
+#: pgadmin/static/js/backgrid.pgadmin.js:1091
msgid "Array Values"
msgstr "Wartości Tablicowe"
@@ -9291,13 +9251,13 @@ msgstr "Zapytanie zakończone z powodzeniem w czasie %s."
msgid "Sort/Filter options"
msgstr ""
-#: pgadmin/static/js/sqleditor/filter_dialog.js:239
+#: pgadmin/static/js/sqleditor/filter_dialog.js:238
msgid "Filter updated successfully"
msgstr ""
-#: pgadmin/static/js/sqleditor/filter_dialog.js:245
-#: pgadmin/tools/datagrid/static/js/show_data.js:238
-#: pgadmin/tools/datagrid/static/js/show_data.js:245
+#: pgadmin/static/js/sqleditor/filter_dialog.js:244
+#: pgadmin/tools/datagrid/static/js/show_data.js:237
+#: pgadmin/tools/datagrid/static/js/show_data.js:244
msgid "Validation Error"
msgstr "Błąd Walidacji"
@@ -9378,7 +9338,6 @@ msgstr ""
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:40
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:41
-#: pgadmin/tools/datagrid/templates/datagrid/index.html:56
#: pgadmin/tools/datagrid/templates/datagrid/index.html:68
msgid "Find"
msgstr "Znajdź"
@@ -9462,14 +9421,14 @@ msgstr ""
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:129
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:131
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4230
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4224
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:663
msgid "Commit"
msgstr ""
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:135
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:137
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4227
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4221
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:681
msgid "Rollback"
msgstr ""
@@ -9545,7 +9504,7 @@ msgstr "Ten URL nie może być wywołany bezpośrednio."
#: pgadmin/tools/backup/__init__.py:43
#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:46
#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:55
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:67
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:66
msgid "Backup"
msgstr "Kopia zapasowa"
@@ -9825,8 +9784,8 @@ msgstr "Tworzenie Kopii Zapasowej..."
#: pgadmin/tools/backup/static/js/backup_dialog.js:71
#: pgadmin/tools/import_export/static/js/import_export.js:685
#: pgadmin/tools/import_export/static/js/import_export.js:699
-#: pgadmin/tools/maintenance/static/js/maintenance.js:477
-#: pgadmin/tools/maintenance/static/js/maintenance.js:488
+#: pgadmin/tools/maintenance/static/js/maintenance.js:476
+#: pgadmin/tools/maintenance/static/js/maintenance.js:487
#: pgadmin/tools/restore/static/js/restore_dialog.js:51
#: pgadmin/tools/restore/static/js/restore_dialog.js:75
msgid "Utility not found"
@@ -9834,25 +9793,25 @@ msgstr ""
#: pgadmin/tools/backup/static/js/backup_dialog.js:72
#: pgadmin/tools/import_export/static/js/import_export.js:700
-#: pgadmin/tools/maintenance/static/js/maintenance.js:489
+#: pgadmin/tools/maintenance/static/js/maintenance.js:488
#: pgadmin/tools/restore/static/js/restore_dialog.js:76
msgid "Failed to fetch Utility information"
msgstr ""
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:159
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:158
msgid "Backup job created."
msgstr "Utworzono zadanie wykonania kopii zapasowej."
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:163
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:162
msgid "Backup job creation failed."
msgstr ""
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:171
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:170
msgid "Backup job failed."
msgstr "Zadanie tworzenia kopii zapasowej nie powiodło się."
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:242
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:229
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:241
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:228
msgid "Please provide a filename"
msgstr "Należy podać nazwę pliku"
@@ -9901,7 +9860,7 @@ msgstr "Nie wybrano obiektu."
msgid "Data Filter"
msgstr ""
-#: pgadmin/tools/datagrid/static/js/show_data.js:161
+#: pgadmin/tools/datagrid/static/js/show_data.js:160
msgid "Use SHIFT + ENTER to apply filter..."
msgstr ""
@@ -10499,30 +10458,6 @@ msgstr "Stos"
msgid "Debugger - "
msgstr "Debugger - "
-#: pgadmin/tools/debugger/templates/debugger/direct.html:59
-msgid "Step into"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:67
-msgid "Step over"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:75
-msgid "Continue/Start"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:85
-msgid "Toggle breakpoint"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:93
-msgid "Clear all breakpoints"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:103
-msgid "Stop"
-msgstr ""
-
#: pgadmin/tools/grant_wizard/__init__.py:327
msgid "Unable to fetch the {} objects"
msgstr ""
@@ -10880,7 +10815,7 @@ msgstr "Szczegółowe Komunikaty"
#: pgadmin/tools/maintenance/static/js/maintenance.js:167
#: pgadmin/tools/maintenance/static/js/maintenance.js:183
-#: pgadmin/tools/maintenance/static/js/maintenance.js:483
+#: pgadmin/tools/maintenance/static/js/maintenance.js:482
msgid "Maintenance..."
msgstr "Porządkowanie..."
@@ -10894,15 +10829,15 @@ msgid ""
"cannot be maintained using this utility."
msgstr ""
-#: pgadmin/tools/maintenance/static/js/maintenance.js:387
-#: pgadmin/tools/maintenance/static/js/maintenance.js:394
+#: pgadmin/tools/maintenance/static/js/maintenance.js:386
+#: pgadmin/tools/maintenance/static/js/maintenance.js:393
msgid "Maintenance job creation failed."
msgstr "Nie udało się utworzenie zadania utrzymania."
#: pgadmin/tools/restore/__init__.py:41
#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:40
#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:49
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:62
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:61
msgid "Restore"
msgstr "Przywrócenie"
@@ -10968,15 +10903,15 @@ msgstr "Przywróć..."
msgid "Restore (%s: %s)"
msgstr "Przywrócenie (%s: %s)"
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:149
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:148
msgid "Restore job created."
msgstr "Zadanie odtworzenia utworzono."
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:153
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:152
msgid "Restore job creation failed."
msgstr ""
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:161
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:160
msgid "Restore job failed."
msgstr ""
@@ -11060,241 +10995,241 @@ msgstr ""
msgid "Geometry Viewer"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:832
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:826
msgid "Editable column"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:834
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:828
msgid "Read-only column"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1261
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1255
msgid "Fetching all records..."
msgstr "Pobieranie wszystkich rekordów..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1730
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2369
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3314
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1724
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2363
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3308
msgid "Unsaved changes"
msgstr "Niezapisane zmiany"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1731
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3315
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1725
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3309
msgid "Are you sure you wish to discard the current changes?"
msgstr "Czy na pewno porzucić ostatnie zmiany?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1759
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1753
msgid "Clear history"
msgstr "Wyczyść historię"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1760
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1754
msgid "Are you sure you wish to clear the history?"
msgstr "Czy na pewno wyczyścić historię?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1761
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1755
msgid ""
"This will remove all of your query history from this and other sessions "
"for this database."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2125
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2119
msgid "Connection Warning"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2132
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2126
msgid "The application has lost the database connection:"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2136
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2130
msgid "⁃ If the connection was idle it may have been forcibly disconnected."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2138
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2132
msgid "⁃ The application server or database server may have been restarted."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2140
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2134
msgid "⁃ The user session may have timed out."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2144
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2138
msgid "Do you want to continue and establish a new session?"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2163
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2157
msgid "Continue"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2299
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2293
#, python-format
msgid "Error fetching SQL for script: %s."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2370
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2364
msgid ""
"The data has been modified, but not saved. Are you sure you wish to "
"discard the changes?"
msgstr "Dane zostały zmienione ale nie zapisane. Czy na pewno odrzucić zmiany?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2414
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2408
msgid "Running query..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2422
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2416
msgid "Waiting for the query to complete..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2579
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2573
msgid "Loading data from the database server and rendering..."
msgstr "Pobieranie danych z serwera bazy i wyświetlanie..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2588
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2582
#, python-format
msgid "Successfully run. Total query runtime: %s."
msgstr "Uruchomiono z powodzeniem. Pełny czas uruchomienia: %s."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2589
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2583
#, python-format
msgid "%s rows affected."
msgstr "%s wierszy zwróconych."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2865
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2859
msgid ""
"This query was generated by pgAdmin as part of a \"View/Edit Data\" "
"operation"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2966
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2960
msgid "Row(s) deleted."
msgstr "Wiersz(e) usunięto."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3040
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3034
msgid "Saving the updated data..."
msgstr "Zapis zmodyfikowanych danych..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3156
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3150
msgid "Data saved successfully."
msgstr "Udany zapis do danych."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3159
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3153
msgid "Auto-commit is off. You still need to commit changes to the database."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3165
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3159
#, python-format
msgid "%s."
msgstr "%s."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3170
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3164
msgid ""
"Saving data changes was rolled back but the current transaction is still "
"active; previous queries are unaffected."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3192
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3186
msgid "This query was generated by pgAdmin as part of a \"Save Data\" operation"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3353
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3347
msgid "Loading the file..."
msgstr "Ładowanie pliku..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3404
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3398
msgid "Saving the queries in the file..."
msgstr "Zapis zapytań do pliku..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3416
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3410
msgid "File saved successfully."
msgstr "Udany zapis do pliku."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3538
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3597
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3532
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3591
msgid "Applying the new filter..."
msgstr "Zastosowanie nowego filtru..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3558
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3568
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3552
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3562
msgid "Filter By Selection Error"
msgstr "Bład filtrowanie Według Zaznaczenia"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3617
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3627
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3611
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3621
msgid "Filter Exclude Selection Error"
msgstr "Błąd filtrowania z wykluczeniem Zaznaczenia"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3637
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3631
msgid "Removing the filter..."
msgstr "Usuwanie filtru..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3655
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3665
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3649
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3659
msgid "Remove Filter Error"
msgstr "Błąd Usuwania Filtru"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3768
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3762
msgid "Setting the limit on the result..."
msgstr "Ustawianie limitu na wynik..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3787
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3796
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3781
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3790
msgid "Change limit Error"
msgstr "Błąd Zmiany Limitu"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3922
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3941
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3916
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3935
msgid "Cancel Query Error"
msgstr "Błąd Anulowania Zapytania"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3960
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3954
msgid "Downloading CSV..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4014
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4008
msgid "CSV Download cancelled."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4017
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4011
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:395
msgid "Download CSV"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4020
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4014
msgid "Download CSV error"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4054
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4061
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4048
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4055
msgid "Auto Rollback Error"
msgstr "Błąd Automatycznego Wycofania"
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4081
#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4087
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4093
msgid "Auto Commit Error"
msgstr "Błąd Automatycznego Zatwierdzenia"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4182
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4176
msgid "The data has changed. Do you want to save changes?"
msgstr "Dane tekstowe zostały zmienione. Czy chcesz zapisać zmiany?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4188
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4182
msgid "The text has changed. Do you want to save changes?"
msgstr "Tekst został zmieniony. Czy chcesz zapisać zmiany?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4268
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4262
msgid ""
"The current transaction is not commited to the database.Do you want to "
"commit or rollback the transaction?"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4271
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4265
msgid "Commit transaction?"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4294
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4288
msgid "Don't save"
msgstr "Bez zapisywania"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4337
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4331
msgid "Save changes?"
msgstr "Zapisać zmiany?"
@@ -13142,9 +13077,3 @@ msgstr "Nie znaleziono wskazanej bazy danych."
#~ msgid "Error dropping %s: \"%s\""
#~ msgstr "Błąd kasowania %s: \"%s\""
-#~ msgid "Tablespace cannot be empty."
-#~ msgstr "Przestrzeń tabel nie może być pusta."
-
-#~ msgid "Label must be specified."
-#~ msgstr "Etykieta musi być określona."
-
diff --git a/web/pgadmin/translations/ru/LC_MESSAGES/messages.mo b/web/pgadmin/translations/ru/LC_MESSAGES/messages.mo
index 57001b19a4c2e2e88c5100e702709f2fd861459e..1521d4054a1eab5e55ca0334c8dbeeb6702987c7 100644
GIT binary patch
delta 26845
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
delta 26752
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
Xhl4zQmhR}d+0(P@j$%2zN#*|!dOx0{
diff --git a/web/pgadmin/translations/ru/LC_MESSAGES/messages.po b/web/pgadmin/translations/ru/LC_MESSAGES/messages.po
index b308c4c98..92d985d8a 100644
--- a/web/pgadmin/translations/ru/LC_MESSAGES/messages.po
+++ b/web/pgadmin/translations/ru/LC_MESSAGES/messages.po
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-01-03 19:02+0530\n"
+"POT-Creation-Date: 2019-12-06 19:29+0530\n"
"PO-Revision-Date: 2017-11-09 09:44+0300\n"
"Last-Translator: Alexander Lakhin <[email protected]>\n"
"Language: ru\n"
@@ -46,13 +46,13 @@ msgstr "Рабочая станция"
#: pgadmin/static/js/slickgrid/editors.js:50
#: pgadmin/static/js/slickgrid/editors.js:60
#: pgadmin/static/js/slickgrid/editors.js:61
-#: pgadmin/static/js/sqleditor/filter_dialog.js:84
-#: pgadmin/tools/datagrid/static/js/show_data.js:143
-#: pgadmin/tools/datagrid/static/js/show_data.js:218
+#: pgadmin/static/js/sqleditor/filter_dialog.js:83
+#: pgadmin/tools/datagrid/static/js/show_data.js:142
+#: pgadmin/tools/datagrid/static/js/show_data.js:217
#: pgadmin/tools/import_export/static/js/import_export.js:500
-#: pgadmin/tools/maintenance/static/js/maintenance.js:302
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2005
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2035
+#: pgadmin/tools/maintenance/static/js/maintenance.js:301
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1999
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2029
msgid "OK"
msgstr "OK"
@@ -455,7 +455,7 @@ msgstr "Требуемые свойства отсутствуют."
#: pgadmin/browser/utils.py:386
#: pgadmin/static/js/alertify.pgadmin.defaults.js:102
#: pgadmin/static/js/alertify.pgadmin.defaults.js:163
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:305
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:303
#: pgadmin/tools/grant_wizard/__init__.py:129 pgadmin/utils/exception.py:35
msgid "Connection to the server has been lost."
msgstr "Подключение к серверу было потеряно."
@@ -574,7 +574,7 @@ msgid "No parameters were changed."
msgstr "Никакие параметры не были изменены."
#: pgadmin/browser/server_groups/servers/__init__.py:767
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:567
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:562
#: pgadmin/browser/server_groups/servers/databases/casts/__init__.py:370
#: pgadmin/browser/server_groups/servers/databases/extensions/__init__.py:264
#: pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py:395
@@ -596,7 +596,7 @@ msgstr "Никакие параметры не были изменены."
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:365
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:569
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/__init__.py:436
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:888
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:922
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:393
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py:484
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py:478
@@ -775,33 +775,33 @@ msgstr "Не удалось найти утилиту для операции '%
msgid "PostgreSQL"
msgstr "PostgreSQL"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:38
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:37
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:21
msgid "Databases"
msgstr "Базы данных"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:375
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:391
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:654
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:724
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:849
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:1021
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:374
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:390
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:649
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:719
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:844
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:1016
msgid "Could not find the database on the server."
msgstr "Не удалось найти базу данных на сервере."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:469
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:468
msgid "Database connected."
msgstr "База данных подключена."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:488
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:485
msgid "Database could not be disconnected."
msgstr "Отключиться от базы данных не удалось."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:492
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:489
msgid "Database disconnected."
msgstr "База данных отключена."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:777
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:772
#: pgadmin/browser/server_groups/servers/databases/casts/__init__.py:483
#: pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py:522
#: pgadmin/browser/server_groups/servers/databases/extensions/__init__.py:357
@@ -816,10 +816,10 @@ msgstr "База данных отключена."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py:548
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py:488
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py:453
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:830
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:829
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py:441
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:462
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1051
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1085
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:474
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py:565
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py:591
@@ -837,11 +837,11 @@ msgstr "База данных отключена."
msgid "Error: Object not found."
msgstr "Ошибка: объект не найден."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:780
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:775
msgid "The specified database could not be found.\n"
msgstr "Не удалось найти указанную базу данных.\n"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:876
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:871
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:728
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:1561
msgid " -- definition incomplete"
@@ -937,19 +937,19 @@ msgstr "Приведение..."
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:93
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:39
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:210
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:182
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:107
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:670
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:712
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:119
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:105
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:53
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:292
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:181
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:106
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:669
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:710
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:118
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:104
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:52
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:289
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:358
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:131
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:130
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:265
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:324
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:184
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:183
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:324
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:148
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:112
@@ -1001,22 +1001,22 @@ msgstr "Имя"
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:114
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog.js:65
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:393
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:185
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:110
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:673
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:716
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:123
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:109
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:295
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:184
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:109
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:672
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:714
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:122
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:108
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:292
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:361
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:146
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:145
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:254
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:327
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:187
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:186
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:328
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:151
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:115
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:312
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:309
#: pgadmin/browser/server_groups/servers/resource_groups/static/js/resource_group.js:87
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:391
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:344
@@ -1131,56 +1131,56 @@ msgstr "Исходный тип"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:654
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:658
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:662
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:137
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:158
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:692
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:702
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:747
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:750
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:758
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:781
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:735
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:748
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:772
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:789
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:805
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:853
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:144
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:416
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:513
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:538
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:561
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:576
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:604
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:130
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:402
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:499
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:523
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:550
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:565
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:593
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:315
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:346
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:349
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:136
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:157
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:691
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:701
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:746
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:749
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:757
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:780
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:733
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:746
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:770
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:787
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:803
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:851
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:143
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:415
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:512
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:537
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:560
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:575
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:603
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:129
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:401
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:498
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:522
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:549
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:564
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:592
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:311
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:342
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:345
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:384
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:388
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:392
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:396
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:400
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:404
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:407
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:411
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:415
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:418
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:440
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:166
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:179
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:191
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:207
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:250
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:268
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:292
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:318
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:323
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:414
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:436
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:165
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:190
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:249
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:267
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:291
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:317
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:322
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:350
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:375
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:385
@@ -1192,14 +1192,14 @@ msgstr "Исходный тип"
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:173
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:136
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:140
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:338
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:343
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:367
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:376
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:381
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:335
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:340
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:364
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:373
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:378
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:383
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:386
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:389
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:393
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:390
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:395
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:408
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:412
@@ -1254,22 +1254,22 @@ msgstr "Системное приведение?"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog.js:74
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:403
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:674
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:306
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:113
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:676
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:719
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:127
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:113
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:59
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:477
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:305
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:112
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:675
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:717
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:126
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:112
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:58
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:473
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:411
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:203
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:202
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:397
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:515
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:514
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:762
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:169
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:132
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:334
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:331
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:465
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:140
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:206
@@ -1352,7 +1352,7 @@ msgstr "Событийный триггер..."
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:331
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:154
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:118
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:315
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:312
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:355
#: pgadmin/dashboard/static/js/dashboard.js:1129
#: pgadmin/dashboard/static/js/dashboard.js:1387
@@ -1364,7 +1364,7 @@ msgstr "Владелец"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:111
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:155
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:242
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:199
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:198
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:286
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:103
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:144
@@ -1373,28 +1373,28 @@ msgstr "Включён?"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:120
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:39
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:316
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:315
msgid "Trigger function"
msgstr "Триггерная функция"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:124
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:205
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:267
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:272
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:347
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:387
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:391
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:404
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:417
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:429
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:459
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:464
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:204
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:266
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:271
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:346
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:386
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:390
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:403
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:416
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:428
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:458
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:463
msgid "Events"
msgstr "События"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:132
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:264
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:456
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:263
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:455
msgid "When"
msgstr "Когда"
@@ -1413,7 +1413,7 @@ msgstr "Когда"
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:784
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:222
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:169
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:409
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:406
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:514
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:378
msgid "Security labels"
@@ -1446,14 +1446,14 @@ msgstr "Метки безопасности"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1124
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:167
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:130
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:317
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:320
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:323
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:326
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:329
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:332
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:400
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:412
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:467
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:397
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:409
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:464
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:516
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:360
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:372
@@ -1560,11 +1560,11 @@ msgstr "Перемещаемое?"
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:189
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:479
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:195
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:321
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:495
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:530
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:320
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:491
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:529
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:811
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:455
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:452
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:473
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:163
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:221
@@ -1764,8 +1764,8 @@ msgstr "Тип"
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:214
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:129
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:161
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:319
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:396
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:316
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:393
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:420
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:427
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:440
@@ -1948,7 +1948,7 @@ msgid "Schema dropped"
msgstr "Схема удалена"
#: pgadmin/browser/server_groups/servers/databases/schemas/__init__.py:781
-#: pgadmin/static/js/backform.pgadmin.js:1837
+#: pgadmin/static/js/backform.pgadmin.js:1833
msgid "Definition incomplete."
msgstr "Определение неполное."
@@ -1967,23 +1967,23 @@ msgstr "Не удалось найти указанный объект ката
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:594
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:60
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:23
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:269
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:268
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:786
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:787
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:788
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:909
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:898
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:899
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:143
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:344
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:417
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:908
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:896
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:897
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:142
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:340
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:413
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:421
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:427
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:428
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:401
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:495
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:496
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:461
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:460
#: pgadmin/tools/import_export/static/js/import_export.js:179
#: pgadmin/tools/import_export/static/js/import_export.js:199
#: pgadmin/tools/import_export/static/js/import_export.js:237
@@ -2032,7 +2032,7 @@ msgstr "Тип данных"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:85
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:171
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:449
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:375
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:372
msgid "Collation"
msgstr "Правило сортировки"
@@ -2152,7 +2152,7 @@ msgstr "Ограничение домена..."
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/static/js/domain.js:65
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:415
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:21
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:127
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:614
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:679
msgid "Check"
@@ -2160,7 +2160,7 @@ msgstr "Проверка"
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js:97
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:419
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:136
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:135
msgid "No inherit?"
msgstr ""
@@ -2171,7 +2171,7 @@ msgid "Validate?"
msgstr "Проверять?"
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:177
msgid "Check cannot be empty."
msgstr "Проверка не может быть пустой."
@@ -2276,8 +2276,8 @@ msgstr "Сторонняя таблица удалена"
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py:1285
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py:1330
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1367
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1417
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1401
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1451
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:1356
msgid "-- Please create column(s) first..."
msgstr "-- Сначала создайте столбцы..."
@@ -2286,8 +2286,6 @@ msgstr "-- Сначала создайте столбцы..."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:487
#: pgadmin/browser/static/js/browser.js:213
#: pgadmin/misc/static/explain/js/explain.js:1219
-#: pgadmin/misc/static/explain/js/explain.js:1348
-#: pgadmin/misc/static/explain/js/explain.js:1349
#: pgadmin/misc/statistics/static/js/statistics.js:129
msgid "Statistics"
msgstr "Статистика"
@@ -2297,7 +2295,7 @@ msgid "Inherited From"
msgstr "Наследуется из"
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:259
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:176
msgid "Column Name cannot be empty."
msgstr "Имя столбца не может быть пустым."
@@ -2498,7 +2496,7 @@ msgid "FTS Dictionary..."
msgstr "Словарь FTS..."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/static/js/fts_dictionary.js:153
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:342
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:339
msgid "Template"
msgstr "Шаблон"
@@ -2648,7 +2646,7 @@ msgstr "Необходимо выбрать функцию выделения л
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:59
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:21
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:457
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:434
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:431
msgid "Functions"
msgstr "Функции"
@@ -2661,29 +2659,29 @@ msgstr "Не удалось найти указанный объект %s."
msgid "Could not find the function node in the database."
msgstr "Не удалось найти узел функции в базе данных."
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:833
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:832
msgid "The specified function could not be found.\n"
msgstr "Не удалось найти указанную функцию.\n"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:850
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:849
msgid "Function dropped."
msgstr "Функция удалена"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1141
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1320
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1140
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1319
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:334
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:511
msgid "Could not find the function in the database."
msgstr "Не удалось найти функцию в базе данных."
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1628
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1627
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js:24
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:621
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbproc.js:24
msgid "Procedures"
msgstr "Процедуры"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1728
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1727
msgid "Trigger Functions"
msgstr "Триггерные функции"
@@ -2723,7 +2721,7 @@ msgstr "Число аргументов"
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:327
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:150
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:79
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:322
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:321
msgid "Arguments"
msgstr "Аргументы"
@@ -2747,8 +2745,8 @@ msgstr "Тип результата"
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:182
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:98
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:100
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:289
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:493
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:288
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:492
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:154
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:155
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:209
@@ -2816,7 +2814,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:338
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:245
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1119
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:405
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:402
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:508
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:366
#: pgadmin/tools/debugger/static/js/direct.js:1707
@@ -2856,7 +2854,7 @@ msgstr "Символ не может быть пустым."
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:406
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js:200
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:314
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:338
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:337
msgid "Code cannot be empty."
msgstr "Код не может быть пустым."
@@ -3046,7 +3044,7 @@ msgstr "Заголовок не может быть пустым."
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:56
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:25
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:450
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:428
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:425
msgid "Sequences"
msgstr "Последовательности"
@@ -3209,22 +3207,22 @@ msgid "System schema?"
msgstr "Системная схема?"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:409
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:322
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:319
msgid "Default TABLE privileges"
msgstr "Права для таблиц по умолчанию"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:412
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:325
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:322
msgid "Default SEQUENCE privileges"
msgstr "Права для последовательностей по умолчанию"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:415
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:328
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:325
msgid "Default FUNCTION privileges"
msgstr "Права для функций по умолчанию"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:418
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:331
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:328
msgid "Default TYPE privileges"
msgstr "Права для типов по умолчанию"
@@ -3233,9 +3231,9 @@ msgid "Default privileges"
msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:443
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:53
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:29
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:422
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:419
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:130
msgid "Tables"
msgstr "Таблицы"
@@ -3243,7 +3241,7 @@ msgstr "Таблицы"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:464
#: pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py:58
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:24
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:445
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:442
msgid "Types"
msgstr "Типы"
@@ -3304,8 +3302,8 @@ msgstr "Публичный синоним?"
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:185
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:221
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:527
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:791
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:808
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:789
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:806
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:275
#: pgadmin/browser/static/js/browser.js:630
#: pgadmin/browser/static/js/node.js:1283
@@ -3314,17 +3312,17 @@ msgstr "Публичный синоним?"
#: pgadmin/misc/file_manager/templates/file_manager/index.html:78
#: pgadmin/static/js/backform.pgadmin.js:538
#: pgadmin/static/js/backgrid.pgadmin.js:621
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1741
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1786
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2385
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1735
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1780
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2379
msgid "Yes"
msgstr "Да"
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:185
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:221
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:527
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:792
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:809
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:790
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:807
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:275
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:147
#: pgadmin/browser/static/js/browser.js:631
@@ -3334,9 +3332,9 @@ msgstr "Да"
#: pgadmin/misc/file_manager/templates/file_manager/index.html:77
#: pgadmin/static/js/backform.pgadmin.js:539
#: pgadmin/static/js/backgrid.pgadmin.js:622
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1742
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1787
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2386
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1736
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1781
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2380
msgid "No"
msgstr "Нет"
@@ -3348,32 +3346,32 @@ msgstr "Целевая схема не может быть пустой."
msgid "Target object cannot be empty."
msgstr "Целевой объект не может быть пустым."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:359
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:357
msgid "Could not find the table."
msgstr "Не удалось найти таблицу."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:596
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1271
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:630
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1305
msgid "The specified table could not be found."
msgstr "Не удалось найти указанную таблицу."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1054
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1088
msgid "The specified table could not be found.\n"
msgstr "Не удалось найти указанную таблицу.\n"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1067
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1101
msgid "Table dropped"
msgstr "Таблица удалена"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1145
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1179
msgid "Trigger(s) have been disabled"
msgstr "Триггер(ы) были отключены"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1147
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1181
msgid "Trigger(s) have been enabled"
msgstr "Триггер(ы) были включены"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1501
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1535
#, python-format
msgid "Table rows counted: %s"
msgstr ""
@@ -3426,7 +3424,7 @@ msgstr "Столбец удалён"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:608
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:704
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:856
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:853
msgid "Could not find the column on the server."
msgstr "Не удалось найти столбец на сервере."
@@ -3572,70 +3570,70 @@ msgstr ""
msgid "Compound Trigger"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:56
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:62
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:68
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:74
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:90
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:61
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:67
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:73
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:89
msgid "Compound Trigger..."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:80
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:79
msgid "Enable compound trigger"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:85
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:84
msgid "Disable compound trigger"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:169
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:168
msgid "Disable compound trigger failed"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:188
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:190
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:187
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:189
msgid "Trigger enabled?"
msgstr "Триггер включён?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:205
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:209
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:222
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:235
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:248
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:204
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:208
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:221
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:234
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:247
msgid "FOR Events"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:207
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:389
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:388
msgid "INSERT"
msgstr "INSERT"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:220
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:402
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:219
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:401
msgid "UPDATE"
msgstr "UPDATE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:233
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:415
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:232
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:414
msgid "DELETE"
msgstr "DELETE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:246
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:428
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:245
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:427
msgid "TRUNCATE"
msgstr "TRUNCATE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:303
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:512
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:302
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:511
msgid "System trigger?"
msgstr "Системный триггер?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:328
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:543
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:327
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:542
msgid "Specify at least one event."
msgstr "Укажите как минимум одно событие."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:347
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:346
msgid ""
"-- Enter any global declarations below:\n"
"\n"
@@ -3705,15 +3703,15 @@ msgstr "Не удалось найти объект на сервере."
msgid "Check constraint updated."
msgstr "Ограничение-проверка изменено."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:40
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:39
msgid "Check..."
msgstr "Проверка..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:46
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:45
msgid "Validate check constraint"
msgstr "Проверить ограничение-проверку"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:157
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:156
msgid "Don't validate?"
msgstr "Не проверять?"
@@ -3749,7 +3747,7 @@ msgid "Exclusion constraint dropped."
msgstr "Ограничение-исключение удалено."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:38
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:97
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:96
msgid "Operator class"
msgstr "Класс операторов"
@@ -3777,10 +3775,10 @@ msgstr "Укажите оператор для столбца: "
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:453
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:381
#: pgadmin/browser/server_groups/servers/static/js/variable.js:341
-#: pgadmin/static/js/backform.pgadmin.js:1260
-#: pgadmin/static/js/backform.pgadmin.js:1370
-#: pgadmin/static/js/backform.pgadmin.js:1550
-#: pgadmin/static/js/backform.pgadmin.js:1669
+#: pgadmin/static/js/backform.pgadmin.js:1259
+#: pgadmin/static/js/backform.pgadmin.js:1366
+#: pgadmin/static/js/backform.pgadmin.js:1546
+#: pgadmin/static/js/backform.pgadmin.js:1665
msgid "Add new row"
msgstr ""
@@ -3792,7 +3790,7 @@ msgstr "Ограничение-исключение"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:28
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:28
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:29
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:236
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:234
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/exclusion_constraint/sql/default/stats.sql:7
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/exclusion_constraint/sql/default/stats.sql:12
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/index_constraint/sql/default/stats.sql:7
@@ -3802,87 +3800,87 @@ msgstr "Ограничение-исключение"
msgid "Index size"
msgstr "Размер индекса"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:642
msgid "Exclusion constraint..."
msgstr "Ограничение-исключение..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:691
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:512
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:498
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:298
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:690
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:511
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:497
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:295
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:378
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:344
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:196
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:366
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:363
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:40
#: pgadmin/tools/backup/static/js/backup.js:366
#: pgadmin/tools/restore/static/js/restore.js:255
msgid "Tablespace"
msgstr "Табличное пространство"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:701
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:700
msgid "Access method"
msgstr "Метод доступа"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:716
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:326
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:715
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:322
msgid "Changing access method will clear columns collection"
msgstr "Смена метода доступа приведёт к очистке набора столбцов"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:746
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:560
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:549
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:386
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:745
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:559
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:548
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:382
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:716
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:790
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:204
msgid "Fill factor"
msgstr "Коэффициент заполнения"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:749
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:734
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:575
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:564
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:267
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:748
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:732
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:574
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:563
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:266
msgid "Deferrable?"
msgstr "Откладываемое?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:757
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:747
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:603
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:592
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:291
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:756
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:745
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:602
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:591
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:290
msgid "Deferred?"
msgstr "Отложенное?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:779
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:413
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:778
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:409
msgid "Constraint"
msgstr "Ограничение"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:908
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:415
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:401
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:348
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:439
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:907
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:414
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:400
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:344
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:435
msgid "Include columns"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:931
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:242
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:438
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:228
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:424
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:370
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:461
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:930
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:241
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:437
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:227
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:423
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:366
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:457
msgid "Select the column(s)"
msgstr "Выберите столбцы"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1012
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1011
msgid "Please specify name for exclusion constraint."
msgstr "Укажите имя для ограничения-исключения."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1018
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1017
msgid "Please specify columns for exclusion constraint."
msgstr "Укажите столбцы для ограничения-исключения."
@@ -3940,53 +3938,53 @@ msgstr "Ссылается на"
msgid "Referencing"
msgstr "Зависимый столбец"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:616
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:615
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:585
msgid "Foreign key"
msgstr "Внешний ключ"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:637
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:635
msgid "Foreign key..."
msgstr "Внешний ключ..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:641
msgid "Validate foreign key"
msgstr "Проверить внешний ключ"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:771
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:769
msgid "Match type"
msgstr "Тип сравнения"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:788
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:786
msgid "Validated?"
msgstr "Проверяется?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:804
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:802
msgid "Auto FK index?"
msgstr "Автоиндекс по внешнему ключу?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:852
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:850
msgid "Covering index"
msgstr "Покрывающий индекс"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1002
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1000
msgid "On update"
msgstr "При изменении"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1003
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1023
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1001
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1021
msgid "Action"
msgstr "Действие"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1022
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1020
msgid "On delete"
msgstr "При удалении"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1050
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1048
msgid "Please specify columns for Foreign key."
msgstr "Выберите столбцы для внешнего ключа."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1059
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1057
msgid "Please specify covering index name."
msgstr "Задайте имя покрывающего индекса."
@@ -4031,7 +4029,7 @@ msgstr "{0} удалено."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py:996
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:20
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:43
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:42
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:557
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:729
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:811
@@ -4040,7 +4038,7 @@ msgstr "Первичный ключ"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py:1006
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:20
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:43
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:42
msgid "Unique constraint"
msgstr "Ограничение уникальности"
@@ -4048,19 +4046,19 @@ msgstr "Ограничение уникальности"
msgid "Could not find the constraint in the table."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:536
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:522
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:231
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:535
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:521
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:229
msgid "Index"
msgstr "Индекс"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:644
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:633
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:632
#, python-format
msgid "Please specify columns for %s"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:56
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:55
msgid "Oid"
msgstr "OID"
@@ -4087,7 +4085,7 @@ msgid "Index is dropped"
msgstr "Индекс удалён"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:29
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:236
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:234
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:45
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:33
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:49
@@ -4104,59 +4102,63 @@ msgstr "Индекс удалён"
msgid "Size"
msgstr "Размер"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:130
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:128
msgid "Sort order"
msgstr "Порядок сортировки"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:151
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:149
msgid "NULLs"
msgstr "NULL"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:248
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:254
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:260
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:266
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:272
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:245
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:251
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:257
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:263
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:269
msgid "Index..."
msgstr "Индекс..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:311
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:308
msgid "Access Method"
msgstr "Метод доступа"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:390
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:386
msgid "Unique?"
msgstr "Уникальный?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:394
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:390
msgid "Clustered?"
msgstr "Кластеризован?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:398
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:394
msgid "Valid?"
msgstr "Проверяется?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:402
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:398
msgid "Primary?"
msgstr "Первичный?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:406
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:402
msgid "System index?"
msgstr "Системный индекс?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:409
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:405
msgid "Concurrent build?"
msgstr "Параллельное создание?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:501
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:497
+msgid "Tablespace cannot be empty."
+msgstr "Табличное пространство не может быть неопределённым."
+
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:503
msgid "Access method cannot be empty."
msgstr "Метод доступа не может быть пустым."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:509
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:511
msgid "You must specify column name."
msgstr "Необходимо задать имя столбца."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:514
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:516
msgid "You must specify at least one column."
msgstr "Необходимо задать минимум один столбец."
@@ -4553,39 +4555,39 @@ msgstr "Правило удалено"
msgid "rule"
msgstr "правило"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:93
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:99
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:105
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:111
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:117
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:92
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:98
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:104
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:110
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:116
msgid "Rule..."
msgstr "Правило..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:165
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:164
#: pgadmin/static/js/sqleditor/query_tool_notifications.js:32
#: pgadmin/static/js/sqleditor/query_tool_notifications.js:80
msgid "Event"
msgstr "Событие"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:179
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:178
msgid "Do instead?"
msgstr ""
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:182
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:183
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:184
msgid "Condition"
msgstr "Условие"
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:188
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:189
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:190
msgid "Commands"
msgstr "Команды"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:195
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:194
msgid "System rule?"
msgstr "Системное правило?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:215
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:214
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:241
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:183
msgid "Please specify name."
@@ -5152,56 +5154,56 @@ msgstr "Триггер удалён"
msgid "Trigger"
msgstr "Триггер"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:56
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:62
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:68
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:74
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:90
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:61
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:67
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:73
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:89
msgid "Trigger..."
msgstr "Триггер..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:80
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:79
msgid "Enable trigger"
msgstr "Включить триггер"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:85
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:84
msgid "Disable trigger"
msgstr "Отключить триггер"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:169
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:168
msgid "Disable trigger failed"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:205
msgid "Row trigger?"
msgstr "Построчный триггер?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:247
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:246
msgid "Constraint trigger?"
msgstr "Триггер-ограничение?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:346
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:345
msgid "Fires"
msgstr "Срабатывает"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:481
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:480
msgid "Old table"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:482
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:488
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:481
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:487
msgid "Transition"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:487
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:486
msgid "New table"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:536
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:535
msgid "Trigger function cannot be empty."
msgstr "Функция триггера не может быть неопределённой."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:556
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:555
msgid "Trigger code cannot be empty."
msgstr "Код триггера не может быть пустым."
@@ -5587,7 +5589,7 @@ msgid "Size of temporary files"
msgstr "Размер временных файлов"
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:45
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:309
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:306
#: pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.2_plus/stats.sql:2
#: pgadmin/browser/server_groups/servers/databases/templates/databases/sql/default/stats.sql:2
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:176
@@ -5641,35 +5643,35 @@ msgstr "Отключиться от базы данных"
msgid "Are you sure you want to disconnect the database - %s?"
msgstr "Вы действительно хотите отключиться от базы данных %s?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:337
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:334
#: pgadmin/static/js/browser/server_groups/servers/databases/external_tables/external_tables.js:52
#: pgadmin/tools/backup/static/js/backup.js:192
#: pgadmin/tools/import_export/static/js/import_export.js:108
msgid "Encoding"
msgstr "Кодировка"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:380
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:377
msgid "Character type"
msgstr "Тип символов"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:385
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:382
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:413
msgid "Connection limit"
msgstr "Макс. число подключений"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:388
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:385
msgid "Template?"
msgstr "Шаблон?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:392
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:389
msgid "Allow connections?"
msgstr "Разрешить подключения?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:417
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:414
msgid "Default Privileges"
msgstr "Права по умолчанию"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:499
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:496
msgid "Connect to database"
msgstr "Подключиться к базе данных"
@@ -6506,7 +6508,7 @@ msgstr "Вид"
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:139
#: pgadmin/browser/static/js/browser.js:224
#: pgadmin/dashboard/static/js/dashboard.js:191
-#: pgadmin/static/js/backform.pgadmin.js:2032
+#: pgadmin/static/js/backform.pgadmin.js:2028
msgid "SQL"
msgstr "SQL"
@@ -7113,8 +7115,8 @@ msgid "At least one privilege should be selected."
msgstr "Нужно выбрать минимум одно право."
#: pgadmin/browser/server_groups/servers/static/js/server.js:46
-msgid "Security label must be specified."
-msgstr ""
+msgid "Label must be specified."
+msgstr "Необходимо задать метку."
#: pgadmin/browser/server_groups/servers/static/js/server.js:79
#: pgadmin/browser/server_groups/servers/static/js/server.js:84
@@ -7213,20 +7215,20 @@ msgstr "Сменить пароль "
#: pgadmin/misc/file_manager/static/js/create_dialogue.js:188
#: pgadmin/misc/file_manager/static/js/select_dialogue.js:86
#: pgadmin/misc/file_manager/static/js/select_dialogue.js:129
-#: pgadmin/preferences/static/js/preferences.js:435
+#: pgadmin/preferences/static/js/preferences.js:434
#: pgadmin/static/js/slickgrid/editors.js:50
-#: pgadmin/static/js/sqleditor/filter_dialog.js:79
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:62
-#: pgadmin/tools/datagrid/static/js/show_data.js:139
+#: pgadmin/static/js/sqleditor/filter_dialog.js:78
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:61
+#: pgadmin/tools/datagrid/static/js/show_data.js:138
#: pgadmin/tools/debugger/static/js/debugger_ui.js:588
#: pgadmin/tools/debugger/static/js/debugger_ui.js:893
#: pgadmin/tools/import_export/static/js/import_export.js:495
-#: pgadmin/tools/maintenance/static/js/maintenance.js:297
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:56
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2010
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2164
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4222
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4289
+#: pgadmin/tools/maintenance/static/js/maintenance.js:296
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:55
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2004
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2158
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4216
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4283
msgid "Cancel"
msgstr "Отмена"
@@ -7447,7 +7449,7 @@ msgid "Connection timeout (seconds)"
msgstr ""
#: pgadmin/browser/server_groups/servers/static/js/server.js:1130
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2192
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2186
msgid "Connect to Server"
msgstr "Подключиться к серверу"
@@ -7698,17 +7700,15 @@ msgid "Dependents"
msgstr "Зависимые"
#: pgadmin/browser/static/js/browser.js:348
-#: pgadmin/browser/static/js/toolbar.js:30
-#: pgadmin/browser/static/js/toolbar.js:31
-#: pgadmin/browser/static/js/toolbar.js:91
+#: pgadmin/browser/static/js/toolbar.js:29
+#: pgadmin/browser/static/js/toolbar.js:88
#: pgadmin/tools/datagrid/static/js/datagrid.js:74
msgid "View Data"
msgstr ""
#: pgadmin/browser/static/js/browser.js:349
#: pgadmin/browser/static/js/toolbar.js:20
-#: pgadmin/browser/static/js/toolbar.js:21
-#: pgadmin/browser/static/js/toolbar.js:93
+#: pgadmin/browser/static/js/toolbar.js:90
#: pgadmin/tools/datagrid/static/js/datagrid.js:75
msgid "Filtered Rows"
msgstr ""
@@ -7954,10 +7954,10 @@ msgid "Changes will be lost. Are you sure you want to reset?"
msgstr ""
#: pgadmin/browser/static/js/node.js:1513
-#: pgadmin/preferences/static/js/preferences.js:439
-#: pgadmin/preferences/static/js/preferences.js:464
+#: pgadmin/preferences/static/js/preferences.js:438
+#: pgadmin/preferences/static/js/preferences.js:463
#: pgadmin/tools/datagrid/templates/datagrid/index.html:37
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4297
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4291
msgid "Save"
msgstr "Сохранить"
@@ -7977,20 +7977,17 @@ msgstr "Выделить всё"
msgid "Unselect All"
msgstr "Снять всё выделение"
-#: pgadmin/browser/static/js/toolbar.js:40
-#: pgadmin/browser/static/js/toolbar.js:41
-#: pgadmin/browser/static/js/toolbar.js:89
+#: pgadmin/browser/static/js/toolbar.js:38
+#: pgadmin/browser/static/js/toolbar.js:86
#: pgadmin/tools/datagrid/static/js/datagrid.js:103
#: pgadmin/tools/datagrid/static/js/datagrid.js:115
#: pgadmin/tools/sqleditor/__init__.py:68
msgid "Query Tool"
msgstr "Запросник"
-#: pgadmin/browser/static/js/wizard.js:85
#: pgadmin/browser/static/js/wizard.js:86
#: pgadmin/static/js/alertify.pgadmin.defaults.js:261
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:263
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:457
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:455
#: pgadmin/templates/security/messages.html:7
#: pgadmin/tools/user_management/static/js/user_management.js:81
#: pgadmin/tools/user_management/static/js/user_management.js:174
@@ -7998,11 +7995,9 @@ msgstr "Запросник"
msgid "Close"
msgstr "Закрыть"
-#: pgadmin/browser/static/js/wizard.js:88
#: pgadmin/browser/static/js/wizard.js:89
#: pgadmin/static/js/alertify.pgadmin.defaults.js:262
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:264
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:458
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:456
msgid "Maximize"
msgstr ""
@@ -8010,22 +8005,6 @@ msgstr ""
msgid "Left panel logo"
msgstr ""
-#: pgadmin/browser/static/js/wizard.js:124
-msgid "Close error bar"
-msgstr ""
-
-#: pgadmin/browser/static/js/wizard.js:131
-#: pgadmin/browser/templates/browser/index.html:135 pgadmin/help/__init__.py:59
-#: pgadmin/help/__init__.py:70 pgadmin/preferences/static/js/preferences.js:427
-#: pgadmin/static/js/sqleditor/filter_dialog.js:72
-#: pgadmin/static/js/sqleditor/filter_dialog.js:73
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:56
-#: pgadmin/tools/datagrid/static/js/show_data.js:133
-#: pgadmin/tools/maintenance/static/js/maintenance.js:289
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:50
-msgid "Help"
-msgstr "Справка"
-
#: pgadmin/browser/static/js/wizard.js:139
#: pgadmin/misc/file_manager/templates/file_manager/index.html:15
msgid "Back"
@@ -8063,6 +8042,11 @@ msgstr "Управление"
msgid "Tools"
msgstr "Инструменты"
+#: pgadmin/browser/templates/browser/index.html:135 pgadmin/help/__init__.py:59
+#: pgadmin/help/__init__.py:70 pgadmin/static/js/sqleditor/filter_dialog.js:72
+msgid "Help"
+msgstr "Справка"
+
#: pgadmin/browser/templates/browser/index.html:157
msgid "Logout"
msgstr "Выход"
@@ -8455,7 +8439,7 @@ msgstr ""
#: pgadmin/dashboard/templates/dashboard/database_dashboard.html:88
#: pgadmin/dashboard/templates/dashboard/server_dashboard.html:92
#: pgadmin/misc/file_manager/templates/file_manager/index.html:27
-#: pgadmin/preferences/static/js/preferences.js:492
+#: pgadmin/preferences/static/js/preferences.js:491
msgid "Refresh"
msgstr "Обновить"
@@ -8980,33 +8964,13 @@ msgstr ""
msgid "Analysis"
msgstr ""
-#: pgadmin/misc/static/explain/js/explain.js:1286
-#: pgadmin/misc/static/explain/js/explain.js:1287
-msgid "Zoom in"
-msgstr ""
-
-#: pgadmin/misc/static/explain/js/explain.js:1295
-#: pgadmin/misc/static/explain/js/explain.js:1296
-msgid "Zoom to original"
-msgstr ""
-
-#: pgadmin/misc/static/explain/js/explain.js:1304
-#: pgadmin/misc/static/explain/js/explain.js:1305
-msgid "Zoom out"
-msgstr ""
-
-#: pgadmin/misc/static/explain/js/explain.js:1319
-#: pgadmin/misc/static/explain/js/explain.js:1320
-msgid "Download"
-msgstr ""
-
#: pgadmin/misc/statistics/static/js/statistics.js:214
msgid "No statistics are available for the selected object."
msgstr "Нет статистики для выделенного объекта."
#: pgadmin/preferences/__init__.py:55
#: pgadmin/preferences/static/js/preferences.js:426
-#: pgadmin/preferences/static/js/preferences.js:449
+#: pgadmin/preferences/static/js/preferences.js:448
msgid "Preferences"
msgstr "Настройки"
@@ -9031,17 +8995,17 @@ msgstr "Скрыть"
msgid "Category is not selected."
msgstr "Категория не выбрана."
-#: pgadmin/preferences/static/js/preferences.js:483
+#: pgadmin/preferences/static/js/preferences.js:482
msgid "Refresh required"
msgstr ""
-#: pgadmin/preferences/static/js/preferences.js:484
+#: pgadmin/preferences/static/js/preferences.js:483
msgid ""
"A page refresh is required to apply the theme. Do you wish to refresh the"
" page now?"
msgstr ""
-#: pgadmin/preferences/static/js/preferences.js:493
+#: pgadmin/preferences/static/js/preferences.js:492
msgid "Later"
msgstr ""
@@ -9087,37 +9051,33 @@ msgstr ""
msgid "INTERNAL SERVER ERROR"
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:1550
-msgid "Add"
-msgstr ""
-
-#: pgadmin/static/js/backform.pgadmin.js:1841
+#: pgadmin/static/js/backform.pgadmin.js:1837
msgid "No updates."
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:1956
+#: pgadmin/static/js/backform.pgadmin.js:1952
msgid "General"
msgstr "Общие"
-#: pgadmin/static/js/backform.pgadmin.js:2157
+#: pgadmin/static/js/backform.pgadmin.js:2153
msgid "Preview not available..."
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:2618
+#: pgadmin/static/js/backform.pgadmin.js:2605
#: pgadmin/tools/backup/static/js/backup.js:95
#: pgadmin/tools/backup/static/js/backup.js:230
msgid "Note"
msgstr "Замечание"
-#: pgadmin/static/js/backform.pgadmin.js:2974
+#: pgadmin/static/js/backform.pgadmin.js:2961
msgid "More"
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:2975
+#: pgadmin/static/js/backform.pgadmin.js:2962
msgid "Less"
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:3059
+#: pgadmin/static/js/backform.pgadmin.js:3046
msgid "Space"
msgstr ""
@@ -9146,7 +9106,7 @@ msgstr "Этот объект нельзя удалить."
msgid "Delete row"
msgstr ""
-#: pgadmin/static/js/backgrid.pgadmin.js:1098
+#: pgadmin/static/js/backgrid.pgadmin.js:1091
msgid "Array Values"
msgstr "Значения массива"
@@ -9300,13 +9260,13 @@ msgstr "Запрос завершён успешно, время выполне
msgid "Sort/Filter options"
msgstr ""
-#: pgadmin/static/js/sqleditor/filter_dialog.js:239
+#: pgadmin/static/js/sqleditor/filter_dialog.js:238
msgid "Filter updated successfully"
msgstr ""
-#: pgadmin/static/js/sqleditor/filter_dialog.js:245
-#: pgadmin/tools/datagrid/static/js/show_data.js:238
-#: pgadmin/tools/datagrid/static/js/show_data.js:245
+#: pgadmin/static/js/sqleditor/filter_dialog.js:244
+#: pgadmin/tools/datagrid/static/js/show_data.js:237
+#: pgadmin/tools/datagrid/static/js/show_data.js:244
msgid "Validation Error"
msgstr "Ошибка проверки"
@@ -9387,7 +9347,6 @@ msgstr ""
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:40
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:41
-#: pgadmin/tools/datagrid/templates/datagrid/index.html:56
#: pgadmin/tools/datagrid/templates/datagrid/index.html:68
msgid "Find"
msgstr "Найти"
@@ -9471,14 +9430,14 @@ msgstr ""
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:129
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:131
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4230
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4224
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:663
msgid "Commit"
msgstr ""
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:135
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:137
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4227
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4221
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:681
msgid "Rollback"
msgstr ""
@@ -9556,7 +9515,7 @@ msgstr "Эту ссылку нельзя открыть непосредстве
#: pgadmin/tools/backup/__init__.py:43
#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:46
#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:55
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:67
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:66
msgid "Backup"
msgstr "Резервная копия"
@@ -9836,8 +9795,8 @@ msgstr "Резервная копия..."
#: pgadmin/tools/backup/static/js/backup_dialog.js:71
#: pgadmin/tools/import_export/static/js/import_export.js:685
#: pgadmin/tools/import_export/static/js/import_export.js:699
-#: pgadmin/tools/maintenance/static/js/maintenance.js:477
-#: pgadmin/tools/maintenance/static/js/maintenance.js:488
+#: pgadmin/tools/maintenance/static/js/maintenance.js:476
+#: pgadmin/tools/maintenance/static/js/maintenance.js:487
#: pgadmin/tools/restore/static/js/restore_dialog.js:51
#: pgadmin/tools/restore/static/js/restore_dialog.js:75
msgid "Utility not found"
@@ -9845,25 +9804,25 @@ msgstr ""
#: pgadmin/tools/backup/static/js/backup_dialog.js:72
#: pgadmin/tools/import_export/static/js/import_export.js:700
-#: pgadmin/tools/maintenance/static/js/maintenance.js:489
+#: pgadmin/tools/maintenance/static/js/maintenance.js:488
#: pgadmin/tools/restore/static/js/restore_dialog.js:76
msgid "Failed to fetch Utility information"
msgstr ""
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:159
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:158
msgid "Backup job created."
msgstr "Задание резервного копирования создано."
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:163
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:162
msgid "Backup job creation failed."
msgstr ""
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:171
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:170
msgid "Backup job failed."
msgstr "Ошибка задания резервного копирования."
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:242
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:229
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:241
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:228
msgid "Please provide a filename"
msgstr "Задайте имя файла"
@@ -9912,7 +9871,7 @@ msgstr "Объект не выбран."
msgid "Data Filter"
msgstr ""
-#: pgadmin/tools/datagrid/static/js/show_data.js:161
+#: pgadmin/tools/datagrid/static/js/show_data.js:160
msgid "Use SHIFT + ENTER to apply filter..."
msgstr ""
@@ -10508,30 +10467,6 @@ msgstr "Стек"
msgid "Debugger - "
msgstr "Отладчик — "
-#: pgadmin/tools/debugger/templates/debugger/direct.html:59
-msgid "Step into"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:67
-msgid "Step over"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:75
-msgid "Continue/Start"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:85
-msgid "Toggle breakpoint"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:93
-msgid "Clear all breakpoints"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:103
-msgid "Stop"
-msgstr ""
-
#: pgadmin/tools/grant_wizard/__init__.py:327
msgid "Unable to fetch the {} objects"
msgstr ""
@@ -10890,7 +10825,7 @@ msgstr "Подробные сообщения"
#: pgadmin/tools/maintenance/static/js/maintenance.js:167
#: pgadmin/tools/maintenance/static/js/maintenance.js:183
-#: pgadmin/tools/maintenance/static/js/maintenance.js:483
+#: pgadmin/tools/maintenance/static/js/maintenance.js:482
msgid "Maintenance..."
msgstr "Обслуживание..."
@@ -10904,15 +10839,15 @@ msgid ""
"cannot be maintained using this utility."
msgstr ""
-#: pgadmin/tools/maintenance/static/js/maintenance.js:387
-#: pgadmin/tools/maintenance/static/js/maintenance.js:394
+#: pgadmin/tools/maintenance/static/js/maintenance.js:386
+#: pgadmin/tools/maintenance/static/js/maintenance.js:393
msgid "Maintenance job creation failed."
msgstr "Создать задание по обслуживанию не удалось."
#: pgadmin/tools/restore/__init__.py:41
#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:40
#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:49
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:62
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:61
msgid "Restore"
msgstr "Восстановить"
@@ -10978,15 +10913,15 @@ msgstr "Восстановить..."
msgid "Restore (%s: %s)"
msgstr "Восстановление (%s: %s)"
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:149
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:148
msgid "Restore job created."
msgstr "Задание для восстановления создано."
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:153
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:152
msgid "Restore job creation failed."
msgstr ""
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:161
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:160
msgid "Restore job failed."
msgstr ""
@@ -11072,77 +11007,77 @@ msgstr ""
msgid "Geometry Viewer"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:832
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:826
msgid "Editable column"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:834
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:828
msgid "Read-only column"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1261
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1255
msgid "Fetching all records..."
msgstr "Загрузка всех записей..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1730
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2369
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3314
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1724
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2363
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3308
msgid "Unsaved changes"
msgstr "Несохранённые изменения"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1731
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3315
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1725
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3309
msgid "Are you sure you wish to discard the current changes?"
msgstr "Вы действительно хотите отбросить текущие изменения?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1759
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1753
msgid "Clear history"
msgstr "Очистить историю"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1760
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1754
msgid "Are you sure you wish to clear the history?"
msgstr "Вы действительно хотите очистить историю?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1761
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1755
msgid ""
"This will remove all of your query history from this and other sessions "
"for this database."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2125
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2119
msgid "Connection Warning"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2132
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2126
msgid "The application has lost the database connection:"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2136
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2130
msgid "⁃ If the connection was idle it may have been forcibly disconnected."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2138
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2132
msgid "⁃ The application server or database server may have been restarted."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2140
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2134
msgid "⁃ The user session may have timed out."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2144
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2138
msgid "Do you want to continue and establish a new session?"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2163
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2157
msgid "Continue"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2299
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2293
#, python-format
msgid "Error fetching SQL for script: %s."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2370
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2364
msgid ""
"The data has been modified, but not saved. Are you sure you wish to "
"discard the changes?"
@@ -11150,165 +11085,165 @@ msgstr ""
"Данные были изменены, но не сохранены. Вы действительно хотите отбросить "
"изменения?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2414
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2408
msgid "Running query..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2422
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2416
msgid "Waiting for the query to complete..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2579
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2573
msgid "Loading data from the database server and rendering..."
msgstr "Загрузка данных с сервера и подготовка к выводу..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2588
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2582
#, python-format
msgid "Successfully run. Total query runtime: %s."
msgstr "Запрос выполнен успешно. Общее время выполнения: %s."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2589
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2583
#, python-format
msgid "%s rows affected."
msgstr "обработано строк: %s."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2865
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2859
msgid ""
"This query was generated by pgAdmin as part of a \"View/Edit Data\" "
"operation"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2966
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2960
msgid "Row(s) deleted."
msgstr "Строки удалены."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3040
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3034
msgid "Saving the updated data..."
msgstr "Сохранение изменённых данных..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3156
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3150
msgid "Data saved successfully."
msgstr "Данные сохранены успешно."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3159
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3153
msgid "Auto-commit is off. You still need to commit changes to the database."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3165
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3159
#, python-format
msgid "%s."
msgstr "%s."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3170
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3164
msgid ""
"Saving data changes was rolled back but the current transaction is still "
"active; previous queries are unaffected."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3192
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3186
msgid "This query was generated by pgAdmin as part of a \"Save Data\" operation"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3353
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3347
msgid "Loading the file..."
msgstr "Загрузка файла..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3404
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3398
msgid "Saving the queries in the file..."
msgstr "Сохранение запросов в файле..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3416
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3410
msgid "File saved successfully."
msgstr "Файл сохранён успешно."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3538
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3597
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3532
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3591
msgid "Applying the new filter..."
msgstr "Применение нового фильтра..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3558
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3568
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3552
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3562
msgid "Filter By Selection Error"
msgstr "Ошибка фильтра по выделенному"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3617
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3627
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3611
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3621
msgid "Filter Exclude Selection Error"
msgstr "Ошибка фильтра, исключающего выделенное"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3637
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3631
msgid "Removing the filter..."
msgstr "Удаление фильтра..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3655
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3665
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3649
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3659
msgid "Remove Filter Error"
msgstr "Ошибка удаления фильтра"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3768
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3762
msgid "Setting the limit on the result..."
msgstr "Установка ограничения набора результатов..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3787
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3796
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3781
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3790
msgid "Change limit Error"
msgstr "Ошибка изменения лимита"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3922
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3941
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3916
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3935
msgid "Cancel Query Error"
msgstr "Ошибка отмены запроса"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3960
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3954
msgid "Downloading CSV..."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4014
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4008
msgid "CSV Download cancelled."
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4017
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4011
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:395
msgid "Download CSV"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4020
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4014
msgid "Download CSV error"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4054
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4061
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4048
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4055
msgid "Auto Rollback Error"
msgstr "Ошибка автоотмены"
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4081
#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4087
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4093
msgid "Auto Commit Error"
msgstr "Ошибка автофиксации"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4182
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4176
msgid "The data has changed. Do you want to save changes?"
msgstr "Данные были изменены. Желаете сохранить изменения?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4188
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4182
msgid "The text has changed. Do you want to save changes?"
msgstr "Текст был изменён. Желаете сохранить изменения?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4268
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4262
msgid ""
"The current transaction is not commited to the database.Do you want to "
"commit or rollback the transaction?"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4271
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4265
msgid "Commit transaction?"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4294
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4288
msgid "Don't save"
msgstr "Не сохранять"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4337
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4331
msgid "Save changes?"
msgstr "Сохранить изменения?"
@@ -12710,9 +12645,3 @@ msgstr "Не удалось найти указанную базу данных.
#~ msgid "Error dropping %s: \"%s\""
#~ msgstr "Ошибка удаления %s: \"%s\""
-#~ msgid "Tablespace cannot be empty."
-#~ msgstr "Табличное пространство не может быть неопределённым."
-
-#~ msgid "Label must be specified."
-#~ msgstr "Необходимо задать метку."
-
diff --git a/web/pgadmin/translations/zh/LC_MESSAGES/messages.mo b/web/pgadmin/translations/zh/LC_MESSAGES/messages.mo
index 5c09320776e7107c32ff7ec14bce4200a4dc2b84..1344e90e72a95f3f4f8814ef0c7434fbe4f48b21 100644
GIT binary patch
delta 32929
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
delta 32851
zcmYM-dAyZV+raUC8Z^(dQm1*IH6to1p(y1k8e~j{63Ih5O{NSXb0Jgc5h;q4k_<^9
zQcC6uMFS%0{r&d3KA-pf=X<Ytt!u4y?|n|k^FH@t(Wn1cH2YQgLbEdb-=QLzObtBH
z)ztt0--p>u=6jOs@Yn*G%)&{T%ox%;CTB7O@jp{CncnykF3Zbg{>BBQUz?W6%)yJN
zXEG0xf7H#HOi|L0-IAP_%w}GWjMuR=72Xa%!D6Jp34acM5079O%8T8atcJF49O;f&
zjdU-pgy-WicwOY*kBu^{>Lnh^Qm`3|;ZIls58%<5xh>^a$8sd=V?peIr(+ki-mTaP
zpF#)x3ftiUtcy)<&t$6N8JLe3V*$p`+~Nb?9^M(w4DSmc2p<k-hmVI(hR<M8`g;yt
z&_XPP%c6W`q*r5o2Yx>?K8y+<M|xwVH{bhB-jI`BbFmp|s-@5_%SO6Vq^m~ym`LYG
zx_+b^-Fs7kky(2>FG@y4$pw+VG}5CZJtiC%jt{R7Zwx1eQ^M(3opEkO$9p>RpPRv+
zyXg6mu^?O+E)JK3Z-mRkmEmf%<98#y7LEExk=_(;3Acq`&tT7;z;}`HW4J5)CHxf~
zU|;x0_;+|XEO19Aa}xEA!ot`KUHKV!6plhJcV-N_XA`nK*zrX4Ku<<zejk>?*;oNz
zi1Z4qNqQZ6fPcZ-SoqF#kQ<^ms~36^E<!KBO;`mVKqs^Sy^-0qJXrAuw8P9@sX;ZY
zOtNLzGxE<1uMTfTZ|q~}z%OAL{0Lp~SK$v>kMu9-c;)WSy&|%iW;~Q6qYIY6UXdPv
zWk`=eBQgdJ>GfC|C!vwM3tQm5=nY$i*8dQ#{~4CYFVXsYusH6+0lsto<-vEuSu<HJ
z-h$0>N%$kSCtdNLOlB<h!BcTLx|hZ7O%pALWl7gY7t$uuC!j0ti%w`1o{3lCalUg_
z@o*v@!87p0`_hW;!qZ4E$0k@}RwmOL+oKb@1TB9Ihv6^S0Z+R>lj(|6u_>;`N%$Kc
zk7FK4`3o>>hhIiUsRwywlkS8LI1-J>o!AbSNBRJ|1@#_EhqNsk`jgPD?1K(`4tm(8
zq7i!>&%>Xw7509Z_&d<`52wTOG`f=ckuLd28mI!6Bfn0hkHre4yQ2dRLeI(tQ9ce&
zCOrka;QLq&3qP9L)xz?m+dfMCEAr5jj8ZrRi{qu}{Tvth6VQQf#@zKp>&?bGI1i7*
zwP@&z&W>w{M))E;79Ye)xDKo1cUd01&qvVfQj^bVS6UxEOdZgb_Cgz+i_ZKyG~~CV
zhig`(UqTPr>*$2viu5}4J@F~p?)OM%kMLmVYCo0+Y>h^u8@j@N=xH8;M&x3&{%G{{
z-+&G@6^+D99E^+5iI;gi)vFseMHkW*YjOTEeR-%t#+B%RH=_;jiS#p(ei@y}JLn2O
z#u~T@J){TF_Vu1fk!*=>ZF@9geXu4DMaR1l8+!j|@!)`OM#0BugI(xe|AVf)@Z7Z0
z;^@k&pcAPT>H6rcXpTncIJEs~;o0aR9EwKxI;_t4ndv;(U@p4n3(*O@9e$1uxC`6h
zUi2{4doo?i|DXfkg+^!&I<e=`v-A>H##Lzlo6(8<gjpX7J(Xru6P<B0w1akN2)jgi
zKXhV4(RO3P+tGSYqbqwo((j@5x1opow@CkqPN?|P#NUBxKb=<C5Z%L;SO`0#*QG1E
zva`|CI|5zVW$59%5p8!HI?yc4$4AjK@+Mk;OQe4Zi#<d9?XbZ!Y2~fZP<O(rcoN!h
za5x%0JQLA+_oES;6X|Coy#S9Qe+hcFR-pAiMf>{_-Ll=;$oMBL{cM_0J{rm<Xs9}(
z4f~>dI0BpFSR90p<1u(J$}7)H12;qm>Vih<RJ5N#QJ%e&2Saybcnf+M??w0SNp!$h
zu@k-<<$2Ggj>@6es&1sap&=iD=i(S_h##T-{(+8n)bqI)QZ`eLhkP>HqM;gq?)4>D
z1jk`9ya9{ibj+Q0%$;`h@I8-Ccm;OHPr}MCr1pc+`WIkfyb5c2|F7l28PCFIxDZ?7
zcJ!K+nV(kB1G|zQjponCCio2=hb8})-u1oF75^7I;*;1Mw_;r^{$g5i3#{k;@9P7O
zLpy#5b0Nb<r2jzQ@wFDD0Xw4|UWk4y-;36J9~<L7Y>G8rO0VQzXup?Xdwd)_;3mx0
z;-SpT=?h0oY)N`3`i{O6o8j}=8aJW!i!J2FU}JRPe%KZ#V14{w<bR4z<R7%ZMz5ra
z_dp{z_7&pqjAxT!#dp#4el%3aEJ`al360PN=mc*?2U>~)a63BDV;85b9D(_yC!&#j
zEYj~{E7Ci$4pw`W_}lQfS5w7H(Sc^7D|{6la9iY;dM(|8Ht2*$qXRsMZSXC$zx`33
zza;f@T6i_u|HEkHR%9b%CmNDcOH%|oqOaKV(fk|Gj-N%Z+eWm5{b7yQQ~Am0R*gju
z^;76VR$^7$iAFZ>jZEeQ%+}}OcpfgmUN{#|#Glb?)NC0aop=@Yz-8DI^WNn3jJ?o~
zrl1pDg-&!g7RRHPr!OA$u{7yZ@F*OJCH(w9kB72kT#DuJ`fvu8B0VRZk3~qoj+Jl~
z7Q!#k_S>)|?m^of!kSoYMLL{~(1Fjz3OEu=dH=^p!8CM+Ga~&6I>20XfM?MTmtbYw
zgua;epesFy)-U*0deap}R+y=ZPOKgpnbzo548=xS9>()vM~`Dsd>)<QE9hRmiw^iR
zo`MBdrbwNN4sb5o{t`R~$D$Kii&bz#q<5kV*^Nf}FlNj1P<B=7s4kjriFVixeN~=@
zPV6jnz#(X)F2-7TE!M;Pu{OSew%-=zJJ9w;-cDOs7ORu4`Zn=*z+)rh6f`s=(V5?X
zmfweV_$=Dd%jiU2kNh?07HmKx^(CH-`_T5iR;ThI=-Id^(&JVWfA=O!h8@m8ug!x|
zaWQ)6-bN>|7MtQ{XuG_3Qpcsy_SMk(_0do_M<;wj<e!3WZC`X^BeOi%(Y2V5Q_zM_
zp#v^PPx}fqw4b2^{D}^D1j}HFHEHG5(FnGQbRTrD&kx6;k)4kAlbyqZ9Xx|}_$s!{
z<9bDU-@EC<<1ijYdE58Wi>WhKBs~CK$))I-xB;E`?dSlr(5;z`jx!Hk@Dik5HuDY-
z?#UM^Bl9CRApI9wG5`Ja&89h8uMe94A1sO&p&`8zJ&aTE7<>{t;Yu`uhtT%rK1jEt
z7FP29*W<yEcSb|i2R%gRp#zM=4tOKB$HnLbe!;@{7y4c}f=00B+O*;(Xns3vhyySe
zA@ua$jzbtf^DGZ{V8IX5fHT8~u^{<RVoB?v9WFvA_9>o)Tk&3Oxh}ne-$oa-2c6&%
zbYX=*N&{EHI;7iT_IMr!@=y=&LkC!jrSJ=Eg+HPptg=3BO>=BadO)NnVm|4o@mO4g
z_3;ok!P*<*7Zc%B^bjuFK>XdSjgherok;PI(?BiJ4hN#4za87*s_-DTBHiMX^lBZ3
z4mbl1`D>Bhj)uJWr|Eh(Ko`*cQ{wLgE+?ZA-i|h0g!#A?y-xpPajd*CeS@iu-iE$t
zyMb65v*Dd+=x3vmd=ksz%Tc}xjp)ZVXwJh9bmf&kOB3jfbxEI(=1)fld;yE$LM)HV
z(21=_uiF-^h~Gx}pIC`>@y}C!KDyv`=oV!A^I!*;p)<V}?O-Z;NFG90wk*omq62M4
zC-e>4ekYd1{a6Aso6<x}VmXqP(eg%U{dP!1vY8WkaDX$h3=T&paus&NiReHp(T?83
zYPbcR=m9hm#lA=(u7UQ~94q5-XuJOCz!#$Rufp8t{}dja@l14vv(b*9M<=ubozQwL
zgxkVz(TVNAD!2!S;!&H^p}Y{?!uzoUzK$Ncedw8~v4ySn{-4Z)r}%PoujinL=WTRC
z@1ytqb2RkZ(E)d08$5!ovCWrhf)}9mE=AAE7_5r_MGxV9XoQ}|tObjBu)}reKtG@n
z*@M;aZ}h!Tacg?jwnZaz3RcHKXoRjt2e=6v;5}%>mZDp*9G%bxwEmW@?7t!0Nro%_
z6`k4dQK8Vb)Sx`N!W!5X&%kCl8C&84Y>wN}PsvhWrM+&6Ze?ezfql`1jz(|A)USxY
zD}9&@L;VaofmhJOvkIO0W^~0rqccB*c2I14T5&D3T`RP|uIRvh!r@VV4LZ)$NYBjj
zP>YPm(E;8<BeEgVo6rt-pbht<r#SO<s#gLHae4GqSHU~62^#99=$5{XF62YBzpv2p
z>`y$j=ivZ)XqtYL4oh2fLZ_i2I~N<{xX7P_PUyu*zkv?47VT$axD{Q{_vi$F#+rB-
znK<wNZ_|qEpbeX&ho~La#-8X*FF{v27VU66I<bl9%I-%eJP&QZ1g-x*x>X;cTl9V8
z@5iGUKXZ@=8yty(vfrhKmCzL)jjgaDdM3_6x8O>2;Oo)DI|B>gJ?I2yp#wjPMrI*;
zcHY3;#PAZv&wRwg>Db}>^rP1_>_U1CcEAEZq<>WEjNM7!fJ5;u9Er7lOao2{Z$k%~
ziM8-CJQ`PE9o&Lm>whup%B$>1GjD{>tSK7$R%i!jp`jg%Hk^zV@KJPYUc!8Q9gWbJ
zSQz)A{U1alRcvQUR}Y)*B>sl-crrYdz0mXk^!f}#8;--GI30`NUFg<4fc5bybZ<XE
z+igbA#vXJ+N9{`e9)m?mH$o@YdKd9GRNct%P1p|&)urf)r=lI-heqN_bWh(#C$br>
z_YGQaFFIi6r_@gs^z5|3x;PT^@n)=t^RhfN=V4t`I1~l7eohs7paWfsMraHc!yEA!
zycvB3KaFn9N_6F4qFcEijnu(N7yc!Er!0;}B3qh=+=~NUSrfG3iC7#@Mkmk@-P3dM
zC>)A*a3MPI6=+Cr!4mioI?<=m2rs~r_$FHK10-_U%$Gda(a&h;4xk;B*q!pLpcBgv
z+oR>Dp%Xs`o#<tee=WKtlhKLZgD&VH+=z3c{OUa(a`t};4_=F>(Zlv0+F%PhvF%tI
zccLF6f1(qp_-m?{kEZLRp>K^I!rs^(hoZM-R`?t`;Wx1`<7eLEp(K8UW$;UM=0Bqo
z*oTJr5IRt$-_nF?V*}Ey&`=LTw`fFoF*?xYSQf8CCvq#g(Ak)EpaneG@vBj=3SGfQ
zY>2xezuew*dh6m9<o7_g<`pzT@1p~LfllN*EQ7lu|1T^@y3oGVf8~9|-#u(fhMo`w
zXQC^=2t9mPqNja4dQE4cA0jVeL0pF};A6D@HgqCCp#A(7`G2A9^7f}+c;@dX{x;}K
zMkySG4sanFfr;o@xEEXFgXo*_1GL>QSOE{9kt}*34O}KX8qKed_R|b=X9UZW?w#eq
z!*_0Em^Nhhpl4z(8p;Le3Kydttwck=2JLVw=HmghU8UcXb<nfX65XOsX!~AhWU{Bn
z!$9=YYZ$h{^U*^$3%lY1JOO`2C(`1N)In!-CEd|T3`Ac@qp&GX#}jcO9*g_Y1vmOL
zm(FJT@L-3N(3Q?WXLt`f^9Q2*3G7Mwe|Rz;!1~zvAnyVkj%6(mm!lI}kCpK|wBNtc
ztv-T9z5k{DN*R^W3DiTkpa~kX&gdcQjYjBnbWi)C?}I_;M8~0rYa+U!+2M2O#1^Al
zvnKLC#UkGS?LOd+@K<!eKhcg4g@yl4AuogGS49V^6X_OsI_Zv)KOH@+_e6RTdi~zQ
zD)<RzUFlCe*x}#kp(u1Ht-KVv(i&)ky6Cm)681zVekK~Z|Dg4Uq5WQj`FL%VKY(t<
zY;=K(4iSGlSVD#k-a=Qj0Uc;7I-wot-u)Ko-_Z#lM(Y**Ck<Qy%|9C5x_W5n+eW$v
zdM5g#k+}FD;_o4vKt^MH4C~_iSPOS!Q!MpwI^~_v0Z&6a9)wQt5_AD$(Ee^h&%(3l
zVOxW3aU<G)(ZeaC&9XdPK}HX}5MRLyu-cLI-EJZdA^j~H;uA7?xfS$4BX<tElHuqC
z#-jBmNB%8%9O;K~FmA%W*d{M8cbl@4c{rMk_pvj6AJ!_68V<&e<UbH@Kvz(#U|w#e
z&Cx^F9~<H|Xn(V@IxdO)jd&{Qf3OCgQYg<?dNy+b555p4<3xNKt6{yudAUP(0$M&0
zhvJ0D{{pS|8@g4+kIKt!VH33e0BnZiu@gRp&G9R&iY1G<;4J&agBiooy_<l!vw*JP
zeQb|Epaaz?npS!owjzB28j)G(gqETMeTo$^uUKC0yIy5nl*jEs$NQ}~k!Ac$u@Y&(
zZrF(QXzYQr&<Sn9UYIGFm%9bM(d&2ydiX9vPyLnX;hcb8v#IE-`4M!$7tsm58~Ix?
zYX`sbU<U`$`&*z?UhWzeLp!X5l`uc@+oOlA8~R2&EAoehmqq?~wEwAS|97Bg<pH$c
zrKR$+xq{VX*wIH(@MZWTwjh5m*2DbLDIzDM9bAT9uWQl6Hx(UlK6?KbqZ3^n>5b^E
z`3}7$KbOv?f%lSOM~BglOO{FLD(F40AL;h!ndpHYvf=0pYYJNLF0}pQk^cfZ&}--f
z-$W<y13KRBY&;x7D;6u8Iw*stk48JrM;o+`bXRnse&G;wA{U_pj71}QJ-X*NqxBz+
z@@LUVWfw$+CFsi5p$&JTd-ex<CNkyHi>C;BsH&s)yajsLdPn|n^sHQsw!0Ob(B0?+
zA4Cu1Qz<{2d6Nfc@($+XN9f9bMJMt*+F^n6X-})75ow5)cZ~GOm`{2jy7%MJiA_h}
zkh9UVumGLV3M}jWf0qYC^ac86+Kqll6t9pP)I?X@0uA9wSQAe}59MXp5bs7;xCCAK
zYBZv2!yRb91uLcrRKb$o|5`j)u^Bp%Ug+UE5AARgI<XmOq@F`pxDX5BO7vQ-LAPut
z8o_;dJRU^bwXc-QyP{{QH|Bo+AH;*9yaWx=HRu4-&`{qO<xiubTZj(uIu^vYB7Zg7
z?n5+EU!v`Q4F8P$qLtGtxk6>`e;X>CPKF&#LK{v+Lwpw+ffpnHbu=>XU{l<QeXwGc
zyxi}Khoj|BVgp=*_PZO6z+QAhe@D7RRqnq96|1ID9)qs14jQ5+=;7&zuI$uE{|CpA
zz6=fhHuN?e!Q8d2mio;{7tk2pnszw90N<$5GxAHedU}`dM+YcTBVCW9(FSeN2_27i
zbTaa>nK=`k_?6*x=tOTq`?(k0%DL#7T8Iw#E>6Xd&`4+dACp!(6g{1z(GDh|r}{4J
zg0G<+?MLest(mT64fH;@LCgD~pMt~D>vw&mXQF591+@JVWP#bthddbS&r?R`dvs-c
z(7pN-U3t-3DIyio{F>+hEzy<rL<cw>UHRZ}6nd7fM<etQx@9k5Y486!9-R4Bw1d6q
zH=)C5gHHLW!#?OlhM-$>F}gKl!U^cgZo*nP3-fU?x}eXad^`G;Y(Jjh{clw}h5Smi
z!-?oAo{lzr4n0&0(fhsx-J&<q$bE=TYzz9m;74>JhtZXnsFSv&3EHj)+O9ulUHJ$e
zY;Y~Qf+^@5?*Vkc=h2QAME<+z;n{)?`~%u<Z=?&?O^37`I`NkHC$_^DdHlkwUS4J;
z>2vFI|6k^zW`n%Ui4<(W?xf2#%FCRDXX8kG058Tv*cV4O&ddD?^()wsbm1oH4SE6^
z!NKUj=ZBY|E58Es@kVq3bDCt+7mDY|Xidg?Y=L=AQ%9}Pjyj?ZPCyS^Z*&j)p%J<R
zt#=O^$p_JiJdGaK|3&_C^uugzlz)?rhh0&y7aLKbNV62eR_G}|1MToabSo~$CO9qf
zUqUCg1nc7pbizNN6Z#Ep|1Www3O7&X*-AWk$nw#OjnPoG4^Ku{FaSL?7or_pjoywa
zXuDZxySZq+m(hAFqI`Y06+JV%kbbk7-+6EXM{zQ=3>u=U=;3UEhPFG}ac^{GgV0aS
z^U+VoiRhd0ktkn^`J`8)6Zrw{|93P}hq1W#zi`VmP+9cU*GC8Hh|aVp`XO>w<PSuz
z)dgtBQzHM~$bSND_ZB*#57B{tLO&z+qwkN>t!VH4ugZf1H$qq51-(vZq61xszEY>+
zoj3<Qtj$}e7tJsn#_h@CDDt<rNuT?twoR|@ThQ+TtMMExaBN=gQ+Ehv7n5-(4}-Bs
zyS&^FpO0ZZ(uLYH0XlAsjY;?Fke4}tWARM9xMTX*U5d>}|ATF@ai??$&qIIonu1O7
zO>Bg_qP%=(?*Fl5bnKi~bU8LB{TQ~yb?9~c7wx!Nmo$;#XuaFej+dbQd>`f2j!Qq9
zb;l0mk3%OoKhm4ge#;%t{Wp{+9-kVFMLT>Fo#}e?njJ(tsCz=1NIz^vdMes}F*d{<
zXr#(?P5pGjb4g!__Ol9|_-=Fp)w8_z{CGVTZ8#n6=p}RlU!V>0PD&lLM9T-G5t<z7
zh3Ge_E$IC()h+!{+7=s-9)!NICSrel13g>WGTqb1VGHyc^+PLMj-H8?_!QRYkxubS
z^o{ocdM($Z*Xc9li%n)L`o7qX<?uK31y<nX^x~?9mbXU6%VxUqV8vl*hhxwN<I#@q
zjQm;Xb$cYzFQD&%m(fTq!+iV!>*7&8(~GGI`o`>l*6$k*#v<PT3wdw?m!tPJi_UO%
z_#)OOy#g!XH)#Fe(Q8}el+^BMG=d$`fzHOFI2?`GrIEe@?SDL$_Ws`z1rMO_=*Q6)
z$h>e78kx5uy#{^deuAZNJ35iwSQ<0El4Z~rO-(eSjnD{o#atvXYiI^X!C16|$>@w{
zqA#TT(E;b99V|sB`aU|bkI@NiLL>AO=3cRwPr7jLbhsN}J<|Qq!*@+@?!VXVzNqjP
zI^a*}sn496Dz-p7JRJ@Ffbb%8BG;i4o)qb6=tAy5BlIX5f#=Z)u0$jA*{RvIqU~h3
z!e7xD{)4WxcAvC@*62WIp(`DX*1sI>@Ot#@+=)(bKDvd=(TRP4?)iGO->=d3zh!yw
zQ|{j=D1Ta-aUHyl{8o4eK8Gh@htt!W?pkzZFN90c!}c!vski~%nqSZf?L!AFbVgc8
zIW(f#YCIUK{K#mDe%Q1}C)N)Q)rIJxxe{H;^^t!&8j)G(fb-B$zlh$3chL6VhQFYZ
z`~&GHn>m~wGG+Rv(Bz{HTA?BAj5g?rhVqOk?~ktNJTwxcBLBL`pNuZ-E;J%@uok|K
z_O~Th&i(tA2Sc<MT|vQqX{E)&ifDPQNVi7!@VM|aY)krF^z7V?ZpC7BA<M(}!cWi%
zY{f#}|L-GX7rNrT=*<5`2QGPL>Zm6AqgEqyD^5bU=rl9}BhZLkiLUsD$bS%<k$wjK
zBJ(L)Zxd!6=zAXA)BR}2h0aP9%ix)$E1>U*3(*PQh-cxgSRc2dr@uh|wDNrPa5YA+
zb1QU$J)?X8I^KExx&Q9T6=WFtJJCJ9FMJ67P?>{<{E6^oY`_<jmFR?a4oCwXKo?Z}
z?6ksa=vFj9Bi9n`zZbd%r=QLJcaP4FjA3YKE=FfO4h`Al$e)fqN#7f8!A7KO56sI<
zU_z(jTGFcru?5Wh?sM`o7m=PnIQ<H@!jN>0&&AiN|45dHIaC;UUS4J{{*JRLcyMT%
zdHdnXu3@k6OmwA#!%NYHTo+CbXN32o5qvy+32mQ!D>Bxj_jo&c|M#JLUUEcw!_`Aq
z+7Ue?Bhb)}Mz`P^^w8aePGmOP-?L~0U&m8%Il2|a&d+@V%4X{D;0xnS^!i+ap6WZ$
z4(6f_7Nck3qwwQ!W4I~Y5^f8>4!;Y340q+^{{6y(r}bC#Q2c=&lEb+QybngE^ik*p
zN<_MJq$@<aa-^$Ax@M&7M!G?yn?|~YY43mA$Y>uGx<vYfNOzBPPc)Q$BEN6spB3pr
zksciBVUa#R(ica1RHU!OtScQG8RMhE^^wj-dUB+1j`VGjzAMuAMEZe9Ka5WFvB-Zi
z@}G(H3z2?tB=_Htz7hqmhD*a`;fioo_)hp9`Xkj^bif}Y|EF+w_*=L?{3HBpB=_G5
z{1X{R!U7kh{K9C*MI&7jJu77*T{)~4)(C5bb;9~#qp)e%BFlpVv<};aox<b8lkhm|
zos3?)$>>+8+tCR<j~?Ea(Jfty_PZSY3|WO<%Z=y@?kn`woc%d6@-9sGw={a)nxF%8
z$J%&4=6(nb=b#-d2|q&HeUG;L7kwYpxG3d!49`T{jY{ckW>OS96fO+cqWAy%NdJk>
zyzIqk#m9v8&;gsG6F3!p(~U&yUmZ@0{5v8&8*_jE_k8Yw&_%(LNWX&(>EOf2KY)fX
z?~*iu66i|GqoHnuz8RZgAMAimYzi8Qx#$F!qwO|X?)~4*!w@WaY5HmP5_C@=M_2MJ
zx{}wz)o5fs#$3qJ`u}1#EHo<p@OcUzOZsZ;iu14z?nLXAxQzR62WRk53ophNcr$jy
zSJ9RHicPS~==4+XMd->Nz;V_?+cmvB^)nbfGuNZ9^hePMtVG*w3;(&C`)`HnSELFj
zqANW&ycAv8wP@&XL??1H`suY0yW>jikA<&HEB_BV&@{CDQ#b%$h;-(vG)|GLxc`Q-
zA{l-NHAK@VprJoADvpTs6=>)tVl!NcMsN?hr$xpjk3rkFMHkc^T|hr{LW3iJL^d9-
zh=Tv36(^%1n}P1(JnVqm&<R!=n+|6qY)-l#I^aa~WBX3b$7j$1-;MH*(Dq-U6VC4C
z!GVfgoigg86X=BIcSlz+4DDz%I?&bVSGFnW_xxMYZ%ogi-vt+;^*#x|Mf=%@_J1VF
zzyFR)9alhSb~IX{IohBDx|coBJscVNOVE1npl`nQ=tMT56F7iwY58kXy~b$&Z6n<i
z%lPwuzsMMl4mb+k)A8taxf>1DD`*7XkMst#!ynNJ{uSw}*QQh76m8cJjpRjW|C7;v
z?o#jn{XDpm+2ONj#h0ys%Om|x_(|k%4}U}_vOCH%<5Rj6+D|^ZHO<j2=@R9AF!%R=
zLwRUG!G-8`oPoaiUPe3EjDG0+h)(F&$o~UfVZrNCy=rLW8lXQFca8l1=mLkMZ^}_o
ze#Ld%e`h|K44s9Z-g)6$=m1|t`JPDU@m<^eDwsPf=*l`o{we50&kHX=&&Xwwz8Y<R
z{e<}W|86o|>Eq~L{SWQ%{m9>p&iqGouYW>2D0Y2nR|`!yLnF`)oxl)u;PWxJa&(+4
z(Ek6MjfdN#;1RUpyl_GIYWQZj8tq_hq`yQv{x<v-jm$sj-XHbf)NjSGI@&&4hX;Qa
zYlC*s9sQZEANqa$S~ManqkJ2>RX?E}{2P|KA>|(vwnF>ujxJ~b+W(O7l4Le>4G$eD
zm>dOfgzupt{R|!GXLR60I0#GMm_B4KLOZ?%9cUIh;YY(IXuFM3z5|WS9xUPgKNtmt
zCZ>ud&<<;&d)XA7Ko2|}2cVIeiw?LO?eIXP52F(=%-QmVR2{ul9nr|1hs|*c*7p9t
z%tJf;6dPl)N$CyN7Tb_M6V0EB`S>DQe?2zC!Z)S-Ht1Kh{^-OnkMwkGMf!2{jrcM8
z@w^jr|NU?A$!UhipatEq7G8jMG&P)!uH;p8g<qoYiM{9m)uyC&r=lSrh4yzN+U_y5
z-RekhnZo_|^ZW=I?pc$mX$3vefrq05Oh9M;1lrLO^crqMx8@)8htrbN@^TSshn5dS
zKMSrw`@1*t=c6yEwbKZ>9d9SYiTr_vu=e!4+#i{CL051Sx}qo1j$XwExIWT<pb;o@
zb6UuWXuEU6iD<jW(TOb$zsN?xpXe`<%HEPz*aMBorRc<_MgB`@2cMw>96;+;zBSnf
zEk7f?9IZD4jogdq``}ZwUG|$O_!kXHo!e3e?a>BjNBVm7^ge`!d<EL^dNeY7(N}k&
z+tZfSKqJxvJ*?M+FNEJ93(jV$%t-%)(g%&ejp&MBM!!^UMJH0?jx@1W=(X#Mp8kR8
zb)6FVcca(w0rVFWPoSayA3E_hX#LNzg7^PB9_;YXsBjnykuH5_s#qb+M>}qgcGv+8
zb-&2JGSU;!fgVKrofqi^kzRrJzXmIN|JU;1UVMvg!C`cu@^>X`pdB?pL){!*!HMDN
z=ogj2X!{${t(h6+ub}<Cg<ii8(20MISqDDCLl3NecbfTdbbzbShBu<W2fP`b$Yyk)
zuOoc`UGbr?#LP6&>S#YL!Y*k0USZ#v+<ylcNQQeg9PMZ{I>Q^nN6;0$j&`^eUCA!A
z{gJTPJ!#+yXuSrJZj1KYGtvX2{L*{4|9-Q%mJF{&HVW=QKer!7XFL}T{d0I0E<@iN
zW$sNAXn+pbD$>WJ6Fdd&_dN8yav3_2X=uN*vOKtgN6{5NgLd>@_!(O9+i+Lp|AxiM
z|2OiB-j@z#nXnPs?j&@Jd!hYa5cy-UBI)dPQQ?j#cn+=j5<1g2(Uq)2x8ytY^cR?w
z%B!R0O~aGWfd`=r8;VBm64QBn<3anMc7N_Yk<Hx0gI|qaM=LHzD}0Q0@KvODq8<N^
z*8eB+GY_N?mqP1TM}Ol{AMK|DdRTj4KAsc#6R@iHe|ls*7S0csq7B!e*J}&f!N1rV
zYd)AJ+z%aSBs#&X&<Tu3BY1205a!MhI?-j=#QVR7hup^~+EKNKk`2%^(H3oRcH|F>
z{L$zu`A&48Md((n#=f`(?Z3&x=`cT!PH<tk6tfQa77q@z4o&}xUGX1$0*`wny@J0&
z%L_i5Ix34ss0w<>nxe1jQ?LV$M$gPsQT{gCetYEq@+kM;8JC!y8rDWv)Dw-!X!P3L
zhkj*x5glkNx+MqE&x-1El0DJ>#-Ib=jMjf9(yJo<4chMCIoy8-YV=t8wCWe$gjQIH
zcC;=0C#?Q>%I}QchX0@gkB$6WBK<5H**7D9J6iuR`isjd*(cJQuMIXJ;{<e%E<^_&
zjfU)Y^b9;0<#W+Je-1rVOC$Xu<|2ef>>#=&4dy2Mgjb;p&(7k(0pCR5gsagG*G2x<
z;SO}bJ?MlEhb5j&>8j`(u|8VwIJDo>qP&0P568OXUzPH+nfrKfz$efKi^4b16|X{H
zp&z0HZ;A39XuCaVy}YMV`x0oq@@RgouyN$KMZcJwh`HbYjfo1^VOa_$qaEBE`H!Qo
z+ULW?=&64To!G|kTQmZ{q5TwjI+a&N+c!YlwT}Fg&G&xx=fN)oL(vF~3`e0qK#W1J
z)1By{T!WsCz37Xm>@#U^yP=2e;_%kUe<9p}g(?3XUEm?i{rq3_*)(t&^b}V{2Wo~M
zl0i|PMMF9r?ci>73udFI`lU#}kM^@Q^7o<bO3X{`Dxu|d=5haR*pUnm&6()$^+uri
zSD^#l8s+z+-}9eABefn4>E}`YQ}}n37k@6*D~C>?D%xM2u;p{v^uy<IWSl_3HR!cj
z6n-0)eLjWu1hk{!=n6(f{v>q5b0hx^bb=p;U!V)zj&9wrXyi&~Uq}VD(T-cA9d$ux
zIw0~#pdDU@HXIvHi}D8}Jr^BlF*?vYXg}Yh?e|9dV3;jDKQ$<ixzL~!X^A%IgogM;
zyaorL^*)I5O=u*(LfajP{KIG@3;!?m(-!TgGdjUDkQY@pGn5Ap+x2M2PlpT9iYw5L
z*N2<K@6ZYEMms)$p8ldQru-(DizwP}m#`Q5hCDl$=KhW0!Hy<|)6f;o$W>rZ!v*0o
zwEp|(R&7AHWLM<>gT6@%E=UU~iPo<X)<q}O1lxQ6JMdr!S46>0=!)({8_vZ7_*|st
zqZ51u?dbjR^C<rg|3m&ycpCP2Dg8n7%<x0>eNyCQ?tgC{y7JH$Z$%qy#>=t6!Zd;V
z!bi|I-dyx>y@ZB*J^FFH7yWU&;w$kxCG@LWcPxUZprP*@UiM0S|G$|GBQO))^QX|2
zFG5572Ktq1W90vc*4rKai$<c<qU6zG!|>SfBy^lJ!V!zO{~nTYWH{i&s5lM%;&BgJ
zK0oqb4c|s5up!F7M%(`s<$I(2FgjrA#c3h6(TR2rPs#FNNCrfOtI&>ajS6?86PS&L
z{8`M$HP`@mpc5_qYO)d9UpMsCJv8#ChmWHlQm>=qWIyJ?m3)B?v=i-MUs(FJlx`CC
zL>r!u9@0xAeIvTpQ_+5I3GYD<>!WD9h3Kc@QshizGpnQE!|>B^3)=7-G-Q9G9T!@X
zIx3CkS3(z12d&>G>=orhBYhcK@21F~nak(?&EdgAwkRsBLkHRx?uh)o=w9Y6O%tdX
zR>xK3*FkT`4`>AUqaWX8UQYuzLnCw?dK*qO-}~Q-2Pbe2x}q^?s3t~w8oIK3(0cQ*
z8LmWEv?uZpqwTA_k=oZo7t$2XZx?op^1hh0<AG5y8f`EEz0Xr3{R}$um(YnVLOXl|
z{igFCdKNZEdN*3{a9DU*`jT4`op4q3FgIGp{kNl2$jIFS97*~rG=C#Hp>NO*e-8IW
z{$FUlf^R0vq5~Wg>E>Z)bb_a#{S65(e3Sd1PsWvGIHSAK5HCOnd=DL9eWbUB--SP+
z9qvWj9l}~zad~QgY}f@o8{N=}^o#rpvOLr!<1(~^yU<Y2Lpz=yz8bz2et=GJWB4Vy
z@^8@z??b=$A3+aoy%njv1Nsf?6tsPIU}T&Z8KcoNadmhr`c8igozR=%yWz*^z+XoC
z=ScsK4qW)Hw4kc!nW}*<v@16E{-48xA0pGEU>-WqN^~M?(T=`}@&oAig;Fcir&vdH
zrB|U_I19VsA~X_zqAM-5DovyWnqLNs`SWoN9y*cHARLZP=;25&L-+0vbYg|xP92m+
z_p&-VK+CW_TJL!Dms+Ppet&e}!QsVN(EC3wDqI(4(c3T`?PxA~sOF;`d>C#<KNWvO
zx8Pvp7hRnuR4J^1_EQ%<Tg@ZCHRgW)@5qB4pB$bQ4nrG`#?$cHNWYEwq}QP<--B+|
z?`Y&oypy)9Ia+=q+RrKIIA=!w(0AhJ{|m|RE7O0&sZrsM@V@X7w1c^5gchJ3uSE~l
zXXpy|g!|C?f1nd7xF%T~tygYMHa%2|f@)!Y*bp6{MWj1Mx+~go?{FY`NJpYuaV_Sy
z5RJ%O^l+|@{O{1)a3srv9o2a^&8#KbQTs^uM$7x59h`@*^oGcvh5ke|7xQr~+Wr?j
z3y)wgJnOx@-2Wo#BX|z!y?82SPklcPJPV!qqmiDE4*W{wzlBC(1NzS2f_}mH83$p7
z57M7vT!zP!UVxs7-Pj5Xu1!A=9E)v9pO5Xm|My41Iy7X5!YUu85Vb{DI1s%BSu_%l
zp^;dQew*DC=`!n5ej~KMlW-KCheqbT@Jp=h{olibD=7R?s&F3qmFg;VfZNcOK8fz-
zTJ#098(m4&^(lQC8o}|%n=NxQI^bgTms;<k?f0MyD7%4vz5gwF@QcDA^t;(O^l;oB
z`7fdqT8nn@1Ll6g@NxPjQdPVnkKYrb`Ex%>e+BajI?#6X4S5*5W8F{FS-BXqCy{Xr
z4_=QC&^`M&(mT*S--E^RAo^RYf*aF|r)Jm+tB~I<(u2|KJR0ryn(&5j3Odo-Hpb`w
zBV>5k=7o#V(5*r{_$=Ites%gT{5kUXqi5sqNFV)K>aRAsB`qR-0y?oi*c1nR#{GA1
zCy}A^&;d7~E8i6P-$c6D=c&UA=-H@?el{G3wmUUE6CL;*bYYi-*F^qgbb<F|Bjagw
zuNH?J(T4k@JhLgK%ZA6G12#d=L~ArM{m}^x2`@$KjYs>N80p(1oxLX>9t-EAD_@E>
zd^`Lg{21-%3v>lPp!E+%et|DiyE15bW%L?0MkjW1l=n|&GlO~X(2YP(`FJ$6Gtmy7
zkNh{$dYjOR?G6v16FP*}FS<FER}br;{WXqsH?)3l%>Dh(z{t2LygHl|-hqbrVRWU-
z(1F%O`R2&~5uMm?=-&T{em^L(B}Je*x_}Po1Ww1?_y56>F$xXUc=Z0?i*@l;wBs$|
zH|TxdiB7E4m#JM#v|b-{fV0q*4?`z(9a{gED1RPv|Ni$H4>tT1o#B>9|AyZ8KhX}$
zZ%y@Tq3`$xk-i|j46Qd7jZ_wm)UD_Q9u4QC-;9=Rjr;!|88-L~oyhj^N3_G;=;8Sr
ztygqgN|#3`oR1FF9{p>%-st_Fh<?sLkG6ji^Klv4@3w8+f8T6BMZxdbfOO@r(%<<X
zkAApJ#e7_bZpk*Z<Gk&uePMKfvXQQdPP8$)pth0jj83#iI4H}5p&1n!*W*~ycc5n>
z^K}}y2HMf_=*)Yd?aqw!2)wNTze7Un{q=2%Oy;{ZU}ZE?jnRp9MeAjIM@B#N1vEGc
zCWMpFfo?_zejt1bt^YFG(FVL7H${5n_i3O}=)mL9_P3#L+6R!W%4SyZ;EWES104=a
z|ByaZYNFqA+oPfD6%Ij9_Z4WzH>2;5`y%~f_y#(`_rmpPKc8dn`~R*e*pGJfH#*}Y
zKc<NtgXT9xCwOew1HDcI(E8V+5t)Hb>;-fSSEKE}#!k2!eJ?cJL4SV!cku!HpcRLp
z5xE4N`Pe9*fOdE*I>6IWzC6m`!NKHz7Pi`%`nw(N=RvgHW078hS^q&`MP$5#PUJ&$
zpsnc24x%e7y(^VBM^}D)I4tsS3TLA2pNRCE=)%^8ThIyZ*cIRZ_e4RVpHjtgXas7a
zd(|k?UC<SrjCL>-Kfw!eA9nmX{ns>2f63#2@ro}r*d~wi-RZCAAKa6^jDCiGD?aMi
zY+mmF<yzlg(_cEz34cPr<F)@Stz-oH@p>aV@HBLSGtiaYkA4ApGSY9OujmbEq<)X`
zDtlAA4ro6oWqGiJUXgJ&`sO+}(zk?nVQ!#EKN;!g!`ILWtwy)-qey>+ZsAV!+8su>
zvcbNTpFNoeXEFp0_4(*ODqR!#&!Qc_h<+$7LAT&bbV3KBJa2z$UjogqiMDHsPM}@b
zCmeyiF|(QRJUHWN=mch=*JEDfFGIf-e;DcS(0jfgok*zzsk{L?;PIII4F~#NZ(!sP
zL+f7}PR4?M|9^xBXZ#o%iTUV^UqMgt`)I=-&;brdy6EqzU2U{o3-mLg9a^swy0Gr(
z!uq4*TomP3V?po#jZttDy0SYXJuh4w`Kuzm6`j~Fbl}2&qzRWq2daY()DE3Mw@9BA
z<-^dg>tiwZ_kXwXa2*-5(VtW*|C#<c<Tz~1^*IxJlK<a>=~k@5=A?H=y82(~KVt8R
z-kQny4E_(jW&{3Cw`(?f8+Kt)`YmyY`|q`>_)ogW$Ku(fi~O5z!FlLuy%qgYYaY5a
zTO+*>{o%5~;neXUwEhIN-v=Xq33?s3MEVH&F<$!!_uqn(kECxpqrz#JPyXX*M=Q~-
z`34){A@nxX;U8xF(d}exjOU}jEt`Qx@_DrV2DIL9Xg{U$k`1#wSa1?L^P%C5Xv0UN
zd>PtsGy0WmKlZ@V1q$Rs+8<rWHIaT8-HK&szdO)Fd{n{IPc3xZY$qOE$-u~%5b66P
zy%g=}b94fEg;K-nVMp{U*V%Xm-i8je869|Eq{|g9km*Lc2@b%^ak}?^6%SsQ-bWS4
zo#y`G;BW+btu8_D_2}@w=zHR}a1MIf7or2NLT|x0cognI&(80WE>Xn%EZ=H*@Y+<%
zW$>@wXv4PXAvqDfZWo{{n}l}w5L)l?NdGTfgf8d}bVBc-?LR}u*&F$ViZW5g&s5~W
zg0^Ubo{=6HUK-wj4tN(jz@u0QpFt<|LX<Cz@)hWp()T01DayYI_h9bd{|`k*fnsTZ
zGU!BVpc88r>8@d4bRxshkdBW0$&r6g<Ubbqi^F%&iGCL4TZ{4EKRVDpGVHKG@wBos
zXvJ!1ety_I@;jr~>?CxrhoK>!h<;W)9QiM!FPshN*6l;DX^9dk-L6D74Ri(>4s>>S
zJ{saH(TPk5Cq?<q;eBWXo<Jw?8v2`!PtnMIkM{c~`te(+WJDBAcg^zP02iZ?xFRY{
z3}>P<e+vB;{AT2@N85diu6P$ZP^MI}6x!}+wBNRo-yKJi?uX+ryNCy0t&K|;$h}I>
zLmS+Qb~p!(#0zMLi_w8ULRbD7TJLA{8`8lj&y-316v5);S3x6E2d&>OmGi&<!Govt
ztSA_c4tRN_$D{XuD%!y<;Uj3MUqmOg0_}KB_-Xhx+W&5}-$UpRpM}fXj{8?G_rUM*
z&<<*0?$n1}BmXQkGQ+|v(FkPGLpTc^U=jLaS{~(}pcC8~<-dl1VFmAh!E$NfD(JxV
z!Vc)G_f+(7U4u?wCOXg);S1qn%tazxgZ8%$UD(%X``u_n{>9wy|4WoFko#lMs_4v{
zqYY0&8w?09K)*PQi}VciL+4R+i&mloy@L+$3Hr+Z8V&icXuU(|XTg#3+<z-}tB?*!
zKlBU35Uhnyp&vS{(UpA_{(y%57qoqWiUo4t^~$0XsD>_}0r~?@C-hC(744@7I*~pV
zx&I!bzGOJl;rKaT8R?#tQe@6Xuiq$iz#Gsnm$#v};$F1l`Dn+lMEW&!tCpkVyoa{m
zjMm#xmj?&_8GGR0Vb{t9a$i8E;=LbFy6lxflbVfw<<Vc3c6)71%e-j~OSfs&yjAPw
jt=i_d?$o(eo7V~r%BwfxwG)=)O*sCw4Zr98r}qB=jdu7f
diff --git a/web/pgadmin/translations/zh/LC_MESSAGES/messages.po b/web/pgadmin/translations/zh/LC_MESSAGES/messages.po
index 9ba23ca16..780fe91ae 100644
--- a/web/pgadmin/translations/zh/LC_MESSAGES/messages.po
+++ b/web/pgadmin/translations/zh/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PgAdmin4\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2020-01-03 19:02+0530\n"
+"POT-Creation-Date: 2019-12-06 19:29+0530\n"
"PO-Revision-Date: 2019-08-03 13:09+0800\n"
"Last-Translator: maikebing <[email protected]>\n"
"Language: zh\n"
@@ -47,13 +47,13 @@ msgstr "桌面"
#: pgadmin/static/js/slickgrid/editors.js:50
#: pgadmin/static/js/slickgrid/editors.js:60
#: pgadmin/static/js/slickgrid/editors.js:61
-#: pgadmin/static/js/sqleditor/filter_dialog.js:84
-#: pgadmin/tools/datagrid/static/js/show_data.js:143
-#: pgadmin/tools/datagrid/static/js/show_data.js:218
+#: pgadmin/static/js/sqleditor/filter_dialog.js:83
+#: pgadmin/tools/datagrid/static/js/show_data.js:142
+#: pgadmin/tools/datagrid/static/js/show_data.js:217
#: pgadmin/tools/import_export/static/js/import_export.js:500
-#: pgadmin/tools/maintenance/static/js/maintenance.js:302
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2005
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2035
+#: pgadmin/tools/maintenance/static/js/maintenance.js:301
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1999
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2029
msgid "OK"
msgstr "确定"
@@ -462,7 +462,7 @@ msgstr "缺少必需的属性。"
#: pgadmin/browser/utils.py:386
#: pgadmin/static/js/alertify.pgadmin.defaults.js:102
#: pgadmin/static/js/alertify.pgadmin.defaults.js:163
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:305
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:303
#: pgadmin/tools/grant_wizard/__init__.py:129 pgadmin/utils/exception.py:35
msgid "Connection to the server has been lost."
msgstr "到服务器的连接已丢失。"
@@ -581,7 +581,7 @@ msgid "No parameters were changed."
msgstr "未更改任何参数。"
#: pgadmin/browser/server_groups/servers/__init__.py:767
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:567
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:562
#: pgadmin/browser/server_groups/servers/databases/casts/__init__.py:370
#: pgadmin/browser/server_groups/servers/databases/extensions/__init__.py:264
#: pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py:395
@@ -603,7 +603,7 @@ msgstr "未更改任何参数。"
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:365
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:569
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/__init__.py:436
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:888
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:922
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:393
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py:484
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py:478
@@ -774,33 +774,33 @@ msgstr "找不到操作 \" %s\" 的实用程序"
msgid "PostgreSQL"
msgstr "PostgreSQL"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:38
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:37
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:21
msgid "Databases"
msgstr "数据库"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:375
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:391
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:654
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:724
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:849
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:1021
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:374
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:390
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:649
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:719
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:844
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:1016
msgid "Could not find the database on the server."
msgstr "在服务器上找不到数据库。"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:469
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:468
msgid "Database connected."
msgstr "已连接数据库。"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:488
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:485
msgid "Database could not be disconnected."
msgstr "无法断开数据库连接。"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:492
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:489
msgid "Database disconnected."
msgstr "数据库连接已断开。"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:777
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:772
#: pgadmin/browser/server_groups/servers/databases/casts/__init__.py:483
#: pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py:522
#: pgadmin/browser/server_groups/servers/databases/extensions/__init__.py:357
@@ -815,10 +815,10 @@ msgstr "数据库连接已断开。"
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py:548
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py:488
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py:453
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:830
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:829
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py:441
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:462
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1051
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1085
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:474
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/__init__.py:565
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py:591
@@ -836,11 +836,11 @@ msgstr "数据库连接已断开。"
msgid "Error: Object not found."
msgstr "错误︰ 找不到对象."
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:780
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:775
msgid "The specified database could not be found.\n"
msgstr "找不到指定的数据库。 \n"
-#: pgadmin/browser/server_groups/servers/databases/__init__.py:876
+#: pgadmin/browser/server_groups/servers/databases/__init__.py:871
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:728
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:1561
msgid " -- definition incomplete"
@@ -936,19 +936,19 @@ msgstr "转换..."
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:93
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:39
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:210
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:182
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:107
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:670
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:712
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:119
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:105
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:53
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:292
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:181
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:106
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:669
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:710
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:118
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:104
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:52
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:289
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:358
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:131
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:130
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:265
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:324
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:184
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:183
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:324
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:148
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:112
@@ -1000,22 +1000,22 @@ msgstr "名称"
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:114
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog.js:65
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:393
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:185
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:110
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:673
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:716
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:123
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:109
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:295
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:184
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:109
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:672
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:714
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:122
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:108
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:292
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:361
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:146
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:145
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:254
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:327
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:187
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:186
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:328
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:151
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:115
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:312
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:309
#: pgadmin/browser/server_groups/servers/resource_groups/static/js/resource_group.js:87
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:391
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:344
@@ -1130,56 +1130,56 @@ msgstr "源类型"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:654
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:658
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:662
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:137
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:158
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:692
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:702
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:747
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:750
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:758
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:781
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:735
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:748
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:772
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:789
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:805
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:853
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:144
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:416
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:513
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:538
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:561
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:576
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:604
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:130
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:402
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:499
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:523
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:550
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:565
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:593
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:315
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:346
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:349
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:136
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:157
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:691
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:701
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:746
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:749
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:757
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:780
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:733
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:746
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:770
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:787
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:803
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:851
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:143
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:415
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:512
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:537
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:560
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:575
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:603
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:129
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:401
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:498
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:522
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:549
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:564
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:592
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:311
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:342
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:345
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:384
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:388
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:392
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:396
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:400
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:404
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:407
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:411
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:415
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:418
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:440
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:166
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:179
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:191
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:207
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:250
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:268
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:292
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:318
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:323
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:414
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:436
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:165
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:190
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:249
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:267
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:291
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:317
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:322
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:350
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:375
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:385
@@ -1191,14 +1191,14 @@ msgstr "源类型"
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:173
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:136
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:140
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:338
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:343
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:367
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:376
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:381
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:335
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:340
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:364
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:373
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:378
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:383
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:386
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:389
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:393
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:390
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:395
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:408
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:412
@@ -1253,22 +1253,22 @@ msgstr "是否系统转换?"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/catalog.js:74
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:403
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:674
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:306
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:113
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:676
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:719
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:127
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:113
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:59
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:477
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:305
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:112
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:675
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:717
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:126
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:112
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:58
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:473
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:411
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:203
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:202
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:397
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:515
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:514
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:762
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:169
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:132
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:334
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:331
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:465
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:140
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:206
@@ -1351,7 +1351,7 @@ msgstr "事件触发器..."
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:331
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:154
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:118
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:315
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:312
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:355
#: pgadmin/dashboard/static/js/dashboard.js:1129
#: pgadmin/dashboard/static/js/dashboard.js:1387
@@ -1363,7 +1363,7 @@ msgstr "所有者"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:111
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:155
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:242
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:199
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:198
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:286
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:103
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:144
@@ -1372,28 +1372,28 @@ msgstr "启用?"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:120
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:39
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:316
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:315
msgid "Trigger function"
msgstr "触发器函数"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:124
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:205
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:267
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:272
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:347
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:387
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:391
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:404
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:417
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:429
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:459
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:464
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:204
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:266
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:271
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:346
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:386
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:390
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:403
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:416
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:428
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:458
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:463
msgid "Events"
msgstr "事件"
#: pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js:132
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:264
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:456
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:263
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:455
msgid "When"
msgstr "何时"
@@ -1412,7 +1412,7 @@ msgstr "何时"
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:784
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:222
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:169
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:409
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:406
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:514
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:378
msgid "Security labels"
@@ -1445,14 +1445,14 @@ msgstr "安全标签"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1124
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:167
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:130
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:317
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:320
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:323
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:326
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:329
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:332
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:400
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:412
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:467
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:397
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:409
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:464
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:516
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:360
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:372
@@ -1559,11 +1559,11 @@ msgstr "可重定位?"
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:189
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:479
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:195
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:321
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:495
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:530
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:320
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:491
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:529
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:811
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:455
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:452
#: pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js:473
#: pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js:163
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:221
@@ -1763,8 +1763,8 @@ msgstr "类型"
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:214
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:129
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:161
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:319
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:396
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:316
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:393
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:420
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:427
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:440
@@ -1945,7 +1945,7 @@ msgid "Schema dropped"
msgstr "架构已被删除"
#: pgadmin/browser/server_groups/servers/databases/schemas/__init__.py:781
-#: pgadmin/static/js/backform.pgadmin.js:1837
+#: pgadmin/static/js/backform.pgadmin.js:1833
msgid "Definition incomplete."
msgstr "定义不完整。"
@@ -1964,23 +1964,23 @@ msgstr "找不到指定的目录对象。"
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:594
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:60
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:23
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:269
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:268
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:786
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:787
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:788
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:909
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:898
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:899
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:143
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:344
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:417
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:908
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:896
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:897
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:142
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:340
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:413
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:421
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:427
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:428
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:401
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:495
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:496
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:461
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:460
#: pgadmin/tools/import_export/static/js/import_export.js:179
#: pgadmin/tools/import_export/static/js/import_export.js:199
#: pgadmin/tools/import_export/static/js/import_export.js:237
@@ -2029,7 +2029,7 @@ msgstr "数据类型"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:85
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:171
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:449
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:375
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:372
msgid "Collation"
msgstr "排序规则"
@@ -2146,7 +2146,7 @@ msgstr "域约束..."
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/static/js/domain.js:65
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:415
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:21
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:128
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:127
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:614
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:679
msgid "Check"
@@ -2154,7 +2154,7 @@ msgstr "检查"
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js:97
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:419
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:136
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:135
msgid "No inherit?"
msgstr "是否没有继承权?"
@@ -2165,7 +2165,7 @@ msgid "Validate?"
msgstr "是否验证?"
#: pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js:129
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:177
msgid "Check cannot be empty."
msgstr "检查不能为空。"
@@ -2270,8 +2270,8 @@ msgstr "外部表已经被删除"
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py:1285
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py:1330
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1367
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1417
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1401
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1451
#: pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py:1356
msgid "-- Please create column(s) first..."
msgstr "--请先创建列..."
@@ -2280,8 +2280,6 @@ msgstr "--请先创建列..."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:487
#: pgadmin/browser/static/js/browser.js:213
#: pgadmin/misc/static/explain/js/explain.js:1219
-#: pgadmin/misc/static/explain/js/explain.js:1348
-#: pgadmin/misc/static/explain/js/explain.js:1349
#: pgadmin/misc/statistics/static/js/statistics.js:129
msgid "Statistics"
msgstr "统计信息"
@@ -2291,7 +2289,7 @@ msgid "Inherited From"
msgstr "继承自"
#: pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.js:259
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:178
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:176
msgid "Column Name cannot be empty."
msgstr "列名不能为空。"
@@ -2490,7 +2488,7 @@ msgid "FTS Dictionary..."
msgstr "FTS 字典..."
#: pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/static/js/fts_dictionary.js:153
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:342
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:339
msgid "Template"
msgstr "模板"
@@ -2638,7 +2636,7 @@ msgstr "必须选中Lexize函数。"
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:59
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:21
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:457
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:434
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:431
msgid "Functions"
msgstr "函数"
@@ -2651,29 +2649,29 @@ msgstr "找不到指定的 %s。"
msgid "Could not find the function node in the database."
msgstr "在数据库中找不到该函数节点。"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:833
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:832
msgid "The specified function could not be found.\n"
msgstr "找不到指定的函数。\n"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:850
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:849
msgid "Function dropped."
msgstr "函数已经删除。"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1141
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1320
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1140
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1319
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:334
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:511
msgid "Could not find the function in the database."
msgstr "在数据库中找不到该函数。"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1628
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1627
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js:24
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py:621
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbproc.js:24
msgid "Procedures"
msgstr "存储过程"
-#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1728
+#: pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py:1727
msgid "Trigger Functions"
msgstr "触发器函数"
@@ -2713,7 +2711,7 @@ msgstr "参数计数"
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:327
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:150
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:79
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:322
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:321
msgid "Arguments"
msgstr "参数"
@@ -2737,8 +2735,8 @@ msgstr "返回类型"
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:182
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:98
#: pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/static/js/edbfunc.js:100
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:289
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:493
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:288
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:492
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:154
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:155
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:209
@@ -2806,7 +2804,7 @@ msgstr ""
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:338
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:245
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:1119
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:405
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:402
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:508
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:366
#: pgadmin/tools/debugger/static/js/direct.js:1707
@@ -2846,7 +2844,7 @@ msgstr "链接符不能为空。"
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/function.js:406
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js:200
#: pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/trigger_function.js:314
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:338
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:337
msgid "Code cannot be empty."
msgstr "代码不能为空。"
@@ -3036,7 +3034,7 @@ msgstr "标题不能为空。"
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py:56
#: pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js:25
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:450
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:428
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:425
msgid "Sequences"
msgstr "序列"
@@ -3199,22 +3197,22 @@ msgid "System schema?"
msgstr "是否为系统架构?"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:409
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:322
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:319
msgid "Default TABLE privileges"
msgstr "默认表权限"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:412
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:325
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:322
msgid "Default SEQUENCE privileges"
msgstr "默认序列权限"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:415
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:328
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:325
msgid "Default FUNCTION privileges"
msgstr "默认函数权限"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:418
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:331
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:328
msgid "Default TYPE privileges"
msgstr "默认类型权限"
@@ -3223,9 +3221,9 @@ msgid "Default privileges"
msgstr "默认权限"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:443
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:53
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:29
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:422
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:419
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:130
msgid "Tables"
msgstr "表"
@@ -3233,7 +3231,7 @@ msgstr "表"
#: pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js:464
#: pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py:58
#: pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js:24
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:445
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:442
msgid "Types"
msgstr "类型"
@@ -3294,8 +3292,8 @@ msgstr "要公开同义词吗?"
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:185
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:221
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:527
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:791
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:808
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:789
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:806
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:275
#: pgadmin/browser/static/js/browser.js:630
#: pgadmin/browser/static/js/node.js:1283
@@ -3304,17 +3302,17 @@ msgstr "要公开同义词吗?"
#: pgadmin/misc/file_manager/templates/file_manager/index.html:78
#: pgadmin/static/js/backform.pgadmin.js:538
#: pgadmin/static/js/backgrid.pgadmin.js:621
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1741
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1786
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2385
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1735
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1780
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2379
msgid "Yes"
msgstr "是"
#: pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js:185
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:221
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js:527
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:792
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:809
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:790
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:807
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/partition.utils.js:275
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:147
#: pgadmin/browser/static/js/browser.js:631
@@ -3324,9 +3322,9 @@ msgstr "是"
#: pgadmin/misc/file_manager/templates/file_manager/index.html:77
#: pgadmin/static/js/backform.pgadmin.js:539
#: pgadmin/static/js/backgrid.pgadmin.js:622
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1742
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1787
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2386
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1736
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1781
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2380
msgid "No"
msgstr "否"
@@ -3338,32 +3336,32 @@ msgstr "目标架构不能为空."
msgid "Target object cannot be empty."
msgstr "目标对象不能为空."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:359
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:357
msgid "Could not find the table."
msgstr "找不到表."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:596
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1271
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:630
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1305
msgid "The specified table could not be found."
msgstr "找不到指定的表。"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1054
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1088
msgid "The specified table could not be found.\n"
msgstr "找不到指定的表。\n"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1067
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1101
msgid "Table dropped"
msgstr "表被删除"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1145
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1179
msgid "Trigger(s) have been disabled"
msgstr "触发器已禁用"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1147
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1181
msgid "Trigger(s) have been enabled"
msgstr "触发器已启用"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1501
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py:1535
#, python-format
msgid "Table rows counted: %s"
msgstr ""
@@ -3416,7 +3414,7 @@ msgstr "列被删除"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:608
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:704
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:856
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py:853
msgid "Could not find the column on the server."
msgstr "服务器上无法找到此列。"
@@ -3562,70 +3560,70 @@ msgstr ""
msgid "Compound Trigger"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:56
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:62
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:68
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:74
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:90
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:61
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:67
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:73
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:89
msgid "Compound Trigger..."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:80
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:79
msgid "Enable compound trigger"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:85
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:84
msgid "Disable compound trigger"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:169
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:168
msgid "Disable compound trigger failed"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:188
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:190
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:187
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:189
msgid "Trigger enabled?"
msgstr "触发已启用?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:205
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:209
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:222
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:235
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:248
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:204
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:208
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:221
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:234
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:247
msgid "FOR Events"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:207
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:389
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:388
msgid "INSERT"
msgstr "INSERT"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:220
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:402
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:219
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:401
msgid "UPDATE"
msgstr "UPDATE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:233
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:415
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:232
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:414
msgid "DELETE"
msgstr "DELETE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:246
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:428
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:245
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:427
msgid "TRUNCATE"
msgstr "TRUNCATE"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:303
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:512
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:302
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:511
msgid "System trigger?"
msgstr "是否为系统触发器?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:328
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:543
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:327
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:542
msgid "Specify at least one event."
msgstr "至少指定一个事件。"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:347
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js:346
msgid ""
"-- Enter any global declarations below:\n"
"\n"
@@ -3695,15 +3693,15 @@ msgstr "在服务器上找不到该对象。"
msgid "Check constraint updated."
msgstr "更新Check 约束."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:40
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:39
msgid "Check..."
msgstr "检查..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:46
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:45
msgid "Validate check constraint"
msgstr "校验检查约束"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:157
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js:156
msgid "Don't validate?"
msgstr "不验证么?"
@@ -3739,7 +3737,7 @@ msgid "Exclusion constraint dropped."
msgstr "排除约束被删除."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:38
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:97
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:96
msgid "Operator class"
msgstr "操作符类"
@@ -3767,10 +3765,10 @@ msgstr "请指定列的运算符: "
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:453
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:381
#: pgadmin/browser/server_groups/servers/static/js/variable.js:341
-#: pgadmin/static/js/backform.pgadmin.js:1260
-#: pgadmin/static/js/backform.pgadmin.js:1370
-#: pgadmin/static/js/backform.pgadmin.js:1550
-#: pgadmin/static/js/backform.pgadmin.js:1669
+#: pgadmin/static/js/backform.pgadmin.js:1259
+#: pgadmin/static/js/backform.pgadmin.js:1366
+#: pgadmin/static/js/backform.pgadmin.js:1546
+#: pgadmin/static/js/backform.pgadmin.js:1665
msgid "Add new row"
msgstr "添加新行"
@@ -3782,7 +3780,7 @@ msgstr "排除约束"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:28
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:28
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:29
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:236
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:234
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/exclusion_constraint/sql/default/stats.sql:7
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/exclusion_constraint/sql/default/stats.sql:12
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/index_constraint/sql/default/stats.sql:7
@@ -3792,87 +3790,87 @@ msgstr "排除约束"
msgid "Index size"
msgstr "索引大小"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:642
msgid "Exclusion constraint..."
msgstr "排除约束..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:691
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:512
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:498
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:298
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:690
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:511
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:497
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:295
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:378
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:344
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:196
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:366
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:363
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:40
#: pgadmin/tools/backup/static/js/backup.js:366
#: pgadmin/tools/restore/static/js/restore.js:255
msgid "Tablespace"
msgstr "表空间"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:701
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:700
msgid "Access method"
msgstr "访问方法"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:716
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:326
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:715
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:322
msgid "Changing access method will clear columns collection"
msgstr "改变访问方法将清除列集合"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:746
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:560
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:549
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:386
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:745
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:559
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:548
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:382
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:716
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:790
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:204
msgid "Fill factor"
msgstr "填充因子"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:749
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:734
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:575
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:564
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:267
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:748
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:732
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:574
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:563
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:266
msgid "Deferrable?"
msgstr "可延迟?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:757
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:747
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:603
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:592
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:291
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:756
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:745
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:602
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:591
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:290
msgid "Deferred?"
msgstr "延迟?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:779
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:413
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:778
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:409
msgid "Constraint"
msgstr "约束"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:908
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:415
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:401
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:348
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:439
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:907
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:414
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:400
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:344
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:435
msgid "Include columns"
msgstr "包含列"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:931
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:242
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:438
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:228
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:424
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:370
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:461
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:930
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:241
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:437
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:227
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:423
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:366
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:457
msgid "Select the column(s)"
msgstr "选择列"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1012
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1011
msgid "Please specify name for exclusion constraint."
msgstr "请指定排除约束的名称。"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1018
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/static/js/exclusion_constraint.js:1017
msgid "Please specify columns for exclusion constraint."
msgstr "请指定用于排除约束的列."
@@ -3930,53 +3928,53 @@ msgstr "参考"
msgid "Referencing"
msgstr "引用"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:616
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:615
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:585
msgid "Foreign key"
msgstr "外键"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:637
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:635
msgid "Foreign key..."
msgstr "外键..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:641
msgid "Validate foreign key"
msgstr "验证外键"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:771
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:769
msgid "Match type"
msgstr "匹配类型"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:788
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:786
msgid "Validated?"
msgstr "通过验证?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:804
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:802
msgid "Auto FK index?"
msgstr "自动 FK 索引吗?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:852
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:850
msgid "Covering index"
msgstr "覆盖索引"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1002
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1000
msgid "On update"
msgstr "在更新时"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1003
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1023
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1001
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1021
msgid "Action"
msgstr "行动"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1022
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1020
msgid "On delete"
msgstr "在删除时"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1050
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1048
msgid "Please specify columns for Foreign key."
msgstr "请为外键指定列."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1059
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/static/js/foreign_key.js:1057
msgid "Please specify covering index name."
msgstr "请指定覆盖索引名称."
@@ -4021,7 +4019,7 @@ msgstr "{0} 已删除."
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py:996
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:20
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:43
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:42
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:557
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:729
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:811
@@ -4030,7 +4028,7 @@ msgstr "主键"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py:1006
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:20
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:43
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:42
msgid "Unique constraint"
msgstr "唯一约束"
@@ -4038,19 +4036,19 @@ msgstr "唯一约束"
msgid "Could not find the constraint in the table."
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:536
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:522
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:231
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:535
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:521
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:229
msgid "Index"
msgstr "索引"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:644
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:633
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js:643
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js:632
#, python-format
msgid "Please specify columns for %s"
msgstr ""
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:56
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/static/js/constraints.js:55
msgid "Oid"
msgstr "Oid"
@@ -4077,7 +4075,7 @@ msgid "Index is dropped"
msgstr "删除索引"
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:29
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:236
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:234
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js:45
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:33
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js:49
@@ -4094,59 +4092,63 @@ msgstr "删除索引"
msgid "Size"
msgstr "大小"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:130
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:128
msgid "Sort order"
msgstr "排序顺序"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:151
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:149
msgid "NULLs"
msgstr "空值"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:248
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:254
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:260
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:266
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:272
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:245
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:251
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:257
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:263
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:269
msgid "Index..."
msgstr "索引..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:311
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:308
msgid "Access Method"
msgstr "访问方法"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:390
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:386
msgid "Unique?"
msgstr "唯一?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:394
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:390
msgid "Clustered?"
msgstr "集群?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:398
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:394
msgid "Valid?"
msgstr "有效么?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:402
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:398
msgid "Primary?"
msgstr "主键?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:406
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:402
msgid "System index?"
msgstr "系统索引?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:409
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:405
msgid "Concurrent build?"
msgstr "并发生成?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:501
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:497
+msgid "Tablespace cannot be empty."
+msgstr "表空间不能为空。"
+
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:503
msgid "Access method cannot be empty."
msgstr "访问方法不能为空。"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:509
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:511
msgid "You must specify column name."
msgstr "你必须指定列名称."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:514
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/static/js/index.js:516
msgid "You must specify at least one column."
msgstr "你需要指定至少一个列."
@@ -4539,39 +4541,39 @@ msgstr "删除规则"
msgid "rule"
msgstr "规则"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:93
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:99
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:105
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:111
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:117
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:92
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:98
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:104
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:110
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:116
msgid "Rule..."
msgstr "规则..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:165
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:164
#: pgadmin/static/js/sqleditor/query_tool_notifications.js:32
#: pgadmin/static/js/sqleditor/query_tool_notifications.js:80
msgid "Event"
msgstr "事件"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:179
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:178
msgid "Do instead?"
msgstr "而是这样做?"
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:182
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:183
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:184
msgid "Condition"
msgstr "条件"
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:188
#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:189
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:190
msgid "Commands"
msgstr "命令"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:195
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:194
msgid "System rule?"
msgstr "系统规则?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:215
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule.js:214
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.js:241
#: pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.js:183
msgid "Please specify name."
@@ -5135,56 +5137,56 @@ msgstr "触发器被删除"
msgid "Trigger"
msgstr "触发器"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:56
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:62
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:68
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:74
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:90
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:55
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:61
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:67
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:73
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:89
msgid "Trigger..."
msgstr "触发器..."
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:80
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:79
msgid "Enable trigger"
msgstr "启用触发器"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:85
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:84
msgid "Disable trigger"
msgstr "禁用触发器"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:169
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:168
msgid "Disable trigger failed"
msgstr "禁用触发器失败"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:206
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:205
msgid "Row trigger?"
msgstr "行触发器么?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:247
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:246
msgid "Constraint trigger?"
msgstr "约束触发吗?"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:346
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:345
msgid "Fires"
msgstr "触发"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:481
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:480
msgid "Old table"
msgstr "旧表"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:482
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:488
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:481
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:487
msgid "Transition"
msgstr "转换"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:487
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:486
msgid "New table"
msgstr "新建表"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:536
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:535
msgid "Trigger function cannot be empty."
msgstr "触发器函数不能为空。"
-#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:556
+#: pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js:555
msgid "Trigger code cannot be empty."
msgstr "触发代码不能为空。"
@@ -5568,7 +5570,7 @@ msgid "Size of temporary files"
msgstr "临时文件的大小"
#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:45
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:309
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:306
#: pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.2_plus/stats.sql:2
#: pgadmin/browser/server_groups/servers/databases/templates/databases/sql/default/stats.sql:2
#: pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js:176
@@ -5622,35 +5624,35 @@ msgstr "断开数据库连接"
msgid "Are you sure you want to disconnect the database - %s?"
msgstr "您确实要断开数据库 %s 的连接吗?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:337
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:334
#: pgadmin/static/js/browser/server_groups/servers/databases/external_tables/external_tables.js:52
#: pgadmin/tools/backup/static/js/backup.js:192
#: pgadmin/tools/import_export/static/js/import_export.js:108
msgid "Encoding"
msgstr "编码"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:380
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:377
msgid "Character type"
msgstr "字符类型"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:385
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:382
#: pgadmin/browser/server_groups/servers/roles/static/js/role.js:413
msgid "Connection limit"
msgstr "连接限制"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:388
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:385
msgid "Template?"
msgstr "是否为模板?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:392
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:389
msgid "Allow connections?"
msgstr "是否允许连接?"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:417
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:414
msgid "Default Privileges"
msgstr "默认权限"
-#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:499
+#: pgadmin/browser/server_groups/servers/databases/static/js/database.js:496
msgid "Connect to database"
msgstr "连接到数据库"
@@ -6476,7 +6478,7 @@ msgstr "种类"
#: pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js:139
#: pgadmin/browser/static/js/browser.js:224
#: pgadmin/dashboard/static/js/dashboard.js:191
-#: pgadmin/static/js/backform.pgadmin.js:2032
+#: pgadmin/static/js/backform.pgadmin.js:2028
msgid "SQL"
msgstr "SQL"
@@ -7096,8 +7098,8 @@ msgid "At least one privilege should be selected."
msgstr "应选定至少一个权限。"
#: pgadmin/browser/server_groups/servers/static/js/server.js:46
-msgid "Security label must be specified."
-msgstr ""
+msgid "Label must be specified."
+msgstr "必须指定标签。"
#: pgadmin/browser/server_groups/servers/static/js/server.js:79
#: pgadmin/browser/server_groups/servers/static/js/server.js:84
@@ -7196,20 +7198,20 @@ msgstr "更改密码 "
#: pgadmin/misc/file_manager/static/js/create_dialogue.js:188
#: pgadmin/misc/file_manager/static/js/select_dialogue.js:86
#: pgadmin/misc/file_manager/static/js/select_dialogue.js:129
-#: pgadmin/preferences/static/js/preferences.js:435
+#: pgadmin/preferences/static/js/preferences.js:434
#: pgadmin/static/js/slickgrid/editors.js:50
-#: pgadmin/static/js/sqleditor/filter_dialog.js:79
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:62
-#: pgadmin/tools/datagrid/static/js/show_data.js:139
+#: pgadmin/static/js/sqleditor/filter_dialog.js:78
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:61
+#: pgadmin/tools/datagrid/static/js/show_data.js:138
#: pgadmin/tools/debugger/static/js/debugger_ui.js:588
#: pgadmin/tools/debugger/static/js/debugger_ui.js:893
#: pgadmin/tools/import_export/static/js/import_export.js:495
-#: pgadmin/tools/maintenance/static/js/maintenance.js:297
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:56
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2010
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2164
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4222
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4289
+#: pgadmin/tools/maintenance/static/js/maintenance.js:296
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:55
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2004
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2158
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4216
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4283
msgid "Cancel"
msgstr "取消"
@@ -7430,7 +7432,7 @@ msgid "Connection timeout (seconds)"
msgstr "连接超时 (秒)"
#: pgadmin/browser/server_groups/servers/static/js/server.js:1130
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2192
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2186
msgid "Connect to Server"
msgstr "连接到服务器"
@@ -7681,17 +7683,15 @@ msgid "Dependents"
msgstr "依赖组件"
#: pgadmin/browser/static/js/browser.js:348
-#: pgadmin/browser/static/js/toolbar.js:30
-#: pgadmin/browser/static/js/toolbar.js:31
-#: pgadmin/browser/static/js/toolbar.js:91
+#: pgadmin/browser/static/js/toolbar.js:29
+#: pgadmin/browser/static/js/toolbar.js:88
#: pgadmin/tools/datagrid/static/js/datagrid.js:74
msgid "View Data"
msgstr "视图数据"
#: pgadmin/browser/static/js/browser.js:349
#: pgadmin/browser/static/js/toolbar.js:20
-#: pgadmin/browser/static/js/toolbar.js:21
-#: pgadmin/browser/static/js/toolbar.js:93
+#: pgadmin/browser/static/js/toolbar.js:90
#: pgadmin/tools/datagrid/static/js/datagrid.js:75
msgid "Filtered Rows"
msgstr "筛选的行"
@@ -7931,10 +7931,10 @@ msgid "Changes will be lost. Are you sure you want to reset?"
msgstr ""
#: pgadmin/browser/static/js/node.js:1513
-#: pgadmin/preferences/static/js/preferences.js:439
-#: pgadmin/preferences/static/js/preferences.js:464
+#: pgadmin/preferences/static/js/preferences.js:438
+#: pgadmin/preferences/static/js/preferences.js:463
#: pgadmin/tools/datagrid/templates/datagrid/index.html:37
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4297
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4291
msgid "Save"
msgstr "保存"
@@ -7954,20 +7954,17 @@ msgstr "全选"
msgid "Unselect All"
msgstr "取消全选"
-#: pgadmin/browser/static/js/toolbar.js:40
-#: pgadmin/browser/static/js/toolbar.js:41
-#: pgadmin/browser/static/js/toolbar.js:89
+#: pgadmin/browser/static/js/toolbar.js:38
+#: pgadmin/browser/static/js/toolbar.js:86
#: pgadmin/tools/datagrid/static/js/datagrid.js:103
#: pgadmin/tools/datagrid/static/js/datagrid.js:115
#: pgadmin/tools/sqleditor/__init__.py:68
msgid "Query Tool"
msgstr "查询工具"
-#: pgadmin/browser/static/js/wizard.js:85
#: pgadmin/browser/static/js/wizard.js:86
#: pgadmin/static/js/alertify.pgadmin.defaults.js:261
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:263
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:457
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:455
#: pgadmin/templates/security/messages.html:7
#: pgadmin/tools/user_management/static/js/user_management.js:81
#: pgadmin/tools/user_management/static/js/user_management.js:174
@@ -7975,11 +7972,9 @@ msgstr "查询工具"
msgid "Close"
msgstr "关闭"
-#: pgadmin/browser/static/js/wizard.js:88
#: pgadmin/browser/static/js/wizard.js:89
#: pgadmin/static/js/alertify.pgadmin.defaults.js:262
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:264
-#: pgadmin/static/js/alertify.pgadmin.defaults.js:458
+#: pgadmin/static/js/alertify.pgadmin.defaults.js:456
msgid "Maximize"
msgstr "最大化"
@@ -7987,22 +7982,6 @@ msgstr "最大化"
msgid "Left panel logo"
msgstr "左侧面板徽标"
-#: pgadmin/browser/static/js/wizard.js:124
-msgid "Close error bar"
-msgstr ""
-
-#: pgadmin/browser/static/js/wizard.js:131
-#: pgadmin/browser/templates/browser/index.html:135 pgadmin/help/__init__.py:59
-#: pgadmin/help/__init__.py:70 pgadmin/preferences/static/js/preferences.js:427
-#: pgadmin/static/js/sqleditor/filter_dialog.js:72
-#: pgadmin/static/js/sqleditor/filter_dialog.js:73
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:56
-#: pgadmin/tools/datagrid/static/js/show_data.js:133
-#: pgadmin/tools/maintenance/static/js/maintenance.js:289
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:50
-msgid "Help"
-msgstr "帮助"
-
#: pgadmin/browser/static/js/wizard.js:139
#: pgadmin/misc/file_manager/templates/file_manager/index.html:15
msgid "Back"
@@ -8040,6 +8019,11 @@ msgstr "管理"
msgid "Tools"
msgstr "工具"
+#: pgadmin/browser/templates/browser/index.html:135 pgadmin/help/__init__.py:59
+#: pgadmin/help/__init__.py:70 pgadmin/static/js/sqleditor/filter_dialog.js:72
+msgid "Help"
+msgstr "帮助"
+
#: pgadmin/browser/templates/browser/index.html:157
msgid "Logout"
msgstr "注销"
@@ -8428,7 +8412,7 @@ msgstr ""
#: pgadmin/dashboard/templates/dashboard/database_dashboard.html:88
#: pgadmin/dashboard/templates/dashboard/server_dashboard.html:92
#: pgadmin/misc/file_manager/templates/file_manager/index.html:27
-#: pgadmin/preferences/static/js/preferences.js:492
+#: pgadmin/preferences/static/js/preferences.js:491
msgid "Refresh"
msgstr "刷新"
@@ -8946,33 +8930,13 @@ msgstr ""
msgid "Analysis"
msgstr ""
-#: pgadmin/misc/static/explain/js/explain.js:1286
-#: pgadmin/misc/static/explain/js/explain.js:1287
-msgid "Zoom in"
-msgstr ""
-
-#: pgadmin/misc/static/explain/js/explain.js:1295
-#: pgadmin/misc/static/explain/js/explain.js:1296
-msgid "Zoom to original"
-msgstr ""
-
-#: pgadmin/misc/static/explain/js/explain.js:1304
-#: pgadmin/misc/static/explain/js/explain.js:1305
-msgid "Zoom out"
-msgstr ""
-
-#: pgadmin/misc/static/explain/js/explain.js:1319
-#: pgadmin/misc/static/explain/js/explain.js:1320
-msgid "Download"
-msgstr ""
-
#: pgadmin/misc/statistics/static/js/statistics.js:214
msgid "No statistics are available for the selected object."
msgstr "没有可用于所选对象的统计数字可用于所选对象。"
#: pgadmin/preferences/__init__.py:55
#: pgadmin/preferences/static/js/preferences.js:426
-#: pgadmin/preferences/static/js/preferences.js:449
+#: pgadmin/preferences/static/js/preferences.js:448
msgid "Preferences"
msgstr "配置"
@@ -8997,17 +8961,17 @@ msgstr "隐藏"
msgid "Category is not selected."
msgstr "未选择类别。"
-#: pgadmin/preferences/static/js/preferences.js:483
+#: pgadmin/preferences/static/js/preferences.js:482
msgid "Refresh required"
msgstr ""
-#: pgadmin/preferences/static/js/preferences.js:484
+#: pgadmin/preferences/static/js/preferences.js:483
msgid ""
"A page refresh is required to apply the theme. Do you wish to refresh the"
" page now?"
msgstr ""
-#: pgadmin/preferences/static/js/preferences.js:493
+#: pgadmin/preferences/static/js/preferences.js:492
msgid "Later"
msgstr ""
@@ -9051,37 +9015,33 @@ msgstr "未知错误"
msgid "INTERNAL SERVER ERROR"
msgstr "INTERNAL SERVER ERROR"
-#: pgadmin/static/js/backform.pgadmin.js:1550
-msgid "Add"
-msgstr ""
-
-#: pgadmin/static/js/backform.pgadmin.js:1841
+#: pgadmin/static/js/backform.pgadmin.js:1837
msgid "No updates."
msgstr "无更新。"
-#: pgadmin/static/js/backform.pgadmin.js:1956
+#: pgadmin/static/js/backform.pgadmin.js:1952
msgid "General"
msgstr "常规"
-#: pgadmin/static/js/backform.pgadmin.js:2157
+#: pgadmin/static/js/backform.pgadmin.js:2153
msgid "Preview not available..."
msgstr ""
-#: pgadmin/static/js/backform.pgadmin.js:2618
+#: pgadmin/static/js/backform.pgadmin.js:2605
#: pgadmin/tools/backup/static/js/backup.js:95
#: pgadmin/tools/backup/static/js/backup.js:230
msgid "Note"
msgstr "注意"
-#: pgadmin/static/js/backform.pgadmin.js:2974
+#: pgadmin/static/js/backform.pgadmin.js:2961
msgid "More"
msgstr "更多"
-#: pgadmin/static/js/backform.pgadmin.js:2975
+#: pgadmin/static/js/backform.pgadmin.js:2962
msgid "Less"
msgstr "更少"
-#: pgadmin/static/js/backform.pgadmin.js:3059
+#: pgadmin/static/js/backform.pgadmin.js:3046
msgid "Space"
msgstr "空间"
@@ -9110,7 +9070,7 @@ msgstr "无法删除此对象。"
msgid "Delete row"
msgstr "删除行"
-#: pgadmin/static/js/backgrid.pgadmin.js:1098
+#: pgadmin/static/js/backgrid.pgadmin.js:1091
msgid "Array Values"
msgstr "数组值"
@@ -9262,13 +9222,13 @@ msgstr "耗时%s 成功返回查询。"
msgid "Sort/Filter options"
msgstr "\"筛选器\" 选项"
-#: pgadmin/static/js/sqleditor/filter_dialog.js:239
+#: pgadmin/static/js/sqleditor/filter_dialog.js:238
msgid "Filter updated successfully"
msgstr "筛选器已成功更新"
-#: pgadmin/static/js/sqleditor/filter_dialog.js:245
-#: pgadmin/tools/datagrid/static/js/show_data.js:238
-#: pgadmin/tools/datagrid/static/js/show_data.js:245
+#: pgadmin/static/js/sqleditor/filter_dialog.js:244
+#: pgadmin/tools/datagrid/static/js/show_data.js:237
+#: pgadmin/tools/datagrid/static/js/show_data.js:244
msgid "Validation Error"
msgstr "验证错误"
@@ -9349,7 +9309,6 @@ msgstr ""
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:40
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:41
-#: pgadmin/tools/datagrid/templates/datagrid/index.html:56
#: pgadmin/tools/datagrid/templates/datagrid/index.html:68
msgid "Find"
msgstr "查找"
@@ -9433,14 +9392,14 @@ msgstr ""
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:129
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:131
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4230
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4224
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:663
msgid "Commit"
msgstr "提交"
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:135
#: pgadmin/static/js/sqleditor/query_tool_preferences.js:137
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4227
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4221
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:681
msgid "Rollback"
msgstr "回滚"
@@ -9516,7 +9475,7 @@ msgstr "不能直接请求此 URL。"
#: pgadmin/tools/backup/__init__.py:43
#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:46
#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:55
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:67
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:66
msgid "Backup"
msgstr "备份"
@@ -9796,8 +9755,8 @@ msgstr "备份..."
#: pgadmin/tools/backup/static/js/backup_dialog.js:71
#: pgadmin/tools/import_export/static/js/import_export.js:685
#: pgadmin/tools/import_export/static/js/import_export.js:699
-#: pgadmin/tools/maintenance/static/js/maintenance.js:477
-#: pgadmin/tools/maintenance/static/js/maintenance.js:488
+#: pgadmin/tools/maintenance/static/js/maintenance.js:476
+#: pgadmin/tools/maintenance/static/js/maintenance.js:487
#: pgadmin/tools/restore/static/js/restore_dialog.js:51
#: pgadmin/tools/restore/static/js/restore_dialog.js:75
msgid "Utility not found"
@@ -9805,25 +9764,25 @@ msgstr "找不到实用程序"
#: pgadmin/tools/backup/static/js/backup_dialog.js:72
#: pgadmin/tools/import_export/static/js/import_export.js:700
-#: pgadmin/tools/maintenance/static/js/maintenance.js:489
+#: pgadmin/tools/maintenance/static/js/maintenance.js:488
#: pgadmin/tools/restore/static/js/restore_dialog.js:76
msgid "Failed to fetch Utility information"
msgstr "无法获取实用程序信息"
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:159
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:158
msgid "Backup job created."
msgstr "创建备份作业。"
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:163
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:162
msgid "Backup job creation failed."
msgstr "备份作业创建失败。"
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:171
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:170
msgid "Backup job failed."
msgstr "备份作业失败。"
-#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:242
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:229
+#: pgadmin/tools/backup/static/js/backup_dialog_wrapper.js:241
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:228
msgid "Please provide a filename"
msgstr "请输入文件名"
@@ -9872,7 +9831,7 @@ msgstr "未选择对象。"
msgid "Data Filter"
msgstr ""
-#: pgadmin/tools/datagrid/static/js/show_data.js:161
+#: pgadmin/tools/datagrid/static/js/show_data.js:160
msgid "Use SHIFT + ENTER to apply filter..."
msgstr ""
@@ -10461,30 +10420,6 @@ msgstr "堆栈"
msgid "Debugger - "
msgstr "调试器- "
-#: pgadmin/tools/debugger/templates/debugger/direct.html:59
-msgid "Step into"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:67
-msgid "Step over"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:75
-msgid "Continue/Start"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:85
-msgid "Toggle breakpoint"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:93
-msgid "Clear all breakpoints"
-msgstr ""
-
-#: pgadmin/tools/debugger/templates/debugger/direct.html:103
-msgid "Stop"
-msgstr ""
-
#: pgadmin/tools/grant_wizard/__init__.py:327
msgid "Unable to fetch the {} objects"
msgstr "无法获取 {} 对象"
@@ -10824,7 +10759,7 @@ msgstr "详细消息"
#: pgadmin/tools/maintenance/static/js/maintenance.js:167
#: pgadmin/tools/maintenance/static/js/maintenance.js:183
-#: pgadmin/tools/maintenance/static/js/maintenance.js:483
+#: pgadmin/tools/maintenance/static/js/maintenance.js:482
msgid "Maintenance..."
msgstr "维护..."
@@ -10838,15 +10773,15 @@ msgid ""
"cannot be maintained using this utility."
msgstr "维护作业创建失败。不能使用此实用程序维护名称中包含 = 符号的数据库。"
-#: pgadmin/tools/maintenance/static/js/maintenance.js:387
-#: pgadmin/tools/maintenance/static/js/maintenance.js:394
+#: pgadmin/tools/maintenance/static/js/maintenance.js:386
+#: pgadmin/tools/maintenance/static/js/maintenance.js:393
msgid "Maintenance job creation failed."
msgstr "维护任务创建失败。"
#: pgadmin/tools/restore/__init__.py:41
#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:40
#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:49
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:62
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:61
msgid "Restore"
msgstr "还原"
@@ -10912,15 +10847,15 @@ msgstr "还原中..."
msgid "Restore (%s: %s)"
msgstr "恢复 (%s: %s)"
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:149
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:148
msgid "Restore job created."
msgstr "还原任务创建."
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:153
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:152
msgid "Restore job creation failed."
msgstr "还原作业创建失败。"
-#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:161
+#: pgadmin/tools/restore/static/js/restore_dialog_wrapper.js:160
msgid "Restore job failed."
msgstr "还原作业失败。"
@@ -11004,241 +10939,241 @@ msgstr "通知"
msgid "Geometry Viewer"
msgstr "几何查看器"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:832
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:826
msgid "Editable column"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:834
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:828
msgid "Read-only column"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1261
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1255
msgid "Fetching all records..."
msgstr "获取所有记录..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1730
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2369
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3314
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1724
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2363
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3308
msgid "Unsaved changes"
msgstr "未保存的更改"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1731
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3315
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1725
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3309
msgid "Are you sure you wish to discard the current changes?"
msgstr "是否确实要放弃当前更改?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1759
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1753
msgid "Clear history"
msgstr "清除历史记录"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1760
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1754
msgid "Are you sure you wish to clear the history?"
msgstr "是否确实要清除历史记录?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1761
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:1755
msgid ""
"This will remove all of your query history from this and other sessions "
"for this database."
msgstr "这将从此数据库的此会话和其他会话中删除所有查询历史记录。"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2125
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2119
msgid "Connection Warning"
msgstr "连接警告"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2132
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2126
msgid "The application has lost the database connection:"
msgstr "应用程序已丢失数据库连接:"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2136
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2130
msgid "⁃ If the connection was idle it may have been forcibly disconnected."
msgstr "- 如果连接处于空闲状态 , 则可能已强制断开连接。"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2138
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2132
msgid "⁃ The application server or database server may have been restarted."
msgstr "- 应用程序服务器或数据库服务器可能已重新启动。"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2140
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2134
msgid "⁃ The user session may have timed out."
msgstr "- 用户会话可能已超时。"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2144
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2138
msgid "Do you want to continue and establish a new session?"
msgstr "是否要继续并建立新的会话?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2163
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2157
msgid "Continue"
msgstr "继续"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2299
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2293
#, python-format
msgid "Error fetching SQL for script: %s."
msgstr "为脚本获取 SQL 时出错: %s。"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2370
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2364
msgid ""
"The data has been modified, but not saved. Are you sure you wish to "
"discard the changes?"
msgstr "数据已修改,但未保存。 确定要放弃更改吗?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2414
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2408
msgid "Running query..."
msgstr "正在运行查询..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2422
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2416
msgid "Waiting for the query to complete..."
msgstr "正在等待查询完成..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2579
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2573
msgid "Loading data from the database server and rendering..."
msgstr "从数据库服务器加载数据并渲染.."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2588
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2582
#, python-format
msgid "Successfully run. Total query runtime: %s."
msgstr "已成功运行。查询运行时间总数: %s。"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2589
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2583
#, python-format
msgid "%s rows affected."
msgstr "%s 行受影响。"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2865
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2859
msgid ""
"This query was generated by pgAdmin as part of a \"View/Edit Data\" "
"operation"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2966
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:2960
msgid "Row(s) deleted."
msgstr "行已删除。"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3040
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3034
msgid "Saving the updated data..."
msgstr "正在保存更新的数据..。"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3156
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3150
msgid "Data saved successfully."
msgstr "数据保存成功."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3159
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3153
msgid "Auto-commit is off. You still need to commit changes to the database."
msgstr "自动提交已关闭。每次更改都需要提交至数据库。"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3165
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3159
#, python-format
msgid "%s."
msgstr "%s."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3170
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3164
msgid ""
"Saving data changes was rolled back but the current transaction is still "
"active; previous queries are unaffected."
msgstr "正在保存的数据更改已经回滚但是当前事务依然处于活动状态;之前的请求不受影响。"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3192
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3186
msgid "This query was generated by pgAdmin as part of a \"Save Data\" operation"
msgstr ""
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3353
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3347
msgid "Loading the file..."
msgstr "加载文件..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3404
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3398
msgid "Saving the queries in the file..."
msgstr "将查询保存在文件..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3416
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3410
msgid "File saved successfully."
msgstr "文件保存成功。"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3538
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3597
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3532
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3591
msgid "Applying the new filter..."
msgstr "应用新的筛选器..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3558
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3568
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3552
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3562
msgid "Filter By Selection Error"
msgstr "按选择筛选错误"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3617
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3627
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3611
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3621
msgid "Filter Exclude Selection Error"
msgstr "筛选排除选择错误"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3637
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3631
msgid "Removing the filter..."
msgstr "移除筛选器..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3655
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3665
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3649
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3659
msgid "Remove Filter Error"
msgstr "删除筛选器错误"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3768
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3762
msgid "Setting the limit on the result..."
msgstr "设置限制的结果..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3787
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3796
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3781
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3790
msgid "Change limit Error"
msgstr "更改限制错误"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3922
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3941
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3916
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3935
msgid "Cancel Query Error"
msgstr "取消查询错误"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3960
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:3954
msgid "Downloading CSV..."
msgstr "正在下载 CSV..."
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4014
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4008
msgid "CSV Download cancelled."
msgstr "CSV 下载已取消。"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4017
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4011
#: pgadmin/tools/sqleditor/utils/query_tool_preferences.py:395
msgid "Download CSV"
msgstr "下载CSV"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4020
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4014
msgid "Download CSV error"
msgstr "下载 CSV 错误"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4054
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4061
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4048
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4055
msgid "Auto Rollback Error"
msgstr "自动回滚错误"
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4081
#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4087
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4093
msgid "Auto Commit Error"
msgstr "自动提交错误"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4182
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4176
msgid "The data has changed. Do you want to save changes?"
msgstr "数据已更改。是否要保存更改?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4188
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4182
msgid "The text has changed. Do you want to save changes?"
msgstr "文本已更改。是否要保存更改?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4268
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4262
msgid ""
"The current transaction is not commited to the database.Do you want to "
"commit or rollback the transaction?"
msgstr "当前事务未提交至数据库, 你想提交或回滚事务吗?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4271
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4265
msgid "Commit transaction?"
msgstr "提交事务?"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4294
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4288
msgid "Don't save"
msgstr "不要保存"
-#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4337
+#: pgadmin/tools/sqleditor/static/js/sqleditor.js:4331
msgid "Save changes?"
msgstr "保存更改吗?"
@@ -12031,9 +11966,3 @@ msgstr "找不到指定的数据库。"
#~ msgid "Error dropping %s: \"%s\""
#~ msgstr "删除%s: \"%s\"时,出错"
-#~ msgid "Tablespace cannot be empty."
-#~ msgstr "表空间不能为空。"
-
-#~ msgid "Label must be specified."
-#~ msgstr "必须指定标签。"
-
diff --git a/web/pgadmin/utils/__init__.py b/web/pgadmin/utils/__init__.py
index 828bd19d7..3ed4c7e0a 100644
--- a/web/pgadmin/utils/__init__.py
+++ b/web/pgadmin/utils/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/ajax.py b/web/pgadmin/utils/ajax.py
index e5d1fae91..a6c0b66e5 100644
--- a/web/pgadmin/utils/ajax.py
+++ b/web/pgadmin/utils/ajax.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/compile_template_name.py b/web/pgadmin/utils/compile_template_name.py
index 188bce3c3..cb6d4f70e 100644
--- a/web/pgadmin/utils/compile_template_name.py
+++ b/web/pgadmin/utils/compile_template_name.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/crypto.py b/web/pgadmin/utils/crypto.py
index 21ecdc2c2..3dc218951 100644
--- a/web/pgadmin/utils/crypto.py
+++ b/web/pgadmin/utils/crypto.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
#########################################################################
diff --git a/web/pgadmin/utils/csrf.py b/web/pgadmin/utils/csrf.py
index 9b2fb3236..02c2dc00f 100644
--- a/web/pgadmin/utils/csrf.py
+++ b/web/pgadmin/utils/csrf.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
#########################################################################
@@ -34,6 +34,8 @@ class _PGCSRFProtect(CSRFProtect):
'pgadmin.tools.datagrid.panel',
'pgadmin.tools.debugger.initialize_target',
'pgadmin.tools.debugger.direct_new',
+ 'pgadmin.tools.schema_diff.panel',
+ 'pgadmin.tools.schema_diff.ddl_compare',
]
for exempt in exempt_views:
diff --git a/web/pgadmin/utils/driver/__init__.py b/web/pgadmin/utils/driver/__init__.py
index ad1e86a39..ad5735685 100644
--- a/web/pgadmin/utils/driver/__init__.py
+++ b/web/pgadmin/utils/driver/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/driver/abstract.py b/web/pgadmin/utils/driver/abstract.py
index f66613ad5..eed4f5dcf 100644
--- a/web/pgadmin/utils/driver/abstract.py
+++ b/web/pgadmin/utils/driver/abstract.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/driver/psycopg2/__init__.py b/web/pgadmin/utils/driver/psycopg2/__init__.py
index fb41e7a88..94dc2976c 100644
--- a/web/pgadmin/utils/driver/psycopg2/__init__.py
+++ b/web/pgadmin/utils/driver/psycopg2/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/driver/psycopg2/connection.py b/web/pgadmin/utils/driver/psycopg2/connection.py
index 203a47b13..2a0ca821e 100644
--- a/web/pgadmin/utils/driver/psycopg2/connection.py
+++ b/web/pgadmin/utils/driver/psycopg2/connection.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/driver/psycopg2/cursor.py b/web/pgadmin/utils/driver/psycopg2/cursor.py
index 532f5d3aa..7bf2879e9 100644
--- a/web/pgadmin/utils/driver/psycopg2/cursor.py
+++ b/web/pgadmin/utils/driver/psycopg2/cursor.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/driver/psycopg2/encoding.py b/web/pgadmin/utils/driver/psycopg2/encoding.py
index b49c8d63b..08843e904 100644
--- a/web/pgadmin/utils/driver/psycopg2/encoding.py
+++ b/web/pgadmin/utils/driver/psycopg2/encoding.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/driver/psycopg2/generate_keywords.py b/web/pgadmin/utils/driver/psycopg2/generate_keywords.py
index 357cc1800..793c551c5 100644
--- a/web/pgadmin/utils/driver/psycopg2/generate_keywords.py
+++ b/web/pgadmin/utils/driver/psycopg2/generate_keywords.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
# This allows us to generate to keywords.py for PostgreSQL for used by
@@ -26,7 +26,7 @@ if __name__ == '__main__':
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/driver/psycopg2/keywords.py b/web/pgadmin/utils/driver/psycopg2/keywords.py
index ecde5b1bc..b4b581766 100644
--- a/web/pgadmin/utils/driver/psycopg2/keywords.py
+++ b/web/pgadmin/utils/driver/psycopg2/keywords.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/driver/psycopg2/server_manager.py b/web/pgadmin/utils/driver/psycopg2/server_manager.py
index 4b9dc19ed..1676f7e38 100644
--- a/web/pgadmin/utils/driver/psycopg2/server_manager.py
+++ b/web/pgadmin/utils/driver/psycopg2/server_manager.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/driver/psycopg2/typecast.py b/web/pgadmin/utils/driver/psycopg2/typecast.py
index 05ea07279..898b17158 100644
--- a/web/pgadmin/utils/driver/psycopg2/typecast.py
+++ b/web/pgadmin/utils/driver/psycopg2/typecast.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/driver/registry.py b/web/pgadmin/utils/driver/registry.py
index 5c77cd173..9f31f6487 100644
--- a/web/pgadmin/utils/driver/registry.py
+++ b/web/pgadmin/utils/driver/registry.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/exception.py b/web/pgadmin/utils/exception.py
index 5417ccc66..6159f9ff8 100644
--- a/web/pgadmin/utils/exception.py
+++ b/web/pgadmin/utils/exception.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/html.py b/web/pgadmin/utils/html.py
index 0cb403a84..c4499c071 100644
--- a/web/pgadmin/utils/html.py
+++ b/web/pgadmin/utils/html.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
#########################################################################
diff --git a/web/pgadmin/utils/javascript/__init__.py b/web/pgadmin/utils/javascript/__init__.py
index 95e092eb1..51fb83f8e 100644
--- a/web/pgadmin/utils/javascript/__init__.py
+++ b/web/pgadmin/utils/javascript/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
###########################################################################
diff --git a/web/pgadmin/utils/javascript/javascript_bundler.py b/web/pgadmin/utils/javascript/javascript_bundler.py
index 4b8c249b0..7811fcfc2 100644
--- a/web/pgadmin/utils/javascript/javascript_bundler.py
+++ b/web/pgadmin/utils/javascript/javascript_bundler.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/javascript/tests/__init__.py b/web/pgadmin/utils/javascript/tests/__init__.py
index 95e092eb1..51fb83f8e 100644
--- a/web/pgadmin/utils/javascript/tests/__init__.py
+++ b/web/pgadmin/utils/javascript/tests/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
###########################################################################
diff --git a/web/pgadmin/utils/javascript/tests/test_javascript_bundler.py b/web/pgadmin/utils/javascript/tests/test_javascript_bundler.py
index 6000cc9a4..bed5a047f 100644
--- a/web/pgadmin/utils/javascript/tests/test_javascript_bundler.py
+++ b/web/pgadmin/utils/javascript/tests/test_javascript_bundler.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/menu.py b/web/pgadmin/utils/menu.py
index c4d74e90e..5ebbface3 100644
--- a/web/pgadmin/utils/menu.py
+++ b/web/pgadmin/utils/menu.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/paths.py b/web/pgadmin/utils/paths.py
index dad5f0e41..8f188474f 100644
--- a/web/pgadmin/utils/paths.py
+++ b/web/pgadmin/utils/paths.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
#########################################################################
diff --git a/web/pgadmin/utils/preferences.py b/web/pgadmin/utils/preferences.py
index 83e215b17..1530c1a87 100644
--- a/web/pgadmin/utils/preferences.py
+++ b/web/pgadmin/utils/preferences.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/route.py b/web/pgadmin/utils/route.py
index 5919f27b2..6e99c7ed2 100644
--- a/web/pgadmin/utils/route.py
+++ b/web/pgadmin/utils/route.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##############################################################
diff --git a/web/pgadmin/utils/server_utils.py b/web/pgadmin/utils/server_utils.py
index fa39b16fe..0bae23298 100644
--- a/web/pgadmin/utils/server_utils.py
+++ b/web/pgadmin/utils/server_utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/session.py b/web/pgadmin/utils/session.py
index 26f5626a3..18d16121c 100644
--- a/web/pgadmin/utils/session.py
+++ b/web/pgadmin/utils/session.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/sqlautocomplete/autocomplete.py b/web/pgadmin/utils/sqlautocomplete/autocomplete.py
index 08a5519a6..da97e6078 100644
--- a/web/pgadmin/utils/sqlautocomplete/autocomplete.py
+++ b/web/pgadmin/utils/sqlautocomplete/autocomplete.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/tests/test_compile_template_name.py b/web/pgadmin/utils/tests/test_compile_template_name.py
index fbb40053b..06ba58ef7 100644
--- a/web/pgadmin/utils/tests/test_compile_template_name.py
+++ b/web/pgadmin/utils/tests/test_compile_template_name.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/tests/test_encoding.py b/web/pgadmin/utils/tests/test_encoding.py
index 11e67a7a7..9910e47d9 100644
--- a/web/pgadmin/utils/tests/test_encoding.py
+++ b/web/pgadmin/utils/tests/test_encoding.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/tests/test_versioned_template_loader.py b/web/pgadmin/utils/tests/test_versioned_template_loader.py
index c18967e93..8161de90e 100644
--- a/web/pgadmin/utils/tests/test_versioned_template_loader.py
+++ b/web/pgadmin/utils/tests/test_versioned_template_loader.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/pgadmin/utils/versioned_template_loader.py b/web/pgadmin/utils/versioned_template_loader.py
index bc32b3625..3b47757da 100644
--- a/web/pgadmin/utils/versioned_template_loader.py
+++ b/web/pgadmin/utils/versioned_template_loader.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/regression/.coveragerc.in b/web/regression/.coveragerc.in
deleted file mode 100644
index 40ced5ded..000000000
--- a/web/regression/.coveragerc.in
+++ /dev/null
@@ -1,25 +0,0 @@
-# .coveragerc to control coverage.py
-# This is default coverage configuration file require to run coverage.py
-# Any paths mentioned for coverage command are indented(default:4 spaces)
-
-[run]
-# Mention paths in 'source' to measure code coverage(Full project path)
-source =
- $PGADMIN4_SRC/web/pgadmin/
-
-# Mention patterns in 'omit' to omit code from the coverage measurement
-# Here, omit code which contains pattern '/tests/', 'feature_tests' etc.
-omit =
- */tests/*
- */feature_tests/*
-
-# Mention patterns in 'include' to include code for the coverage measurement
-# Here, code coverage will show report only for modules mentioned in the
-# 'include'
-include =
- # For all modules
- */web/pgadmin/*
- # For 'databases'
- # */web/pgadmin/browser/server_groups/servers/databases/*
- # For 'tables'
- # */web/pgadmin/browser/server_groups/servers/databases/schemas/tables/*
diff --git a/web/regression/README b/web/regression/README
index a4591acb2..bcb8002f2 100644
--- a/web/regression/README
+++ b/web/regression/README
@@ -190,41 +190,6 @@ Python Tests:
Example 2) Execute only reverse engineered SQL test framework for some modules
run 'python runtests.py --pkg resql --modules sequences,functions'
-Code Coverage:
----------------
-
-- Test framework is able to calculate the code coverage.
-- Coverage package(coverage) is added in $PGADMIN4_SRC/web/regression/requirements.txt file
-
-How to generate code coverage report for API test-suite?
--------------------------------------
-
-- Change to the regression test directory:
- run 'cd $PGADMIN4_SRC/web/regression'
-
-- Before running code coverage we need to configure 'regression/.coveragerc' file.
- i). Create 'regression/.coveragerc' file.
- ii). Copy content of 'regression/.coveragerc.in' to 'regression/.coveragerc'
- iii). Modify 'regression/.coveragerc' file as per our need as 'regression/.coveragerc.in' has default configurations
-
- In 'regression/.coveragerc' file we need to mention some parameters
- like 'source'(project path),'include'(files/modules to be included for
- coverage),'omit'(files/modules to be omitted from coverage)
-
- We can also add more parameters according to our need.
- For more info please read coverage.py's official document here
- 'http://coverage.readthedocs.io/en/coverage-4.2/install.html'
-
-- Run coverage
- With all modules
- run 'python runtests.py --coverage --exclude feature_tests'
- With specific module
- run 'python runtests.py --pkg browser.server_groups.servers.tests --coverage'
-
-- After execution of coverage, we will see code coverage report on console.
- For a nicer presentation, '/regression/covhtml' directory gets created.
- Open 'index.html' file in browser and you will see detail coverage report.
-
Javascript Tests:
- Install node.js and yarn, in the appropriate way for your platform. On macOS with Homebrew you might use:
diff --git a/web/regression/__init__.py b/web/regression/__init__.py
index 4ceb1a6e3..718fe76e2 100644
--- a/web/regression/__init__.py
+++ b/web/regression/__init__.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/regression/feature_utils/app_starter.py b/web/regression/feature_utils/app_starter.py
index fe4c441a1..6d1340fae 100644
--- a/web/regression/feature_utils/app_starter.py
+++ b/web/regression/feature_utils/app_starter.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/regression/feature_utils/base_feature_test.py b/web/regression/feature_utils/base_feature_test.py
index 34a1de949..d112431ad 100644
--- a/web/regression/feature_utils/base_feature_test.py
+++ b/web/regression/feature_utils/base_feature_test.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/regression/feature_utils/locators.py b/web/regression/feature_utils/locators.py
index d0471091d..6947724d3 100644
--- a/web/regression/feature_utils/locators.py
+++ b/web/regression/feature_utils/locators.py
@@ -1,7 +1,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/regression/feature_utils/pgadmin_page.py b/web/regression/feature_utils/pgadmin_page.py
index aef031fd0..d3b089832 100644
--- a/web/regression/feature_utils/pgadmin_page.py
+++ b/web/regression/feature_utils/pgadmin_page.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/regression/feature_utils/tree_area_locators.py b/web/regression/feature_utils/tree_area_locators.py
index 0d7725849..e3dbb61ac 100644
--- a/web/regression/feature_utils/tree_area_locators.py
+++ b/web/regression/feature_utils/tree_area_locators.py
@@ -1,7 +1,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/regression/javascript/alerts/alertify_wrapper_spec.js b/web/regression/javascript/alerts/alertify_wrapper_spec.js
index a1f068be8..429d39a72 100644
--- a/web/regression/javascript/alerts/alertify_wrapper_spec.js
+++ b/web/regression/javascript/alerts/alertify_wrapper_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/backform_controls/keyboardshortcut_spec.js b/web/regression/javascript/backform_controls/keyboardshortcut_spec.js
index 45efbb5e4..e1ff3175b 100644
--- a/web/regression/javascript/backform_controls/keyboardshortcut_spec.js
+++ b/web/regression/javascript/backform_controls/keyboardshortcut_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/backform_controls/keycode_spec.js b/web/regression/javascript/backform_controls/keycode_spec.js
index beb73a7f1..8d97fcdaa 100644
--- a/web/regression/javascript/backform_controls/keycode_spec.js
+++ b/web/regression/javascript/backform_controls/keycode_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/backup/backup_dialog_spec.js b/web/regression/javascript/backup/backup_dialog_spec.js
index 0f4c6efef..734d738d5 100644
--- a/web/regression/javascript/backup/backup_dialog_spec.js
+++ b/web/regression/javascript/backup/backup_dialog_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/backup/backup_dialog_wrapper_spec.js b/web/regression/javascript/backup/backup_dialog_wrapper_spec.js
index c90ac39ec..413e838c3 100644
--- a/web/regression/javascript/backup/backup_dialog_wrapper_spec.js
+++ b/web/regression/javascript/backup/backup_dialog_wrapper_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/backup/global_server_backup_dialog_spec.js b/web/regression/javascript/backup/global_server_backup_dialog_spec.js
index b1ea552bb..ad01b2a5f 100644
--- a/web/regression/javascript/backup/global_server_backup_dialog_spec.js
+++ b/web/regression/javascript/backup/global_server_backup_dialog_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/backup/menu_utils_spec.js b/web/regression/javascript/backup/menu_utils_spec.js
index 676928392..3c7e09da4 100644
--- a/web/regression/javascript/backup/menu_utils_spec.js
+++ b/web/regression/javascript/backup/menu_utils_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/browser/generate_url_spec.js b/web/regression/javascript/browser/generate_url_spec.js
index ad0e682ee..1ede1c294 100644
--- a/web/regression/javascript/browser/generate_url_spec.js
+++ b/web/regression/javascript/browser/generate_url_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/browser/layout_spec.js b/web/regression/javascript/browser/layout_spec.js
index 10b3f5aef..c1e6709d1 100644
--- a/web/regression/javascript/browser/layout_spec.js
+++ b/web/regression/javascript/browser/layout_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/browser/modify_animation_spec.js b/web/regression/javascript/browser/modify_animation_spec.js
index d50c21a7e..edc0572fa 100644
--- a/web/regression/javascript/browser/modify_animation_spec.js
+++ b/web/regression/javascript/browser/modify_animation_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/browser/preferences_spec.js b/web/regression/javascript/browser/preferences_spec.js
index a56bc39a3..e455bb3c9 100644
--- a/web/regression/javascript/browser/preferences_spec.js
+++ b/web/regression/javascript/browser/preferences_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/browser/server_groups/servers/databases/external_tables/external_tables_spec.js b/web/regression/javascript/browser/server_groups/servers/databases/external_tables/external_tables_spec.js
index 3fd96484a..a06a1f0cf 100644
--- a/web/regression/javascript/browser/server_groups/servers/databases/external_tables/external_tables_spec.js
+++ b/web/regression/javascript/browser/server_groups/servers/databases/external_tables/external_tables_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/browser/server_groups/servers/databases/schemas/tables/show_advanced_tab_spec.js b/web/regression/javascript/browser/server_groups/servers/databases/schemas/tables/show_advanced_tab_spec.js
index 3dd2324ad..1e8e8d24e 100644
--- a/web/regression/javascript/browser/server_groups/servers/databases/schemas/tables/show_advanced_tab_spec.js
+++ b/web/regression/javascript/browser/server_groups/servers/databases/schemas/tables/show_advanced_tab_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/browser/server_groups/servers/model_validation_spec.js b/web/regression/javascript/browser/server_groups/servers/model_validation_spec.js
index b2547fe5c..67cbe704e 100644
--- a/web/regression/javascript/browser/server_groups/servers/model_validation_spec.js
+++ b/web/regression/javascript/browser/server_groups/servers/model_validation_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/check_node_visibility_spec.js b/web/regression/javascript/check_node_visibility_spec.js
index c49024f38..e673aa759 100644
--- a/web/regression/javascript/check_node_visibility_spec.js
+++ b/web/regression/javascript/check_node_visibility_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/common_keyboard_shortcuts_spec.js b/web/regression/javascript/common_keyboard_shortcuts_spec.js
index a855a942d..a74f3ce55 100644
--- a/web/regression/javascript/common_keyboard_shortcuts_spec.js
+++ b/web/regression/javascript/common_keyboard_shortcuts_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/dashboard/charting_spec.js b/web/regression/javascript/dashboard/charting_spec.js
index 7fdeb6b46..b853c75e8 100644
--- a/web/regression/javascript/dashboard/charting_spec.js
+++ b/web/regression/javascript/dashboard/charting_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/datagrid/get_panel_title_spec.js b/web/regression/javascript/datagrid/get_panel_title_spec.js
index 45cf89185..15852d078 100644
--- a/web/regression/javascript/datagrid/get_panel_title_spec.js
+++ b/web/regression/javascript/datagrid/get_panel_title_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/datagrid/show_data_spec.js b/web/regression/javascript/datagrid/show_data_spec.js
index ac771518c..278872ef1 100644
--- a/web/regression/javascript/datagrid/show_data_spec.js
+++ b/web/regression/javascript/datagrid/show_data_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/datagrid/show_query_tool_spec.js b/web/regression/javascript/datagrid/show_query_tool_spec.js
index ba658f05e..c7a89726f 100644
--- a/web/regression/javascript/datagrid/show_query_tool_spec.js
+++ b/web/regression/javascript/datagrid/show_query_tool_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/debugger_utils_spec.js b/web/regression/javascript/debugger_utils_spec.js
index f9b4089cc..132385368 100644
--- a/web/regression/javascript/debugger_utils_spec.js
+++ b/web/regression/javascript/debugger_utils_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/dialog_tab_navigator_spec.js b/web/regression/javascript/dialog_tab_navigator_spec.js
index 113df8c34..60e4bdd2e 100644
--- a/web/regression/javascript/dialog_tab_navigator_spec.js
+++ b/web/regression/javascript/dialog_tab_navigator_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/fake_browser/browser.js b/web/regression/javascript/fake_browser/browser.js
index 55a810a3e..ec3d07792 100644
--- a/web/regression/javascript/fake_browser/browser.js
+++ b/web/regression/javascript/fake_browser/browser.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/fake_endpoints.js b/web/regression/javascript/fake_endpoints.js
index fa01b3f89..d706cff92 100644
--- a/web/regression/javascript/fake_endpoints.js
+++ b/web/regression/javascript/fake_endpoints.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/fake_model.js b/web/regression/javascript/fake_model.js
index b62939fdd..e6b1466dc 100644
--- a/web/regression/javascript/fake_model.js
+++ b/web/regression/javascript/fake_model.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/fake_translations.js b/web/regression/javascript/fake_translations.js
index c7db2b02e..960916b22 100644
--- a/web/regression/javascript/fake_translations.js
+++ b/web/regression/javascript/fake_translations.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/file_manager/file_manager_specs.js b/web/regression/javascript/file_manager/file_manager_specs.js
index 9da9a7bf6..15819d62f 100644
--- a/web/regression/javascript/file_manager/file_manager_specs.js
+++ b/web/regression/javascript/file_manager/file_manager_specs.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/geometry_viewer/geometry_viewer_spec.js b/web/regression/javascript/geometry_viewer/geometry_viewer_spec.js
index f76377e1b..555c57d1f 100644
--- a/web/regression/javascript/geometry_viewer/geometry_viewer_spec.js
+++ b/web/regression/javascript/geometry_viewer/geometry_viewer_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/gettext_spec.js b/web/regression/javascript/gettext_spec.js
index 4e14bee54..07e4609c8 100644
--- a/web/regression/javascript/gettext_spec.js
+++ b/web/regression/javascript/gettext_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/help/help_spec.js b/web/regression/javascript/help/help_spec.js
index b22125c69..3baa626b2 100644
--- a/web/regression/javascript/help/help_spec.js
+++ b/web/regression/javascript/help/help_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/history/history_collection_spec.js b/web/regression/javascript/history/history_collection_spec.js
index 146e710ba..2145f1a9c 100644
--- a/web/regression/javascript/history/history_collection_spec.js
+++ b/web/regression/javascript/history/history_collection_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/history/query_history_spec.js b/web/regression/javascript/history/query_history_spec.js
index 2ad6c989e..976026d8c 100644
--- a/web/regression/javascript/history/query_history_spec.js
+++ b/web/regression/javascript/history/query_history_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/jasmine_capture_warnings_beforeall.js b/web/regression/javascript/jasmine_capture_warnings_beforeall.js
index 0683793f3..55f3edf11 100644
--- a/web/regression/javascript/jasmine_capture_warnings_beforeall.js
+++ b/web/regression/javascript/jasmine_capture_warnings_beforeall.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/misc/explain/explain_statistics_spec.js b/web/regression/javascript/misc/explain/explain_statistics_spec.js
index 25ad98bb9..3124cae17 100644
--- a/web/regression/javascript/misc/explain/explain_statistics_spec.js
+++ b/web/regression/javascript/misc/explain/explain_statistics_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/misc/statistics/statistics_spec.js b/web/regression/javascript/misc/statistics/statistics_spec.js
index f879e1603..825a755f3 100644
--- a/web/regression/javascript/misc/statistics/statistics_spec.js
+++ b/web/regression/javascript/misc/statistics/statistics_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/nodes/schema/child_menu_spec.js b/web/regression/javascript/nodes/schema/child_menu_spec.js
index e3dda5e53..7a22940c3 100644
--- a/web/regression/javascript/nodes/schema/child_menu_spec.js
+++ b/web/regression/javascript/nodes/schema/child_menu_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
/////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/parse_shortcut_value_spec.js b/web/regression/javascript/parse_shortcut_value_spec.js
index 7518517bd..8a090f34f 100644
--- a/web/regression/javascript/parse_shortcut_value_spec.js
+++ b/web/regression/javascript/parse_shortcut_value_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/pgadmin_utils_spec.js b/web/regression/javascript/pgadmin_utils_spec.js
index 44ae7796e..c46e06ee5 100644
--- a/web/regression/javascript/pgadmin_utils_spec.js
+++ b/web/regression/javascript/pgadmin_utils_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/restore/restore_dialog_spec.js b/web/regression/javascript/restore/restore_dialog_spec.js
index 437e4760b..d97b6c2f7 100644
--- a/web/regression/javascript/restore/restore_dialog_spec.js
+++ b/web/regression/javascript/restore/restore_dialog_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/restore/restore_dialog_wrapper_spec.js b/web/regression/javascript/restore/restore_dialog_wrapper_spec.js
index f08d50ab2..aeef8192a 100644
--- a/web/regression/javascript/restore/restore_dialog_wrapper_spec.js
+++ b/web/regression/javascript/restore/restore_dialog_wrapper_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/selection/active_cell_capture_spec.js b/web/regression/javascript/selection/active_cell_capture_spec.js
index 7db3a56e0..919aaf3aa 100644
--- a/web/regression/javascript/selection/active_cell_capture_spec.js
+++ b/web/regression/javascript/selection/active_cell_capture_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/selection/column_selector_spec.js b/web/regression/javascript/selection/column_selector_spec.js
index 481250bbd..ae0966957 100644
--- a/web/regression/javascript/selection/column_selector_spec.js
+++ b/web/regression/javascript/selection/column_selector_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/selection/copy_data_spec.js b/web/regression/javascript/selection/copy_data_spec.js
index 38b23f8be..9b87752ab 100644
--- a/web/regression/javascript/selection/copy_data_spec.js
+++ b/web/regression/javascript/selection/copy_data_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/selection/grid_selector_spec.js b/web/regression/javascript/selection/grid_selector_spec.js
index 3a06dfbfc..0f9353eac 100644
--- a/web/regression/javascript/selection/grid_selector_spec.js
+++ b/web/regression/javascript/selection/grid_selector_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/selection/range_boundary_navigator_spec.js b/web/regression/javascript/selection/range_boundary_navigator_spec.js
index bc8afa386..0a3fa3f15 100644
--- a/web/regression/javascript/selection/range_boundary_navigator_spec.js
+++ b/web/regression/javascript/selection/range_boundary_navigator_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/selection/range_selection_helper_spec.js b/web/regression/javascript/selection/range_selection_helper_spec.js
index 93fc2059b..f0e5f9776 100644
--- a/web/regression/javascript/selection/range_selection_helper_spec.js
+++ b/web/regression/javascript/selection/range_selection_helper_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/selection/row_selector_spec.js b/web/regression/javascript/selection/row_selector_spec.js
index aa3bc4977..e7594e0dc 100644
--- a/web/regression/javascript/selection/row_selector_spec.js
+++ b/web/regression/javascript/selection/row_selector_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/selection/set_staged_rows_spec.js b/web/regression/javascript/selection/set_staged_rows_spec.js
index f628860f7..72f8cb9e9 100644
--- a/web/regression/javascript/selection/set_staged_rows_spec.js
+++ b/web/regression/javascript/selection/set_staged_rows_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/selection/xcell_selection_model_spec.js b/web/regression/javascript/selection/xcell_selection_model_spec.js
index 1882fa2cd..99b69a43a 100644
--- a/web/regression/javascript/selection/xcell_selection_model_spec.js
+++ b/web/regression/javascript/selection/xcell_selection_model_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/size_prettify_spec.js b/web/regression/javascript/size_prettify_spec.js
index aae26d952..85ce30b7b 100644
--- a/web/regression/javascript/size_prettify_spec.js
+++ b/web/regression/javascript/size_prettify_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/slickgrid/cell_selector_spec.js b/web/regression/javascript/slickgrid/cell_selector_spec.js
index 8354d1bd5..074841390 100644
--- a/web/regression/javascript/slickgrid/cell_selector_spec.js
+++ b/web/regression/javascript/slickgrid/cell_selector_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/slickgrid/event_handlers/handle_query_output_keyboard_event_spec.js b/web/regression/javascript/slickgrid/event_handlers/handle_query_output_keyboard_event_spec.js
index 942a5c324..644db37a9 100644
--- a/web/regression/javascript/slickgrid/event_handlers/handle_query_output_keyboard_event_spec.js
+++ b/web/regression/javascript/slickgrid/event_handlers/handle_query_output_keyboard_event_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/sqleditor/calculate_query_run_time_spec.js b/web/regression/javascript/sqleditor/calculate_query_run_time_spec.js
index d394ff9d1..ce74b8298 100644
--- a/web/regression/javascript/sqleditor/calculate_query_run_time_spec.js
+++ b/web/regression/javascript/sqleditor/calculate_query_run_time_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/sqleditor/call_render_after_poll_spec.js b/web/regression/javascript/sqleditor/call_render_after_poll_spec.js
index 18aeceac0..bb3ba6053 100644
--- a/web/regression/javascript/sqleditor/call_render_after_poll_spec.js
+++ b/web/regression/javascript/sqleditor/call_render_after_poll_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/sqleditor/execute_query_spec.js b/web/regression/javascript/sqleditor/execute_query_spec.js
index c63d5a260..b05ffed20 100644
--- a/web/regression/javascript/sqleditor/execute_query_spec.js
+++ b/web/regression/javascript/sqleditor/execute_query_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/sqleditor/filter_dialog_specs.js b/web/regression/javascript/sqleditor/filter_dialog_specs.js
index 15f67133d..173d90608 100644
--- a/web/regression/javascript/sqleditor/filter_dialog_specs.js
+++ b/web/regression/javascript/sqleditor/filter_dialog_specs.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/sqleditor/keyboard_shortcuts_spec.js b/web/regression/javascript/sqleditor/keyboard_shortcuts_spec.js
index b64f9b6c0..788615f29 100644
--- a/web/regression/javascript/sqleditor/keyboard_shortcuts_spec.js
+++ b/web/regression/javascript/sqleditor/keyboard_shortcuts_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/sqleditor/query_tool_actions_spec.js b/web/regression/javascript/sqleditor/query_tool_actions_spec.js
index 9152b8eb8..487bbb4eb 100644
--- a/web/regression/javascript/sqleditor/query_tool_actions_spec.js
+++ b/web/regression/javascript/sqleditor/query_tool_actions_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/sqleditor/query_tool_http_error_handler_spec.js b/web/regression/javascript/sqleditor/query_tool_http_error_handler_spec.js
index 363debcc9..a2c49770f 100644
--- a/web/regression/javascript/sqleditor/query_tool_http_error_handler_spec.js
+++ b/web/regression/javascript/sqleditor/query_tool_http_error_handler_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/sqleditor_utils_spec.js b/web/regression/javascript/sqleditor_utils_spec.js
index 3f727b26a..614caeb59 100644
--- a/web/regression/javascript/sqleditor_utils_spec.js
+++ b/web/regression/javascript/sqleditor_utils_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/table/enable_disable_triggers_spec.js b/web/regression/javascript/table/enable_disable_triggers_spec.js
index 213ecf562..256689958 100644
--- a/web/regression/javascript/table/enable_disable_triggers_spec.js
+++ b/web/regression/javascript/table/enable_disable_triggers_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/tree/pgadmin_tree_node_spec.js b/web/regression/javascript/tree/pgadmin_tree_node_spec.js
index 5434fd614..a98df1616 100644
--- a/web/regression/javascript/tree/pgadmin_tree_node_spec.js
+++ b/web/regression/javascript/tree/pgadmin_tree_node_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/tree/pgadmin_tree_state_save_spec.js b/web/regression/javascript/tree/pgadmin_tree_state_save_spec.js
index e97c85daa..9d6065a55 100644
--- a/web/regression/javascript/tree/pgadmin_tree_state_save_spec.js
+++ b/web/regression/javascript/tree/pgadmin_tree_state_save_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/tree/tree_fake.js b/web/regression/javascript/tree/tree_fake.js
index c0c17796a..2187a8f4b 100644
--- a/web/regression/javascript/tree/tree_fake.js
+++ b/web/regression/javascript/tree/tree_fake.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
diff --git a/web/regression/javascript/tree/tree_spec.js b/web/regression/javascript/tree/tree_spec.js
index bb607796c..06a78d0c4 100644
--- a/web/regression/javascript/tree/tree_spec.js
+++ b/web/regression/javascript/tree/tree_spec.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
diff --git a/web/regression/python_test_utils/csrf_test_client.py b/web/regression/python_test_utils/csrf_test_client.py
index bb3f7da70..7c5cf8b19 100644
--- a/web/regression/python_test_utils/csrf_test_client.py
+++ b/web/regression/python_test_utils/csrf_test_client.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/regression/python_test_utils/sql_template_test_base.py b/web/regression/python_test_utils/sql_template_test_base.py
index ec169d853..fe0b2a2e9 100644
--- a/web/regression/python_test_utils/sql_template_test_base.py
+++ b/web/regression/python_test_utils/sql_template_test_base.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/regression/python_test_utils/template_helper.py b/web/regression/python_test_utils/template_helper.py
index 0ab9454e9..4f3148778 100644
--- a/web/regression/python_test_utils/template_helper.py
+++ b/web/regression/python_test_utils/template_helper.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/regression/python_test_utils/test_gui_helper.py b/web/regression/python_test_utils/test_gui_helper.py
index da070141a..d2f87a6fb 100644
--- a/web/regression/python_test_utils/test_gui_helper.py
+++ b/web/regression/python_test_utils/test_gui_helper.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/regression/python_test_utils/test_utils.py b/web/regression/python_test_utils/test_utils.py
index 4b5891567..5d182ece2 100644
--- a/web/regression/python_test_utils/test_utils.py
+++ b/web/regression/python_test_utils/test_utils.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -14,7 +14,6 @@ import sys
import uuid
import psycopg2
import sqlite3
-import shutil
from functools import partial
from testtools.testcase import clone_test_with_new_id
@@ -24,11 +23,7 @@ from regression import test_setup
from pgadmin.utils.preferences import Preferences
-CURRENT_PATH = os.path.abspath(os.path.join(os.path.dirname(
- os.path.realpath(__file__)), "../"))
-
SERVER_GROUP = test_setup.config_data['server_group']
-COVERAGE_CONFIG_FILE = os.path.join(CURRENT_PATH, ".coveragerc")
file_name = os.path.realpath(__file__)
@@ -1151,27 +1146,3 @@ def get_watcher_dialogue_status(self):
def get_driver_version():
version = getattr(psycopg2, '__version__', None)
return version
-
-
-def is_coverage_enabled(args):
- """
- This function checks for coverage args exists in command line args
- :return: boolean
- """
- if "coverage" in args and args["coverage"]:
- return True
- return False
-
-
-def print_and_store_coverage_report(cov):
- """
- This function print the coverage report on console and store it in html
- files
- :return: None
- """
- print("\nCoverage Summary:\n", file=sys.stderr)
- cov.report()
- cov_dir = os.path.join(CURRENT_PATH, "covhtml")
- if os.path.exists(cov_dir):
- shutil.rmtree(cov_dir)
- cov.html_report(directory=cov_dir)
diff --git a/web/regression/re_sql/tests/test_resql.py b/web/regression/re_sql/tests/test_resql.py
index 7666bea16..fc1e59473 100644
--- a/web/regression/re_sql/tests/test_resql.py
+++ b/web/regression/re_sql/tests/test_resql.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/regression/requirements.txt b/web/regression/requirements.txt
index 1eb922b19..ed516a1de 100644
--- a/web/regression/requirements.txt
+++ b/web/regression/requirements.txt
@@ -27,7 +27,7 @@ testscenarios==0.5.0
testtools==2.3.0
traceback2==1.4.0
selenium==3.14.0
-coverage==5.0.1
+
###############################################################
# Modules specifically required for Python3.3 or lesser version
###############################################################
diff --git a/web/regression/runtests.py b/web/regression/runtests.py
index 735a6dd5d..f80eb5c7a 100644
--- a/web/regression/runtests.py
+++ b/web/regression/runtests.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
@@ -20,7 +20,6 @@ import sys
import traceback
import json
import random
-import coverage
import unittest
@@ -49,8 +48,6 @@ if sys.path[0] != root:
from pgadmin import create_app
import config
-COVERAGE_CONFIG_FILE = os.path.join(CURRENT_PATH, ".coveragerc")
-
if config.SERVER_MODE is True:
config.SECURITY_RECOVERABLE = True
config.SECURITY_CHANGEABLE = True
@@ -300,8 +297,6 @@ def add_arguments():
help='Skips execution of the test cases of particular package and '
'sub-packages'
)
- parser.add_argument('--coverage', nargs='?', const=True, type=bool,
- default=False, help='Enable code coverage feature')
parser.add_argument(
'--default_browser',
help='Executes the feature test in specific browser'
@@ -399,7 +394,6 @@ if __name__ == '__main__':
# Failure detected?
failure = False
test_result = dict()
- cov = None
# Set signal handler for cleanup
signal_list = dir(signal)
@@ -436,12 +430,6 @@ if __name__ == '__main__':
node_name = "all"
if args['pkg'] is not None:
node_name = args['pkg'].split('.')[-1]
-
- # Start coverage
- if test_utils.is_coverage_enabled(args):
- cov = coverage.Coverage(config_file=COVERAGE_CONFIG_FILE)
- cov.start()
-
try:
for server in servers_info:
print("\n=============Running the test cases for '%s'============="
@@ -569,15 +557,6 @@ if __name__ == '__main__':
file=sys.stderr
)
- # Stop code coverage
- if test_utils.is_coverage_enabled(args):
- cov.stop()
- cov.save()
-
- # # Print coverage only if coverage args given in command line
- if test_utils.is_coverage_enabled(args):
- test_utils.print_and_store_coverage_report(cov)
-
print("Please check output in file: %s/regression.log\n" % CURRENT_PATH)
# Unset environment variable
diff --git a/web/regression/test_setup.py b/web/regression/test_setup.py
index 953cc3661..8abce5676 100644
--- a/web/regression/test_setup.py
+++ b/web/regression/test_setup.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/setup.py b/web/setup.py
index eb7d90445..d725bbdf9 100644
--- a/web/setup.py
+++ b/web/setup.py
@@ -2,7 +2,7 @@
#
# pgAdmin 4 - PostgreSQL Tools
#
-# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# Copyright (C) 2013 - 2019, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
diff --git a/web/webpack.config.js b/web/webpack.config.js
index 9b0f2d645..230172cf0 100644
--- a/web/webpack.config.js
+++ b/web/webpack.config.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
@@ -356,6 +356,7 @@ module.exports = [{
slickgrid: sourceDir + '/bundle/slickgrid.js',
sqleditor: './pgadmin/tools/sqleditor/static/js/sqleditor.js',
debugger_direct: './pgadmin/tools/debugger/static/js/direct.js',
+ schema_diff: './pgadmin/tools/schema_diff/static/js/schema_diff_hook.js',
file_utils: './pgadmin/misc/file_manager/static/js/utility.js',
'pgadmin.style': pgadminCssStyles,
pgadmin: pgadminScssStyles,
@@ -492,7 +493,8 @@ module.exports = [{
',pgadmin.tools.import_export' +
',pgadmin.tools.debugger.controller' +
',pgadmin.tools.debugger.direct' +
- ',pgadmin.node.pga_job',
+ ',pgadmin.node.pga_job' +
+ ',pgadmin.tools.schema_diff',
},
}, {
test: require.resolve('snapsvg'),
diff --git a/web/webpack.shim.js b/web/webpack.shim.js
index 6e8c90767..daa4c8e99 100644
--- a/web/webpack.shim.js
+++ b/web/webpack.shim.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
@@ -278,6 +278,8 @@ var webpackShimConfig = {
'pgadmin.tools.import_export': path.join(__dirname, './pgadmin/tools/import_export/static/js/import_export'),
'pgadmin.tools.maintenance': path.join(__dirname, './pgadmin/tools/maintenance/static/js/maintenance'),
'pgadmin.tools.restore': path.join(__dirname, './pgadmin/tools/restore/static/js/restore'),
+ 'pgadmin.tools.schema_diff': path.join(__dirname, './pgadmin/tools/schema_diff/static/js/schema_diff'),
+ 'pgadmin.tools.schema_diff_ui': path.join(__dirname, './pgadmin/tools/schema_diff/static/js/schema_diff_ui'),
'pgadmin.tools.user_management': path.join(__dirname, './pgadmin/tools/user_management/static/js/user_management'),
'pgadmin.user_management.current_user': '/user_management/current_user',
'slick.pgadmin.editors': path.join(__dirname, './pgadmin/tools/../static/js/slickgrid/editors'),
diff --git a/web/webpack.test.config.js b/web/webpack.test.config.js
index c8a5dc311..3d153620a 100644
--- a/web/webpack.test.config.js
+++ b/web/webpack.test.config.js
@@ -2,7 +2,7 @@
//
// pgAdmin 4 - PostgreSQL Tools
//
-// Copyright (C) 2013 - 2020, The pgAdmin Development Team
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
^ permalink raw reply [nested|flat] 10+ messages in thread
* Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures
2019-12-20 13:29 [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Akshay Joshi <[email protected]>
2020-01-02 06:34 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Khushboo Vashi <[email protected]>
2020-01-02 09:13 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Aditya Toshniwal <[email protected]>
2020-01-02 09:38 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Khushboo Vashi <[email protected]>
2020-01-08 06:06 ` Re: [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Khushboo Vashi <[email protected]>
@ 2020-01-10 10:13 ` Akshay Joshi <[email protected]>
0 siblings, 0 replies; 10+ messages in thread
From: Akshay Joshi @ 2020-01-10 10:13 UTC (permalink / raw)
To: Khushboo Vashi <[email protected]>; +Cc: Aditya Toshniwal <[email protected]>; Chethana Kumar <[email protected]>; pgadmin-hackers
Thanks, patch applied.
On Wed, Jan 8, 2020 at 11:37 AM Khushboo Vashi <
[email protected]> wrote:
> Hi,
>
> Please find the attached updated patch.
>
> - The Generate Icon has been changed to
> https://fontawesome.com/v4.7.0/icon/file-code-o .
>
> Thanks,
> Khushboo
>
> On Thu, Jan 2, 2020 at 3:08 PM Khushboo Vashi <
> [email protected]> wrote:
>
>>
>>
>> On Thu, Jan 2, 2020 at 2:43 PM Aditya Toshniwal <
>> [email protected]> wrote:
>>
>>> Hi Khushboo,
>>>
>>> On Thu, Jan 2, 2020 at 12:04 PM Khushboo Vashi <
>>> [email protected]> wrote:
>>>
>>>> Hi Aditya,
>>>>
>>>> Thanks for the review. Please find the inline response.
>>>> Also, the updated patch attached.
>>>>
>>>> On Fri, Dec 27, 2019 at 4:55 PM Aditya Toshniwal <
>>>> [email protected]> wrote:
>>>>
>>>>> Hi Akshay/Khushboo,
>>>>>
>>>>> I have few suggestions/questions for the attached patch:
>>>>>
>>>>> 1. Code like SchemaDiffRegistry('server', ServerNode) should be
>>>>> replaced with SSchemaDiffRegistry(ServerModule.NODE_TYPE, ServerNode)
>>>>>
>>>>> Done
>>>>
>>>>>
>>>>> 1. The variables return_ajax_response, only_sql, json_resp as far
>>>>> as I understood are similar. Can we have same var name everywhere ?
>>>>>
>>>>> only_sql is used when I need only SQL but not to be executed in the
>>>> backend. json_resp is used to have the plain text/json response.
>>>>
>>>>>
>>>>> 1. Remove commented code -
>>>>> web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
>>>>> -> get_sql_from_table_diff
>>>>>
>>>>> Done
>>>>
>>>>>
>>>>> 1. In
>>>>> web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
>>>>> -> fetch_tables - keys_to_remove is passed. How is it different from
>>>>> keys_to_ignore used at other places ?
>>>>>
>>>>> keys_to_remove used to remove the table properties before comparison
>>>> as we combine all child nodes of the table while comparing and
>>>> keys_to_ignore is to ignore the keys while comparing. We have also used the
>>>> keys_to_ignore in the table node itself.
>>>>
>>>>>
>>>>> 1. web/pgadmin/tools/schema_diff/__init__.py
>>>>> -> check_version_compatibility has hardcoded version numbers. Can we
>>>>> use get_version_mapping_directories from
>>>>> web/pgadmin/utils/versioned_template_loader.py ?
>>>>>
>>>>> I have checked the possibilities before using it in the schema diff.
>>>> The * purpose and the return values * are different for both the files.
>>>>
>>> The return value can be taken and tweaked to fit your purpose. If let's
>>> say a new version of Postgres is released then that also need to be added
>>> in schema diff along with get_version_mapping_directories. That would
>>> not be the case if you use get_version_mapping_directories.
>>>
>> I can do one thing, will take the versions dict at one place and both the
>> functions get_version_mapping_directories and schema_diff can use that
>> version dict.
>> As, I am not in favour of tweaking get_version_mapping_directories
>> function as the name suggests something else.
>>
> I have changed the logic for the version comparison, so now no need to
> hard code the version values and no need to change the existing code.
>
>>
>>>>> 1. Rename .reallyHidden to .really-hidden
>>>>>
>>>>> Done
>>>>
>>>>>
>>>>> 1. CSS class #schema-diff-grid -> background: white; - hardcoded
>>>>> color can be changed to use $color-bg instead. Also use rem or px for -
>>>>> font-size: 9pt.
>>>>>
>>>>> Done
>>>>
>>>>>
>>>>> 1.
>>>>> 2. .slick-group-toggle.collapsed, .slick-group-toggle.expanded -
>>>>> svgs are not required. Font awesome has the icons. refer - .obj_properties
>>>>> .collapsed .caret::before.
>>>>>
>>>>> Done
>>>>
>>>>>
>>>>> 1.
>>>>> 2. In
>>>>> web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js ->
>>>>> formatNode - Appends can be avoided and formed in a single statement.
>>>>> + } else {
>>>>> + return $('<span></span>').append(
>>>>> + $('<span></span>', {
>>>>> + class: 'wcTabIcon ' + optimage,
>>>>> + })
>>>>> + ).append($('<span></span>').text(opt.text));
>>>>> + }
>>>>> +};
>>>>>
>>>>> Any harm in this approach?
>>>>
>>> Obviously the extra append operations, which can be avoided.
>>>
>> Yeah, right but I don't think it is going to be a performance issue.
>>
>>>
>>>>> 1.
>>>>> 2. In
>>>>> web/pgadmin/tools/schema_diff/static/js/schema_diff.backform.js
>>>>> -> fetchData - We should not use async = false.
>>>>> + $.ajax({
>>>>> + async: false,
>>>>> + url: url,
>>>>> + })
>>>>>
>>>>> This is pending.
>>>
>> It's not pending, I left it as it is, as I have copied this code from
>> backform.pgadmin.js and tweaked it accordingly, as we already cleaned up
>> the async: false in the past but this has not been changed. So, before
>> changing it, we need to analyse why we have not changed it.
>>
>>>
>>>>> 1. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js -
>>>>> Use 'sources/window' - pgWindow.
>>>>>
>>>>>
>>>>> 1. + let preferences = (window.opener !== null) ?
>>>>> window.opener.pgAdmin.Browser.get_preferences_for_module('schema_diff') :
>>>>> window.top.pgAdmin.Browser.get_preferences_for_module('schema_diff');
>>>>>
>>>>> Done
>>>>
>>>>>
>>>>> 1. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js -
>>>>> Use map instead of for loop. It will also remove the sel_rows_data.push.
>>>>> will be helpfull in large data.
>>>>> + for (var row = 0; row < sel_rows.length; row++) {
>>>>> + let data = self.grid.getData().getItem(sel_rows[row]);
>>>>> +
>>>>> + if (data.type) {
>>>>> + let tmp_data = {
>>>>> + 'node_type': data.type,
>>>>> + 'source_oid': parseInt(data.oid, 10),
>>>>> + 'target_oid': parseInt(data.oid, 10),
>>>>> + 'comp_status': data.status,
>>>>> + };
>>>>> +
>>>>> + if(data.status && (data.status.toLowerCase() ==
>>>>> 'different' || data.status.toLowerCase() == 'identical')) {
>>>>> + tmp_data['target_oid'] = data.target_oid;
>>>>> + }
>>>>> + sel_rows_data.push(tmp_data);
>>>>> + }
>>>>> + }
>>>>> +
>>>>> + url_params['sel_rows'] = sel_rows_data;
>>>>>
>>>>> This is a debatable topic as there are pros and cons of both map and
>>>> for loop. Like, it's more readable if we use map and in case of for loop,
>>>> chrome and firefox will be more happy in terms of performance.
>>>>
>>> I'm not comparing "map" and "for" here. I'm trying to avoid
>>> sel_rows_data.push statement here which is directly proportional to
>>> the number of selected rows.
>>>
>> At the end, it will return the new array according to the condition in
>> both the cases.
>>
>>>
>>>>> 1.
>>>>> 2. In web/pgadmin/tools/schema_diff/static/js/schema_diff_ui.js
>>>>> -Are we doing anything to handle failure.
>>>>> + connect_database(server_id, db_id, callback) {
>>>>> + var url = url_for('schema_diff.connect_database', {'sid':
>>>>> server_id, 'did': db_id});
>>>>> + $.post(url)
>>>>> + .done(function(res) {
>>>>> + if (res.success && res.data) {
>>>>> + callback(res.data);
>>>>> + }
>>>>> + })
>>>>> + .fail(function() {
>>>>> + // Fail
>>>>> + });
>>>>> +
>>>>> + }
>>>>>
>>>>> Forgot to handle, now added.
>>>>
>>>>>
>>>>> 1.
>>>>> 2. As you've added a completely different function for
>>>>> connect_server, I would suggest to rename dlgServerPass to a different name
>>>>> to avoid conflict with existing dlgServerPass in server.js
>>>>> + if (!Alertify.dlgServerPass) {
>>>>> + Alertify.dialog('dlgServerPass', function factory() {
>>>>>
>>>>> As we open the schema diff in different frame, I think, this should
>>>> not be the issue.
>>>>
>>>>>
>>>>> 1.
>>>>> 2. Generate script does not work if pgAdmin opened in iframe.
>>>>> Iframes are used by tools like Katacoda.
>>>>> [image: Screenshot 2019-12-27 at 16.40.47.png]
>>>>>
>>>>> Fixed, good catch.
>>>>
>>>>>
>>>>> 1.
>>>>> 2. Comparing objects loader is not attached to DDL Comparison
>>>>> panel.
>>>>> [image: compare_overlay.png]
>>>>>
>>>>> Fixed.
>>>>
>>>>>
>>>>> 1.
>>>>> 2. Filter icon and Generate script icon size are different. Also
>>>>> change icons CSS to use font-icon. You can refer icons from sqleditor.
>>>>> [image: Screenshot 2019-12-27 at 12.18.00.png]
>>>>>
>>>>> The problem is, for the generate script icon, I have used the svg (as
>>>> no similar icon in font-awesome) whereas for Filter, font-awesome is used.
>>>> I can replace the Generate Script icon from font-awesome (can search for
>>>> some similar icon) if Chetana agrees.
>>>>
>>> @Chethana Kumar <[email protected]> , please have a look.
>>>>
>>>> https://fontawesome.com/v4.7.0/icon/file-code-o
>>>> https://fontawesome.com/v4.7.0/icon/file-text-o
>>>>
>>>>>
>>>>> 1.
>>>>>
>>>>> *The fetch_objects_to_compare function used in each node uses loop to
>>>>> fetch data. Although it is working for now, but I would suggest using bulk
>>>>> fetch nodes instead of looping through all the nodes one by one.*
>>>>>
>>>>
>>>> Can you please elaborate the approach which you are suggesting?
>>>>
>>> The fetch_objects_to_compare function fetches all the nodes first, and
>>> then in a loop the properties for each node is fetched. Instead of that,
>>> all the nodes along with their properties can be fetched in one go from the
>>> database. Although this is no stopper, but it can be an improvement done in
>>> future.
>>>
>> Sure, will look into it in the second phase.
>>
>>
>>>
>>>> Thanks,
>>>> Khushboo
>>>>
>>>>>
>>>>> On Fri, Dec 20, 2019 at 6:59 PM Akshay Joshi <
>>>>> [email protected]> wrote:
>>>>>
>>>>>> Hi Hackers,
>>>>>>
>>>>>> Attached is the implementation of the new feature Schema Diff Tool.
>>>>>> Initial work(backend code to compare the objects) has been done by me and
>>>>>> then most of the task has been completed by *Khushboo Vashi. *Sending
>>>>>> the patch on behalf of her*.*
>>>>>>
>>>>>> Currently, this tool only supports Tables, Views, Materialized Views,
>>>>>> Functions and Procedures node.
>>>>>>
>>>>>> Please review and test it thoroughly. Suggestions are welcome to
>>>>>> improve the tool.
>>>>>>
>>>>>> --
>>>>>> *Thanks & Regards*
>>>>>> *Akshay Joshi*
>>>>>>
>>>>>> *Sr. Software Architect*
>>>>>> *EnterpriseDB Software India Private Limited*
>>>>>> *Mobile: +91 976-788-8246*
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Thanks and Regards,
>>>>> Aditya Toshniwal
>>>>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune
>>>>> "Don't Complain about Heat, Plant a TREE"
>>>>>
>>>>
>>>
>>> --
>>> Thanks and Regards,
>>> Aditya Toshniwal
>>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune
>>> "Don't Complain about Heat, Plant a TREE"
>>>
>>
--
*Thanks & Regards*
*Akshay Joshi*
*Sr. Software Architect*
*EnterpriseDB Software India Private Limited*
*Mobile: +91 976-788-8246*
Attachments:
[image/png] Screenshot 2019-12-27 at 12.18.00.png (47.9K, 3-Screenshot%202019-12-27%20at%2012.18.00.png)
download | view image
[image/png] Screenshot 2019-12-27 at 16.40.47.png (395.3K, 4-Screenshot%202019-12-27%20at%2016.40.47.png)
download | view image
[image/png] compare_overlay.png (411.6K, 5-compare_overlay.png)
download | view image
^ permalink raw reply [nested|flat] 10+ messages in thread
end of thread, other threads:[~2020-01-10 10:13 UTC | newest]
Thread overview: 10+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2019-12-20 13:29 [Feature-3452] Schema diff tool with Table, View, Materialized View, Functions and Procedures Akshay Joshi <[email protected]>
2019-12-27 11:56 ` Aditya Toshniwal <[email protected]>
2020-01-02 06:34 ` Khushboo Vashi <[email protected]>
2020-01-02 08:34 ` Chethana Kumar <[email protected]>
2020-01-02 09:03 ` Khushboo Vashi <[email protected]>
2020-01-02 09:13 ` Aditya Toshniwal <[email protected]>
2020-01-02 09:38 ` Khushboo Vashi <[email protected]>
2020-01-02 09:48 ` Aditya Toshniwal <[email protected]>
2020-01-08 06:06 ` Khushboo Vashi <[email protected]>
2020-01-10 10:13 ` Akshay Joshi <[email protected]>
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox