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]> 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-27 11:56 Aditya Toshniwal <[email protected]> parent: Akshay Joshi <[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 @ 2020-01-02 06:34 Khushboo Vashi <[email protected]> parent: Akshay Joshi <[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 @ 2020-01-02 08:34 Chethana Kumar <[email protected]> parent: 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 @ 2020-01-02 09:03 Khushboo Vashi <[email protected]> parent: Chethana Kumar <[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 @ 2020-01-02 09:13 Aditya Toshniwal <[email protected]> parent: 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 @ 2020-01-02 09:38 Khushboo Vashi <[email protected]> parent: Aditya Toshniwal <[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 @ 2020-01-02 09:48 Aditya Toshniwal <[email protected]> parent: Khushboo Vashi <[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 @ 2020-01-08 06:06 Khushboo Vashi <[email protected]> parent: Khushboo Vashi <[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 zcmYM+dHhzx-}v$C)4uQf`bqn~Ds5V%JuS3Ir9_1`OHt^e(1NIF5hbNkR1~2_Nh%@= zg-9v!ZMQ^9?$_&@`8|I3{l{}=&N(yhdC$x_SADVc*=$eD%9i}0K&Iys{ND#z5{Xh+ zqoK9`|9{PfClW`gHpd1T5{WBDBocQ~?>#D!=!Ltm1E!BoBsQic5_jNg>Xq+KBo^R) zoJ;%IdlHG_)box>Bno3yES*Rs6D=rsp+8o^`!FBAgxT>8EP)$h{cFrm{YT7*zs2k4 zu`%`hV-txhu@jcZN3a;ag6X&!v*97k&iIL6C}g7Hx9DHdOVPCZ!u2fCoY8#I!qF1Z zvS?rxV!cYVX0%?kkurXwS!`$(Z5!<r?H28ccHB4C2Sf+Q_F>WC=nO~4`nc#r(MO_> zVbTt#Qpk)?VM&}7Z&;0{dM(=FcFc{RVL?0?>u0eH^~-3gOW&VJl*5LYj(w1|PK-mB zat;>8H}5C^MJep0!GV87_rj%kW07&8!@B4L9kB=wjNTX9r$?7W-$VD%=jgzPF)#jy z?DIt4@xdbF$$teJO4DFutuYVw$DBAEbK(7H2alndcn;0j0`&eRXeQTUEnJUo-k;I? z&!YEVzykOm=D-5U2NH=JD3nHb?cG=#mt##l5Y6%+>7?EOIZ=r_u_OL~23GZ<FyqE( z;2mSV7nYzt6b)b^cE>5$43pnd=uDyLghZkm-imecX>`D?==Hy`1zt<Ws^eq$FusA! zu^tuMN2AZb5bK{|RqFqs{a1J-Ot335;bbBi8{R@wc??b6A86_?V@b?8G0eC!_NRU~ z*1^xwj?*TEHLZa+Q?DQEv(SE@M>q4UvAzKddj3DAU<!Z0rg%DafleO{YjrgiqP;u1 z`-fmAyf@azp@B}u9QZ7@z=hZV4`CTB^jHY6J{m|9%*XhN&J;XO{n5>F7n*@b(Y2c% z>#w2%t;KS<CAJ@l^^@pC@;n~)LK!sR+Gt?S(Y?_gGvN)G^nn{GWX0Rj0q#Nrnt)|- zCfdQ9v3*mle-Y~k(T>kzDZGTWvH0ZhTnEfT{RT9XH=z?9J(>KQnn^VH9(Wlm<9lcT zM`HVV^npB6!f`5x&Y&6^aBa+r%`h{ziS>@?+V?;wIta7jUD5GV$bWGfCedK3UPL$B zO7wvp=!;}O8o)2ni|BxPrn2*~2)foC&|^FS9e5p@nQdrbd(gH23Vo3sPf~Dz%V;2Z zrv<B`0bPUHushm8Uo?dS<MlCUV3T5fcC0T!Q@%ddH=_f7f%fwY=D_4>3a0V``ii}b zMqKELunE)Ah^wKgZiYVC0aI&=>C|sR*Zx8D{&}&!GP)D9(|!!i+!-w9`TvW859E6? zcm=u_8lX3JMl*0jtoM)g+hTnr`utcl<x^sPPV`lD;0<U-x1*WZm%7gS|Br%8a0zQ- z?x#Y%DY^+eqa6>#TsR6H@WFU}I+~G}qpzcT=N)uucB1`%hmG-Myk2QK{doQxQt%YC zw*iNusT_y>a5h%P-_edsJ{<<Ej=l#PVmkIg10IJt@hLQe^Uw?|LNmD%^WZv6dSM#{ zANUjv<Qp`Azp(}uekPpf*61$38x3d~w!l5HJ@1V0DsF?#Xdi`j@ip}RAMh&7GBael z#Z1<}JPjjgNXHpi0pE=7M+dxwc2IX#_>FiY`evMn)$m2Ei96BbcOI)?jc3EhrzcjY zp2RC~B{sm%o+bYcDP(*uk!XZXuq@t<wQwfZ#;xdk;T)Qg+_S^XnxOX&$4dAlI`CSo zj|Z_L=9?4R8=`^SjQ00Ll7f*hLuc|8R>j2JaAP&J-V4pt!{`i_pqbi%26z%3sMNgh zd!jWO=p1w@Kg4uA9L?~2_<APGQ?SDu&<E~AQ@sQoU^hCmbLc?D=7;w7*qHhVbVke2 z=k{SeyomN!>xFRrCbXZ)(N#$Q$;4L_OxZu7AyNLtkcsx_%<sYC_+o5dk9K?n-K=>R zgy(BTd!yGMMmOK<SPBoJ0bIgjSbm`yW&N8`xSEE6*c=yPd;A_-Vx^aO4dYPkge$QP z{)KI^*&_B0PD1<Hj4tKBXdqQy4#%}8mZLrpJ$@50OOnD23OR8u=Eo(`w=p;Mozbr` zEA^w82~T1^Jcqe3!{Ts%UMxesG`b0!VL==nuRn@esL#Ztk<6oDN6XRo!Mo@iZ5uk! zXP6iFp@IH{4tNHg;UzSsRhNXNXpQ!BCuYMjXaEziJkG=-`1TU=-;TnkG}v+BSHgqk zun+a>SQH<{O!xvC=pr;zZ(;%b5Pg1stp9`ta2_*bVrd8@3wmE(bmAqKlK-+4s?ksZ zJEChe3hiJ9dVM}RlMUz+e267+HyXe%v3?QFMA2m-@H*&o?a_g|qy6?rGdwg&!BpIh zJ#i}9;h}iLZ|ENQH`a4552-JLc32+0UK_Jwb98`fu{w4|m+Ap@z$xf+v(WpK3n`e= zWta`$i5Iq_Yqkpw=zFxIvzU(mqR*9iH4IoA3sY~5X0R(dz+LEo<Ip|y7&_tSkW3{L zuf>M#=$amko<`R`u_AO-4DBEtYp3z{LOUL~GQ7)&V;1U*(D%i1EQBAR6WEWg`TsCG zUcjuL|BSDN)Z|15D1y$k5}MljSP5Ij_F>U6n2q*{Xr`V(_sT*njqjsx$nVk26n#DP zR}<aLO)>TRza<4{-W^TNV6@}$*a#<KL)?J5@Hcc<|A(IQ%&S5sDqs%kb<p;vSQ-0b z9-N5wJ0to$rvCiDn1UTILmylhZ`g-Ds2{{xSbKGNvu#5IIE|iyKky37w<f$n>!YXX zF3gRyu?{XlGw~Ig(GzRPe>#N%Z-h0hj}@s8!)iDk&A_|SbLgI^`ev{dI?#=1hZE56 z`YUM0zQrps|Jq<XG?0g|2CiDm`a95fG?=O^>q5O2I<p(mkH;9SiZju*-H282TlBe% zZ-rA)9X<b@u_oSzZpvBc{m)|_+!o!Nq+lu!qp3QM`S8zpLzcHg$_k?$R>#zg(SawR zuhgZn{bO{%Gw5D8k6AHoeK-x-u>kclSQwLa<ArwU%=%$b9FKM|6AkP|EQBl38ElE| zd(Z*DNAEw1Iq?j7%r0Vn%=}K+V@1*XDj*Y0CTdf#!<LvAyP^Z$jID75+QAz1Tz`ND zauA)#IW%LL-VOZ}#v;@!pwBf$2ke60-v{mgPR!}~A4kF6{}|fwOf-;X=#A^q^ST|K z>Bm?UzrX?bE4r!LzZW*^ICQVPfv)*?==Dq+!qQ!dj@K8nF@9nw1=naa+VTBZ51+xh zxD5^9Pc)_fU@^?JG0eO)n!#FVdvmm(Ug&uri7v@~SR5yz$NWW17NoF|f;0XcOX81c zN-tq0%)KcD&;U(oV>FOXXoh;CnHh|3<~z`UM#t+(^!}&NV>btD<A<Bbe@zO1(BMbo zip^oI+Mr9(6-(i*=!_mgckMiMMyt_OZa@dziLU*AG|<!N#1ij^K=Yx`mq91k;C=G% zgV)kvhc}=D4~&jMuTMh<niuO!u`Kns(3yXQ4s;Oh=OlXn-{|Jcyd~V14_(TlI2}tR zDY!-}(TLZf9ejkQY%ey%gXkV9xHV*=Bvz$fA04<qI^c*{ACLAs4SjA_bUqsJV)Qg5 zS5PQJVG|nJK{VpS=z}NGK>k1<yo@eI<_|)^rO^OtqbY5H_R|ebbx$;dcgFVdXg^8h z{$%3ucwr7YgBP$4zKX8pw`f4;&<tHdH(8!-VSqyDCai`Id=+-V=GYRSz(%+mTVbXT z!_WD)IKcBije-&V8a<14_!pMN%-h4vDq;re4Y3?HMz7z5o}vfPOg)Y1I1in`dzcx& zKr^%-oyafN89(t)ypZ#wFw;`#9;h7a_0dgvHTvN7=-S?fF40Idb7Qe0PC`@uD*D_z z=#qVk26PO~=p{_rQPv$HvV7>w%b_ol+E@bHqa6-LXM8uhwlgs+E=Tvk8uY#`=s<hW z=YK|*G;L@2Sk=RH>b-W7{|XfDqoF3g5O4SxZ9g3?xGM~F6`GlrXsSD7Y3zl*xb8*Y zaL=GKUV)kL12jWBV*N|ZNd22#<UbpQ?`iNj{EW`*LcB5W$6@UXVHVm;p!b(U2dajy zX&W@Ko|qj6p_#lB9e5mi-{WYe=Aiv7OHwdZYtRmM#0&e-Kn_NKi`TP#5&|uRIk;XK zeXbtb@zrRc*P%1-iC<#hc)j-Suz6eH6|^S@QE*c|iaszKjch);mP^oA@LJ4?pQHC3 zjP=9Vkoqa~6jb;$coiC8XUvSfF&Fkn1HA(YG?^Gr!2usZQ#uV(1EZ;2i*~Rnx()4k z7n;&9(SeVl6S;t9Am?Wx-~woS8T2&N!OD1Ts-5*8K_Q)nB#y+F(A4MM69TD-4%h$< zq(!V>i+0=%?f4dS58W4?7TaG$C-^32#SQ4D-G;?H|A#5~3jPP(mBl{~k(WjvsEP(q z7wxE7Y`+$Lt_#+};jw)_=BB<FJ;raK0e*}w-65=tM=|M}tjHH3WmlmCwTO0%?LE;4 z`=Q5b5IWOw=q7qH)>mU*>K~wMy%){cA$0E?L;E?0X88OUtiK)R+8dUj0{Y;!(H`g? zxEb@{?Pv%0qnUUp`Z)S(ej4lHOmr`8NAEj?1@ISiuUtgm7kT%Q|LPQ~?+YJ`-sp_x zVguZO&fqK>$a!=oo~gEw3$MlNu_DgH&iFp&^ZHl8(pZpsE%dmzMkjJ(l7eeB0F88b ztdBtlo`j}!Dw=_L=pI>)&iFNSx35Nz>Dy?a`_R4dJsR+(Xtu9IK!wmuCo59$hI;5` zyE@u7dL7zfujoKD&^u!N9`yN#Vts0?&qDXs!dTym`Kf=3F8Lv3V*LF-1qaBwKXjZQ zooNYlW>v8$)<HLC`{?y(zyr`s4MFc8j%Ms0Ovg#_`VuTceFgg5R?N%ziCq+&!8hmt z$Iuy`Mc3#;tY5}dpa;Tz`OyJOq3z|-z-yvw-z?U<plja`-6Ny1D$d68p8qWr%HmP1 zj+wp*1Jpq~YKjKb8SS7ay0#CXd*^wqkIS(<9>k)U_%^)Iis5ZkC*!Sn3I}74@5uj6 z6yBy_3JV+zkrqQ!R0CbJ253s##(FR8OMMu2#ckLY3w|HI_kFPm^)b;k*o^uKyb7!Q z5FGRa`8VR{X>ewn(M@v{D`S>Jp~G5ey#sc{yRZ~)#M1Z;PQbsgIF9`>WZ)U}I4{Qm z_z9YsYKOyptq&(d>if~)nmmY&aVgfsAF&wbITB`68Li)f2K)f}B3XnDaTAusKhS^+ z{S<!rG(#sk0u68m+W*QVg+dg*!3ua9*QJrlqhX+($3m(OqXCxqIsBor4Yr{^0uAI% zY>x*p6P7z3W?Bi|J6EHdv>m$1yQ8Ne*^h#+#(U72J&p#nFt)ElJJ^AC@Hu9|Z_!h8 z813*B7RJA0d!Apy3#J5mU*%~1*xmxOdHy?7u;ZR+M>og%9q1eC-q`*~^hq>RbI_S@ zjO|Cz({Kta<3-Gd<$n#wvIe?|o5p%4O#S^|UkaJIa0}YOFf@>{=<$0bw$DV@`X#&q zH=;8;gx+@oeeP0h&-%a6Z$UJm;<4Teb5L(*o&A^SLBS6CpaI+->-S*}>Qkb#&;b`< zR$PH*=uLFV-p3sHB|7s%vHce`@PE<!i=PNfSP4^q{;x^FJ<tkE;0@^J7!}(eN7r^9 zy7sHl0N%!&xH;B8MhD)D>G&O**-Pla8BT_!$cs+6%t_YY3$<fIGfb!61$~u{L<4yU zeGxs2uHjNl1%P(68O^{R^i_Klz3*>yV%biG%#=izq7vrB>rRn>XVjMlQ#2_05Zci^ zbfDKU7ruoK^Z~jD_M;vBgT9cmoQ|6goj?urI5x#{*b=kjEof$jCn+?iaCf}026Iz? z51rXgbl`8$8U2iT@H~1w^O<nH2pVX4wBzcS5$neGE79kgV-D<$KA-GO!8hJ8tcNe7 z4}OK-_zjl9qv%XCo(=7J(F~Np>ew7R;qBNO--_4&#!A#no(q|2jrpi|3iV{7U%YS| znyQiLOzuH5@c<h6RLqZa(NwNLH|uV6#>dgkcM1*kJeukZzws+616e|s`rSXmn{f-~ z@%w*(f^WX#=mUvALjXC@k4pix<2upCn3sBMEQCGKj)&r-I1<g=@8|?BqkAdW`7n`m zbQ9Lbrk?-a6zpggdgF2|j2qFw_QvZc(2qyruW%|#p!K@w9_fTW-v^z@a5R9ivHmDJ zk?H6X%)z9oS{`p$7cXqaBDC*8XZABXz$tX*|3q{A9ri{E%ujn`bZI)FOEv<X*n{Zv zGtl1!3()(&`J4RP;RzZH<RTh*)(c??@<)rKGb@K>@k&g`p6HCmq5~$;y)zx%oU_rr z@h-Zz-be5I5Y5cK3*_H{57UsEA-dcDK_f5zPiU`&2GA6Jp>#z%yakKm(Ab_t*M272 z?~CYjug3Z&bWiQV)TZ?TvY9xAwbJ<Ud68eH)C>K~%YypXcn$TU|AoK3x(NqUe-XQ4 z8voxNyW>^37=4i)L^JU>I#41lm<7#1E=<Q{NeV{X3@c(gtcxSC7A{0P`V8&pYxMqu z=-xPv{<b@fW~6$Ca9<ttxrXRwyBf`KS9Ejt3)hp0yF(!{K3<rJRk&d;nyRhnW;}#; zcpgppWvqrpGKN4}p%ZA2-Zv86TVv6HA4m7f3^b7EF?Ifzr3!q_&`7tVo8xP=gQMtf z{R4e4OQw**g6Mr$p!d~5ueXeLK?m%M&Ui4or^ca~oQ}EKe~D))7~#w4+P#i`Om?9e z_&HwBlsPT6W_d9+AUZ%xbSXNZ19U?->1}9$_oJKoarC)YV*6W|^ujg@?$#sdfTz)p zb7e_Oy<!Wa$FdIEK@)U<j_Az#qy5~2#c?K1$Jfxk)HG{a>e!CJo7vP)VRPC~WlKw@ z{*lY-*+aun?8AjuupVB<x3F%GwA3Fsj$;Mtt#dLU9Sy~*)F024miPnLpr_%L+-a$g z&|g@CdXqe9sXrkNMfb>jY>Zp;B-2t~uZ!_Q<-BRBKlgV*BcF&haUIsiBj~9pkS}!D z3JqWkdf!5<j-O%!yb!O~%Ac0{8_+)3i1w*yU|W;1;WXNDr2=8#o>+(aWVFL~unHbU zcYW@Hp@XZiKK0ws`{$v7e~gv!5*lEILZP4QupjmDXg|sQ6pTDW;SfL_Y)buR^uhUP zN88Z=PNDY~DH1wpgI*tnW@t{V??9LE44U#Qil(Lh1k@fYQ6G-HH<F226x=+YV>ur{ zcYpq3VH4Iuk4q!uGoEOU9@CbXAG@RPhr#H3VSKzk6YXa)dfyiGzP)IFzhdgo|7T*u zf9NsHTs+J)AEr}pjODQ}dcG&113iJ>zc{)Ieet}D4!9LPP5aP*&qXto2oo)c1wH>) zQt*Ke=&`y9eQ+c?gD25}UPX`Py67gf<Bu>8?vL$1qk)`3kM&>Cj3vX&^P=sAG3kuT zQOJ$8&;XjD9d?Zl!0gmVpeei$eGg1W16zP*<ki@|6@C5-^qcS_`kpw3j&~7#K3gfy zzmXOz6(UPV1E_?4HXCC)c0o7e$mm?O!w=BScmUl)SxSdDVMR2fHKJFe<8(s<>J#hz zOLP96`E4{f;63O}C!-P0KqFoh>#H!G`ewAlLukOq(fj^E`^n1N$t5g_2GST!c_%c0 z-ssZxOHy#45oiYwq3`f%v3(&L;Ogk6=qKo2_y+xE96@*WWi<7f%7#o7L|@4z(0&`B z6YPL4UGjPgMlv8?7=?B;4qfXcx(R2;>uaN%(C2nU51<qIHD14f&NyRw$W&f*=0(wo zmO>_$OjM;{M2+HwR_F|_Lub|>%i=gR<@4h8MQEUF(3!j)-HN7sHyY3n(bMRg@-mva zdgUCK^Vc+0;O}vxUD1JVL?a#)>qF2PjYI<+j}9~yoxpr7hOeNh-i$8YK6J*1(FvW7 z?K!UC74G>jM!_4dMQ73j{Uca^?2d!b<FytI;1leD`>`TcD<3vnH}rSFNc41!K{NCO zI*}RC+31^eKBoTp{{<9G)heu%M&#%~$0~%5&Y?5TS}_D#1f6MlwBu%I##&)&bH)1g z=)`V9GcgRE*x1-Uz9Q$pEe(@t(9h71Oktv!K_FM-S?ZrxPD^wk<gHcG662}ote%#* z1s}&Q_$%(?{zf&@5}$g#R$5{eeuK+tpHe%Vg1U9X51LMB=7!WwhSWVtLk${MppouJ zclR-@jOWprm8lobcNKId&CoS%iLJ07HpB(!M7~0g-(|c4i`5VPG)0&C+9U<nqFeO( zXs_sv(SFgJqqjtFiw=w4iA*>#GS){&?}?6$j*BKA{C|b$#OPzuDbXj;j;F`^GtpVG zeRgy%nyKeweMxj_ba`||kbnM<f}3p>*2MSF)c%6*;*;nm%FrMjx4dY3xma(6RjGHt z@^}x{#yQa)=vx03ua~|ud@EX|<ope!;4hLSdgIdQZmdB4H}nNmv|-pQjj$Z`p6EyC zK6DSvM&FcgqQ`X)8pv^UFBNSRPDvH?nAX9{p8rM^+<Z5qo8?LLqp}p8>AUEwcn|vK z`WZdfXV8z$pXf2nepUF@n+JWqJ9?~dMVI7Ww4VuR#-GDvR|<<L_-Z_d?%Ilt<BvtO zJ|4Zk7@x%bcs<_QBn0pd`o`Ohc6>OtpF%T|)-(iM1_w~DfS#5~O*#L!QP@s{YgoNm z_|e!Cn^K>Gz5zePc37l&Na+BaLVY^6!J=1(z0(gHP@fj-?_)LUr((TWi*UUyHlqE3 z7My=K-C7!)!C~}Vo<~!d)-t>>3Sk%Owb6hdLOb{gUE`9i!qRlYfz)q6*Z3{;&AAcn z{}c3^@guqvza`@h*;}Wj{#A-%=;rBz-Y^>76O+-77NKju1`Y6Sbd7hRFRpK}10F{+ zQTLj(L^=*Z_s(Q=PdyV&E~Vh^-55Q99=AU*9n;!`&2t61*=nFm)e>FnJFpp!Mf+Kc z{_@#_26ig?Z#4I{Av2|s`}yZTD7ZUYqLFn(Q#BB4;TUvDmY|tf9qYT$WB4T+*m<mo zIohVB{*tK<`jNU5o%y5aaeWF6@HI^R^Zy@HF!Iw_4|B8&H#SG#3;obkPeKEk9bJS5 z{2H42575kgj!x)%bRx&2m(b_)w-1)Wa-RRn6x<XY&^Opk=!}wR2eZ(<usr%cI-{@g zDm;WOu~>)TjcCBnqXWK<2J{Y^fe+9Z+hI(aiYy(&SFQq9quv>PW8D{>f^NEbSOOQK z0l$Z4Zg;Hzf(HB#`g<U6rx18i^bJ}IJr&oXd#7io`1^kl4Mui5n!+h)#LuCbScpEb z7M;=i=l~z1dt@(G!L-gHfNEHsdJC+IccRZdhi2|2bT7Tyne*=e+i1}J@xlpofXrRO z1G&)-ilBj%L$B9FkL#7_@$7>3(+_>~jYgk)Dqf$9Zpvlo5^YIRa1-sr7WiwdSG_Jo z*aA)UjnO;N6hDNfekPi+RcOXGp!aV_2ilL`e-@iy=C0v-OLR{qdr&Y{x1*6iho<sX zycPGx>y5gF2M41Aj==^v5q*QMNB7b(^fYAb9x|67%|Hn>z>4V1Ya@Xs6Rj!O;SFfY z2BDi}0{W3yfWB&f#HLuRN7$@4U=QjK;x)Jj>tn&|(-PgV9s2xStc%}bC(Lz2cwzOy z8vg!&j)EEZ06k8pu_0FO89E+-HK@OgzU%j3I{t^=m)<LM*c)BKXVE~uM6YM-9o{P~ z(D%vR=tpZF`fpPwexTqCD)b368-@n*4BEjiOvl8HX{mpjy&Sfr+8cf2%|!#;j0SiD z%~Z+0p}jYHN*+a*Y%QkaFPJp7*>4JedDJR;H#&pGXdwI10rK?=?}z5-nh!%~JR2S0 zYaED~`-i}Xpuc)wMDO2%?yb}4(i9!Q`FEfj2ZY`E6gq>Q=mUSF*DKu|X51HTpN}1J z7dq2I1H%Nmp_zOHo!EAC#{c4#SZ`1WbQn6JIfIg6b9@*toJUh$@s`lu4}CFBM>~2Q z>){bBkA(+^fE%Nm>~{2+&Bw<0HJX8Zw}!y$qx}uS%J^`SLT3ugu|58Yz47YX(o%oF zKO1{e{~52xW<x^zGtnQ>%~WS-czz5T=w>vNzoRdv^25S_^{^22zUV7GIf{bka|{;6 zhtcyn7jxrEw1aoiclS=rgnQ8YzKqw8V=n6F(adDLJ)DZl=&`;Pz5WRL3Z9O6J^ynk z*wHfdmHJ-1;R7_nPtXp&Kpse(j$Xz()brdCuD3vE-VY6YMsy+iCVU<J7JP)hInUxi z&ws8v!`E&EI@1X_7@tDd>KqzKzTu&xBIsAJHri1~^tmBe5XYczx~b@dW<}?t8CZ-i z!5X~E^S_;fkzd9dSbs$5U?94A?uhlL&<^LIDPD*!*|u2!4%4ashh;H+WC*M!I&fF? z<JB)Z43l<nFNGoaB>FM>J>HOgR7hoE^uhAz$E7y96s=;tJG!QW(ffvDHM}2FGmfr_ zZbJ9m$D=s^cK8(yrtCP{(K#%K|DZE1H9B<E63s{#G}WWgjvhtV_-S<D<>(&RhxUIM zo#^lAlIFZCWT@I*oPRf0M;cs{q0tA?_8Dl(SD~BqZRF@DcA){+xF?+ZhUk66(11sy zd*fL&ur+8PyU>8YLnr!kl7bzbK_k8p&3bQmpfLK5uZ+&P3;NS+5c=HRvHd};O8pr$ zbMIkGJctHRdQ5n(A$pA4p%YAAN5Prj85<r(*X%{~Gr9u1;6*gR4r4<Hz0t4c05qU! z=qZ?wb#X=XAliSP`@-|(qjfQ(=f4F7AG`*uU=J*U58z;&i5u`dUWISoACBV*G&ASW znHL=w-i)oV0`(baU~gkf+<`7hw(;RjSOLp<{yS4>&V`X^hp%Bx+>5@;6Ay&zP0`IW z4o%%$^uD*yO#Fnt^YcC!-h3U<`r~LnThNctMXZl?A7Zn5{%@m@T05*o{XI;_U(twj zOb8uSLVrLEL<gRXzAxTFGj{|HEGL`VfU2NteFHkNo6t-@f*#*zFzF31QSjU^LpRGN z^tgPDzDQ1EBh2$~uq`^X39<f8^elP`syq_j19i~;o1sg34f^Kni%x9JBb<L5X3&sI zJ^CYZFZv=miyoUxXa{*FhRswFok<h)7<E98RS$HN_K)>D(akqDwm*UPI}h#mm5I#E z2iDVIO17iB|10c*N6>R$XHrP*HE5;=qQ`M8rglI2{Cq5qE79k+qk$ekGkY8zIPqwB zu0WE40hC8mUN>IofIiq4Gvn=ODo3Fi8jC~lS@cv~#H+EvW8wJSgPwv{umOIIF5!P@ zAdMamOO@<K!PNCZUmSzc8y`b==_Yhd&!G=qKxbHBa#+h6XyEP8y>c_AUM%QLUx=<k z*L(|l-$7(alZi_dOjW@t;X);}-WJ`}H=;A2h^BmMy#8Wz4Y~)mp@Hs>?O&n+9FJZ= zk9p3i;YVu+Z0`A=O2K2a16}(+&=jXl3onYYm`=SN8u>7EX{MlSKL;IXIXc7l&`tMs z^aOf;;)#&Kyy*Q^F!k^MG@;-PozT?wMLW6|z44jo%h7dcW<Ek^d<M<TU+5;x`D6&J zB)Ye1p!YRF_fl(o58Gqv-~Y+@ROlcVdOXt6k4p{ooHs-}7>$12?#Fug0(##b^i+I< z?vXR-z}cpUj21zkFOS||9o;imPUrmBq0of}2cCc~!L)ee9JHfF=q6o_sjnM4<Adn? z<7_nN(_w~{&`j1q18a*0&@Xx``aT){H0R$7lW1_$J%QKY0!+sv=+b0-ChUm<XbS6~ z12;t1x;wfFhhQ%pg{|--^mt~Qk(Rg-TVX$(kE8MLBn1PweP-z3E_BVuqv!WYbbvQ7 z1Ac^NU>CX>PoSyHIV)tSJXWJ#3(dfdX#e-1d+Gr+@HuD(l5bLQfL-XoKcJ~S8_o1= zn0Ya@!-nWmbVFx+6PmeO(SYwmGxh@7?@BblE$F}p(53zzIo8R<e-s=r%X49^OQ4Zf zL1)+oy?!e?v-{D{@M5&1571-y89ISO=yT`L&6<C9cmrOEK7R*R#^<n>=YJE0hBTbS z>R5hGI9^>bH6Xg?i_w|BiVn09YvN~kC0@dcSZ{84t`GX$Bs3#aV|{LP0p?(Q{#!1g z!`0}EXDepHLuiVRqQ~Y`tpA11FflI#l#XViK6+n^*xmtsAM`^rI6SsLjGnStm^9Td zQAo`w-tZZ^R)^8eb_tz9ndif%sfpg-CfW;K<6&sP52G`mikI<eG?3}@!w;PWXl8fL zkH7zar@<L#ej&^t2YPM`VO6Y#rv3)B<DuvbMqnEpkM8F8(ZIe&Gx7_1{~zdk<ezvw z+lz6py~z2`!G$U`xO?lP1NA{8z7w6%187H&V(JBj-ZuvgbVYOvdf(URfCtgk{}0`? zm$3<!UJwHAlceA#8if<_MRZBh7lvKk3=O0U+HrsMSPe!yz8{_WlV~7|WBa?&PtiSb z7<~_%KzIM|(PYV&!pyHhmtYt=vk{nDOEi^JWBoa_qXlTjmSQ9PB(`T<6z<Q7?unvk zfVI*7+hQ&3gzPQ;{XYuM>;*JsFGttJ_RW})_7BkxccL@@5j_QepaT?oIb^Ilx<t*; zemkI>w=4QPVgP!|Zo_oX|0D`7!4h=y?2R5pQ+FPH!6X)kdVVy3l4z!Cqp#-HSRb!N z*Lob9xw+_)E<t}8ZNV$>d#vyIPb>-lvseSHOLZ3dOJzGcgN(0)O`08@Ss`qT<)XvT z<Fp!E;J0YNC6<N>RY&(sbM%ea16_)-nELPkJV3#jPD4}mEV{;v(V4D{zK<@&K6J+W z(Ug9RRq!ynggKUlfr_F1HA6Gi30<lIXr{+3<NSNWWEvcBc632>DH_-+^q9VbZpv+F z2fNYJ@k6|R8qLrJG@vZY!}Z$ez%8&U_ClBF;pNHD@j@Excm>+=S~Q^T@y1Wl08U2# zLhsM;YPc^anu&twOiQ2x)r{@E(M>l1eeOYYoX3(B+$3|*0T#y_R-pl`kM;M_`*udZ zMDPDGdIDYJ^XN=-t_TBMfwnimy4V4m;saO>lj|u|r*H&oW1f{^psUff?-=U?(68Jb z=<a<99cUZ68NWsQDfe3V4cG<mralCR;5Rq|TfUx_xEEL9t)Bn#tHLgyf*zCUvAzP` z#cR+v+g3ES`*9Hd4{yQFtHVDtx*B~SWLp#dCbSA(OZ_fviR<wi{5#g0z2TdX^Y;)1 z*X9*;(`>^!coLmy={Lil4_aa`>Lbu&^kHoO1!qt%yfy@|EV={h(S95s!V>Gk*K{sc zrv4t*^86p6U~2Qf75>oK4t?-BbfBHs2T!8A_S(0@i{@6eJ{Q~IdaQw$upw4mAC_hy zHm1G|)A2Bxi45;>{%vSW!5I%l5B6NN<9Y9e|JnT=^sANF5Pr=z#oko!MKiV=Z^A#( zQ_y{5_%`%GkMBd#$>^q?f$8|dM$W&xa}y2zxZI2W0pcXOxiW7G9h5>JtQ6~Y(R1E3 z+8%wbCwfXoqQ`4I`hIybIzP6rK=0e=-*njV&e*UIeS;lBH{U6=gUiv}o5NC-Lf`d0 z(2gEQ@0*D&aS=N6Bj~0*iB9ytSTFQ`xL!F)!52bZbjD54uUvOb$J^1LV$;xb`wCXX z!)V7@w}hFNK%c9D2HpmpNKdSZgVArv40OVC(4|VgOu>O)MN_r~J#Kr^6#s(G@K3bE zw5_3oyy!qB&|_B}y}uJW^FC-mw_pVvk3PQ;9r$%*++<>1C?q~Xcl!}EfGi(`H7$h( zb|v~oY=_REEBfy5iw<~4^j`GXPKfnInEHsJd*ppIumh=f&fnR1A=9?-*K4KG0o$N2 zq+aOS-HoPvGCJV%vAzV;sjrV7KsWP+STFct$V>zDc(#i5k(k}{|3JL(7}ll!COU(o z=uES250Mu@UsTmG9Xp^)a0mKAc>oP;F}kF$V@CWC-2*$(O?n>P3z<LS{QHW`Nx^}- zqp9kLW?(eB6cb~8E;`_fSl@sy!KdgZ{vKW1pJV+LrUpban0ZGSrvy4q#T}e~Uo4Gj zsDt;S5x){|d==dj>(I@0AhsXF2Gq}@Z@!8<(^CIU=sU0*^_|!di|-0QPP?H2PC=J& zMyxN{l?<EebsCKPElj-_&<yNEGw>}M@mVz0nLZ9nR0DmkE4sUTp&7aro%t9%!W;Eb zbn_1VG`v|yq5V%!QYc5^C3FcsKqLJW-2-2vYkDD?@w2eDxzWv80S&k%zJ#6808XI+ zUq;^_1@?p`sEPHdx5nm}981AprR&gR@df(8ujskX^m%BnfYzI#=eZxc%O61pnjf#P zMl-PoP4)Na#Ll7<xrpAM`HR$&CKJUecta&L)pgOCwL>#87=2(kx~m_K&cRC5SH<gJ zp@IF1W+2braDQ3!`G$B6c0?yS9SiyWUrNCTHlV58jRtf84d5qq;FIVpIOD#Mi5BSf zo6+mT&^1qDRh*9Qjd#$se;+*sJJ8G=#MFQP_e{Ky_GOq+5%lxh9KEq0I)hQsNoa?2 z(EApm0c=KR_7!?8PoZzTf6>5-d=);|718If!(`4hb}fY)@s_XC5+}H@aew&tbe10o zKOnMw8~$L?6-RUZX&jD;@4|1q5ol(9ME6LkgW<R~!%WmWpqaQ1&2&$!hC>d<-~Tgc zXhp+I*bt9Ii+>*??S^*H2i;sZ$NC6#P47hqdIx>8Z9<oD8@jnaLo<0I)-R(=UGj%` z{wx0wHeYS5&xLEzH5`ZT^2KNXo6wYgh^_H^G?nRx!k=oZpu4;`x@3dU7uOgxpo!@7 zPoYb;G#Lw<(6#$A)=x$={upLZ0zDm#&<DH3`mJby<Iw@1MK{^<=q7YY_M-2T-_Q&d zJ{<N)vSch&$8;_<MZZ%0upCZB*K8%4k&WnP`WfB*f1;VWjLt0ckq|%`^uGF75nH2g zykY3(9FLX!{!fbyZ=eHgMN@bJJ<orlDJ=0*m|^8;(`Z*r=lWpu#q}sI!iCrjTOAGG zkO?><jlW+&_gKE4{Z-8QZ%4u1`v~^IO;{I;98XK^$M!f9(|-vwc^d8LE%dWm{(lTW zy*rMgKITMP;yOHr_S4{G`1L#l4R8_G!;P5w-~Z20s7ynZQ{i`dH#EX&*aWwt9bH1- z*|koGuikL1Mg0wQ)BcE8VxcqPG<8I;KZ#~yLu~&W?XSsM&VL&U!zuXS8+a8SkM;C( z;m?G<(2gFDzJ+#h6urO5Z{aiB6|GOkI=BUW?p&;={~rFx)*WqM_dDmm5rv;<aHb{y z2!Celg|(@_fYos~x+(ug2d?;Mus3>rD%#Im=zXWq6qh(3GTQ~+TVv4c3$Z=!KA#M` zyzpP)jnoL!xo``*t0zULp~q$hdJN}8U&nIPw?&Vk$205SVF}7$G3o=+7tuI$GtZ9o z#YqajK(@pSJJA__g+`k7Lj2$L&^O;bnELFZZ?O63@mz+!VBSFk*oJP-Z_xm<{S(^D zp{c(LecvR9#tTVwcg{xN&2ONa@*p~Jri&r+0%*Wx(N}6^^m>zcy*-+_p6EI6hxu_h zn!yQZz>kLZWa2przPXm6k#9gB+=~uy1nuBYbeCtn6zWYe5A`nSX6qN*pF;avh<+2+ zqQ58JLGS+(?f)lC{r5k9r(k3k(HqnL4Vfs7zJRVmPe*@rch5pox*J`pW9X06qL;(W zo1)iSM{h!3X!pkJ6VRo53{&6#85CTL#b|0apflf%&g2lfG{2+og*^X-8C;7F)Dztk zBhk${1^r#H0G;V3wBJwBrTYQB?`KT<vA7g($j=}C9q0;l;O1!RyQ3Wpj_vox_9^Jh zpGUt1o6*2`pqueq^xc09UD}*!;l3--3{+3c5dQq%hz3*C8C{BA=yB<X{)uNC`oJ9Y zzQt&OuSd5=ze4Z(6<zB;(ZDig2>s?pCtMJ{UL`{^bl8XnQ`HJnGe%Q57^~n!w4;@1 zCf1?5d^<Ye?&twD@T2IGq-6{<FNrQ)J@owFj%H|Vl7cCF1P$QXcwq@T!0K3kJGvE9 zdjp-xAv7a@pnK>tx`ahCh5qWI*IS|2JE0RCjCC+MhJq0-MbGhC<PR)~t=JboL<cIH zIds$jM^L{StK)0Y1DHy6mJF#)nH#NFLXTl>bV3c#{+lAFEt$BQf}5i+j^;CZ7n+G9 zSu>=5x%`ICxIng$`ikf=ZHVrb9_T=QqJz-X-hobNOmq@D@C<bApT$m&yqLm38qQ!7 z?3O)4VpgjWcdp$r{QmxH`+VHI>H0S^r?n`Tr(T_!b?VlvQ$M|K<0f_Lt-o9;t<Bx* 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 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 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 zcmZVH1(;RU|Ni|wLw9!#9W%rLLw9#~r!<n%Yy{~LB%}mM=@2BOK}t$Qq(PAG7Nq{~ z`>fCW9<T4SuWS2SYwgvs&l$>_mts%;E4F_%anzX}SC5#UmlnS&?|G%;c;3S?O7*<E zn>_C(-ot{yo_BJy=k+EYWvk~k!v0tlkK@iD&r80|^VSnTv)%I+;HaNHZ#L<fc6c65 zcsq7Fe{uTW2}}4B<CEc<`50pn|6s=0<>HCVG?;+rS<MJk`HB{AfT@Ugz+^Za)8PzD z{}FR|K0POpkO!}jj(X8|yM|&S6X7K`)0??4HR**gI@U#Xv<W7{b{GZwVND!}%6|xp z;&oJq((IwLS;-krAcBMe`#mo+uEmsi8bk2@{^@h0r1qJ7FX;i#lPS#9W;!#(%xq>e zbE0NH4As{NjEbf0c?FACws;MT*S2_r1I&~PG`55mmZ7!9J6ODv#k*VlbBp)0_yCI! zwYYEbuPi<mqtMPIOP^}#(+{vx8u@HXm}eQjxA+o^udw)Pi*K;_CW~*g_zsKjwfF&x zAF=o`i~nZvGm$+#ZwZ$$3LW|j)v=qFe#hbuE&jyfFU^0<f6Wi3_lv71iW%LEg=whY zk4qp5fgJWA%*<=%HzUj<W^uEWS=OvzRz}rZ&EmCCd!??$n>l^2r6sg6+nb-6UCi$0 z=Vl*N1O3fG<}mY1b2OGE-*}9M$510bjrDa>9}%cdLfM1v<W0sH#AjesoR4Z~5$Yr^ zLycrB#>2gs1W#K02Bs(e6m{Sd9P+%3m;*zw8m7Z;n40#z@dR{qmtqS18P&tzQSX|^ zsG}b9u&XdLDt`$~j`hqgmOjFqWv)TJiuR)#K7)G4Jwrb_fuJL9<S{V|@dOqxh#Glu zR0m3<UWUyuE_Ok^%f7JqNL0mNV@zC#(QpN-+&WZ!yD$&#JHq_y#qpGcnD{TMK$N4r zATbuIKw6BAA=m&zQSY`9m>0KTZoF+K{goFf@p9M)2VpgQh-#<sF}K8Jjxqo0aTO9Y zMNLp6>SFQ!sF9CBb!-vV#UHQ)zD3Pgq2r!c2Ag9ooR1pe1FV6mPk3G~?1bU?4XT5` z_yqD3c!$cE=cMPg#vxc3FJWm+a*9!7eH?*4mPGG2mtG20aaW7a$DG8Epc;OTc`@B- zH*+<y2yuTD0X^7>@$n(X!*>`9WBu;dIti)+A*jt+12v_cu_bQ8e3<BrYp@(@Z}mV8 zsGr6EK(%uT6VbkR-xA(q5+20)!!?)z6A%wW6)1rfu{svVX{gh20#)t~CdPM|6yu+D z1IdiBiHD<(a|uf?i*a@SYZK6>Xo1Su5i?;g)EZAmEx~W7<CE}DH`RHtAn`Vs3}>Qd zW;N>kA4bi<ZDge0BTR^&P#sQqj{LOmWg(!RmqAT=eblCFY4L%m%{LO`;y8=XM7>z% zp~~&D_+iw{-9t6_7PX|Y&$|Jp#5lw=qpvB+OF#t*VhpT+YN!TkCYoY19E$4sIaIy} z<_pxw-(dz!alyUF3ZrJUHmY1Ri}$qnpbN~udNP>=jc^X8#f2Eyl&A_GqNeg6)Y^VT z%~+C)ZmP4PI$RM`U_H!^T~Q5xW9iFL<#wZ%{PacUUo&u#1XXYiHL{1O4!yMazo<<Z ze96sJB2)z#&0Ls@cmdQ@*Tgi~95u58P)jiu)q&aOYM+1_+>K@M5Jq5(%kI5U61B;C zq0*OO;P{|s?mnucuTh)qJtoKaS6qWxQ5`E})<Jc!D{27#Kmw}ZOVrekwfKBg#>J=} zZ$MRaz`TOW{|{>S$Gz(EXF{dtLzSzDTDm3{Z;k3;AEaI18&5z}^fhWG7NXYt2h`I1 zh-zRfszWDGBfo^&^><Jse}-DZDA!#1gs6toU<hWyv{)XMzfB<S(-V8}HLAijsHxe4 z>d+ociHA`I|1zJWHe1xcT)woZa#<{%+u{+Zj+8=e#)_zVn_?oLKwAP@)4r%pG7{6^ zbX0-$sD=-iXU#jP4!=dsOqA<xY7?RI=Rnn040B_3EP{iuAO47bV*=T4xHp@RD)1eu z;dQ8v?MF@RX;j5m?fFyGQbqmSnE<tvsZnd63sql9EQ+=4`8ZTPv;SuO(-T-_2}e<D zbO~GF8_bRkZ@P+yp&Fcw8F4m-;LoTIUqbDTC#WfYhnk@%x7^aiLk%c7M#ZeRn13bY zB0&X<qIPdZR1ce>M$#S2qi-HSRUG5CE0+kP5l@F2P-fIX%3&C`M!nD`VL{x98rU<R zKxqQ0?zjg{F&FVESOT|WIKIa0nB%Tn!#b!n9gmrDD~8}D%!2Px<ucxL@%pHS2cqg( zi#gCgOCU9YkEjBv?z_+V>ZpzkKsB@&^#b}0RWSMk_XQ&_h7xaznQ%0!p%qvNuV7(J z`p|tg)WAH%yCXB=d-Dirw;#hWyo2gU(nqd9CCo<rGgQNqu>fwtta#tj6FznwDT=DE zBj(00Q3F|zIq@QfV$>&!v;O%AXbPL5Mlc*Tg^MsR9zr$r8XI8Rr>>*DQER*aLvROb zYA;(n>NEF^C@ZSoMyLS}LgibIS#<tS63_@=pc+j5+;yND>ezga>hVfc!LyhjKcFhi z_rg7IiK=J3xdAnhbEuhnZ}F@z-HcR2UsKYbfZpv3?ZI|b#WzvAIngUuK|Zr7>iI|v z$MvY0xQ^<;N7NfL>uWc&rLYw7c32V@VHLdgn)xq7Ajd!Mcy+<*#Mfd4e2bN^)EnMn zI2u*aUeua?LUkn9TX*~#V{GCrQSXP&7#}BKbew~6@Ow;%Yu+;di3sc>L7u{Rc-?%0 zF^GS_WEkyV_u@!{svrd8VmPW?Db$SBzyjC})$l@0g3D3)ezx=@J^}UclqFonsKjrf z8n}<D@Es<{)bHGjCmc1>;;8(UP$R3339zxnJE1z*7d2BOFeR=<?Fs)7fmj5dU`%|A z>S^$Mw|2=<4Hv`8SQj-@b5ISgMwQ=+O>iHoL#aQwPsa?Xcwy9lN}$Tu#Kb!PtqG{2 zJ}$u<j;e4P>XkYV)v-mWe5+71wgofbLCk`;P-`ChqbnbVdR_=sz7c9ETVopRgo$<j zM_Ixw)YSZlDezbzgXjH?>d<RcMcyaZkyxnoWT>UcfSRdX*bvL2*8W>$q}~ElzKy6o zuv2lLz^??fMrTnYyn$))F)CvmFDTISRHz0sVkm~9$~8t++yPbobJR$Opr(8js^c>( z{X5hWFGF8F+fG0g9mf#7fGYSes=+uxL4n<$3^m1}s0M1H8f=J~xwe=A2ctIOT-1!L zvgi9Oei5|?o&^Q@fk2etpum(TLsgs`RY3%*fr^+nh|Op5FQWtnK4d1Nrg%T5!lRfJ z|3(e$4Qj8%iRuQD8dZN5)Qp8i^<6`SNzfEkM$JSWR0S<jOVA6|q2ZQ31+x)fgvx&e z)8ScE{uh=W6wTEeA2sDEP%{*Y%3s|lP?SIy)C*<_s)FsPV{_QjkE53425RbFpr$rj zbk{&yR0p%7W+Va&V+kyT{ZJiUjXG7^Fg^Oa322J1pr+)WJ$Q*a1xaEA1wM2_aXaz) zs40yXGbnJ3(qePsMQ}3CK+R;PSk6$4LcAcV14U2`S9H&PuLFU4B=o@PxEFI_gV=7w zKB~u4Q6ry)A-Do{j*p@~UT<MZj2R~=@II)7YN#7(MkioCoQ<04qnJ(S{~CduBt(zv z)-)f65O0hHaUkmRe=VwGXHZl7(JU0t%~Vg+nvSvfQq+rSCu*-;N7WZIzFU%#7(x49 zKLv0Vs)v7J7$!>K8Z3p`iFdL1G}Op<qTUndQ3H5|>Oh8sL4kLBNmRMdFa)Qdj_G>T zQXfG-H-R$*v}uA8xq>lKYaDKtK`lXT)KoS^ZN~QYydP>xN1^JQgBtl^R0kfSzF{Rz z?9z*%+H0AZ^RE|72NHDLdZK#vCF-0`LY?Os_IxF(p`DigJ8HytP@6Sc5_itiq3X$w zIu-d*9WQ6`I;eWvB;ovP^YkY{Bc5#;e?WEMCsYNyP(40@s`wAgh}TfNIw+|-Me$Js zN{!mASy0alp~{s<&0H;1d#!x}YM>{ohr_WPPC^wpg=+XBs>182H{A==2;wDkGnWZf zaRjR3N~rfkLsYr$sQQMZW_moTJ%2s{o&Qy+o^C-^d;rz4^Qeq>Q7@#|<~vl!yyR}` zV_++y8Bm*eIBLz;qfW~i)FzFS!tJpLWN-LhD*`Go2DNFnqBh%QREKV$UMNpcOY#P_ z)?Uh>z_;L(7*4c0s)NH&`9`9aVghQ{&p^%4TGR~f4y1GbP7qLqw^0p!M9oNyRBnVx zP*a{7^+G9#dY9Kn%}^&)g#%E>atvz57NZ*6fZ1>#s)Kh?OY#U~>HL2ppaQW{y9QIB zW*|MP;w-4=1yCa@i-8ei0pi0j3^!t4yo$Loej2w)OQ6=i6>4d_pxzt9(bvf55zw*P zgc|u#)YP9vb>IeSGd)A~JZ4%q^3<q~<wBJ&f*NrxRJqou`g)=o9&CPX&zGj<{Hvi& zmarEy5I=>Q+9#+@_Q~SW)42+hqsnDMjVv!JUoq4amqqRJN;n0ZqGs+cYKfnt2J$W) z=U+XHm)>Pah5ES6Z1HBO&C~(4iMpdYHX1c^Gf}&Gt)-tsb?lDCU!od}n!(i*&rF8u zP&%K0dY&EC<2<NMRu(mqHmDJHM0KPWYKjM<UO?kf6|F|){|Qy!&!`UWLyhzTs^bq( z<=>(5`*B0u+9g7*S$5QeLa2(0qY9L>^!jEK)JR)mKJ1FxBlA!l{t?yiF4Sf|g~50h zH6!Pd`hD*@0d1bU_TVFGQ^m;WI+6@K6HkpbaTJ!p(^wo6XL2u?T3D9&7%Y!RP%oso znS;Fc*bOzHQ|6x-PoMu+2x!wiz|<Hgi~CH-hC26EQ8UmUHG+Pq85)3Ef}yDL3s6(M z8?_`SQRUC0-WSg;J$lw4FNAnPOiue=H~~#j6;wmDP*d01;=Rq0sHvTf+O!KSz6y1` zenOS|6*a||QG4bVYN;M!R{R&W)FIh8|0<Z5fHq47)Ec%xHPjbX(Qs79#-f&HHtIAi zN6pwC)W|QQD!z}Jk+-O&O_kksBrhsoVN|}#**X7eun`HWs0V5@jYEBSY{wA1f?4n* z=Elr9-1EAq^#0~t)QI<>X6P_#DbAq2CtN|jqTivGCPhx)jXXT3Thpqjsj6l1<`{)| z8`Mm6KpoQ_sF968?S)yW8Jmadz;e`*u0w6Q&8YG_P!0crn$fF10rm6=s;BQzQyeXq z>qrt*#t_uhg`+Aei<-G=sPb(sy$7meUzn5Z`C<%o2sMDss1EywEyM4q2Ckxd{20~n zE6jt@L*3LzU?}nSm<zu~&A`w22kt@DGb7BMj-{B1_#xEhyobvF4jBmhKeyWqu~45% zDN!SeKxHgz@k*#oS`W2pyJ8{qQO9eG`73H<S5YIrhg#AnsE)ly4KQvVb%6Gh5YU>W zMKxRqwL8mUHmr+Unt`YaN1EeM4NXDK)ErbtR-s0^8`aQnsB-5}^<S~)_b{o>|2qQN zF=1X;un2|_uZBIb8){82qB`~z)$k`&#j*3bktIYOyAag#GN_JJN6lDE)Y|tkM`Pgp z&nBQvwHCE|x1f&8ZqzxyjQUV|g*pvM!`(<yqVi`!H5i7fr?91$L6xh5+C!ZzeHLny zF9_%StARBnsD}qpYkm>K@fzwCn<&3)r~qn;i=(EtHmc!9W?M_|j;g0GYR?QrjeII< zGcK|Cq5PbGZHfydsK7ncW_gU7+IOfm3o78A$3rbeVpPRBFa*n>%C$9nqV~)X)RK)x z)jtC@Lvzf<J^_8Gtj7Gf4z(GtV`+ScrLcHG*O9@f3dW#D^fhWm7Ng#5TQC%V$1?a4 z3u5UAH}Za{__wHm`Ns*UXXjBpzJeP09ZP>?>CaIG-eV<<Stuy*+wrwAEAg3F19zZK zL(Ia?RHzQ-LcOp`q1tPR>;d0vMnEI#>=L}*s1Eq3r5TNy!kMVew-hyFD^Po2HR`?b zBWeJrP@C=os>5&0s6||d5~7wWBgWDB&qF}FxR_batcGf^9;)I-W*bz8yIQ<2s-a;P zACEPOPq*~zs7?IHo+l{k@~6VU@Bd{bpv_bmHR9T+23w;V>VleqKBy6YiON3?wfny} zS7YG#qGoV6D*rF2dXHfUUb5%!(bt*;7jq*`g{mMOsz6rM$Rbb;l|^-^1_sv9;>}PU zZjZ{>1J&?AOZQO&7?0W;vn{@|80TM`V;c#2QyoWbrmL6}qZW6c^LbEjwt5(feNel9 z0jj}`sET)@I(Py#fIm_7-A3(+xFy_+Clm`1FIs~0pP4`p5;UdLP*b-Od*XWRi0MlP z@yo0HIaX|s_pmwEEM@so16hxn!2_rP9Yb~G3aZ{msE)os&0ti&w96O^OOTKTn_&~I zjhnC%Mk(XIAyva-#5<bbqsm>vBABwQvo3026Hqg-4z&sY!0h-M^^MC<U(UTailQDg z#A-MUb*zq{X66>^GvNd36`H1ekT)Dlp<Y<KQ2EZGo<G4>n7D#V?~Teg9<`K9kR|rL z0|Zpy5r$#HitblLOJZ)~15lq4%TOcVZSl9LktMF=_DT`d8?YVfd%<v2LqDN9eik*r z7nl#zRMre}{%a6W&w8O6oPhc;+J;&11a1!E`#Y*5KU8&7yce}e-(n8TTrDW@n^rYY z9h-(#a4Tx9z3OfzqM<fvIt={$pN)WaaX!>>ERNdU^-v9VM0IGmrB6pyupD*l)}xNw zcGPj*i>mK9>ci@sr9VP##<!??W7XjN>s6SEfC}a{i=)yjqZ(>}YN#b@6Lms0Fy7K< zpz<%U^ws7T%tQJ<)J#4_%}lbIu6*&DoPRz9yh<c!Z5p5&9Ey5jj7If%hQ*g+4C0$G z8ty<fybo2+NmR!!Tl@~{xV^G?^jdC@Bt`AHe6@Tx^7<qwV{23ey-+hU1l7=3R0k)c zI`9*!!CmGtRK5$S^4C!H-M93277wcJ$|XiU5Ag}8K)6`~)o^80L-kQ3Y>wIkolymc zp~_7`<(q?=xkadat5Bz5532kn)DqrB?Um;i_umrGn=48kx9L)#UJSWVo3Wy$w?J*C z&rubOMm0PM)!`YaP4&H{Z%1`#ABNzss2O^I>d-T!KHvLDKx>_}t{YiqREB~UFN-0> z>!I@XMRjZ>>J>W&wMSN?I<x~dLkCbZ@dxTfb`Les==EIw)EM~vzgz?~l_gOh5>-&U zwG(E?NvIKSMvZ(gYHAOgf1@h?gz7+&`fdPeQ2BD8I#L0(>6)VI8;WUp|9ImFXsVW> zMz{|3!q|m6Zu?PdcM~;*kFg}aM3u|mz&$UH+LRShGf*EjlO0eq)Eiarm#B8eps$QG z320=?Q8Td?Rd5?>L<dm~pFn*hI%DbQP!(N6m3xe;@2wfTp-WGLMM=+w`jXoQRnPQ> zoPUkrTg&)8Y6(`Ors!8o{}VNJ*D(~MHVO*-Ie~mwj`&d2^F5diZ=f28)!5BYJXFV$ zTRgj&uQBIeQ&N-!jkFYMQ&mDuc@xx>wzKqJs1c8}_%!TId<kl)k~MLsr!Z>9>Y+Y{ zo1i*46hm+!>ceTTPe4=m7iuORpho@@)d8<*khdn7pYc#jw6(eW5ZR6D$e*ZVcMFyO zBWfTqTex}>qROR3eF|nqwNuvgs}azM>!T{{h#E;h)TWt*+P%wB745*Ua6hW!m0P+Q zs)srSZBX^}!|XT;i{olkJ$F#~-echWCv4?LkPVfgH0tBH0qUIhwD@S$rd)`sU=3=- zdr?dDtHsZwMtB3Y<_}Oa`re+$Z0*t$V{(1|XC|PL6+<;p7B%u(W-HXD?1`GG$*37x zh#KiWRL6fqmA{4hqVgP-KX)5fUujfFYNI;d9AoJGcT@m-phngowK>LP2(Cnp=vRAw z2KAlq4wk|!ZCyv&qw48{+H8YS<-S90#^tEZz6RCtjp%FY_7YIfPNKfUT||xKIcnse zP)m}&ohw)bRjx8><PA~zyP^g#0QCiCBC5d!sCt)J`VQ3IIoXc$uZAy>pn|th@wcem z8m+zSd1m~Fcuvd{#LsRWg1mji>vRnAHe%w>g1j=M|AOUJuCx2K;Huc3_(bf4Pp~#N z?h@qw7=IVveV2Png5K5nySgc?g_^QPW((AmwZjnXjT*r>m=(Xna6Eu{@D*w)vUGFx zgrV~1M;+IasF`cz6VT@ChFa4;s3}{I+9aFJ-KY*7vF9gIQ+@{3&|j$Ce%I39qCT#p zcX!XznpsfkVVDE`as)Kh-B8DEJgUO)QERpWbKzc8gAeTa8&t==9&QF=phlP*)sZ5o z{8dr)HA0=LR;YYEk<ICQg9s?&NYoU6Z7x7nv=+75cB3jdjyhJCQRN<^%DqG7i`~=Z zONn}(!;C=ft#YV(YhmEm|5^tEe6>PNO>flNj73fPd{o7YQ9a*)+ABLyUo6g{X6_|w zCgXhW^5w)3;ssG1Z-_dM9Z@sa69a$#r#}HTI0AKSW}+Hgf$H%V)Th~gOFx7<mVcls zeqrfRdb#vOsB-yG9V&rpxEboJU3=8t8jijy7)L-2&qmF_YSeMuhid37X2X}L_duH7 z?zhz<P`myY)C=o1^3wB?_X+a4691yF`=W9k^%;<%pNlugCdB9T<NWIj!E+LR!mRz> zPrsM21Mxy%xUXXKFg+FT#hj#H8xZ8Z#8?B}IsS;{h}Rk9eukWm1&HrO9nY7jFCeK0 zyYCMTP`iJ`V9viXtR$fzo<fZ%>Jay{U?I#)yaVc7&p=gt0M(IyES_<w%ij<~Ngsu( zZ#^pCP0WY!hq>RZDve>p2l$q-6xG0GR0rY=cLhqKD(s2s@m$P>2T&C}Ms+9+15pFD zQRPQqcKi|5fs3emqK*g({K@KksCxX#1acGDhU&m=)LJF`(iN<Ws%QwR14~f(kE1I1 z*Pdq`>1L`XD*rIl(k?@tqVuR-e-$<3w~%i}y#GhJ&6OAR25f}&aXM=A-NB3){VVq? zAvv%*@y}7mZwD&>d2EJZql3JqI2N_*!^XHbY6Qk6UJTWtiWps=|J4cT4OI{MrsXw5 zy&zg*BJ7De-y=|O#Bc5SdV9VX)sf#V{sh%P&{$V425RK#QR!Jxr!G`+ef}3Gpq`aQ zO>qqj!T!h;d9zS&vY$~MIE>1F&Ag8qz$;XTKcLQif^lvjxy@3jnXHXTus8ZDFq(kQ z|F@`ut5734f@<g%YAT<iKAhfK{3B|nVvKjM;FPF**-;(JhjFloSphWzbu8X!Jm+5{ zYe$0Kc%P#>G7R-jpK30|Sj5+%mSP)f3Qu8RCQvhT-_nC8xblfn9nOe)v1LQGR{~YO z>I9C3dfJo(^{g$b1D#M)G#IsZQ!oT)qK?xR%z}TRHfgkp?s#QEJ+Fgma4_n$Ohx6} zjjHboYUXeH7I=;7NX$vD#|csKWT=@)hnk@<)C?3ub+9gKW;&uq^f_vTKB|M0EPW$} z5Z{NY_XaLP|2_eYc+zB7a3QMVHK@I?7gf<!RF9)faci0k15=CI1KCg=D2(brWz>gS z1559M8o(eNh+}cG&cFAy`xZL|^~yYf${0M=nGm(9(xX0hv!j-(JgP%gQ4KanjjS_j zihH4EZh*zdpgz1NqdN8j#!~w`31|}?LXG5f-~m&Fnwf{F20x*uKH4;QI?|%1zNlFq z)q$F*dK#Lap=M?PD*ss2shEa=@BiNs&{Qt7469Hh+KifseU^U8(l4M!b{jP#uP_59 z`o?u29QC{?YKE$y2G9&O&^Bf_44nTjEMXj~r_;?PSb+E@)E>BlT8g;ST|>!GBT8px zH^c3Dan!)d<8-WI>6cM6aC186Up;+Ff_nN1RbiqT?rU-yRF4ay)~qyYMjD`Is2yqs zKDYFV7)E>!>KoG`RK8zP?VLj`&23b@|IFb0D`W6X_eCN)>P6B7)x%y`4~Jq_JcT+H zuTX29WR{zeG^mQRSUdu?2}_~g0~JvnZ*I@Kpz`<e325y`q1I>#YRXoc>rfv`n@~%$ z#XN-Bg82C#)zJ^%x`txSb|cMz8hIYnk`+h&;86ipe@oN={B{I1<y|eIAFAL`RFB7_ zX6Rc>pNEx*uP~or4&sI81bMtlyw>;+@rQGRysGs4<~;ZN1bG(l-H`OPSRdmp4Dz<J z|Gc&YekCE*q9AW2-ozzTG-a{tdH$s~0<(fy6Sby|%#N1c&m4vt*cfvvY6j<;t1!OK z|Ie0i6!rD^g834)GzpeD^I|CR+Ng?#ApP_vqNaE<szb9-Yr71!G+R)6XFqCB+(mWl z2_~a`?=1mMaf0RUw@{Oy-c)U{2o6SVqD{Dsj7PB)@sX?CZr_K>{}?l3%++qs<T7)c z`OE@lAq@QcA4M&pgjw1wXI3<;pn6^%b$lA4M%2chcS3Edt`_fO@%|PcX7LdgAGezG zuL2V-VY+3QW$^_TUu5x>7GGoW%@*Hk@jVvbk2+1iTKaF6e#YXLEPi!0=U>O`wk6!N z49_h7(&Fze{>kDo*0_<zMwL%&@njZHXYmk==dgIF#S2)xkWWCHsFXb@V-Lz(yt>6} zS-g?i)NEn4HrtsU&CX^w)EAJRsF|5;>Hc&J%rfVg^Ua0kVsn|f!dz{xL+yo)7T<>2 zD?2QH&^%%ubNb#%OE_)*VV*NDnpaQ_{AJ!TADget_gIm9QP#SVR>ge8YhxQ6fwl2E z2EPA?uXAfz1odhxgF22CQ6DZ<QQrePqCTVsqP`(bu=oPhdtn1+#><!oz4h++=0!d4 zjM;Gp>b<fPGwb|cCXf@o4elqQT&NdDU5gJuo$CeWUQ54W@mL$(7m`p^#Z^%6`p%dQ zzeK&TR-k5Zo4E&lHFSu8j^RVpo9rd3#~)BHo}53r%~KjR@>ZzyKB$Jqp~@{nZLU?Q zkLwK<KZvD?A47en#M$KDl&Lmx{#7ss392w0HT9KIug>b&5gTJg+=XQ@%4YYoVg=Nj z@JlR*dvUU!{}kl4#c8O4y)fUQmNLo~_f;<W7S6vu?Q&Z}G1O;3UDQ-{M{SnAs0I$8 zKL4Zh(NzJnm|ajawhlYsMa+$*x4FI00}BwJkNNR8tb<Yf?XIT{%q^&fQvU2JY>rci zk3}_@e21lDVWp!Q+Jm|95r$#Po$kl+il}eZ{ZS3CLgl-HT1r3WF1HqGQRg)jwaX(= z1uCP~axm7!uTe{K1=WG_yIn&=P)oTQ+u>%^45rxQ>Q9fVCpT)T%ONxAdrb&vO};S4 zqcYCNF1QiPV4A(|__RP(@D=KfHWzhFx1)CXS=5KqEmVh|qUwK(TI#s_TzV=D{Q2KZ z1axfjp+0WwU~wFe`YHGzYKm{5UL*<kyBR8r`mR_XwP(7aMmz@9p~<N40W0nKpp zSq#Cb2bgi4|EvV`;>fE6tdBZIEm0$CZ}GmEgZLoS=~#@~RO?U;-avKuBkGGtnqOS` zTo{jdF;u-(P@A|G`Z^xn3Fs%AepnVK;x~B0(%T$#$7q1*V<w)DMeTuA80Y}%eee<0 zK#D^y9)X&nTBwe7L3L!{A<n;c>u?e@^{Y|eWNxB5_7PPu`eC;xGNNXn5Nc{$qn4l- zYL|~gE#)rEf>%(RIrxaHFDYu~(xUcIjw8P7Q7L;+6SZlYq8eyt_C+ntSLPJVMtnAE zM0-#TpG0l8$Ef2KbksGJ3^lM&RQ(mP4%YGsR3)$wwdwAm&Uw~f-S1>{MK!Pv)$?7b zjvPguk~65ibJyZ=kGYOy#1PWUqVlyv?fwC%P5KpT$^3}~G}S+#dcGbtlKqz9hWQb- zwyBT152pgC{7q5m-ObUc`WB$})N;&-yHE{ZLv7OANIu_-a>AY0IH(NCF$B}0c5Nxt z$ZMcR-UKzZ?NB570(IU;p&Fio+6%K#d+Qi#GrqBS@{{h<wminx_x~OQRPjJm1tU=f zCZMKng}KYpe@EqeYQ90Osdvg53)P{-s7;m*mA`<+i=zfs7ZcLH*P4JfQ!muWzSRR< zjhfn>s9k&(Rq-9vo_KE0gMM@6Qls+aL7k>D*a`>Xw|E});neH2d!e1hz|a3tes^n? z3{^oGssp7^Gf>-}cR<b55Y&>4M&+M|>gW>Gh<Bnk@$dFL#Tj=@bD}y{7PU79pW*y# zs;80A9@nGJcalF`2TGu(t|sQihL{USqdK<1o*zUl!3oq1{b}**s1Dvoy>Q;6-l)N6 z-QG!jmh-QkWFSH3vk+=`*1>w%18d=4)W{S3=?bPoRhSKR{K8O6SO?4C0F1zGSQH;) ze#~*seUWL7C5bQc320>3P_Nzu=Usui7)pF1D&tmEg|9F>hF);Tus-U;X%MQOA5gpg z9BQhgUUbh(qGqle>Uht>Lg;THpm+HrRD%gGx!=7mfqEegKsB%lb*!$V8c2TGb)-C& zA>Iv(;TkNBcTh8u{fhgHsD+w=F{ln~N9y&x3-%z!Rd+6np*qq5!*MF=LuNm!;eRnF zX20e>PV1sxFe6a;7o$4-2Wm!w|8foIN6kP-)E=9Pfq(yFJAphT{Eez0@pacw1#C&Y zH>$!@7=j;A6{Nr6Dy)p!1AR~*$Foq+f3^4v)Bv*o?FQBw)scx<NaufxJ$Qs=h^M;g z*18$0;i;&l*o~UPe^CwPzU9`qEvmw~=0Vheo?1M^ZC9=uYG#L_zB#Q#Ulko8poZR~ z_Cl^ZE?yHg)kClhE<<ga+ZclB?z)kdLLK8ym=#B3ZCs7o3-7Q27Qg5IZ0S_2N&M11 z&VNG!Iq$m!A64)Kmcw)p+^1t3)aF}-+SS)k$1&wYcN{aJPDNhS8?-S-#crrKWiLzj zQ7^XXsP7F+ANsC>og~B~;V9}u=p5=ja1~Y2JJgHBd*ogqiBT12LalW;mcV9~{w?a` zbveex{TLHZq283|QSChQ38;ZLsGfbmEExZ>+tme7BW-B5M&<8<aj++9#Dnem6jVL4 zQ7@jAsE+)Nnz>J?`ieYp9rDW&NK8U?)D*Tty~D>~W1No~`AgJDqCa&7lVBg>X;B^e z8nvlrphmU{)$q@#J@qH*tK3^udr6-K+VQ>Y1k|IFs8?!b)Kt|(jj$1_Ks(gt>W_NS z%tMXnPgJ=C&)th98LE5)s(dL_$Eu+Q*2UsJrqk#D0s`vUPSl6WIaG%pqAGfg8u=%T zjd5SNic_FAQD*Fp#ZeztD=d8jYL6U2&EPqU-@^pN-(V7*|Cle`aY~C?yOO8|Ynjb4 zAMwtp4$MJq)}^Qs{)p=EZd5}@Ed3&C0Jl*y@C0>C<G*tG!!Ypo{|gaNg&picAIv~} zDC*eFM>TXBwG>xS6+T6+ZGzWsYV%_b;#E-Ty-~Y;2CCdzb1!P<&b;RQYqLBcK~wS^ zHS*wp_~rN@Dn>Qj_Kka&_dreYcc|mJ47H~FQ4O3&&A<cHOnpGrAM>rNCjn}P)1YQ7 z>@DYC4HP0lJt~LlKr_qO3AKg;QLosss6Fx{>YaZW)$jw<G5m;XF!8@Go(grGb7M}d zhxKtNs^h=;1T^)xQET-QHL?$=wMzZYRa6AkU=39MUZ{=?M>RMd^~Riw1@H<gU!wQ! zbYwtvAS-HswNcOg76kGV=!!b8b1^q=!FPBQwKRWya4)2%*q?afk3rsY9EY0fyr0|v zilN>I<xve(!7yxun#oc48GeI1^!fjmKw%Po;ulgiqDQC^1qTHOrZg6+=jl*OP#Ghz z4>raXs7>kx2M0zTfm(_#SR03-%AG)c7`?&#SR{(dasIjy(DC{nE8uBVhU8IQfvQ-U z_;{?R=a>hxL<<hQfa+s7@kyvp$K9y<UZEPy7CqS0(tL*M=t_%U#j>>TWsDIV_=^JV zu{iNHs5jhQ)Eh2y%;3PWYJnQbXjDTREd35@$r8p24lHFUtU|meYA<a?ZSp@*<^Dn~ zQHt2X?);}EptY)IHbE`HXQ<=U1GUS2i+_VU|4XqX9zbonpg3+OB2e*8s87XtsQS*M zj@>oXp1Kz&*!}w-Z%NR(juJOGa4h1O8O_3GO$;Gld(?~ND^!Kwp-#^asAIJOwaX8o z&iffmjyF-q@f~W9gv8_bKlGqrJlBEhs1et<ct_OK^+2uhAk<8)Mm4Y<wfhgDHt%VB ze%sPtqDK13Oc3A2GoZ@n^$FA=Py$uaWYkp6Mosxb)DI><qB?rq(*H(v<TdJ8MNJSK z_z+8iDwhW}^0KIM^-%e`So%QJ!2Iz9G-Wd_!)kl*Gis9@LM_cP^9<@eaS8Pv_y@Ji zdn9zbdo5~D+(2#OkVNkIHb-sd(Wv~pT{?gMpMXBUb0l_ang_L(l~HS32esLnp-#sj z%#S~zI(Qe=!AGcpyh1HuoFr~W(xH~72&&^XQG2Hg27di-Bmqs)RMgb}fNF3ZX2%ou z{1s|y<0f?tWWWr>!%<UP7xlai7Q()$fvvLi4X90bz&wY6U;leRKqGjC+AJSXBZ!yG z707^^(gIi(d!uGz6Y9<R1ogtnp4^@PCaAR?hdTc=FdJ?}b@;rczd>I;PnN=sAd6W5 zHAUr69cgaqJy0DSirSQuP$OP$>Dy8D9ku7@QQxedV_-ljZTF+{<xR=?&q1IR30k90 zsF@gwnyRl*$7D9Dp=GFDzYVoV4q-5!vgg0!2I99+9i5fR<y(%bZ#`;e4p{oBRGj~+ zB%CKfn=MmnS0D_vCn8XLp$6(3O*hn1OhI+vIO==DS=2}$p*kEhjWZc)K$*;3W`5Lw ziunYz$!gkz{-|?1%;Hl}GcybG;A&LE7g4+aZ&ZVKQQwYVp+=e}tursGe0kJnY=X+y z3UyliuL$VHGZ(cc%TOcVj5-a+P!0W#DsT=p1CLO9AT*szuZY@Q%`plNK`o7s>hMTZ zeG^gTzCmW(_tp^5=GcPDcm%uSY3z!n(gz2AMqG(Ch=0NgSR;dbb56r%#BbmLEEy8) zjl-W%4VKF2mY^bPPt?SW*b=kq^WP_+<FgDy@lVv+1ZQ$1NQRn$l$Zt6q4q*KRKAX= zy)zI)a3pF5m!M|$XVlUiMD3B6sE#Gb%uLX}mz;pkX+G2v)I{xp7G@9B)DK5hJOh<~ zHR_liL3Q9ds^SNzP5B&iV(cugBLz_%E{)m~_0ZQ;bg~TNQM+{pY7@;z9k&gb4tHY+ zUdF(S3IpdltDCtDsC?B?$E*wLd4JTv#-d)qvoHjI%*y#ML*NVvxiD!q*W=Qtco!^% zGc0}va}fWC8d>)2uETXvGtm?^LwztWj>jUn9rNRJ)KX;4;by8q4&RNixg~Tld!c$f z05z3kP;0jUwHLOd)^;~)#*U(v;Iw(kyoK5`Pf$~yG^cAXCn|qopMci7EULkJs5NSf zn!0|dB^ZMm;S5y%wf20srT>PS`g^GSF><*MCPPhm2r9h<YH6#X2IRLQpq>mu^>7px z!r2&sr?4PK3w7~gs2S*m_pm=|FSHJGd*E{nBR&sR-w{;)E2wsEpqA(%hU@%C$?c{% z0=0W<qTXl?Fa+D8cKb-wi)SHf1XoZEJVVV~^gOP7GE_V*YNkRhUIMjb)lol5HNwE( z{~1g`Q$7tV;8N7?y@%@1E7Ys=J*wj1yzV$ALM=&li<dz?Z-mO<5jBu*sQL$@@=wGn zxD*5b{?8)<+MQAJ1$*PMFlue~p{Dk-`49sgLCrvLxSQ(asF9XO%}4{(6nC-s2y-T? z+$vPZc4Of8|Bew*2hO05P4xWkm=!|JKx<S-KC}22s0xOmUfB~YeLCvHY%UhX{g(b7 z)$u3=+|0!?GZf(bYjZ@9z-I7@q1L85s=!p#$Y!CA*$=3WtT*?d%Ad05f1uu!mr+yx z9QCS>R?y8z4%DeCjVf2SAm?8rX+(k=Y>#T7i)9#u`urb`A^08Y#k3o>*7wXe7&vwj zuEWVtn=Kn^%EM6&S44d(Hb%YJn)w7YWpl75?!(HMppYxj7}dcps6Fuo>O4=wthg3S z;2CU!2@AX9+XV{~{~q;S@jPl~k`{3z&xJaUeqKu`ikjk5_Mj4KChDLnXk*UD5aQ=8 z{uVW|h@#HQs7=@u^+M{2n(9fY2B)F+%sgZUeQzlNP5ma+nr%l_a2)kT;yP-|ZlOAO z7qj70)D)*E=4K)jYNo1~4N>oncBn5LzNODW)w4VxpTFxYVGF9k-Kdf8H-E>#n+vrW zAEMU&gQdqU9vt{970FQ@=!^Q08i6Xe67@dWggXCwFe9GFz`y_VF9D4tK?zqNHL9U3 zsGdfkHepFrMJ>$E_PifzN{6D3>uA(WPQox;i0asJ)XZH#4b&^i`Bx9463`mPNA2Pe zRDnFG=fzPKSG0Hyvys`xo_9qJq&I2_hoUy^G*pMySo$7||51|juMe9$B$USVrQGgq zg?Wk3M12SyMD5;ps0I?1c2k)aHS!4507_wgtb-YF6ly?AP{(Z}=E0}-JVP1ZO>yZm z!TfW{{LqO#@c?$i{AFEy0k$I^ubgYJ7pj3ls3n?%+B1t#=Y1opV+T=deiF6G@1SPl z5$aTVe)-_QZ!(oI=VBew-(Uz<t>9*+E0!U?%Hj`DpN63oon0_H@gGpf?iA|%@CdaB zl2meU)-tH{4yHeWKy4B>pw`N(?7mv1K^3fM@jl35@#dp;ciJj$1}b6*@s6mk-(yfC z{)jquDXO|-7>>D#*FtUPp_o(We;xs?%|Q&usMXx&DTI0>R!6P<9MlNcqxQ@>)NYPn z-TgvC1Zr)2p*pY-)!;TPh__K6N@;4inP`aN8qy#FAv{=(%6J^3@x}?N>C$7=4i5a` zvmB@jdSVe=fmQH2X2M)`+!ED9t@RYtNN1o<(I#^jY7-yE!2kc}cLLfpk5N+=T-Qxm zTGVDKirP#yPz4*JDr{r%u4aGK$VZ^w6LU~6nq{ar;bGJ%xry4WuQBlV|DxA(FP!A4 zinF5{3P(+G2}^Hp_CUQK23Y(nRE1MeGqL~!#~O<fPha2F*A#UeJD@gUpZc7CH8`6D z^=vU}#GB2-sN;1JHKjLD4c|q*AzxWMdIQ&iB&e_JnJr!%wP&iM_Euk1{mW1@y{!S~ zUlsmNf~M>mszVP@1zw>#kiDVnd0w+5D!n?Ye0@~IZ7h8tYSWHDb#xYLfIpy?ayzQr zexHCEJY^3qpfcV-t=&u1t2B8d*TGO!!-Y}hN~1<n6*Z;pQ5BCzE#WNGt9y~9uRwL| zC)9EGj}gd1;5MqEIE~#V3PDv|6xHMUs0Lf0*7`F{gI`$sH|Bf{A$>Upb~$Qhen*{# z`=~Fcv6=+h@x2fN%23oLcy&>mt}ALLrlH<wOHe)EXX)oq4cxQzml#4kc2jrmLs2u> z6jg2r>J&^vZNhaJqVvC#fEv7lIWcN8H`RGiBQAy^SON24N7U5KvgaF74eY>BJdGjv z0o7po=I;AKam+!y8mivD82J6aVFa|hr(s_F7WD<=u%-WrwTWLwEk#%hS3v}7$x5R( zSp&19rGJ5{cOq)ZrkRUSduSsD{{5fr1XRHxRL{<#HqCWZ#=EFZ^%S*KA5i&|wRCHl z4K*VrQRz)kuk<dcPq`JSFB~^fOLo_M(USA8UHg#)9ltECT!ws@k9cuZMcuJEuEy#Z zqqX~-ua9~ak3luC2Q@<nP<!XN#jm0UbO$vfk5L_Y+1htK|6~cN+qkvNiW*UI)D$<e z^lmth_?M_tldi4%Fe!(s_%jT{?wAYbp!U=+sI`BLI#ns!xlI`E6VQ~EwuCyEfuXcQ z^>}zkx0yzx@-0Vw@z{!irNY2cVPL7ur>Nck#^R|zbNMr&j$fGRmnTq=gl3lTHL8cp zQ4Q?H<@hUV6ZP)oruIwJhs|`<D|HR(<8}`=!bhl?tI*kfxHUzck{+l5jB@F|w}gPs z_g2h?XHhST_o#}~ba5}5Jg9S94YjsSP#x@wTJwIW{KHUtX{x2qM}4|3Lk(;@YR1lB zLY@DM1k}?9rq|WIN|T|cyf|vDYgoKDs=|>LpM}+k|6u9Q&FJ0SF;0!@Xiika1yCI> zhAC;^D^EbXxCLs>W?F`=sF~P{UGN%q!>ZlgNPj{d%OjW*&szKws-d_&oJmkKmKyb5 z2}3PqarD(dbxY`qA;bq`VVs9L?`KdIJV2d_52%?*+0(6QPSgyRMjfjLs5NelD(|DF z{#(=%ZbU8lo}Qe4_2dc(+B}a?Jx}vFU$uhxWpiwfEqalT+j<9kw^XnXU)PB*>+8O7 zWbE(0Xmmx*=rWvyS-)^I_ao|SecAzTrYE94ynY$L`B#tsB0)c;K0tNgDQd+3pgI<7 zpc`>vj38bGOXG0V3u-rNO+TRC1JMV$O&Aw7!zocSQ5f~SHrB+3z9lR%SE6?BdW-Ks zo$Gz54jn~RbP2T-FDyO&U>6TT<u8ufbmc9*CTfp$M!ldGp_afuNkBb+h+3mps1YU@ z;x<V|)boaBE7Y5<6KdwZL9P9FsPp|JD*qAGaXgJ0&`nE!irPDGkyGS*v4^_jlpa-4 zev4N|RoL9@jjC|0ITv*d*P8oK6`!@|w^0qhwe)DiT*s25K9)0JdhM1H1hg5Nqo!^E zYN~xygVRt`wiFBEY1Gt5AMSqO$cTCq*1-_$g6hZw)C|o-)w|r{>rhL$9RolApC+JV zaU0d+ml*i@oXx2jiHiA9zgeXvs)l-pcd+y!s1C2O_-@n^Ji!orgW3zJM!1e;MwKs! zzNWakCA3BTBr_1T#`7=)58+I_g9UKdm+nQi5%+Km&)^`^r;iE_{N2!aU%B5^Yk<{A zUw}>V9_GdJql3L|*mpGN|1$z%W2^!UAs%mRu-A`@^Pt{rOUCgECVm1t5`R8EIPk}E zn@n&s^8>15=TQTQJJG!l@}e5-irW2iQM>+(#h*=NYP6=gCb^1QV>t1t=6)<j{3Yr= zkax1%3oTLc38)`Bx1k!iW9cDN+#9qO7AJiSsw4ZcBtA#Ao6rB+1v+8`33E{u{)VCW z2~{w3s_S5LR6~<c`43`Ye23bk1*SRMpz4{7EpVr$r~1YXs1m9J{+9&G5!iyN=q;+E z@ab-Ztxz*E$>O_Fd*dOhf)q1cM{A%uIuP|HU16?8y(xc0)$<(lW0skLJ>q+f38;sQ zP!)efRg`m<`+dEp*pm2W%z=r&b@_{9YvQwU4ZcC``en1-D|Q{~G;Ox{Uev4okfonM z{`?!i97aH=;1cSE@(lHYh&IQa^Gv9BcuCaeX@NS9gE1qnM!nNdU<N#cYUl;(*!_z- zwo&K0^z;~)cvj3s`(Azms<0(i!YQbppGBS1>lS~5>R{A)?uC*P6%RozSwYkbtF5K? zLv7M=sCu?o`U%wg;yU{JX7hr8Mv`*Adt((tO=U&YTGq07eN+Q2P;a=;Q5_v&&nIC5 z;xp~}GStj$K{dD&HPa_8esezOKPd^XNl?K!-#OD@eBz;~%~H(bJ?!~V)Qn9+bzm2& zLq|~^zKB|~Yp8lYqB<ULft$GyRK6SwIRAQ(n*>c|8PwV}K<)14sLeRl+>2R>KSdqC z<O|&~tAYAV7=r5XEX<5YQ8VxeRsRb!#`mtBG`<BgVQezwM0Kd3Ss7CjZ-)Ai>WiAG zuTfLE5H+<wp-#_XRQcza4Wlh`pDkgymUuB#eRomi{Gi2dw<kgE?tG}tR11}12x<x^ zqh@A4YRQ(MI<gHl^+!+@UqFrYxur*65*+yFcv9d7(syD#?6EZP+xfn?mw+0Ix6GLV zRbe=4bCyFj+zHiiPt@@lh5A^XYR_k*$}P0?4H!av8)|7TppN59RQZpXMCU)wayRuE zP@l`WPz{#D5Uh$i*IiLdGyzr7Ow{IEi0asCb1!NJ&Z6?&L*;vcI#r)gdm`o!)Ti?w zpMYi{l^KdESQ0hGl~E&WjM~+mQJZiqs=~FXHQ$2T6Gu@ETthW{%Y24f;tv=P)2!h9 zYg6SUAS+@~Y>S~d4>jV$s2Ta);ulaal$+)|REHC<botWaQR10V>5owL{DW#Zc$Hg% zgsV9J8bLY|H1*j~1xleBsA3sgqblf*+GGPz6-`AQvjwPcO#4wYc?h*>&zpD5*BDHC zwAJo+%VMtfUBhijP{V_;6^=q}z8jbwW2|vgnHN=Yanu@DLk*x6YBP31Ey3rg4vx0x z(@{$}A9LVZRC|B=1oS5Q%e;l^;eFKFKQcd{eiDke)>YJHo$KIWR7Vz~8rX#D&@ZSD zu@k7JyN~MNGgQNGE$&BI?<$Cc+C&*p9mtOwX#`fs3RnxLVs5;K^vC;5|KYmK-Gp%8 zz&F=GlGllmWwZDj?MS=!TbaetIDcm~e6A!){7<GpqWvePdc>vgfV;_mLPO%}PySXk zaG9a$h|VLuzSYqQ`%$hUW$saCiIv$%_#}DRvtEuUoWGP5PD$p<s*x+R=7}pi^Z2*q zS%?z2ic>fV72P4vU$~33mo`GfTSuTj&l=P4Elf(8y@Vf=o`G;F8;t5}=99qRj`0#w z;dU}?C;k}?KI6_rhO<<#Q#rZ*q~Hx)PQLWye~yPpYe`2Jk-s)+2S`gy9XrVP9pR^h z^}5wnhrEfox01G&Tfg_O_fOzTMP^;Ukf<vU>W|>-%FCUVM!In?Cw(!6f2E?Uq?e?F zhcP`~;eJ5+Wc=^doX+hby$g3^%7$4RL-f-+f0@a9M#4Y;DY1qM29voG4Q}E22%Zn8 zgBJ;RCA^Iab)_L*iu)@08`=P7(SWXNl%Gp_cEU@sHSt`5C+<Id?0DmN|9Gt_Sj{Tz zN5*VC_=217BwigFE5$SZSid(O+hc#y8=)@#l)m@Q!s}d;SAcx&=tNV>*0N6B=UH#! z?TAn3ZqC5olD6EZ!S2@Ms1!U*Wn;;Zob<?RunN*>G}2p9P*(}k_7PvtU7BZ+S6k}h zuMh>UyyPkQpJ#i>TaC14)G>_olZ5@h`A_5(pKwMhXh4ECW_mJyW*vz_=dN>?ppx_y zKFsqBJkL+~Z}J?ZtX|EL*KX3AlRk*_71)UfttdZ)a<>V$KrY{VL*N~m3t6vEQD7_g zb_(g@MHRTZ&{!wZ%aQ*cX|e6O9(Ly0ESD|tHeEv}(~>vxYC$~Q;$PEFQ_8m|Z3ch; z#2f5-5}7yf=Rp<uoC2lDl#qKU1sc$ZuD(<dN|^|YEA1|M>Jd-GvsjEW^7?@~!g!X| z(z4O%nZ$LqC;v@N^GFi*l0hHAx*Aa^6Aw4j=t7>Svcmh#gXDkBv$s5ZPTo+`9}%yB zA88;n&xi3$*A(+K>HqLN3Hc(gq;%HbVj2F$)KpfD3@6C3j{+CCb*&{Me*w-LU~#3r z=MJ)XX2P2&r;qSz<ZDdle<Qw`=ZC2?BWY#0gNcv-PX}`7{Of8@&k|Zk?gdi#mV#-h z=oO>sMIpX7dY4EWVflJeSpn|H+;O<Sqk*#AXRW-LOXC|UACr1?H74AOdMc66UH|v~ z<3of>bhV;TH^S8|uC!vLjiS&ajJ(=X*--0DWZD%f??ayZq`#&7CGzNcNV={K4sQqP zyLrAy>mP-O?<w?z#N%Y>^`Ay=kZCpzCuIbq|I^s7<aulPrkQD(#UtcNLEe{?OUqq@ zczx>sM4oas3+h7#;u*;Arz0^t4bLN?5f2WNd8$p%b23C;ZAsHVKBX%TrXc?y8Ysmb zd8M#&Wl8HzJ<+iRb@aCMJ(M{}hZ2&;j|bj#{rp{-OsQ;S?FknoQ!yI&k#H97vSiei z|3974H=g6<sYd4ul1JAko_|f*1D0QDU8%P}X}Zetyr2z0U)M(wKN{86e=iAl$@rGS zxhce7dJ25&xnVsYYmMCH8Q;LXE!<K6(@-s*-y}Yc2F~D4>+D8r{43HPSXzJD`oBx< zH=~fg*Ke>4dN`5_TQj<(q;=-5!rhlj9&`Wi^(&ovY-MK?))j?1b6Vqh)G14!&ww)W z{7E1e>)(wE^~F+GWeQ{^b8;FULWQx2_vG1J3g6=SO5zhqABuUc!jx7vDrNrnYG%*o zQKmfg<|WTS8^A!)nn#|06|BpHY*gBWaC>Y+=E+oWgqf&LID`sPb4Ol9$$y$kBCifS z3n8r>X>|!_r`$i>x@uBBE8#~xdqlhd^@ovmRR8|!aaBaZ3hph8tjvEJsmL>3PpqQv z2%jcT<n;?3TtKDsDVvqVBgD55KZThovxD&eUQx)Ki8_X;oyhl32#NaszJ>xPc<?*- zCgRPAH{hABI`la5;;-=rzJ@E_z&fd)7jpckbCG#_Q+^%kw<+^0iP@~4EEs5i1P><A zP+RUv^g63mQk70rCaopUw-UZfIP#i9;4*2t!g=0<GI=QbfVA;Af;;lkZ{4ip-l<N| z*&Ej3@TfNa8a&)&m1Uu~b-6pxyNkG&^y$>JBC<9tPyQcxwueThQt1pU8=2)7Yv2S{ z=e|YWA9=W+d{Y?22g)48M!~!ZR#8a}5+bi^(Wn3WP5MmwL0G@^TRbxT|L62#)6-|F zL9%`>s>A&qHRYgd5!{j2km%C~PtTS306n-*>x)Q#Ps{UTOy4p+Psj9@^E{m#!K0!) zsz93hKY)86_aN@U+(WpBau4Gk&K<dR@-tCiQchPcnh2)wmxM=gf5km|des?$KWF6S z=V=~tucI?FxplRp<YHRfK;PRl3yG~qdUlm~EuKdw?;7IOiKix>fjo7oryzbyIbG$b zTh~&ar=|x5DbtAijGI~hoj)S&tnylf-;(hg;>A%{5EVwDveFc&N7_*;oJqI~dFycN z%4FqVlW(&%xSwa4$p1#2BmFPpE$P59($2fay+isrPrsnhki-@wo*^8Q3cjVnW`yHm zHqx*0ycqXr;!U|HS_NbY{9NCMXXUgwc0IDucc#$?+|4cjpO#*o{JNIvbN&*E6R0%u z8cDb<l~uEmC_RFBBW9u^`T5JsfvW>)9ZCDq;;pSxJ?uufH|2lg9z~g%#G{a}5@li& zUt}E#Y?g6EhFalnJd8*DC>g`4=py0ggmpEbvZvf(R5Xu#85z|>()$yCO1=d)$~uH+ zQKlU60z6yE9nb1eJ*T<LQV*B!9VOE?LgjHXnf|qo6ea$NMjBAKF%{M(&sfs_d(9_r z5NVmobDO-S$+w*F71E=-2E1z&NK2Zo?c|-OLD0@;<p2K;3&A5i_=d!zg!5P@N)W$A zI2v~<3RR(^^7xj#{C<QNpY*@2@?A8}KY-!=MI!^O{1=2{kZ-ER)#QJ#AfJj}@~{(b zB6AHYnM97>q<zO7hYn=Hk)&0nB3*UJtE&RfUXu2TyA|O$l>dhEx-yZcAmwybAzfEu zo>k?(VCgkU_e0n~x-L+`K`L6!!;_3+4e@tY@Rb$V!1H6I<)@NAaUdqK&OEWaf06fF zS7qS8A1O0}Jhe$LO}#&$ehpDqxIX8vlR?)rD$_N9h8q%2hq|&;=wB)*N%%ACY)s2L zg39)APoj<^Jg-i^!rZBNo{Dn1?h+ou9fz{Tto%JX`vqx*^>e<iugKhyit^LwWh<DD zO5bq*Mum}AX7XI)d3sDhdS1)>GnKs|{v2~sW-$%iRyo26sB;<l1`$qe`Cs#>lqyyG zy~yyG0;z4p)9_2;F)jXqg5fmSjI^BOZ^6Bn@F&v$Bt4r|N^;<8NW31;l34i|<k>}j zUF!)SC%oCp_}l35Gs~z9UH_-D&#d5ZD!gR*qEbfJ*NkwpJ?~1zySY!0XC$`a)>Yf; zt4H1{lzW8jScZgzb47m7D?y|U8AoZ#xcD_h?`JFc1r?noo`8nJsJt%EzqdxK5dVs@ zQHkHO{9ULc2I2XnM_xUwGb>2{k??Nv?82OS|LY3nK~E}cMxl}z%w3jS*9>gQ{fR=w zX=oY+XOVv+Cg+a4z9u|{j{eTwfO^vLpda~z$s2iP;hC<VNat5>-THSXa}V2@Ysg%k zdm)ug4rJvxk+BSS3-Z;le3Qr%K_!FeR5@!P4dHXv>4fATO8ySSZ&J?y@;>CA#I0)} zWoGf*zZsc8#<EmCg~Z`ji88+Ac@N^JsC*oSf~Yu}J<nwg-y!V`<ysNfFS9QsZzs|s zuaf_nrB@_AvuC6A@2u{ivfLEdL1GIk&@VP8Cmce<|8j4qF#oKNSJf(cMMD#~b#-z4 z-+%WI%0Yd<@tj|w4_tK#7ozM7>vT=h8`z+u>DPI5jU;g!ja((;4hmFcCI(R;Icb55 zcosSt!ShL^FCjdhJ2T;}q-~`9Se#*vs?0}M(#vNJ_cy<@#`U<NPsL5Rb!DW&;WYTv zGNdHFlz0(~C&F>uV`%6Vm9?VGbmDzzG#lY$<o^qE6R%3SHVouC@$bo-%i1_Z*{0mO z4p7$rg}_EK|Mxm!8B*A2J`hhvo>)|L2oI6D7w+Ww3Mwf{!y_>+4eE-=9Y&eXq}8U( zMDDw!eTTZzkzRoNYz)>vVdUto(cC<UPo{WOs;e&XxfXtJ4JbVqmCYtSDbIE7q(fD$ zfxhI+Y@P4U^UH)!{-<mfE0bL3f0t$aXpOk)_-8RFu!#zjk+~24OZ;c@+$aBN{DQRO zbUL3^wweya;T}kQA?D=X7+D#<CjL41NA9hvL+xt+)uTW%Dz8a}r>L+#l~=aTT*E2k ziHko_;4seT?((0}@YtJ09sI_nSBJ`V<+o0)!oj4?ApaulPT4u++e$nUGw&ZFLsAmA zVHk<2T=~F%pHbi#ood3fA>2jC*BHB#uONjRQc-fA*Ct(8KGK_T7pGi4o<&|hgGx#M zU8L)pK^?mCX#A~7tjArSf^m6}j|Um7@J!PFrtnps_aUrn6Y*|XgGRSv823Ex0>t}q zmnYv&I;HD5<tCATpEdZs)p5Z+=D*DU0vc;ahG|5L(#r@ky|x0|cs7CXFI1u{glEfe zJr&32*;L}2iN~YCNi;r+v|*$@BkdhVUY!V6qMn7=5!3Qu0pWC-nxCz=XRVRibRq?n z^(Fp}jElLekk*v~D`{W_=@q$uw@$X<`EEKihI&>Lp27Vs;q=t8m2_P-9o{g?#i9;f zPtadQU>}*@@n983Bk>zOBs`4<=Mt`Ol`N*hCFE;D<qJu#Ls-{q(r0n&x@wgxT#*ir zq7Ge;D3h2xg(>qBd7cpG(*Ea%Oe?H#OA4*UQ5ddKbL)yqfuAY7m%=Z2_AB94u9Cp> z_~ff;jZLJ(Ppor4@$@?JT9nZhL7B&RoV4SSzs{!zcerm_1-}vAN5-7QeH#3k_(|e_ zaxWn~lfo%zU@^~A(QqgR)4&GO{~^!k3}_7Ht`Yu)djjFeD<0)S$(u$Ua^rW8{$E*V zA06YJ#qpU5ArVp}%LX-UZK4_pDk5H@UTYWK6;-O1kqjOt^JFK_#5Toj_9#_Hy>&N< z?kekTu_`NNmbU7p>TT;am7r<86!mg?Y@^j}z3k^s?wp--_MUTd@BQBI{oebVG&uE# zT80e)u}lV{A;uFMA?`+G3AjmqU0>FKCD~vx#Fk(`<B(Vx#zvxb3~ty4)2pIb4|b9r zf6;?N`|BuPW+0lzF{0Rf@)ml`TS_j|#rZ7!3hZ1MM>HGkTb+HRi<{FgU}iBoKk|UE zy#RK#ezyMo@mv>&i>=fpmk|`(uVOoiGg<Hv@ro{%{t|?rRj$-xsqmf$-$s52zM+~M zn0rxYtHEB7KmP|H{1IX=VmEvQgh~WF`kE^Uy$t#Dh$WNZYyiK+%WmQ)=_gWO(?y2P zE`S%S3rA>A4z%E=^Wb>_L~la=7mLGokGdMqWZ*RTEI2*!qbk}4te56<G|KE0{5ry7 z%k<dw#Ftp~1xGrFZryX3qY|k@pMN>cUU<6*F%jvF*fNMkh_rzGJy;b-m8-aL=E3=` ziY^7O*8CN;`s*>mn@I21%$_HH2cC)^7O*`|Q3B}VfJj>b{yf+T73quM&k<1l5cOSp zi#YHq^OKd=K9Zn<otYEM(+AGeU2Em%|2;sL4pq_cAtrX6XfgPS9HITa#Pci^+edtc z-iOQ&CO=pY+nyyK3~zugjaI(2_mdw}{UqvH0ft{!;57!k_%Rx3V0nnQ<yGy-_Yyq} z_Xk@lO4t^1v3&4nh=135Et+R=4_bf1KV&umP8L|$o~Ewj$iOMYS5sv2{rDSsC&(Y; ze}*}lD7KW?6~9RT7DHM116<6@>_c5#kMQ3TTHSTo4tOr=CgCQr57<IxCdr@wRx9x( zgf6jQD;JAxgfyOdBmNumxOzDBwLgM$!7kyOnOm<j6^LHYycxYN@IL48zHoj*ZwYZZ z9t+->dYAnCZwJ@{`E7t0ju}E8wiDrmc#vKVVwYKPmpGsLEj?anap3Rh>@XIHMWH#F z2Z)u>t7R^Mn5w)3^8G)<;A!G%nhhCj%|Y!Ms%2;sSWIZV{>v|^x2m8Z?~{*ZzJ@qQ z@jURI<bQzMFXF)I=vIJ@BCh4IPw53NlZfpGY>VgOHyB<8QLHWb60SYW60xoDXM=6Q z#ahFAMC{01H?ZZ3OK(2;XUtt=rj+=q?%GaV!1B^4zW;-G@uP?<=R*7rKaanS=so-& z9AL8OCfES@|3>&8{tmTRJNnV!E40pro6KB8UHDJx8Pwy69f$?Y?jT<-f6udn<;4JP z5qJoAwqDcL9I<bxf6qXv3hmO~Sol4_hY(j1JK@Lhu$|QhrK3>|r#T1462<P)tDzo> zca-0J+%$TzXmzN~$E2?q%+m8<ZU+21?9eFGJ{<fU^I{X3*-so4s`&9_CW`(P`gwRY z$Ms>h8GFK(1r|6;^LHxR1|So{9)0aL@<xb+?Kn%`#5XEXMgKIpT}7+OOUOS$uM-Cx z!7rehjmAy(G$G%kvpMh@%ir^6K#qkdzpyVOp29QbVm;zr7B+%&oA@K~22m^%-W$|n z+Y!q^{1$mO{djr@$iJk&i~I<BCU|Ff1JGST-8A$tzW?Qbt3(CcfS-qOTZIeth^G+W zP5uU6jF5-nX$X&0-WWaVIJ_Hj7%sLB?*MlV_!?%vR9>jbm$?DJIGSQ*8YQ2u0(Hch zELje3C-{0|EPhA(!W~LK58+WPTC4{NJ{8{>!ONk)g~vu(U=xE^7^(w(58<tRG+{ff z*G`~66+fi)0z?+$D-j<AHV?l~-I#cpI0=m}@Hy!D;C!G*4Fqe5kH^Kz<oEv?k}QVg zSHf)!h>hpcbDGzHFVX?&-BUaTP8s<=u&I1<wJhleHdK$?#7rvr0pd|TAcH;kH6IuH zwE6x&#)1q;185G#*CBcwQUO>i+>Xd#>KbB4`eAFNhe+LAMCrw$C02z0l>QoB)`P>u zrfYqNe3EFf-&VxX`z*?U^oa@p+nxjyO9CIqV2&=l&*eKfM*i%WLVSRb1ut2TYk<ZO z>a+A0DkeG(xYyA<#r#;}aCBwAZ8igGfHweFG1QMm=ZIpjBk)7$qvFSgScgb&_%U)E zoQq(G;ZH-%2_8@XTRk)+z?X8kcZnD255vVa!<#9;|DRMqz|UA#LY+cxCzeAJOVk5C zpzkKX#R4zOZzJ47ITPsJ#y^(Bur}mk7xb9L@cMG(FTlS6Z^nFlH1FT10;6S+r8D&9 zt*Mh4{sFiH`7jo*hFge03UyzdTd#|t*{a|Sk9fV8e3R-OfL}uYD%jUL(^>xiU)T~M zw83Aa*#%-Bd@|%g)K4g>mfGUT0UYoUZU*%*`c25w!P8l`9dAZn4CfB`emG&f1UGCk z><&DDyaCcUyekXE;*|6~0w>AOz)2%NLH`<Y5p@@Q8+oL4WvPv27l@nbH)pmbOD4i= z3O<q@`SkLs*U`rUw%#OFc%_QL37J!qmJ!!~3a<_?N8}*<=QwC7UPZkMH_2z=VOt2+ ziX)yx;~cqs*djNId^I|~qaUNmqF6i)-(;)&di%J9%7KTf660MSk8_I8?V4F&8eXe# zMSN{RQ?t<Rbo+d!&pE~AtDIe193AJi46omvmSeemR%P9lF71PfQT7>~f@LZ8Bi&0+ zjIk#M$4szyh);5&V%l;ncY)I^a{EGAAz#gcV9^Zw?x^4huf0#J*#E5z241xfjPLNG zY34I)3q{j!)hCweG=0W2!|U<{_r7T_iE7$CJvF^sYI+Z6x1L!&gQLpqS*?SC3VW}l zPNR){zgc8BEx%<MPQzK?=V)ghsn_B){$j)Qx=XtqwI`JF56HZdG~Mvi^tj}aK9@7k zJ<Vg(KRd`j9CNEtv(TGeX@kss!<%aaQ_k3XKjHAXgX8bnH>3rhN_GVLmG1eEJt@iW zO?F#G?sT_hp<_4;ja<LaU0m$y8r+=cXw&lXAzsVpvi-_cSm<(^9?Rzr<%Vsj+n4XM zf=6aK9yADkHQP~^)GquAx!(N0>nlnf3BeVmj=#3(I@~+W=kn$mg}H`}p#mc}*DyVy 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 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 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 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 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 @ 2020-01-10 10:13 Akshay Joshi <[email protected]> parent: Khushboo Vashi <[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