diff --git a/docs/en_US/images/preferences_browser_display.png b/docs/en_US/images/preferences_browser_display.png index de504e510..e16ebb6c4 100644 Binary files a/docs/en_US/images/preferences_browser_display.png and b/docs/en_US/images/preferences_browser_display.png differ diff --git a/docs/en_US/preferences.rst b/docs/en_US/preferences.rst index 1a3406634..fdb8b9c8d 100644 --- a/docs/en_US/preferences.rst +++ b/docs/en_US/preferences.rst @@ -59,6 +59,8 @@ Use the fields on the *Display* panel to specify general display preferences: | *Full* | This will disable resizing, docking/undocking of the panels | +---------------------+-------------------------------------------------------------------+ +* When the *Show empty object collections?* switch is turned off, then all object + collections which are empty will be hidden from browser tree. * When the *Show system objects?* switch is set to *True*, the client will display system objects such as system schemas (for example, *pg_temp*) or system columns (for example, *xmin* or *ctid*) in the tree control. diff --git a/web/pgadmin/browser/collection.py b/web/pgadmin/browser/collection.py index 835c7623c..692d2261e 100644 --- a/web/pgadmin/browser/collection.py +++ b/web/pgadmin/browser/collection.py @@ -16,6 +16,9 @@ from pgadmin.browser.utils import PGChildModule from pgadmin.utils import PgAdminModule from pgadmin.utils.preferences import Preferences from pgadmin.utils.constants import PGADMIN_NODE +from pgadmin.utils.driver import get_driver +from config import PG_DEFAULT_DRIVER +from pgadmin.browser.utils import PGChildNodeView class CollectionNodeModule(PgAdminModule, PGChildModule, metaclass=ABCMeta): @@ -94,6 +97,42 @@ class CollectionNodeModule(PgAdminModule, PGChildModule, metaclass=ABCMeta): return obj + def has_nodes(self, sid, did, scid=None, tid=None, vid=None, + base_template_path=''): + if self.pref_show_empty_coll_nodes.get(): + return True + + try: + driver = get_driver(PG_DEFAULT_DRIVER) + manager = driver.connection_manager(sid) + conn = manager.connection(did=did) + if '{1}' in base_template_path: + template_base_path = base_template_path.format( + manager.server_type, manager.version) + else: + template_base_path = base_template_path.format(manager.version) + + last_system_oid = 0 if self.show_system_objects else \ + PGChildNodeView._DATABASE_LAST_SYSTEM_OID + + sql = render_template( + "/".join([template_base_path, PGChildNodeView._COUNT_SQL]), + did=did, + scid=scid, + tid=tid, + vid=vid, + datlastsysoid=last_system_oid, + showsysobj=self.show_system_objects, + conn=conn + ) + + status, res = conn.execute_dict(sql) + + return int(res['rows'][0]['count']) > 0 if status \ + else True + except Exception as _: + return True + @property def node_type(self): return '%s' % (self._NODE_TYPE) @@ -239,3 +278,6 @@ class CollectionNodeModule(PgAdminModule, PGChildModule, metaclass=ABCMeta): self.collection_label, 'node', self.SHOW_ON_BROWSER, category_label=gettext('Nodes') ) + self.pref_show_empty_coll_nodes = self.browser_preference.preference( + 'show_empty_coll_nodes' + ) diff --git a/web/pgadmin/browser/register_browser_preferences.py b/web/pgadmin/browser/register_browser_preferences.py index 1bdd0ddfe..79f00d961 100644 --- a/web/pgadmin/browser/register_browser_preferences.py +++ b/web/pgadmin/browser/register_browser_preferences.py @@ -29,6 +29,16 @@ def register_browser_preferences(self): category_label=PREF_LABEL_DISPLAY ) + self.show_empty_coll_nodes = self.preference.register( + 'display', 'show_empty_coll_nodes', + gettext("Show empty object collections?"), 'boolean', True, + category_label=PREF_LABEL_DISPLAY, + help_str=gettext( + 'If turned off, then all object collections which are empty ' + 'will be hidden from browser tree' + ) + ) + self.show_user_defined_templates = self.preference.register( 'display', 'show_user_defined_templates', gettext("Show template databases?"), 'boolean', False, 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 9d47c6a90..c55cd3e39 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/casts/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/casts/__init__.py @@ -60,7 +60,9 @@ class CastModule(CollectionNodeModule): :param sid: server id :param did: database id """ - yield self.generate_browser_collection_node(did) + if self.has_nodes(sid, did, + base_template_path=CastView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node(did) @property def node_inode(self): @@ -148,6 +150,7 @@ class CastView(PGChildNodeView, SchemaDiffObjectCompare): """ node_type = blueprint.node_type + BASE_TEMPLATE_PATH = 'casts/sql/#{0}#' parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -208,7 +211,8 @@ class CastView(PGChildNodeView, SchemaDiffObjectCompare): ).connection_manager(kwargs['sid']) self.conn = self.manager.connection(did=kwargs['did']) # Set template path for the SQL scripts - self.template_path = 'casts/sql/#{0}#'.format(self.manager.version) + self.template_path = self.BASE_TEMPLATE_PATH.format( + self.manager.version) self.datistemplate = False if ( diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/templates/casts/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/casts/templates/casts/sql/default/count.sql new file mode 100644 index 000000000..6c24907dc --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/casts/templates/casts/sql/default/count.sql @@ -0,0 +1,7 @@ +SELECT COUNT(*) +FROM pg_catalog.pg_cast ca +WHERE 1=1 +{# Check for Show system object #} +{% if (not showsysobj) and datlastsysoid %} + AND ca.oid > {{datlastsysoid}}::OID +{% endif %} 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 32915cb2a..12ed616e3 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 @@ -65,7 +65,10 @@ class EventTriggerModule(CollectionNodeModule): """ Generate the event_trigger node """ - yield self.generate_browser_collection_node(sid) + if self.has_nodes( + sid, did, + base_template_path=EventTriggerView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node(sid) @property def node_inode(self): @@ -149,6 +152,7 @@ class EventTriggerView(PGChildNodeView, SchemaDiffObjectCompare): node_type = blueprint.node_type node_icon = "icon-%s" % blueprint.node_type + BASE_TEMPLATE_PATH = 'event_triggers/sql/#{0}#' parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -194,7 +198,7 @@ class EventTriggerView(PGChildNodeView, SchemaDiffObjectCompare): PG_DEFAULT_DRIVER ).connection_manager(kwargs['sid']) self.conn = self.manager.connection(did=kwargs['did']) - self.template_path = 'event_triggers/sql/#{0}#'.format( + self.template_path = self.BASE_TEMPLATE_PATH.format( self.manager.version) self.datistemplate = False diff --git a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/templates/event_triggers/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/templates/event_triggers/sql/default/count.sql new file mode 100644 index 000000000..368a2daa0 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/templates/event_triggers/sql/default/count.sql @@ -0,0 +1,2 @@ +SELECT COUNT(*) +FROM pg_catalog.pg_event_trigger e 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 599999638..7c1fcb699 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/extensions/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/__init__.py @@ -48,7 +48,9 @@ class ExtensionModule(CollectionNodeModule): """ Generate the collection node """ - yield self.generate_browser_collection_node(did) + if self.has_nodes(sid, did, + base_template_path=ExtensionView.EXT_TEMPLATE_PATH): + yield self.generate_browser_collection_node(did) @property def node_inode(self): diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/templates/extensions/sql/count.sql b/web/pgadmin/browser/server_groups/servers/databases/extensions/templates/extensions/sql/count.sql new file mode 100644 index 000000000..96b8d5183 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/templates/extensions/sql/count.sql @@ -0,0 +1,3 @@ +SELECT COUNT(*) +FROM pg_catalog.pg_extension x +WHERE 1=1 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 0970f9781..a56fcedd6 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 @@ -75,7 +75,10 @@ class ForeignDataWrapperModule(CollectionNodeModule): sid: Server ID did: Database Id """ - yield self.generate_browser_collection_node(did) + if self.has_nodes( + sid, did, + base_template_path=ForeignDataWrapperView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node(did) @property def script_load(self): @@ -179,6 +182,7 @@ class ForeignDataWrapperView(PGChildNodeView, SchemaDiffObjectCompare): """ node_type = blueprint.node_type + BASE_TEMPLATE_PATH = 'foreign_data_wrappers/sql/#{0}#' parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -235,7 +239,7 @@ class ForeignDataWrapperView(PGChildNodeView, SchemaDiffObjectCompare): kwargs['did']]['datistemplate'] # Set the template path for the SQL scripts - self.template_path = 'foreign_data_wrappers/sql/#{0}#'.format( + self.template_path = self.BASE_TEMPLATE_PATH.format( self.manager.version ) diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/templates/foreign_data_wrappers/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/templates/foreign_data_wrappers/sql/default/count.sql new file mode 100644 index 000000000..2554ed688 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/templates/foreign_data_wrappers/sql/default/count.sql @@ -0,0 +1,2 @@ +SELECT COUNT(*) +FROM pg_catalog.pg_foreign_data_wrapper fdw 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 1267b8eb0..6ae393c0c 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/languages/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/languages/__init__.py @@ -74,7 +74,10 @@ class LanguageModule(CollectionNodeModule): sid: Server ID did: Database Id """ - yield self.generate_browser_collection_node(did) + if self.has_nodes( + sid, did, + base_template_path=LanguageView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node(did) @property def node_inode(self): @@ -175,6 +178,7 @@ class LanguageView(PGChildNodeView, SchemaDiffObjectCompare): _NOT_FOUND_LANG_INFORMATION = \ gettext("Could not find the language information.") node_type = blueprint.node_type + BASE_TEMPLATE_PATH = "languages/sql/#{0}#" parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -241,7 +245,7 @@ class LanguageView(PGChildNodeView, SchemaDiffObjectCompare): # Set the template path for the SQL scripts self.template_path = ( - "languages/sql/#{0}#".format(self.manager.version) + self.BASE_TEMPLATE_PATH.format(self.manager.version) ) return f(*args, **kwargs) diff --git a/web/pgadmin/browser/server_groups/servers/databases/publications/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/publications/__init__.py index 1f70c6649..d10c995db 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/publications/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/publications/__init__.py @@ -73,7 +73,10 @@ class PublicationModule(CollectionNodeModule): sid: Server ID did: Database Id """ - yield self.generate_browser_collection_node(did) + if self.has_nodes( + sid, did, + base_template_path=PublicationView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node(did) @property def node_inode(self): @@ -167,6 +170,7 @@ class PublicationView(PGChildNodeView, SchemaDiffObjectCompare): _NOT_FOUND_PUB_INFORMATION = \ gettext("Could not find the publication information.") node_type = blueprint.node_type + BASE_TEMPLATE_PATH = "publications/sql/#{0}#" parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -223,7 +227,7 @@ class PublicationView(PGChildNodeView, SchemaDiffObjectCompare): self.conn = self.manager.connection(did=kwargs['did']) # Set the template path for the SQL scripts self.template_path = ( - "publications/sql/#{0}#".format(self.manager.version) + self.BASE_TEMPLATE_PATH.format(self.manager.version) ) return f(*args, **kwargs) diff --git a/web/pgadmin/browser/server_groups/servers/databases/publications/templates/publications/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/publications/templates/publications/sql/default/count.sql new file mode 100644 index 000000000..43e890c01 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/publications/templates/publications/sql/default/count.sql @@ -0,0 +1,2 @@ +SELECT COUNT(*) +FROM pg_catalog.pg_publication c diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/aggregates/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/aggregates/__init__.py index 2ce90fc33..604c10254 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/aggregates/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/aggregates/__init__.py @@ -67,7 +67,9 @@ class AggregateModule(SchemaChildModule): """ Generate the collection node """ - yield self.generate_browser_collection_node(scid) + if self.has_nodes(sid, did, scid=scid, + base_template_path=AggregateView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node(scid) @property def script_load(self): @@ -118,6 +120,7 @@ class AggregateView(PGChildNodeView): node_type = blueprint.node_type node_label = "Aggregate" + BASE_TEMPLATE_PATH = 'aggregates/sql/#{0}#' parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -165,10 +168,8 @@ class AggregateView(PGChildNodeView): kwargs['did']]['datistemplate'] # Set the template path for the SQL scripts - self.template_path = compile_template_path( - 'aggregates/sql/', - self.manager.version - ) + self.template_path = \ + self.BASE_TEMPLATE_PATH.format(self.manager.version) return f(*args, **kwargs) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/aggregates/templates/aggregates/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/aggregates/templates/aggregates/sql/default/count.sql new file mode 100644 index 000000000..9813317da --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/aggregates/templates/aggregates/sql/default/count.sql @@ -0,0 +1,4 @@ +SELECT COUNT(*) +FROM pg_catalog.pg_aggregate ag + LEFT OUTER JOIN pg_catalog.pg_proc pr ON pr.oid = ag.aggfnoid +WHERE pronamespace = {{scid}}::oid; 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 4ab0ee131..78f056d79 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 @@ -70,7 +70,9 @@ class CollationModule(SchemaChildModule): """ Generate the collection node """ - yield self.generate_browser_collection_node(scid) + if self.has_nodes(sid, did, scid=scid, + base_template_path=CollationView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node(scid) @property def script_load(self): @@ -148,6 +150,7 @@ class CollationView(PGChildNodeView, SchemaDiffObjectCompare): node_type = blueprint.node_type node_label = "Collation" + BASE_TEMPLATE_PATH = 'collations/sql/#{0}#' parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -202,10 +205,8 @@ class CollationView(PGChildNodeView, SchemaDiffObjectCompare): kwargs['did']]['datistemplate'] # Set the template path for the SQL scripts - self.template_path = compile_template_path( - 'collations/sql/', - self.manager.version - ) + self.template_path = \ + self.BASE_TEMPLATE_PATH.format(self.manager.version) return f(*args, **kwargs) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/templates/collations/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/templates/collations/sql/default/count.sql new file mode 100644 index 000000000..bb36a1e93 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/templates/collations/sql/default/count.sql @@ -0,0 +1,5 @@ +SELECT COUNT(*) +FROM pg_catalog.pg_collation c +{% if scid %} +WHERE c.collnamespace = {{scid}}::oid +{% endif %} 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 431cd7c88..1f3b6a549 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 @@ -61,7 +61,9 @@ class DomainModule(SchemaChildModule): """ Generate the domain collection node. """ - yield self.generate_browser_collection_node(scid) + if self.has_nodes(sid, did, scid=scid, + base_template_path=DomainView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node(scid) @property def script_load(self): @@ -151,6 +153,7 @@ class DomainView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare): node_type = blueprint.node_type node_label = "Domain" + BASE_TEMPLATE_PATH = 'domains/sql/#{0}#' parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -301,10 +304,8 @@ class DomainView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare): kwargs['did']]['datistemplate'] # we will set template path for sql scripts - self.template_path = compile_template_path( - 'domains/sql/', - self.manager.version - ) + self.template_path = \ + self.BASE_TEMPLATE_PATH.format(self.manager.version) return f(*args, **kwargs) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/default/count.sql new file mode 100644 index 000000000..1bb6660e5 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/default/count.sql @@ -0,0 +1,9 @@ +SELECT COUNT(*) +FROM + pg_catalog.pg_type d +JOIN + pg_catalog.pg_type b ON b.oid = d.typbasetype +JOIN + pg_catalog.pg_namespace bn ON bn.oid=d.typnamespace +WHERE + d.typnamespace = {{scid}}::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 641f88a04..9b8142138 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 @@ -68,7 +68,10 @@ class ForeignTableModule(SchemaChildModule): """ Generate the Foreign Table collection node. """ - yield self.generate_browser_collection_node(scid) + if self.has_nodes( + sid, did, scid, + base_template_path=ForeignTableView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node(scid) @property def node_inode(self): @@ -178,6 +181,7 @@ class ForeignTableView(PGChildNodeView, DataTypeReader, node_type = blueprint.node_type node_label = "Foreign Table" + BASE_TEMPLATE_PATH = 'foreign_tables/sql/#{0}#' parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -390,10 +394,8 @@ class ForeignTableView(PGChildNodeView, DataTypeReader, # Set template path for sql scripts depending # on the server version. - self.template_path = compile_template_path( - 'foreign_tables/sql/', - self.manager.version - ) + self.template_path = \ + self.BASE_TEMPLATE_PATH.format(self.manager.version) return f(*args, **kwargs) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/templates/foreign_tables/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/templates/foreign_tables/sql/default/count.sql new file mode 100644 index 000000000..9d633526a --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/templates/foreign_tables/sql/default/count.sql @@ -0,0 +1,7 @@ +SELECT COUNT(*) +FROM + pg_catalog.pg_class c +JOIN + pg_catalog.pg_foreign_table ft ON c.oid=ft.ftrelid +WHERE + c.relnamespace = {{scid}}::oid 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 b7d04e16d..831f1e533 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 @@ -68,7 +68,10 @@ class FtsConfigurationModule(SchemaChildModule): :param did: database id :param scid: schema id """ - yield self.generate_browser_collection_node(scid) + if self.has_nodes( + sid, did, scid, + base_template_path=FtsConfigurationView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node(scid) @property def node_inode(self): @@ -169,6 +172,7 @@ class FtsConfigurationView(PGChildNodeView, SchemaDiffObjectCompare): """ node_type = blueprint.node_type + BASE_TEMPLATE_PATH = 'fts_configurations/sql/#{0}#' parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -236,7 +240,7 @@ class FtsConfigurationView(PGChildNodeView, SchemaDiffObjectCompare): kwargs['did']]['datistemplate'] # Set the template path for the SQL scripts - self.template_path = 'fts_configurations/sql/#{0}#'.format( + self.template_path = self.BASE_TEMPLATE_PATH.format( self.manager.version) return f(*args, **kwargs) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/templates/fts_configurations/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/templates/fts_configurations/sql/default/count.sql new file mode 100644 index 000000000..9ae467001 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/templates/fts_configurations/sql/default/count.sql @@ -0,0 +1,7 @@ +SELECT COUNT(*) +FROM + pg_catalog.pg_ts_config cfg +WHERE +{% if scid %} + cfg.cfgnamespace = {{scid}}::OID +{% endif %} 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 c2dab76ea..21beb6714 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 @@ -66,7 +66,10 @@ class FtsDictionaryModule(SchemaChildModule): :param did: database id :param scid: schema id """ - yield self.generate_browser_collection_node(scid) + if self.has_nodes( + sid, did, scid, + base_template_path=FtsDictionaryView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node(scid) @property def node_inode(self): @@ -161,6 +164,7 @@ class FtsDictionaryView(PGChildNodeView, SchemaDiffObjectCompare): """ node_type = blueprint.node_type + BASE_TEMPLATE_PATH = 'fts_dictionaries/sql/#{0}#' parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -225,7 +229,7 @@ class FtsDictionaryView(PGChildNodeView, SchemaDiffObjectCompare): kwargs['did']]['datistemplate'] # Set the template path for the SQL scripts - self.template_path = 'fts_dictionaries/sql/#{0}#'.format( + self.template_path = self.BASE_TEMPLATE_PATH.format( self.manager.version) return f(*args, **kwargs) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/templates/fts_dictionaries/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/templates/fts_dictionaries/sql/default/count.sql new file mode 100644 index 000000000..ea5b405f7 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/templates/fts_dictionaries/sql/default/count.sql @@ -0,0 +1,7 @@ +SELECT COUNT(*) +FROM + pg_catalog.pg_ts_dict dict +WHERE +{% if scid %} + dict.dictnamespace = {{scid}}::OID +{% endif %} 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 a141c295a..1e66ce5d6 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 @@ -59,7 +59,10 @@ class FtsParserModule(SchemaChildModule): :param did: database id :param scid: schema id """ - yield self.generate_browser_collection_node(scid) + + if self.has_nodes(sid, did, scid=scid, + base_template_path=FtsParserView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node(scid) @property def node_inode(self): @@ -163,6 +166,7 @@ class FtsParserView(PGChildNodeView, SchemaDiffObjectCompare): """ node_type = blueprint.node_type + BASE_TEMPLATE_PATH = 'fts_parsers/sql/#{0}#' parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -238,7 +242,7 @@ class FtsParserView(PGChildNodeView, SchemaDiffObjectCompare): self.datistemplate = self.manager.db_info[ kwargs['did']]['datistemplate'] # Set the template path for the SQL scripts - self.template_path = 'fts_parsers/sql/#{0}#'.format( + self.template_path = self.BASE_TEMPLATE_PATH.format( self.manager.version) return f(*args, **kwargs) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/templates/fts_parsers/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/templates/fts_parsers/sql/default/count.sql new file mode 100644 index 000000000..5d51911f0 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/templates/fts_parsers/sql/default/count.sql @@ -0,0 +1,7 @@ +SELECT COUNT(*) +FROM + pg_catalog.pg_ts_parser prs +WHERE +{% if scid %} + prs.prsnamespace = {{scid}}::OID +{% endif %} 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 673bf99fa..9a174f78b 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 @@ -65,7 +65,10 @@ class FtsTemplateModule(SchemaChildModule): :param did: database id :param scid: schema id """ - yield self.generate_browser_collection_node(scid) + if self.has_nodes( + sid, did, scid, + base_template_path=FtsTemplateView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node(scid) @property def node_inode(self): @@ -157,6 +160,7 @@ class FtsTemplateView(PGChildNodeView, SchemaDiffObjectCompare): node_type = blueprint.node_type node_label = "FTS Template" + BASE_TEMPLATE_PATH = 'fts_templates/sql/#{0}#' parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -217,7 +221,7 @@ class FtsTemplateView(PGChildNodeView, SchemaDiffObjectCompare): ): self.datistemplate = self.manager.db_info[ kwargs['did']]['datistemplate'] - self.template_path = 'fts_templates/sql/#{0}#'.format( + self.template_path = self.BASE_TEMPLATE_PATH.format( self.manager.version) return f(*args, **kwargs) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/templates/fts_templates/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/templates/fts_templates/sql/default/count.sql new file mode 100644 index 000000000..03298feae --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/templates/fts_templates/sql/default/count.sql @@ -0,0 +1,7 @@ +SELECT COUNT(*) +FROM + pg_catalog.pg_ts_template tmpl +WHERE +{% if scid %} + tmpl.tmplnamespace = {{scid}}::OID +{% endif %} 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 75f77fa15..3697b9e3a 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 @@ -81,7 +81,9 @@ class FunctionModule(SchemaChildModule): """ Generate Functions collection node. """ - yield self.generate_browser_collection_node(scid) + if self.has_nodes(sid, did, scid=scid, + base_template_path=FunctionView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node(scid) @property def node_inode(self): @@ -185,7 +187,7 @@ class FunctionView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare): """ node_type = blueprint.node_type - + BASE_TEMPLATE_PATH = 'functions/{0}/sql/#{1}#' parent_ids = [ {'type': 'int', 'id': 'gid'}, {'type': 'int', 'id': 'sid'}, @@ -351,21 +353,9 @@ class FunctionView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare): self.qtIdent = driver.qtIdent self.qtLiteral = driver.qtLiteral - template_initial = None - if self.node_type == 'function': - template_initial = 'functions' - elif self.node_type == 'procedure': - template_initial = 'procedures' - elif self.node_type == 'trigger_function': - template_initial = 'trigger_functions' - # Set the template path for the SQL scripts - self.sql_template_path = "/".join([ - template_initial, - self.manager.server_type, - 'sql', - '#{0}#' - ]).format(self.manager.version) + self.sql_template_path = self.BASE_TEMPLATE_PATH.format( + self.manager.server_type, self.manager.version) return f(*args, **kwargs) @@ -2074,7 +2064,9 @@ class ProcedureModule(SchemaChildModule): """ Generate Procedures collection node. """ - yield self.generate_browser_collection_node(scid) + if self.has_nodes(sid, did, scid=scid, + base_template_path=ProcedureView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node(scid) @property def node_inode(self): @@ -2099,6 +2091,7 @@ procedure_blueprint = ProcedureModule(__name__) class ProcedureView(FunctionView): node_type = procedure_blueprint.node_type + BASE_TEMPLATE_PATH = 'procedures/{0}/sql/#{1}#' def __init__(self, *args, **kwargs): """ @@ -2172,7 +2165,10 @@ class TriggerFunctionModule(SchemaChildModule): """ Generate Trigger function collection node. """ - yield self.generate_browser_collection_node(scid) + if self.has_nodes( + sid, did, scid, + base_template_path=TriggerFunctionView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node(scid) @property def node_inode(self): @@ -2197,6 +2193,7 @@ trigger_function_blueprint = TriggerFunctionModule(__name__) class TriggerFunctionView(FunctionView): node_type = trigger_function_blueprint.node_type + BASE_TEMPLATE_PATH = 'trigger_functions/{0}/sql/#{1}#' def __init__(self, *args, **kwargs): """ diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/pg/sql/11_plus/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/pg/sql/11_plus/count.sql new file mode 100644 index 000000000..a3b4aa73f --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/pg/sql/11_plus/count.sql @@ -0,0 +1,9 @@ +SELECT COUNT(*) +FROM + pg_catalog.pg_proc pr +JOIN + pg_catalog.pg_type typ ON typ.oid=prorettype +WHERE + pr.prokind IN ('f', 'w') + AND typname NOT IN ('trigger', 'event_trigger') + AND pronamespace = {{scid}}::oid; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/pg/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/pg/sql/default/count.sql new file mode 100644 index 000000000..5f97fdcdf --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/pg/sql/default/count.sql @@ -0,0 +1,13 @@ +SELECT COUNT(*) +FROM + pg_catalog.pg_proc pr +JOIN + pg_catalog.pg_type typ ON typ.oid=prorettype +JOIN + pg_catalog.pg_namespace typns ON typns.oid=typ.typnamespace +JOIN + pg_catalog.pg_language lng ON lng.oid=prolang +WHERE + proisagg = FALSE + AND typname NOT IN ('trigger', 'event_trigger') + AND pronamespace = {{scid}}::oid diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/ppas/sql/11_plus/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/ppas/sql/11_plus/count.sql new file mode 100644 index 000000000..d602b1d1b --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/ppas/sql/11_plus/count.sql @@ -0,0 +1,9 @@ +SELECT COUNT(*) +FROM + pg_catalog.pg_proc pr +JOIN + pg_catalog.pg_type typ ON typ.oid=prorettype +WHERE + pr.prokind IN ('f', 'w') + AND typname NOT IN ('trigger', 'event_trigger') + AND pronamespace = {{scid}}::oid diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/ppas/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/ppas/sql/default/count.sql new file mode 100644 index 000000000..5f97fdcdf --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/ppas/sql/default/count.sql @@ -0,0 +1,13 @@ +SELECT COUNT(*) +FROM + pg_catalog.pg_proc pr +JOIN + pg_catalog.pg_type typ ON typ.oid=prorettype +JOIN + pg_catalog.pg_namespace typns ON typns.oid=typ.typnamespace +JOIN + pg_catalog.pg_language lng ON lng.oid=prolang +WHERE + proisagg = FALSE + AND typname NOT IN ('trigger', 'event_trigger') + AND pronamespace = {{scid}}::oid diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/11_plus/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/11_plus/count.sql new file mode 100644 index 000000000..1be1b3961 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/11_plus/count.sql @@ -0,0 +1,13 @@ +SELECT COUNT(*) +FROM + pg_catalog.pg_proc pr +JOIN + pg_catalog.pg_type typ ON typ.oid=prorettype +JOIN + pg_catalog.pg_namespace typns ON typns.oid=typ.typnamespace +JOIN + pg_catalog.pg_language lng ON lng.oid=prolang +WHERE + pr.prokind = 'p' + AND typname NOT IN ('trigger', 'event_trigger') + AND pronamespace = {{scid}}::oid; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/14_plus/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/14_plus/count.sql new file mode 100644 index 000000000..1be1b3961 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/pg/sql/14_plus/count.sql @@ -0,0 +1,13 @@ +SELECT COUNT(*) +FROM + pg_catalog.pg_proc pr +JOIN + pg_catalog.pg_type typ ON typ.oid=prorettype +JOIN + pg_catalog.pg_namespace typns ON typns.oid=typ.typnamespace +JOIN + pg_catalog.pg_language lng ON lng.oid=prolang +WHERE + pr.prokind = 'p' + AND typname NOT IN ('trigger', 'event_trigger') + AND pronamespace = {{scid}}::oid; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/11_plus/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/11_plus/count.sql new file mode 100644 index 000000000..edbed6d4c --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/11_plus/count.sql @@ -0,0 +1,13 @@ +SELECT COUNT(*) +FROM + pg_catalog.pg_proc pr +JOIN + pg_catalog.pg_type typ ON typ.oid=prorettype +JOIN + pg_catalog.pg_namespace typns ON typns.oid=typ.typnamespace +JOIN + pg_catalog.pg_language lng ON lng.oid=prolang +WHERE + pr.prokind = 'p'::char + AND typname NOT IN ('trigger', 'event_trigger') + AND pronamespace = {{scid}}::oid; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/14_plus/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/14_plus/count.sql new file mode 100644 index 000000000..edbed6d4c --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/14_plus/count.sql @@ -0,0 +1,13 @@ +SELECT COUNT(*) +FROM + pg_catalog.pg_proc pr +JOIN + pg_catalog.pg_type typ ON typ.oid=prorettype +JOIN + pg_catalog.pg_namespace typns ON typns.oid=typ.typnamespace +JOIN + pg_catalog.pg_language lng ON lng.oid=prolang +WHERE + pr.prokind = 'p'::char + AND typname NOT IN ('trigger', 'event_trigger') + AND pronamespace = {{scid}}::oid; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/default/count.sql new file mode 100644 index 000000000..aa89e2f8a --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedures/ppas/sql/default/count.sql @@ -0,0 +1,13 @@ +SELECT COUNT(*) +FROM + pg_catalog.pg_proc pr +JOIN + pg_catalog.pg_type typ ON typ.oid=prorettype +JOIN + pg_catalog.pg_namespace typns ON typns.oid=typ.typnamespace +JOIN + pg_catalog.pg_language lng ON lng.oid=prolang +WHERE + proisagg = FALSE + AND typname NOT IN ('trigger', 'event_trigger') + AND pronamespace = {{scid}}::oid; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/11_plus/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/11_plus/count.sql new file mode 100644 index 000000000..0c4e2cd65 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/11_plus/count.sql @@ -0,0 +1,14 @@ +SELECT COUNT(*) +FROM + pg_catalog.pg_proc pr +JOIN + pg_catalog.pg_type typ ON typ.oid=prorettype +JOIN + pg_catalog.pg_namespace typns ON typns.oid=typ.typnamespace +JOIN + pg_catalog.pg_language lng ON lng.oid=prolang +WHERE + pr.prokind IN ('f', 'w') + AND typname IN ('trigger', 'event_trigger') + AND lanname NOT IN ('edbspl', 'sql', 'internal') + AND pronamespace = {{scid}}::oid; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/default/count.sql new file mode 100644 index 000000000..18266de94 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/pg/sql/default/count.sql @@ -0,0 +1,14 @@ +SELECT COUNT(*) +FROM + pg_catalog.pg_proc pr +JOIN + pg_catalog.pg_type typ ON typ.oid=prorettype +JOIN + pg_catalog.pg_namespace typns ON typns.oid=typ.typnamespace +JOIN + pg_catalog.pg_language lng ON lng.oid=prolang +WHERE + proisagg = FALSE + AND typname IN ('trigger', 'event_trigger') + AND lanname NOT IN ('edbspl', 'sql', 'internal') + AND pronamespace = {{scid}}::oid; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/11_plus/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/11_plus/count.sql new file mode 100644 index 000000000..997152d06 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/11_plus/count.sql @@ -0,0 +1,13 @@ +SELECT COUNT(*) +FROM + pg_catalog.pg_proc pr +JOIN + pg_catalog.pg_type typ ON typ.oid=prorettype +JOIN + pg_catalog.pg_namespace typns ON typns.oid=typ.typnamespace +JOIN + pg_catalog.pg_language lng ON lng.oid=prolang +WHERE + pr.prokind IN ('f', 'w') + AND typname IN ('trigger', 'event_trigger') + AND pronamespace = {{scid}}::oid; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/default/count.sql new file mode 100644 index 000000000..dd9006c0a --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_functions/ppas/sql/default/count.sql @@ -0,0 +1,14 @@ +SELECT COUNT(*) +FROM + pg_catalog.pg_proc pr +JOIN + pg_catalog.pg_type typ ON typ.oid=prorettype +JOIN + pg_catalog.pg_namespace typns ON typns.oid=typ.typnamespace +JOIN + pg_catalog.pg_language lng ON lng.oid=prolang +WHERE + proisagg = FALSE + AND typname IN ('trigger', 'event_trigger') + AND lanname NOT IN ('sql', 'internal') + AND pronamespace = {{scid}}::oid; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/operators/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/operators/__init__.py index 78d3de8a9..bae1d19d8 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/operators/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/operators/__init__.py @@ -67,7 +67,9 @@ class OperatorModule(SchemaChildModule): """ Generate the collection node """ - yield self.generate_browser_collection_node(scid) + if self.has_nodes(sid, did, scid=scid, + base_template_path=OperatorView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node(scid) @property def script_load(self): @@ -117,6 +119,7 @@ class OperatorView(PGChildNodeView): node_type = blueprint.node_type node_label = "Operator" + BASE_TEMPLATE_PATH = 'operators/sql/#{0}#' parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -164,8 +167,10 @@ class OperatorView(PGChildNodeView): kwargs['did']]['datistemplate'] # Set the template path for the SQL scripts + self.template_path = \ + self.BASE_TEMPLATE_PATH.format(self.manager.version) self.template_path = compile_template_path( - 'operators/sql/', + self.BASE_TEMPLATE_PATH, self.manager.version ) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/operators/templates/operators/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/operators/templates/operators/sql/default/count.sql new file mode 100644 index 000000000..27c4ec67a --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/operators/templates/operators/sql/default/count.sql @@ -0,0 +1,6 @@ +SELECT COUNT(*) +FROM pg_catalog.pg_operator op + JOIN pg_catalog.pg_type et on et.oid=op.oprresult +{% if scid %} + WHERE op.oprnamespace = {{scid}}::oid +{% endif %} 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 5be371709..f684a0ad4 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 @@ -66,7 +66,9 @@ class PackageModule(SchemaChildModule): """ Generate the package node """ - yield self.generate_browser_collection_node(scid) + if self.has_nodes(sid, did, scid=scid, + base_template_path=PackageView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node(scid) @property def script_load(self): @@ -99,6 +101,7 @@ class PackageView(PGChildNodeView, SchemaDiffObjectCompare): node_type = blueprint.node_type node_label = "Package" node_icon = "icon-%s" % node_type + BASE_TEMPLATE_PATH = 'packages/ppas/#{0}#' parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -153,7 +156,7 @@ class PackageView(PGChildNodeView, SchemaDiffObjectCompare): "Connection to the server has been lost." ) ) - self.template_path = 'packages/ppas/#{0}#'.format( + self.template_path = self.BASE_TEMPLATE_PATH.format( self.manager.version) sql = render_template( diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/templates/packages/ppas/12_plus/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/templates/packages/ppas/12_plus/count.sql new file mode 100644 index 000000000..7aa6fe79c --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/templates/packages/ppas/12_plus/count.sql @@ -0,0 +1,6 @@ +SELECT COUNT(*) +FROM + pg_catalog.pg_namespace nsp +WHERE nspparent = {{scid}}::oid +AND nspobjecttype = 0 +AND nspcompoundtrigger = false diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/templates/packages/ppas/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/templates/packages/ppas/default/count.sql new file mode 100644 index 000000000..d82347a3b --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/templates/packages/ppas/default/count.sql @@ -0,0 +1,5 @@ +SELECT COUNT(*) +FROM + pg_catalog.pg_namespace nsp +WHERE nspparent = {{scid}}::oid +AND nspobjecttype = 0; 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 61164a4f5..420287940 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 @@ -64,7 +64,9 @@ class SequenceModule(SchemaChildModule): """ Generate the sequence node """ - yield self.generate_browser_collection_node(scid) + if self.has_nodes(sid, did, scid=scid, + base_template_path=SequenceView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node(scid) @property def script_load(self): @@ -91,6 +93,7 @@ class SequenceView(PGChildNodeView, SchemaDiffObjectCompare): node_type = blueprint.node_type node_label = "Sequence" node_icon = "icon-%s" % node_type + BASE_TEMPLATE_PATH = 'sequences/sql/#{0}#' parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -148,7 +151,7 @@ class SequenceView(PGChildNodeView, SchemaDiffObjectCompare): self.datistemplate = self.manager.db_info[ kwargs['did']]['datistemplate'] - self.template_path = 'sequences/sql/#{0}#'.format( + self.template_path = self.BASE_TEMPLATE_PATH.format( self.manager.version ) self.acl = ['r', 'w', 'U'] diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/templates/sequences/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/templates/sequences/sql/default/count.sql new file mode 100644 index 000000000..394d3d3a7 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/templates/sequences/sql/default/count.sql @@ -0,0 +1,7 @@ +SELECT COUNT(*) +FROM pg_catalog.pg_class cl +WHERE + relkind = 'S' +{% if scid %} + AND relnamespace = {{scid|qtLiteral(conn)}}::oid +{% endif %} 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 fdb819c53..b3407ae19 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 @@ -70,7 +70,9 @@ class SynonymModule(SchemaChildModule): """ Generate the collection node """ - yield self.generate_browser_collection_node(scid) + if self.has_nodes(sid, did, scid=scid, + base_template_path=SynonymView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node(scid) @property def script_load(self): @@ -148,6 +150,7 @@ class SynonymView(PGChildNodeView, SchemaDiffObjectCompare): node_type = blueprint.node_type node_label = "Synonym" + BASE_TEMPLATE_PATH = 'synonyms/sql/#{0}#' parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -216,7 +219,7 @@ class SynonymView(PGChildNodeView, SchemaDiffObjectCompare): kwargs['did']]['datistemplate'] # we will set template path for sql scripts - self.template_path = 'synonyms/sql/#{0}#'.format( + self.template_path = self.BASE_TEMPLATE_PATH.format( self.manager.version) return f(*args, **kwargs) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonyms/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonyms/sql/default/count.sql new file mode 100644 index 000000000..32ea38621 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonyms/sql/default/count.sql @@ -0,0 +1,4 @@ +SELECT COUNT(*) +FROM pg_catalog.pg_synonym s + JOIN pg_catalog.pg_namespace ns ON s.synnamespace = ns.oid + AND s.synnamespace = {{scid}}::oid 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 bda1a7c7a..bec311e5d 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 @@ -72,7 +72,9 @@ class TableModule(SchemaChildModule): """ Generate the collection node """ - yield self.generate_browser_collection_node(scid) + if self.has_nodes(sid, did, scid=scid, + base_template_path=BaseTableView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node(scid) @property def script_load(self): 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 4e963a095..3bbd36914 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 @@ -72,9 +72,13 @@ class ColumnsModule(CollectionNodeModule): Generate the collection node """ assert ('tid' in kwargs or 'vid' in kwargs) - yield self.generate_browser_collection_node( - kwargs['tid'] if 'tid' in kwargs else kwargs['vid'] - ) + if self.has_nodes(sid, did, scid=scid, + tid=kwargs.get('tid', None), + vid=kwargs.get('vid', None), + base_template_path=ColumnsView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node( + kwargs['tid'] if 'tid' in kwargs else kwargs['vid'] + ) @property def script_load(self): @@ -159,6 +163,7 @@ class ColumnsView(PGChildNodeView, DataTypeReader): node_type = blueprint.node_type node_label = "Column" + BASE_TEMPLATE_PATH = 'columns/sql/#{0}#' parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -207,7 +212,7 @@ class ColumnsView(PGChildNodeView, DataTypeReader): self.qtTypeIdent = driver.qtTypeIdent # Set the template path for the SQL scripts - self.template_path = 'columns/sql/#{0}#'.format( + self.template_path = self.BASE_TEMPLATE_PATH.format( self.manager.version) # Allowed ACL for column 'Select/Update/Insert/References' 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 e33063729..997116f62 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 @@ -105,9 +105,13 @@ class CompoundTriggerModule(CollectionNodeModule): Generate the collection node """ assert ('tid' in kwargs or 'vid' in kwargs) - yield self.generate_browser_collection_node( - kwargs['tid'] if 'tid' in kwargs else kwargs['vid'] - ) + if self.has_nodes( + sid, did, scid=scid, tid=kwargs.get('tid', None), + vid=kwargs.get('vid', None), + base_template_path=CompoundTriggerView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node( + kwargs['tid'] if 'tid' in kwargs else kwargs['vid'] + ) @property def script_load(self): @@ -216,6 +220,7 @@ class CompoundTriggerView(PGChildNodeView, SchemaDiffObjectCompare): node_type = blueprint.node_type node_label = "Compound Trigger" + BASE_TEMPLATE_PATH = 'compound_triggers/sql/{0}/#{1}#' parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -278,7 +283,7 @@ class CompoundTriggerView(PGChildNodeView, SchemaDiffObjectCompare): ) # we will set template path for sql scripts - self.template_path = 'compound_triggers/sql/{0}/#{1}#'.format( + self.template_path = self.BASE_TEMPLATE_PATH.format( self.manager.server_type, self.manager.version) # Store server type self.server_type = self.manager.server_type 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 73400b176..04117f4fb 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 @@ -103,9 +103,13 @@ class IndexesModule(CollectionNodeModule): Generate the collection node """ assert ('tid' in kwargs or 'vid' in kwargs) - yield self.generate_browser_collection_node( - kwargs['tid'] if 'tid' in kwargs else kwargs['vid'] - ) + if self.has_nodes(sid, did, scid=scid, + tid=kwargs.get('tid', None), + vid=kwargs.get('vid', None), + base_template_path=IndexesView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node( + kwargs['tid'] if 'tid' in kwargs else kwargs['vid'] + ) @property def script_load(self): @@ -194,6 +198,7 @@ class IndexesView(PGChildNodeView, SchemaDiffObjectCompare): node_type = blueprint.node_type node_label = "Index" + BASE_TEMPLATE_PATH = 'indexes/sql/#{0}#' parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -252,8 +257,7 @@ class IndexesView(PGChildNodeView, SchemaDiffObjectCompare): ) # we will set template path for sql scripts - self.template_path = compile_template_path( - 'indexes/sql/', + self.template_path = self.BASE_TEMPLATE_PATH.format( self.manager.version ) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/row_security_policies/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/row_security_policies/__init__.py index ac2a04612..43ddb8c7f 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/row_security_policies/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/row_security_policies/__init__.py @@ -60,14 +60,18 @@ class RowSecurityModule(CollectionNodeModule): self.min_ver = 90500 self.max_ver = None - def get_nodes(self, **kwargs): + def get_nodes(self, gid, sid, did, scid, **kwargs): """ Generate the collection node """ assert ('tid' in kwargs or 'vid' in kwargs) - yield self.generate_browser_collection_node( - kwargs['tid'] if 'tid' in kwargs else kwargs['vid'] - ) + if self.has_nodes( + sid, did, scid=scid, tid=kwargs.get('tid', None), + vid=kwargs.get('vid', None), + base_template_path=RowSecurityView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node( + kwargs['tid'] if 'tid' in kwargs else kwargs['vid'] + ) @property def node_inode(self): @@ -148,6 +152,7 @@ class RowSecurityView(PGChildNodeView): node_type = blueprint.node_type node_label = "RLS Policy" + BASE_TEMPLATE_PATH = 'row_security_policies/sql/#{0}#' parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -205,7 +210,7 @@ class RowSecurityView(PGChildNodeView): 'tables/sql', self.manager.version ) - self.template_path = 'row_security_policies/sql/#{0}#'.format( + self.template_path = self.BASE_TEMPLATE_PATH.format( self.manager.version) return f(*args, **kwargs) 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 566371504..0a080e656 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 @@ -80,9 +80,13 @@ class RuleModule(CollectionNodeModule): Generate the collection node """ assert ('tid' in kwargs or 'vid' in kwargs) - yield self.generate_browser_collection_node( - kwargs['tid'] if 'tid' in kwargs else kwargs['vid'] - ) + if self.has_nodes(sid, did, scid=scid, + tid=kwargs.get('tid', None), + vid=kwargs.get('vid', None), + base_template_path=RuleView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node( + kwargs['tid'] if 'tid' in kwargs else kwargs['vid'] + ) @property def node_inode(self): @@ -150,6 +154,7 @@ class RuleView(PGChildNodeView, SchemaDiffObjectCompare): """ node_type = blueprint.node_type node_label = "Rule" + BASE_TEMPLATE_PATH = 'rules/sql' parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -197,7 +202,7 @@ class RuleView(PGChildNodeView, SchemaDiffObjectCompare): self.manager = get_driver( PG_DEFAULT_DRIVER).connection_manager(kwargs['sid']) self.conn = self.manager.connection(did=kwargs['did']) - self.template_path = 'rules/sql' + self.template_path = self.BASE_TEMPLATE_PATH self.table_template_path = compile_template_path( 'tables/sql', self.manager.version diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/count.sql new file mode 100644 index 000000000..3d63214db --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/count.sql @@ -0,0 +1,9 @@ +SELECT COUNT(*) +FROM pg_catalog.pg_attribute att +WHERE + att.attrelid = {{ tid|qtLiteral(conn) }}::oid +{### To show system objects ###} +{% if not showsysobj %} + AND att.attnum > 0 +{% endif %} + AND att.attisdropped IS FALSE diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/compound_triggers/sql/ppas/12_plus/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/compound_triggers/sql/ppas/12_plus/count.sql new file mode 100644 index 000000000..b5fea5662 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/compound_triggers/sql/ppas/12_plus/count.sql @@ -0,0 +1,5 @@ +SELECT COUNT(*) +FROM pg_catalog.pg_trigger t + WHERE NOT tgisinternal + AND tgrelid = {{tid}}::OID + AND tgpackageoid != 0 diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/indexes/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/indexes/sql/default/count.sql new file mode 100644 index 000000000..2f375997b --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/indexes/sql/default/count.sql @@ -0,0 +1,7 @@ +SELECT COUNT(*) +FROM pg_catalog.pg_index idx + JOIN pg_catalog.pg_class cls ON cls.oid=indexrelid + LEFT JOIN pg_catalog.pg_depend dep ON (dep.classid = cls.tableoid AND dep.objid = cls.oid AND dep.refobjsubid = '0' AND dep.refclassid=(SELECT oid FROM pg_catalog.pg_class WHERE relname='pg_constraint') AND dep.deptype='i') + LEFT OUTER JOIN pg_catalog.pg_constraint con ON (con.tableoid = dep.refclassid AND con.oid = dep.refobjid) +WHERE indrelid = {{tid}}::OID + AND conname is NULL diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/row_security_policies/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/row_security_policies/sql/default/count.sql new file mode 100644 index 000000000..31e455a6a --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/row_security_policies/sql/default/count.sql @@ -0,0 +1,7 @@ +SELECT COUNT(*) +FROM + pg_catalog.pg_policy pl +WHERE +{% if tid %} + pl.polrelid = {{ tid }} +{% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/rules/sql/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/rules/sql/count.sql new file mode 100644 index 000000000..e9cd0b40b --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/rules/sql/count.sql @@ -0,0 +1,7 @@ +SELECT COUNT(*) +FROM + pg_catalog.pg_rewrite rw +WHERE +{% if tid %} + rw.ev_class = {{ tid }} +{% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/default/count.sql new file mode 100644 index 000000000..ee8b833e5 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/default/count.sql @@ -0,0 +1,4 @@ +SELECT COUNT(*) +FROM pg_catalog.pg_class rel + WHERE rel.relkind IN ('r','s','t','p') AND rel.relnamespace = {{ scid }}::oid + AND NOT rel.relispartition; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/triggers/sql/pg/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/triggers/sql/pg/default/count.sql new file mode 100644 index 000000000..74f54929e --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/triggers/sql/pg/default/count.sql @@ -0,0 +1,4 @@ +SELECT COUNT(*) +FROM pg_catalog.pg_trigger t +WHERE NOT tgisinternal + AND tgrelid = {{tid}}::OID diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/triggers/sql/ppas/12_plus/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/triggers/sql/ppas/12_plus/count.sql new file mode 100644 index 000000000..b17aaf7cb --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/triggers/sql/ppas/12_plus/count.sql @@ -0,0 +1,5 @@ +SELECT COUNT(*) +FROM pg_catalog.pg_trigger t + WHERE NOT tgisinternal + AND tgrelid = {{tid}}::OID + AND tgpackageoid = 0 diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/triggers/sql/ppas/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/triggers/sql/ppas/default/count.sql new file mode 100644 index 000000000..74f54929e --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/triggers/sql/ppas/default/count.sql @@ -0,0 +1,4 @@ +SELECT COUNT(*) +FROM pg_catalog.pg_trigger t +WHERE NOT tgisinternal + AND tgrelid = {{tid}}::OID 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 356242b5e..025958035 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 @@ -101,9 +101,13 @@ class TriggerModule(CollectionNodeModule): Generate the collection node """ assert ('tid' in kwargs or 'vid' in kwargs) - yield self.generate_browser_collection_node( - kwargs['tid'] if 'tid' in kwargs else kwargs['vid'] - ) + if self.has_nodes(sid, did, scid=scid, + tid=kwargs.get('tid', None), + vid=kwargs.get('vid', None), + base_template_path=TriggerView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node( + kwargs['tid'] if 'tid' in kwargs else kwargs['vid'] + ) @property def script_load(self): @@ -213,6 +217,7 @@ class TriggerView(PGChildNodeView, SchemaDiffObjectCompare): node_type = blueprint.node_type node_label = "Trigger" + BASE_TEMPLATE_PATH = 'triggers/sql/{0}/#{1}#' parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -266,7 +271,7 @@ class TriggerView(PGChildNodeView, SchemaDiffObjectCompare): 'tables/sql', self.manager.version ) - self.template_path = 'triggers/sql/{0}/#{1}#'.format( + self.template_path = self.BASE_TEMPLATE_PATH.format( self.manager.server_type, self.manager.version) self.trigger_function_template_path = \ 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 ee0b68c6c..aa16ecabc 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 @@ -90,6 +90,7 @@ class BaseTableView(PGChildNodeView, BasePartitionTable, VacuumSettings): node_label = "Table" pattern = '\n{2,}' double_newline = '\n\n' + BASE_TEMPLATE_PATH = 'tables/sql/#{0}#' @staticmethod def check_precondition(f): 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 592faad0e..1bc293aed 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 @@ -71,7 +71,9 @@ class TypeModule(SchemaChildModule): """ Generate the collection node """ - yield self.generate_browser_collection_node(scid) + if self.has_nodes(sid, did, scid=scid, + base_template_path=TypeView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node(scid) @property def script_load(self): @@ -179,6 +181,7 @@ class TypeView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare): node_type = blueprint.node_type icon_str = "icon-%s" + BASE_TEMPLATE_PATH = 'types/{0}/sql/#{1}#' parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -238,12 +241,8 @@ class TypeView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare): # Declare allows acl on type self.acl = ['U'] - self.template_path = "/".join([ - 'types', - self.manager.server_type, - 'sql', - '#{0}#' - ]).format(self.manager.version) + self.template_path = self.BASE_TEMPLATE_PATH.format( + self.manager.server_type, self.manager.version) return f(*args, **kwargs) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/templates/types/pg/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/templates/types/pg/sql/default/count.sql new file mode 100644 index 000000000..20d3b8b25 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/templates/types/pg/sql/default/count.sql @@ -0,0 +1,7 @@ +SELECT COUNT(*) +FROM pg_catalog.pg_type t +LEFT OUTER JOIN pg_catalog.pg_class ct ON ct.oid=t.typrelid AND ct.relkind <> 'c' +WHERE t.typtype != 'd' AND t.typname NOT LIKE E'\\_%' AND t.typnamespace = {{scid}}::oid +{% if not showsysobj %} + AND ct.oid is NULL +{% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/templates/types/ppas/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/templates/types/ppas/sql/default/count.sql new file mode 100644 index 000000000..670982a2e --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/templates/types/ppas/sql/default/count.sql @@ -0,0 +1,7 @@ +SELECT COUNT(*) +FROM pg_catalog.pg_type t + LEFT OUTER JOIN pg_catalog.pg_class ct ON ct.oid=t.typrelid AND ct.relkind <> 'c' +WHERE t.typtype != 'd' AND t.typname NOT LIKE E'\\_%' AND t.typnamespace = {{scid}}::oid +{% if not showsysobj %} + AND ct.oid is NULL +{% endif %} 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 c97fccdf3..f652f0f8c 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 @@ -91,7 +91,10 @@ class ViewModule(SchemaChildModule): """ Generate the collection node """ - yield self.generate_browser_collection_node(scid) + if self.has_nodes( + sid, did, scid, base_template_path=ViewNode.BASE_TEMPLATE_PATH + + '/' + ViewNode._SQL_PREFIX): + yield self.generate_browser_collection_node(scid) @property def script_load(self): @@ -216,6 +219,15 @@ class MViewModule(ViewModule): self.min_ver = 90300 self.max_ver = None + def get_nodes(self, gid, sid, did, scid): + """ + Generate the collection node + """ + if self.has_nodes( + sid, did, scid, base_template_path=MViewNode.BASE_TEMPLATE_PATH + + '/' + MViewNode._SQL_PREFIX): + yield self.generate_browser_collection_node(scid) + view_blueprint = ViewModule(__name__) mview_blueprint = MViewModule(__name__) @@ -242,12 +254,8 @@ def check_precondition(f): kwargs['sid'] ) self.conn = self.manager.connection(did=kwargs['did']) - # Set template path for sql scripts - if self.manager.server_type == 'ppas': - _temp = self.ppas_template_path(self.manager.version) - else: - _temp = self.pg_template_path(self.manager.version) - self.template_path = self.template_initial + '/' + _temp + self.template_path = self.BASE_TEMPLATE_PATH.format( + self.manager.server_type, self.manager.version) self.column_template_path = 'columns/sql/#{0}#'.format( self.manager.version) @@ -327,6 +335,7 @@ class ViewNode(PGChildNodeView, VacuumSettings, SchemaDiffObjectCompare): _SQL_PREFIX = 'sql/' _ALLOWED_PRIVS_JSON = 'sql/allowed_privs.json' PROPERTIES_PATH = 'sql/{0}/#{1}#/properties.sql' + BASE_TEMPLATE_PATH = 'views/{0}/#{1}#' parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -377,23 +386,8 @@ class ViewNode(PGChildNodeView, VacuumSettings, SchemaDiffObjectCompare): self.manager = None self.conn = None self.template_path = None - self.template_initial = 'views' self.allowed_acls = [] - @staticmethod - def ppas_template_path(ver): - """ - Returns the template path for PPAS servers. - """ - return 'ppas/#{0}#'.format(ver) - - @staticmethod - def pg_template_path(ver): - """ - Returns the template path for PostgreSQL servers. - """ - return 'pg/#{0}#'.format(ver) - @check_precondition def list(self, gid, sid, did, scid): """ @@ -1797,6 +1791,7 @@ class MViewNode(ViewNode, VacuumSettings): node_type = mview_blueprint.node_type operations = mview_operations TOAST_STR = 'toast.' + BASE_TEMPLATE_PATH = 'mviews/{0}/#{1}#' def __init__(self, *args, **kwargs): """ @@ -1805,7 +1800,6 @@ class MViewNode(ViewNode, VacuumSettings): super().__init__(*args, **kwargs) - self.template_initial = 'mviews' self.allowed_acls = [] @staticmethod diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/pg/default/sql/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/pg/default/sql/count.sql new file mode 100644 index 000000000..02ea09f76 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/pg/default/sql/count.sql @@ -0,0 +1,7 @@ +SELECT COUNT(*) +FROM pg_catalog.pg_class c +WHERE + c.relkind = 'm' +{% if scid %} + AND c.relnamespace = {{scid}}::oid +{% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/ppas/default/sql/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/ppas/default/sql/count.sql new file mode 100644 index 000000000..02ea09f76 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/ppas/default/sql/count.sql @@ -0,0 +1,7 @@ +SELECT COUNT(*) +FROM pg_catalog.pg_class c +WHERE + c.relkind = 'm' +{% if scid %} + AND c.relnamespace = {{scid}}::oid +{% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/default/sql/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/default/sql/count.sql new file mode 100644 index 000000000..fdb5d5e40 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/default/sql/count.sql @@ -0,0 +1,7 @@ +SELECT COUNT(*) +FROM pg_catalog.pg_class c +WHERE + c.relkind = 'v' +{% if scid %} + AND c.relnamespace = {{scid}}::oid +{% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/default/sql/count.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/default/sql/count.sql new file mode 100644 index 000000000..fdb5d5e40 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/default/sql/count.sql @@ -0,0 +1,7 @@ +SELECT COUNT(*) +FROM pg_catalog.pg_class c +WHERE + c.relkind = 'v' +{% if scid %} + AND c.relnamespace = {{scid}}::oid +{% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/subscriptions/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/subscriptions/__init__.py index 61bda1714..e1deb11dd 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/subscriptions/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/subscriptions/__init__.py @@ -74,7 +74,10 @@ class SubscriptionModule(CollectionNodeModule): sid: Server ID did: Database Id """ - yield self.generate_browser_collection_node(did) + if self.has_nodes( + sid, did, + base_template_path=SubscriptionView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node(did) @property def node_inode(self): @@ -176,6 +179,7 @@ class SubscriptionView(PGChildNodeView, SchemaDiffObjectCompare): _NOT_FOUND_PUB_INFORMATION = \ gettext("Could not find the subscription information.") node_type = blueprint.node_type + BASE_TEMPLATE_PATH = "subscriptions/sql/#{0}#" parent_ids = [ {'type': 'int', 'id': 'gid'}, @@ -232,7 +236,7 @@ class SubscriptionView(PGChildNodeView, SchemaDiffObjectCompare): self.conn = self.manager.connection(did=kwargs['did']) # Set the template path for the SQL scripts self.template_path = ( - "subscriptions/sql/#{0}#".format(self.manager.version) + self.BASE_TEMPLATE_PATH.format(self.manager.version) ) return f(*args, **kwargs) diff --git a/web/pgadmin/browser/server_groups/servers/databases/subscriptions/templates/subscriptions/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/databases/subscriptions/templates/subscriptions/sql/default/count.sql new file mode 100644 index 000000000..4bac35de1 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/subscriptions/templates/subscriptions/sql/default/count.sql @@ -0,0 +1,3 @@ +SELECT COUNT(*) +FROM pg_catalog.pg_subscription sub +WHERE sub.subdbid = {{ did }} 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 2a08a37d2..6aa3d1cb1 100644 --- a/web/pgadmin/browser/server_groups/servers/resource_groups/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/resource_groups/__init__.py @@ -79,7 +79,10 @@ class ResourceGroupModule(CollectionNodeModule): gid: Server Group ID sid: Server ID """ - yield self.generate_browser_collection_node(sid) + if self.has_nodes( + sid, None, + base_template_path=ResourceGroupView.BASE_TEMPLATE_PATH): + yield self.generate_browser_collection_node(sid) @property def node_inode(self): @@ -165,6 +168,7 @@ class ResourceGroupView(NodeView): """ node_type = blueprint.node_type + BASE_TEMPLATE_PATH = 'resource_groups/sql/#{0}#' _PROPERTIES_SQL = 'properties.sql' _CREATE_SQL = 'create.sql' _UPDATE_SQL = 'update.sql' @@ -236,7 +240,7 @@ class ResourceGroupView(NodeView): "Connection to the server has been lost." ) ) - self.sql_path = 'resource_groups/sql/#{0}#'.format( + self.sql_path = self.BASE_TEMPLATE_PATH.format( self.manager.version ) return f(*args, **kwargs) diff --git a/web/pgadmin/browser/server_groups/servers/resource_groups/templates/resource_groups/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/resource_groups/templates/resource_groups/sql/default/count.sql new file mode 100644 index 000000000..e1622bfc6 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/resource_groups/templates/resource_groups/sql/default/count.sql @@ -0,0 +1,2 @@ +SELECT COUNT(*) +FROM edb_resource_group diff --git a/web/pgadmin/browser/utils.py b/web/pgadmin/browser/utils.py index 708592141..cb5717dfc 100644 --- a/web/pgadmin/browser/utils.py +++ b/web/pgadmin/browser/utils.py @@ -373,6 +373,7 @@ class PGChildNodeView(NodeView): _NODE_SQL = 'node.sql' _NODES_SQL = 'nodes.sql' + _COUNT_SQL = 'count.sql' _CREATE_SQL = 'create.sql' _UPDATE_SQL = 'update.sql' _ALTER_SQL = 'alter.sql' diff --git a/web/pgadmin/static/js/tree/tree_nodes.ts b/web/pgadmin/static/js/tree/tree_nodes.ts index 8cbfaecd9..055438218 100644 --- a/web/pgadmin/static/js/tree/tree_nodes.ts +++ b/web/pgadmin/static/js/tree/tree_nodes.ts @@ -151,10 +151,10 @@ export class ManageTreeNodes { await fill(treeData); if (node.children.length > 0) res(node.children); else { - res(null); + res([]); if (node.data && node.data._type == 'server' && node.data.connected) { Notify.info(gettext('Server children are not available.' - +' Please check these nodes are not hidden through the preferences setting `Browser > Nodes`.')); + +' Please check these nodes are not hidden through the preferences setting `Browser > Nodes`.'), null); } }