diff --git a/web/pgadmin/browser/collection.py b/web/pgadmin/browser/collection.py index 97f58b6..804e8b3 100644 --- a/web/pgadmin/browser/collection.py +++ b/web/pgadmin/browser/collection.py @@ -76,10 +76,10 @@ class CollectionNodeModule(PgAdminModule, PGChildModule): obj.setdefault(key, kwargs[key]) return obj - def generate_browser_collection_node(self, parent_id, **kwargs): + def generate_browser_collection_node(self, parent_id, collection_count, **kwargs): obj = { "id": "coll-%s/%d" % (self.node_type, parent_id), - "label": self.collection_label, + "label": self.collection_label + ' (' + str(collection_count) + ')', "icon": self.collection_icon, "inode": True, "_type": 'coll-%s' % (self.node_type), diff --git a/web/pgadmin/browser/server_groups/__init__.py b/web/pgadmin/browser/server_groups/__init__.py index faff488..63c38e5 100644 --- a/web/pgadmin/browser/server_groups/__init__.py +++ b/web/pgadmin/browser/server_groups/__init__.py @@ -21,7 +21,7 @@ from pgadmin.utils.ajax import make_json_response, \ make_response as ajax_response from pgadmin.utils.menu import MenuItem -from pgadmin.model import db, ServerGroup +from pgadmin.model import db, ServerGroup, Server class ServerGroupModule(BrowserPluginModule): @@ -33,9 +33,14 @@ class ServerGroupModule(BrowserPluginModule): user_id=current_user.id ).order_by("id") for idx, group in enumerate(groups): + + # Find number of servers in this group + servers = Server.query.filter_by(user_id=current_user.id, + servergroup_id=group.id) + yield self.generate_browser_node( "%d" % (group.id), None, - group.name, + group.name + ' (' + str(servers.count()) + ')', "icon-%s" % self.node_type, True, self.node_type, diff --git a/web/pgadmin/browser/server_groups/servers/databases/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/__init__.py index 3b7c57b..cf76523 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/__init__.py @@ -30,6 +30,45 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(action=None): + """ + This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to self + """ + + def wrap(f): + @wraps(f) + def wrapped(self, *args, **kwargs): + + self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(kwargs['sid']) + if action and action in ["drop"]: + self.conn = self.manager.connection() + elif 'did' in kwargs: + self.conn = self.manager.connection(did=kwargs['did']) + else: + self.conn = self.manager.connection() + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + _("Connection to the server has been lost!") + ) + + ver = self.manager.version + # we will set template path for sql scripts + if ver >= 90300: + self.template_path = 'databases/sql/9.3_plus' + elif ver >= 90200: + self.template_path = 'databases/sql/9.2_plus' + else: + self.template_path = 'databases/sql/9.1_plus' + return f(self, *args, **kwargs) + + return wrapped + + return wrap + + class DatabaseModule(CollectionNodeModule): NODE_TYPE = 'database' COLLECTION_LABEL = _("Databases") @@ -40,12 +79,28 @@ class DatabaseModule(CollectionNodeModule): super(DatabaseModule, self).__init__(*args, **kwargs) + @check_precondition(action="nodes") def get_nodes(self, gid, sid): """ Generate the collection node """ if self.show_node: - yield self.generate_browser_collection_node(sid) + collection_count = 0 + last_system_oid = 0 if self.show_system_objects else \ + (self.manager.db_info[self.manager.did])['datlastsysoid'] + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template( + "/".join([self.template_path, 'nodes.sql']), + last_system_oid=last_system_oid + ) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(sid, collection_count) @property def script_load(self): @@ -111,47 +166,10 @@ class DatabaseView(PGChildNodeView): }], 'get_encodings': [{'get': 'get_encodings'}, {'get': 'get_encodings'}], 'get_ctypes': [{'get': 'get_ctypes'}, {'get': 'get_ctypes'}], - 'vopts': [{}, {'get': 'variable_options'}] + 'vopts': [{}, {'get': 'variable_options'}], + 'coll': [{}, {'get': 'collection'}] }) - def check_precondition(action=None): - """ - This function will behave as a decorator which will checks - database connection before running view, it will also attaches - manager,conn & template_path properties to self - """ - - def wrap(f): - @wraps(f) - def wrapped(self, *args, **kwargs): - - self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(kwargs['sid']) - if action and action in ["drop"]: - self.conn = self.manager.connection() - elif 'did' in kwargs: - self.conn = self.manager.connection(did=kwargs['did']) - else: - self.conn = self.manager.connection() - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - _("Connection to the server has been lost!") - ) - - ver = self.manager.version - # we will set template path for sql scripts - if ver >= 90300: - self.template_path = 'databases/sql/9.3_plus' - elif ver >= 90200: - self.template_path = 'databases/sql/9.2_plus' - else: - self.template_path = 'databases/sql/9.1_plus' - return f(self, *args, **kwargs) - - return wrapped - - return wrap - @check_precondition(action="list") def list(self, gid, sid): last_system_oid = 0 if self.blueprint.show_system_objects else \ 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 86a7eca..a5e2f38 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/casts/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/casts/__init__.py @@ -25,6 +25,36 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + This function will behave as a decorator which will check the + database connection before running view. It will also attach + manager, conn & template_path properties to self + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold self & kwargs will hold gid,sid,did + self = args[0] + self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(kwargs['sid']) + self.conn = self.manager.connection(did=kwargs['did']) + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + gettext( + "Connection to the server has been lost!" + ) + ) + ver = self.manager.version + # we will set template path for sql scripts + if ver >= 90100: + self.template_path = 'cast/sql/9.1_plus' + + return f(*args, **kwargs) + + return wrap + + class CastModule(CollectionNodeModule): """ class CastModule(CollectionNodeModule) @@ -53,6 +83,7 @@ class CastModule(CollectionNodeModule): def __init__(self, *args, **kwargs): super(CastModule, self).__init__(*args, **kwargs) + @check_precondition def get_nodes(self, gid, sid, did): """ Generate the collection node @@ -60,7 +91,23 @@ class CastModule(CollectionNodeModule): :param sid: server id :param did: database id """ - yield self.generate_browser_collection_node(did) + collection_count = 0 + last_system_oid = 0 if self.show_system_objects else \ + (self.manager.db_info[self.manager.did])['datlastsysoid'] + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template( + "/".join([self.template_path, 'nodes.sql']), + datlastsysoid=self.manager.db_info[did]['datlastsysoid'], + showsysobj=self.show_system_objects + ) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(did, collection_count) @property def node_inode(self): @@ -188,35 +235,6 @@ class CastView(PGChildNodeView): 200, {'Content-Type': 'application/x-javascript'} ) - def check_precondition(f): - """ - This function will behave as a decorator which will check the - database connection before running view. It will also attach - manager, conn & template_path properties to self - """ - - @wraps(f) - def wrap(*args, **kwargs): - # Here args[0] will hold self & kwargs will hold gid,sid,did - self = args[0] - self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(kwargs['sid']) - self.conn = self.manager.connection(did=kwargs['did']) - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - gettext( - "Connection to the server has been lost!" - ) - ) - ver = self.manager.version - # we will set template path for sql scripts - if ver >= 90100: - self.template_path = 'cast/sql/9.1_plus' - - return f(*args, **kwargs) - - return wrap - @check_precondition def list(self, gid, sid, did): """ 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 9f434e1..9c625b2 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 @@ -24,6 +24,37 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to self + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold self & kwargs will hold gid,sid,did + self = args[0] + self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(kwargs['sid']) + self.conn = self.manager.connection(did=kwargs['did']) + + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + gettext( + "Connection to the server has been lost!" + ) + ) + + ver = self.manager.version + if ver >= 90300: + self.template_path = 'event_triggers/sql/9.3_plus' + + return f(*args, **kwargs) + + return wrap + + class EventTriggerModule(CollectionNodeModule): """ class EventTriggerModule(CollectionNodeModule) @@ -59,11 +90,22 @@ class EventTriggerModule(CollectionNodeModule): self.min_ver = 90300 self.max_ver = None + @check_precondition def get_nodes(self, gid, sid, did): """ Generate the event_trigger node """ - yield self.generate_browser_collection_node(sid) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.template_path, 'nodes.sql'])) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(sid, collection_count) @property def node_inode(self): @@ -179,35 +221,6 @@ class EventTriggerView(PGChildNodeView): 200, {'Content-Type': 'application/x-javascript'} ) - def check_precondition(f): - """ - This function will behave as a decorator which will checks - database connection before running view, it will also attaches - manager,conn & template_path properties to self - """ - - @wraps(f) - def wrap(*args, **kwargs): - # Here args[0] will hold self & kwargs will hold gid,sid,did - self = args[0] - self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(kwargs['sid']) - self.conn = self.manager.connection(did=kwargs['did']) - - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - gettext( - "Connection to the server has been lost!" - ) - ) - - ver = self.manager.version - if ver >= 90300: - self.template_path = 'event_triggers/sql/9.3_plus' - - return f(*args, **kwargs) - - return wrap @check_precondition def list(self, gid, sid, did): 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 888393c..aff15a0 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/extensions/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/__init__.py @@ -45,6 +45,28 @@ else: basestring = basestring +def check_precondition(f): + """ + This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to self + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold self & kwargs will hold gid,sid,did + self = args[0] + self.manager = get_driver( + PG_DEFAULT_DRIVER + ).connection_manager(kwargs['sid']) + self.conn = self.manager.connection(did=kwargs['did']) + self.template_path = 'extensions/sql' + + return f(*args, **kwargs) + + return wrap + + class ExtensionModule(CollectionNodeModule): """ class ExtensionModule(Object): @@ -62,11 +84,22 @@ class ExtensionModule(CollectionNodeModule): """ super(ExtensionModule, self).__init__(*args, **kwargs) + @check_precondition def get_nodes(self, gid, sid, did): """ Generate the collection node """ - yield self.generate_browser_collection_node(did) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.template_path, 'properties.sql'])) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(did, collection_count) @property def node_inode(self): @@ -130,27 +163,6 @@ class ExtensionView(PGChildNodeView): 'children': [{'get': 'children'}] }) - def check_precondition(f): - """ - This function will behave as a decorator which will checks - database connection before running view, it will also attaches - manager,conn & template_path properties to self - """ - - @wraps(f) - def wrap(*args, **kwargs): - # Here args[0] will hold self & kwargs will hold gid,sid,did - self = args[0] - self.manager = get_driver( - PG_DEFAULT_DRIVER - ).connection_manager(kwargs['sid']) - self.conn = self.manager.connection(did=kwargs['did']) - self.template_path = 'extensions/sql' - - return f(*args, **kwargs) - - return wrap - @check_precondition def list(self, gid, sid, did): """ 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 d4494a1..3edb755 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 @@ -27,6 +27,40 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to self + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold self & kwargs will hold gid,sid,did + self = args[0] + self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(kwargs['sid']) + self.conn = self.manager.connection(did=kwargs['did']) + + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + gettext( + "Connection to the server has been lost!" + ) + ) + + ver = self.manager.version + # we will set template path for sql scripts + if ver >= 90300: + self.template_path = 'foreign_data_wrappers/sql/9.3_plus' + else: + self.template_path = 'foreign_data_wrappers/sql/9.1_plus' + + return f(*args, **kwargs) + + return wrap + + class ForeignDataWrapperModule(CollectionNodeModule): """ class ForeignDataWrapperModule(CollectionNodeModule) @@ -63,6 +97,7 @@ class ForeignDataWrapperModule(CollectionNodeModule): super(ForeignDataWrapperModule, self).__init__(*args, **kwargs) + @check_precondition def get_nodes(self, gid, sid, did): """ Method is used to generate the browser collection node @@ -72,7 +107,17 @@ class ForeignDataWrapperModule(CollectionNodeModule): sid: Server ID did: Database Id """ - yield self.generate_browser_collection_node(did) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.template_path, 'properties.sql']), conn=self.conn) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(did, collection_count) @property def script_load(self): @@ -197,39 +242,6 @@ class ForeignDataWrapperView(PGChildNodeView): 200, {'Content-Type': 'application/x-javascript'} ) - def check_precondition(f): - """ - This function will behave as a decorator which will checks - database connection before running view, it will also attaches - manager,conn & template_path properties to self - """ - - @wraps(f) - def wrap(*args, **kwargs): - # Here args[0] will hold self & kwargs will hold gid,sid,did - self = args[0] - self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(kwargs['sid']) - self.conn = self.manager.connection(did=kwargs['did']) - - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - gettext( - "Connection to the server has been lost!" - ) - ) - - ver = self.manager.version - # we will set template path for sql scripts - if ver >= 90300: - self.template_path = 'foreign_data_wrappers/sql/9.3_plus' - else: - self.template_path = 'foreign_data_wrappers/sql/9.1_plus' - - return f(*args, **kwargs) - - return wrap - @check_precondition def list(self, gid, sid, did): """ 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 f51975f..8cdf7a3 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 @@ -27,6 +27,40 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to self + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold self & kwargs will hold gid,sid,did + self = args[0] + self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(kwargs['sid']) + self.conn = self.manager.connection(did=kwargs['did']) + + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + gettext( + "Connection to the server has been lost!" + ) + ) + + ver = self.manager.version + # we will set template path for sql scripts + if ver >= 90300: + self.template_path = 'foreign_servers/sql/9.3_plus' + else: + self.template_path = 'foreign_servers/sql/9.1_plus' + + return f(*args, **kwargs) + + return wrap + + class ForeignServerModule(CollectionNodeModule): """ class ForeignServerModule(CollectionNodeModule) @@ -63,6 +97,7 @@ class ForeignServerModule(CollectionNodeModule): super(ForeignServerModule, self).__init__(*args, **kwargs) + @check_precondition def get_nodes(self, gid, sid, did, fid): """ Method is used to generate the browser collection node @@ -73,7 +108,18 @@ class ForeignServerModule(CollectionNodeModule): did: Database ID fid: foreign data wrapper ID """ - yield self.generate_browser_collection_node(fid) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.template_path, 'properties.sql']), + conn=self.conn, fid=fid) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(fid, collection_count) @property def script_load(self): @@ -191,39 +237,6 @@ class ForeignServerView(PGChildNodeView): 200, {'Content-Type': 'application/x-javascript'} ) - def check_precondition(f): - """ - This function will behave as a decorator which will checks - database connection before running view, it will also attaches - manager,conn & template_path properties to self - """ - - @wraps(f) - def wrap(*args, **kwargs): - # Here args[0] will hold self & kwargs will hold gid,sid,did - self = args[0] - self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(kwargs['sid']) - self.conn = self.manager.connection(did=kwargs['did']) - - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - gettext( - "Connection to the server has been lost!" - ) - ) - - ver = self.manager.version - # we will set template path for sql scripts - if ver >= 90300: - self.template_path = 'foreign_servers/sql/9.3_plus' - else: - self.template_path = 'foreign_servers/sql/9.1_plus' - - return f(*args, **kwargs) - - return wrap - @check_precondition def list(self, gid, sid, did, fid): """ diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/templates/foreign_servers/sql/9.1_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/templates/foreign_servers/sql/9.1_plus/properties.sql index 011378c..bb14018 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/templates/foreign_servers/sql/9.1_plus/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/templates/foreign_servers/sql/9.1_plus/properties.sql @@ -23,5 +23,5 @@ WHERE srvfdw={{fid}}::int {% if fsid %} WHERE srv.oid={{fsid}}::int {% endif %} -ORDER BY srvname; +ORDER BY srvname {% endif %} \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/templates/foreign_servers/sql/9.3_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/templates/foreign_servers/sql/9.3_plus/properties.sql index 98154b8..8741263 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/templates/foreign_servers/sql/9.3_plus/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/templates/foreign_servers/sql/9.3_plus/properties.sql @@ -22,5 +22,5 @@ WHERE srvfdw={{fid}}::int {% if fsid %} WHERE srv.oid={{fsid}}::int {% endif %} -ORDER BY srvname; +ORDER BY srvname {% endif %} \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/__init__.py index c0e3f58..09762ec 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/__init__.py @@ -25,6 +25,40 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to self + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold self & kwargs will hold gid,sid,did + self = args[0] + self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(kwargs['sid']) + self.conn = self.manager.connection(did=kwargs['did']) + + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + gettext( + "Connection to the server has been lost!" + ) + ) + + self.template_path = 'user_mappings/sql/9.1_plus' + + ver = self.manager.version + # we will set template path for sql scripts + if ver >= 90100: + self.template_path = 'user_mappings/sql/9.1_plus' + + return f(*args, **kwargs) + + return wrap + + class UserMappingModule(CollectionNodeModule): """ class UserMappingModule(CollectionNodeModule) @@ -64,6 +98,7 @@ class UserMappingModule(CollectionNodeModule): super(UserMappingModule, self).__init__(*args, **kwargs) + @check_precondition def get_nodes(self, gid, sid, did, fid, fsid): """ Method is used to generate the browser collection node @@ -75,8 +110,18 @@ class UserMappingModule(CollectionNodeModule): fid: foreign data wrapper ID fsid: Foreign server ID """ + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.template_path, 'properties.sql']), + conn=self.conn, fsid=fsid) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset - yield self.generate_browser_collection_node(fsid) + yield self.generate_browser_collection_node(fsid, collection_count) @property def node_inode(self): @@ -205,39 +250,6 @@ class UserMappingView(PGChildNodeView): 200, {'Content-Type': 'application/x-javascript'} ) - def check_precondition(f): - """ - This function will behave as a decorator which will checks - database connection before running view, it will also attaches - manager,conn & template_path properties to self - """ - - @wraps(f) - def wrap(*args, **kwargs): - # Here args[0] will hold self & kwargs will hold gid,sid,did - self = args[0] - self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(kwargs['sid']) - self.conn = self.manager.connection(did=kwargs['did']) - - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - gettext( - "Connection to the server has been lost!" - ) - ) - - self.template_path = 'user_mappings/sql/9.1_plus' - - ver = self.manager.version - # we will set template path for sql scripts - if ver >= 90100: - self.template_path = 'user_mappings/sql/9.1_plus' - - return f(*args, **kwargs) - - return wrap - @check_precondition def list(self, gid, sid, did, fid, fsid): """ diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/templates/user_mappings/sql/9.1_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/templates/user_mappings/sql/9.1_plus/properties.sql index 7996abd..1ef2db3 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/templates/user_mappings/sql/9.1_plus/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/templates/user_mappings/sql/9.1_plus/properties.sql @@ -19,5 +19,5 @@ WITH umapData AS {% if fdwdata %} WHERE fdw.fdwname = {{fdwdata.name|qtLiteral}}::text {% endif %} - ORDER BY 2; + ORDER BY 2 {% endif %} 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 07c04e9..d00f0dc 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/languages/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/languages/__init__.py @@ -27,6 +27,41 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + This function will behave as a decorator which will check the + database connection before running the view. It also attaches + manager, conn & template_path properties to self + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold self & kwargs will hold gid,sid,did + self = args[0] + self.driver = get_driver(PG_DEFAULT_DRIVER) + self.manager = self.driver.connection_manager(kwargs['sid']) + self.conn = self.manager.connection(did=kwargs['did']) + + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + gettext( + "Connection to the server has been lost!" + ) + ) + + ver = self.manager.version + # we will set template path for sql scripts + if ver >= 90300: + self.template_path = 'languages/sql/9.3_plus' + else: + self.template_path = 'languages/sql/9.1_plus' + + return f(*args, **kwargs) + + return wrap + + class LanguageModule(CollectionNodeModule): """ class LanguageModule(CollectionNodeModule) @@ -65,6 +100,7 @@ class LanguageModule(CollectionNodeModule): super(LanguageModule, self).__init__(*args, **kwargs) + @check_precondition def get_nodes(self, gid, sid, did): """ Method is used to generate the browser collection node @@ -74,7 +110,17 @@ class LanguageModule(CollectionNodeModule): sid: Server ID did: Database Id """ - yield self.generate_browser_collection_node(did) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.template_path, 'properties.sql'])) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(did, collection_count) @property def node_inode(self): @@ -204,40 +250,6 @@ class LanguageView(PGChildNodeView): 200, {'Content-Type': 'application/x-javascript'} ) - def check_precondition(f): - """ - This function will behave as a decorator which will check the - database connection before running the view. It also attaches - manager, conn & template_path properties to self - """ - - @wraps(f) - def wrap(*args, **kwargs): - # Here args[0] will hold self & kwargs will hold gid,sid,did - self = args[0] - self.driver = get_driver(PG_DEFAULT_DRIVER) - self.manager = self.driver.connection_manager(kwargs['sid']) - self.conn = self.manager.connection(did=kwargs['did']) - - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - gettext( - "Connection to the server has been lost!" - ) - ) - - ver = self.manager.version - # we will set template path for sql scripts - if ver >= 90300: - self.template_path = 'languages/sql/9.3_plus' - else: - self.template_path = 'languages/sql/9.1_plus' - - return f(*args, **kwargs) - - return wrap - @check_precondition def list(self, gid, sid, did): """ 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 4671897..ec7414b 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py @@ -44,6 +44,47 @@ from config import PG_DEFAULT_DRIVER """ +def check_precondition(f): + """ + This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to instance of the method. + + Assumptions: + This function will always be used as decorator of a class method. + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold self & kwargs will hold gid,sid,did + self = args[0] + self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager( + kwargs['sid'] + ) + self.conn = self.manager.connection(did=kwargs['did']) + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + gettext("Connection to the server has been lost!") + ) + + # Set template path for sql scripts + if hasattr(self, 'NODE_TYPE'): + initial_path = self.NODE_TYPE + else: + initial_path = self.template_initial + + self.template_path = initial_path + '/' + ( + SchemaView.ppas_template_path(self.manager.version) + if self.manager.server_type == 'ppas' else + SchemaView.pg_template_path(self.manager.version) + ) + + return f(*args, **kwargs) + + return wrap + + class SchemaModule(CollectionNodeModule): """ class SchemaModule(CollectionNodeModule) @@ -81,11 +122,26 @@ class SchemaModule(CollectionNodeModule): super(SchemaModule, self).__init__(*args, **kwargs) + @check_precondition def get_nodes(self, gid, sid, did): """ Generate the collection node """ - yield self.generate_browser_collection_node(did) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template( + "/".join([self.template_path, 'sql/nodes.sql']), + show_sysobj=self.show_system_objects, + _=gettext + ) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(did, collection_count) @property def script_load(self): @@ -111,42 +167,6 @@ schema_blueprint = SchemaModule(__name__) catalog_blueprint = CatalogModule(__name__) -def check_precondition(f): - """ - This function will behave as a decorator which will checks - database connection before running view, it will also attaches - manager,conn & template_path properties to instance of the method. - - Assumptions: - This function will always be used as decorator of a class method. - """ - - @wraps(f) - def wrap(*args, **kwargs): - # Here args[0] will hold self & kwargs will hold gid,sid,did - self = args[0] - self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager( - kwargs['sid'] - ) - self.conn = self.manager.connection(did=kwargs['did']) - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - gettext("Connection to the server has been lost!") - ) - - # Set template path for sql scripts - self.template_path = self.template_initial + '/' + ( - self.ppas_template_path(self.manager.version) - if self.manager.server_type == 'ppas' else - self.pg_template_path(self.manager.version) - ) - - return f(*args, **kwargs) - - return wrap - - class SchemaView(PGChildNodeView): """ This class is responsible for generating routes for schema node. 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 e55afdf..77e18bd 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 @@ -25,6 +25,38 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to self + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold self & kwargs will hold gid,sid,did + self = args[0] + self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager( + kwargs['sid'] + ) + self.conn = self.manager.connection(did=kwargs['did']) + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + gettext( + "Connection to the server has been lost!" + ) + ) + + self.template_path = 'catalog_object/sql/{0}/9.1_plus'.format( + 'ppas' if self.manager.server_type == 'ppas' else 'pg' + ) + + return f(*args, **kwargs) + + return wrap + + class CatalogObjectModule(SchemaChildModule): """ class CatalogObjectModule(SchemaChildModule) @@ -65,11 +97,23 @@ class CatalogObjectModule(SchemaChildModule): self.min_ver = None self.max_ver = None + @check_precondition def get_nodes(self, gid, sid, did, scid): """ Generate the collection node """ - yield self.generate_browser_collection_node(scid) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.template_path, 'nodes.sql']), + scid=scid) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(scid, collection_count) @property def script_load(self): @@ -131,37 +175,6 @@ class CatalogObjectView(PGChildNodeView): 'module.js': [{}, {}, {'get': 'module_js'}] }) - def check_precondition(f): - """ - This function will behave as a decorator which will checks - database connection before running view, it will also attaches - manager,conn & template_path properties to self - """ - - @wraps(f) - def wrap(*args, **kwargs): - # Here args[0] will hold self & kwargs will hold gid,sid,did - self = args[0] - self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager( - kwargs['sid'] - ) - self.conn = self.manager.connection(did=kwargs['did']) - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - gettext( - "Connection to the server has been lost!" - ) - ) - - self.template_path = 'catalog_object/sql/{0}/9.1_plus'.format( - 'ppas' if self.manager.server_type == 'ppas' else 'pg' - ) - - return f(*args, **kwargs) - - return wrap - @check_precondition def list(self, gid, sid, did, scid): """ 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 b0e784f..ad22506 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 @@ -25,6 +25,36 @@ from pgadmin.utils.preferences import Preferences from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to self + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold self & kwargs will hold gid,sid,did + self = args[0] + self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager( + kwargs['sid'] + ) + self.conn = self.manager.connection(did=kwargs['did']) + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + gettext( + "Connection to the server has been lost!" + ) + ) + + self.template_path = 'catalog_object_column/sql/9.1_plus' + + return f(*args, **kwargs) + + return wrap + + class CatalogObjectColumnsModule(CollectionNodeModule): """ class ColumnModule(CollectionNodeModule) @@ -62,11 +92,23 @@ class CatalogObjectColumnsModule(CollectionNodeModule): self.min_ver = None self.max_ver = None + @check_precondition def get_nodes(self, gid, sid, did, scid, coid): """ Generate the collection node """ - yield self.generate_browser_collection_node(coid) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.template_path,'nodes.sql']), + coid=coid) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(coid, collection_count) @property def script_load(self): @@ -151,35 +193,6 @@ class CatalogObjectColumnsView(PGChildNodeView): 'module.js': [{}, {}, {'get': 'module_js'}] }) - def check_precondition(f): - """ - This function will behave as a decorator which will checks - database connection before running view, it will also attaches - manager,conn & template_path properties to self - """ - - @wraps(f) - def wrap(*args, **kwargs): - # Here args[0] will hold self & kwargs will hold gid,sid,did - self = args[0] - self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager( - kwargs['sid'] - ) - self.conn = self.manager.connection(did=kwargs['did']) - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - gettext( - "Connection to the server has been lost!" - ) - ) - - self.template_path = 'catalog_object_column/sql/9.1_plus' - - return f(*args, **kwargs) - - return wrap - @check_precondition def list(self, gid, sid, did, scid, coid): """ diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/templates/catalog_object/sql/pg/9.1_plus/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/templates/catalog_object/sql/pg/9.1_plus/nodes.sql index 8a8dad0..1c9e08d 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/templates/catalog_object/sql/pg/9.1_plus/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/templates/catalog_object/sql/pg/9.1_plus/nodes.sql @@ -3,4 +3,4 @@ SELECT FROM pg_class c WHERE relnamespace = {{scid}}::int -ORDER BY relname; +ORDER BY relname diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/templates/catalog_object/sql/ppas/9.1_plus/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/templates/catalog_object/sql/ppas/9.1_plus/nodes.sql index f510f49..15489c0 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/templates/catalog_object/sql/ppas/9.1_plus/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/templates/catalog_object/sql/ppas/9.1_plus/nodes.sql @@ -8,4 +8,4 @@ OR ( AND (c.relname NOT LIKE '\\_%' AND c.relname = 'dual' AND c.relname = 'type_object_source') ) -ORDER BY relname; +ORDER BY relname 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 c4e7bc3..034f2ff 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 @@ -26,6 +26,36 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to self + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold self & kwargs will hold gid,sid,did + self = args[0] + self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager( + kwargs['sid'] + ) + self.conn = self.manager.connection(did=kwargs['did']) + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + gettext( + "Connection to the server has been lost!" + ) + ) + + # we will set template path for sql scripts + self.template_path = 'collation/sql/9.1_plus' + return f(*args, **kwargs) + + return wrap + + class CollationModule(SchemaChildModule): """ class CollationModule(CollectionNodeModule) @@ -64,11 +94,23 @@ class CollationModule(SchemaChildModule): self.min_ver = 90100 self.max_ver = None + @check_precondition def get_nodes(self, gid, sid, did, scid): """ Generate the collection node """ - yield self.generate_browser_collection_node(scid) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.template_path, 'nodes.sql']), + scid=scid) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(scid, collection_count) @property def script_load(self): @@ -170,35 +212,6 @@ class CollationView(PGChildNodeView): {'get': 'get_collation'}] }) - def check_precondition(f): - """ - This function will behave as a decorator which will checks - database connection before running view, it will also attaches - manager,conn & template_path properties to self - """ - - @wraps(f) - def wrap(*args, **kwargs): - # Here args[0] will hold self & kwargs will hold gid,sid,did - self = args[0] - self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager( - kwargs['sid'] - ) - self.conn = self.manager.connection(did=kwargs['did']) - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - gettext( - "Connection to the server has been lost!" - ) - ) - - # we will set template path for sql scripts - self.template_path = 'collation/sql/9.1_plus' - return f(*args, **kwargs) - - return wrap - @check_precondition def list(self, gid, sid, did, scid): """ diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/templates/collation/sql/9.1_plus/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/templates/collation/sql/9.1_plus/nodes.sql index de932b2..e8f5c9f 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/templates/collation/sql/9.1_plus/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/templates/collation/sql/9.1_plus/nodes.sql @@ -1,4 +1,4 @@ SELECT c.oid, c.collname AS name FROM pg_collation c WHERE c.collnamespace = {{scid}}::oid -ORDER BY c.collname; +ORDER BY c.collname 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 c94525a..4ea85a5 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 @@ -28,6 +28,40 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + Works as a decorator. + Checks database connection status. + Attach connection object and template path. + """ + + @wraps(f) + def wrap(*args, **kwargs): + self = args[0] + driver = get_driver(PG_DEFAULT_DRIVER) + self.manager = driver.connection_manager(kwargs['sid']) + # Get database connection + self.conn = self.manager.connection(did=kwargs['did']) + self.qtIdent = driver.qtIdent + + if not self.conn.connected(): + return precondition_required( + gettext("Connection to the server has been lost!") + ) + + ver = self.manager.version + server_type = self.manager.server_type + + # we will set template path for sql scripts + if ver >= 90200: + self.template_path = 'domains/sql/9.2_plus' + elif ver >= 90100: + self.template_path = 'domains/sql/9.1_plus' + + return f(*args, **kwargs) + + return wrap + class DomainModule(SchemaChildModule): """ class DomainModule(SchemaChildModule): @@ -55,11 +89,23 @@ class DomainModule(SchemaChildModule): self.min_ver = None self.max_ver = None + @check_precondition def get_nodes(self, gid, sid, did, scid): """ Generate the domain collection node. """ - yield self.generate_browser_collection_node(scid) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.template_path, 'node.sql']), + scid=scid) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(scid, collection_count) @property def script_load(self): @@ -247,40 +293,6 @@ class DomainView(PGChildNodeView, DataTypeReader): 200, {'Content-Type': 'application/x-javascript'} ) - def check_precondition(f): - """ - Works as a decorator. - Checks database connection status. - Attach connection object and template path. - """ - - @wraps(f) - def wrap(*args, **kwargs): - self = args[0] - driver = get_driver(PG_DEFAULT_DRIVER) - self.manager = driver.connection_manager(kwargs['sid']) - # Get database connection - self.conn = self.manager.connection(did=kwargs['did']) - self.qtIdent = driver.qtIdent - - if not self.conn.connected(): - return precondition_required( - gettext("Connection to the server has been lost!") - ) - - ver = self.manager.version - server_type = self.manager.server_type - - # we will set template path for sql scripts - if ver >= 90200: - self.template_path = 'domains/sql/9.2_plus' - elif ver >= 90100: - self.template_path = 'domains/sql/9.1_plus' - - return f(*args, **kwargs) - - return wrap - @check_precondition def list(self, gid, sid, did, scid): """ 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 8eef4d1..5abb2bb 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 @@ -26,6 +26,40 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + Works as a decorator. + Checks database connection status. + Attach connection object and template path. + """ + + @wraps(f) + def wrap(*args, **kwargs): + self = args[0] + driver = get_driver(PG_DEFAULT_DRIVER) + self.manager = driver.connection_manager(kwargs['sid']) + self.conn = self.manager.connection(did=kwargs['did']) + self.qtIdent = driver.qtIdent + + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + gettext("Connection to the server has been lost!") + ) + + ver = self.manager.version + + # we will set template path for sql scripts + if ver >= 90200: + self.template_path = 'domain_constraints/sql/9.2_plus' + elif ver >= 90100: + self.template_path = 'domain_constraints/sql/9.1_plus' + + return f(*args, **kwargs) + + return wrap + + class DomainConstraintModule(CollectionNodeModule): """ class DomainConstraintModule(CollectionNodeModule): @@ -55,11 +89,23 @@ class DomainConstraintModule(CollectionNodeModule): self.min_ver = None self.max_ver = None + @check_precondition def get_nodes(self, gid, sid, did, scid, doid): """ Generate the Domain Constraint collection node. """ - yield self.generate_browser_collection_node(doid) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.template_path, 'properties.sql']), + doid=doid) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(doid, collection_count) @property def node_inode(self): @@ -241,39 +287,6 @@ class DomainConstraintView(PGChildNodeView): 200, {'Content-Type': 'application/x-javascript'} ) - def check_precondition(f): - """ - Works as a decorator. - Checks database connection status. - Attach connection object and template path. - """ - - @wraps(f) - def wrap(*args, **kwargs): - self = args[0] - driver = get_driver(PG_DEFAULT_DRIVER) - self.manager = driver.connection_manager(kwargs['sid']) - self.conn = self.manager.connection(did=kwargs['did']) - self.qtIdent = driver.qtIdent - - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - gettext("Connection to the server has been lost!") - ) - - ver = self.manager.version - - # we will set template path for sql scripts - if ver >= 90200: - self.template_path = 'domain_constraints/sql/9.2_plus' - elif ver >= 90100: - self.template_path = 'domain_constraints/sql/9.1_plus' - - return f(*args, **kwargs) - - return wrap - @check_precondition def list(self, gid, sid, did, scid, doid): """ diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/9.1_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/9.1_plus/node.sql index 7bd3e5b..9ac6ec4 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/9.1_plus/node.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/9.1_plus/node.sql @@ -10,4 +10,4 @@ JOIN WHERE d.typnamespace = {{scid}}::oid ORDER BY - d.typname; + d.typname diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/9.2_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/9.2_plus/node.sql index 7bd3e5b..9ac6ec4 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/9.2_plus/node.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/templates/domains/sql/9.2_plus/node.sql @@ -10,4 +10,4 @@ JOIN WHERE d.typnamespace = {{scid}}::oid ORDER BY - d.typname; + d.typname 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 98182fc..4325887 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 @@ -33,6 +33,49 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + Works as a decorator. + Checks the database connection status. + Attaches the connection object and template path to the class object. + """ + + @wraps(f) + def wrap(*args, **kwargs): + self = args[0] + driver = get_driver(PG_DEFAULT_DRIVER) + self.manager = driver.connection_manager(kwargs['sid']) + + # Get database connection + self.conn = self.manager.connection(did=kwargs['did']) + + self.qtIdent = driver.qtIdent + + if not self.conn.connected(): + return precondition_required( + gettext( + "Connection to the server has been lost!" + ) + ) + + ver = self.manager.version + server_type = self.manager.server_type + + # Set template path for sql scripts depending + # on the server version. + + if ver >= 90500: + self.template_path = 'foreign_tables/sql/9.5_plus' + elif ver >= 90200: + self.template_path = 'foreign_tables/sql/9.2_plus' + else: + self.template_path = 'foreign_tables/sql/9.1_plus' + + return f(*args, **kwargs) + + return wrap + + class ForeignTableModule(SchemaChildModule): """ class ForeignTableModule(CollectionNodeModule): @@ -62,11 +105,23 @@ class ForeignTableModule(SchemaChildModule): self.min_ver = None self.max_ver = None + @check_precondition def get_nodes(self, gid, sid, did, scid): """ Generate the Foreign Table collection node. """ - yield self.generate_browser_collection_node(scid) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.template_path, 'node.sql']), + scid=scid) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(scid, collection_count) @property def node_inode(self): @@ -323,48 +378,6 @@ class ForeignTableView(PGChildNodeView, DataTypeReader): 200, {'Content-Type': 'application/x-javascript'} ) - def check_precondition(f): - """ - Works as a decorator. - Checks the database connection status. - Attaches the connection object and template path to the class object. - """ - - @wraps(f) - def wrap(*args, **kwargs): - self = args[0] - driver = get_driver(PG_DEFAULT_DRIVER) - self.manager = driver.connection_manager(kwargs['sid']) - - # Get database connection - self.conn = self.manager.connection(did=kwargs['did']) - - self.qtIdent = driver.qtIdent - - if not self.conn.connected(): - return precondition_required( - gettext( - "Connection to the server has been lost!" - ) - ) - - ver = self.manager.version - server_type = self.manager.server_type - - # Set template path for sql scripts depending - # on the server version. - - if ver >= 90500: - self.template_path = 'foreign_tables/sql/9.5_plus' - elif ver >= 90200: - self.template_path = 'foreign_tables/sql/9.2_plus' - else: - self.template_path = 'foreign_tables/sql/9.1_plus' - - return f(*args, **kwargs) - - return wrap - @check_precondition def list(self, gid, sid, did, scid): """ diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/templates/foreign_tables/sql/9.1_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/templates/foreign_tables/sql/9.1_plus/node.sql index bc731c5..ad43d93 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/templates/foreign_tables/sql/9.1_plus/node.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/templates/foreign_tables/sql/9.1_plus/node.sql @@ -11,4 +11,4 @@ LEFT OUTER JOIN pg_description des ON (des.objoid=c.oid AND des.classoid='pg_class'::regclass) WHERE c.relnamespace = {{scid}}::oid -ORDER BY c.relname; +ORDER BY c.relname diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/templates/foreign_tables/sql/9.2_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/templates/foreign_tables/sql/9.2_plus/node.sql index bc731c5..ad43d93 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/templates/foreign_tables/sql/9.2_plus/node.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/templates/foreign_tables/sql/9.2_plus/node.sql @@ -11,4 +11,4 @@ LEFT OUTER JOIN pg_description des ON (des.objoid=c.oid AND des.classoid='pg_class'::regclass) WHERE c.relnamespace = {{scid}}::oid -ORDER BY c.relname; +ORDER BY c.relname diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/templates/foreign_tables/sql/9.5_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/templates/foreign_tables/sql/9.5_plus/node.sql index bc731c5..ad43d93 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/templates/foreign_tables/sql/9.5_plus/node.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/templates/foreign_tables/sql/9.5_plus/node.sql @@ -11,4 +11,4 @@ LEFT OUTER JOIN pg_description des ON (des.objoid=c.oid AND des.classoid='pg_class'::regclass) WHERE c.relnamespace = {{scid}}::oid -ORDER BY c.relname; +ORDER BY c.relname 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 8c32025..e197d90 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 @@ -26,6 +26,34 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to self + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold self & kwargs will hold gid,sid,did + self = args[0] + self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager( + kwargs['sid']) + self.conn = self.manager.connection(did=kwargs['did']) + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + _("Connection to the server has been lost!") + ) + # we will set template path for sql scripts depending upon server version + ver = self.manager.version + if ver >= 90100: + self.template_path = 'fts_configuration/sql/9.1_plus' + return f(*args, **kwargs) + + return wrap + + class FtsConfigurationModule(SchemaChildModule): """ class FtsConfigurationModule(SchemaChildModule) @@ -58,6 +86,7 @@ class FtsConfigurationModule(SchemaChildModule): self.manager = None super(FtsConfigurationModule, self).__init__(*args, **kwargs) + @check_precondition def get_nodes(self, gid, sid, did, scid): """ Generate the collection node @@ -66,7 +95,18 @@ class FtsConfigurationModule(SchemaChildModule): :param did: database id :param scid: schema id """ - yield self.generate_browser_collection_node(scid) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.template_path, 'nodes.sql']), + scid=scid) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(scid, collection_count) @property def node_inode(self): @@ -216,33 +256,6 @@ class FtsConfigurationView(PGChildNodeView): 200, {'Content-Type': 'application/x-javascript'} ) - def check_precondition(f): - """ - This function will behave as a decorator which will checks - database connection before running view, it will also attaches - manager,conn & template_path properties to self - """ - - @wraps(f) - def wrap(*args, **kwargs): - # Here args[0] will hold self & kwargs will hold gid,sid,did - self = args[0] - self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager( - kwargs['sid']) - self.conn = self.manager.connection(did=kwargs['did']) - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - _("Connection to the server has been lost!") - ) - # we will set template path for sql scripts depending upon server version - ver = self.manager.version - if ver >= 90100: - self.template_path = 'fts_configuration/sql/9.1_plus' - return f(*args, **kwargs) - - return wrap - @check_precondition def list(self, gid, sid, did, scid): """ 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 b7dea08..10fbe18 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 @@ -26,6 +26,34 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to self + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold self & kwargs will hold gid,sid,did + self = args[0] + self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager( + kwargs['sid']) + self.conn = self.manager.connection(did=kwargs['did']) + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + _("Connection to the server has been lost!") + ) + # we will set template path for sql scripts depending upon server version + ver = self.manager.version + if ver >= 90100: + self.template_path = 'fts_dictionary/sql/9.1_plus' + return f(*args, **kwargs) + + return wrap + + class FtsDictionaryModule(SchemaChildModule): """ class FtsDictionaryModule(SchemaChildModule) @@ -57,6 +85,7 @@ class FtsDictionaryModule(SchemaChildModule): self.manager = None super(FtsDictionaryModule, self).__init__(*args, **kwargs) + @check_precondition def get_nodes(self, gid, sid, did, scid): """ Generate the collection node @@ -65,7 +94,18 @@ class FtsDictionaryModule(SchemaChildModule): :param did: database id :param scid: schema id """ - yield self.generate_browser_collection_node(scid) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.template_path, 'nodes.sql']), + scid=scid) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(scid, collection_count) @property def node_inode(self): @@ -208,33 +248,6 @@ class FtsDictionaryView(PGChildNodeView): 200, {'Content-Type': 'application/x-javascript'} ) - def check_precondition(f): - """ - This function will behave as a decorator which will checks - database connection before running view, it will also attaches - manager,conn & template_path properties to self - """ - - @wraps(f) - def wrap(*args, **kwargs): - # Here args[0] will hold self & kwargs will hold gid,sid,did - self = args[0] - self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager( - kwargs['sid']) - self.conn = self.manager.connection(did=kwargs['did']) - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - _("Connection to the server has been lost!") - ) - # we will set template path for sql scripts depending upon server version - ver = self.manager.version - if ver >= 90100: - self.template_path = 'fts_dictionary/sql/9.1_plus' - return f(*args, **kwargs) - - return wrap - def tokenize_options(self, option_value): """ This function will tokenize the string stored in database diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parser/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parser/__init__.py index cd31922..ca01980 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parser/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parser/__init__.py @@ -25,6 +25,35 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to self + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold self & kwargs will hold gid,sid,did + self = args[0] + self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager( + kwargs['sid']) + self.conn = self.manager.connection(did=kwargs['did']) + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + _( + "Connection to the server has been lost!" + ) + ) + # we will set template path for sql scripts depending upon server version + ver = self.manager.version + if ver >= 90100: + self.template_path = 'fts_parser/sql/9.1_plus' + return f(*args, **kwargs) + + return wrap + class FtsParserModule(SchemaChildModule): """ class FtsParserModule(SchemaChildModule) @@ -46,6 +75,7 @@ class FtsParserModule(SchemaChildModule): NODE_TYPE = 'fts_parser' COLLECTION_LABEL = _('FTS Parsers') + @check_precondition def get_nodes(self, gid, sid, did, scid): """ Generate the collection node @@ -54,7 +84,18 @@ class FtsParserModule(SchemaChildModule): :param did: database id :param scid: schema id """ - yield self.generate_browser_collection_node(scid) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.template_path, 'nodes.sql']), + scid=scid) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(scid, collection_count) @property def node_inode(self): @@ -206,35 +247,6 @@ class FtsParserView(PGChildNodeView): self.manager = None super(FtsParserView, self).__init__(**kwargs) - def check_precondition(f): - """ - This function will behave as a decorator which will checks - database connection before running view, it will also attaches - manager,conn & template_path properties to self - """ - - @wraps(f) - def wrap(*args, **kwargs): - # Here args[0] will hold self & kwargs will hold gid,sid,did - self = args[0] - self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager( - kwargs['sid']) - self.conn = self.manager.connection(did=kwargs['did']) - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - _( - "Connection to the server has been lost!" - ) - ) - # we will set template path for sql scripts depending upon server version - ver = self.manager.version - if ver >= 90100: - self.template_path = 'fts_parser/sql/9.1_plus' - return f(*args, **kwargs) - - return wrap - @check_precondition def list(self, gid, sid, did, scid): sql = render_template( 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 a349197..7974601 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 @@ -25,6 +25,35 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to self + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold self & kwargs will hold gid,sid,did + self = args[0] + self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager( + kwargs['sid']) + self.conn = self.manager.connection(did=kwargs['did']) + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + gettext( + "Connection to the server has been lost!" + ) + ) + # we will set template path for sql scripts depending upon server version + ver = self.manager.version + if ver >= 90100: + self.template_path = 'fts_template/sql/9.1_plus' + return f(*args, **kwargs) + + return wrap + class FtsTemplateModule(SchemaChildModule): """ class FtsTemplateModule(SchemaChildModule) @@ -54,6 +83,7 @@ class FtsTemplateModule(SchemaChildModule): self.max_ver = None super(FtsTemplateModule, self).__init__(*args, **kwargs) + @check_precondition def get_nodes(self, gid, sid, did, scid): """ Generate the collection node @@ -62,7 +92,18 @@ class FtsTemplateModule(SchemaChildModule): :param did: database id :param scid: schema id """ - yield self.generate_browser_collection_node(scid) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.template_path, 'nodes.sql']), + scid=scid) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(scid, collection_count) @property def node_inode(self): @@ -195,35 +236,6 @@ class FtsTemplateView(PGChildNodeView): 200, {'Content-Type': 'application/x-javascript'} ) - def check_precondition(f): - """ - This function will behave as a decorator which will checks - database connection before running view, it will also attaches - manager,conn & template_path properties to self - """ - - @wraps(f) - def wrap(*args, **kwargs): - # Here args[0] will hold self & kwargs will hold gid,sid,did - self = args[0] - self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager( - kwargs['sid']) - self.conn = self.manager.connection(did=kwargs['did']) - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - gettext( - "Connection to the server has been lost!" - ) - ) - # we will set template path for sql scripts depending upon server version - ver = self.manager.version - if ver >= 90100: - self.template_path = 'fts_template/sql/9.1_plus' - return f(*args, **kwargs) - - return wrap - @check_precondition def list(self, gid, sid, did, scid): sql = render_template( 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 ca69cac..28cf5a1 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 @@ -35,6 +35,53 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + Works as a decorator. + Checks the database connection status. + Attaches the connection object and template path to the class object. + """ + + @wraps(f) + def wrap(*args, **kwargs): + self = args[0] + driver = get_driver(PG_DEFAULT_DRIVER) + self.manager = driver.connection_manager(kwargs['sid']) + + # Get database connection + self.conn = self.manager.connection(did=kwargs['did']) + + self.qtIdent = driver.qtIdent + self.qtLiteral = driver.qtLiteral + + if not self.conn.connected(): + return precondition_required( + gettext( + "Connection to the server has been lost!" + ) + ) + + ver = self.manager.version + + # Set template path for sql scripts depending + # on the server version. + self.template_path = "/".join([ + self.node_type + ]) + self.sql_template_path = "/".join([ + self.template_path, + self.manager.server_type, + 'sql', + '9.5_plus' if ver >= 90500 else + '9.2_plus' if ver >= 90200 else + '9.1_plus' + ]) + + return f(*args, **kwargs) + + return wrap + + class FunctionModule(SchemaChildModule): """ class FunctionModule(SchemaChildModule): @@ -76,11 +123,23 @@ class FunctionModule(SchemaChildModule): self.max_ver = None self.server_type = None + @check_precondition def get_nodes(self, gid, sid, did, scid): """ Generate Functions collection node. """ - yield self.generate_browser_collection_node(scid) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.sql_template_path, 'node.sql']), + scid=scid) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(scid, collection_count) @property def node_inode(self): @@ -314,52 +373,6 @@ class FunctionView(PGChildNodeView, DataTypeReader): 200, {'Content-Type': 'application/x-javascript'} ) - def check_precondition(f): - """ - Works as a decorator. - Checks the database connection status. - Attaches the connection object and template path to the class object. - """ - - @wraps(f) - def wrap(*args, **kwargs): - self = args[0] - driver = get_driver(PG_DEFAULT_DRIVER) - self.manager = driver.connection_manager(kwargs['sid']) - - # Get database connection - self.conn = self.manager.connection(did=kwargs['did']) - - self.qtIdent = driver.qtIdent - self.qtLiteral = driver.qtLiteral - - if not self.conn.connected(): - return precondition_required( - gettext( - "Connection to the server has been lost!" - ) - ) - - ver = self.manager.version - - # Set template path for sql scripts depending - # on the server version. - self.template_path = "/".join([ - self.node_type - ]) - self.sql_template_path = "/".join([ - self.template_path, - self.manager.server_type, - 'sql', - '9.5_plus' if ver >= 90500 else - '9.2_plus' if ver >= 90200 else - '9.1_plus' - ]) - - return f(*args, **kwargs) - - return wrap - @check_precondition def list(self, gid, sid, did, scid): """ @@ -1471,11 +1484,23 @@ class ProcedureModule(SchemaChildModule): self.max_ver = None self.server_type = ['ppas'] + @check_precondition def get_nodes(self, gid, sid, did, scid): """ Generate Procedures collection node. """ - yield self.generate_browser_collection_node(scid) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.sql_template_path, 'node.sql']), + scid=scid) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(scid, collection_count) @property def node_inode(self): @@ -1581,11 +1606,23 @@ class TriggerFunctionModule(SchemaChildModule): self.min_ver = 90100 self.max_ver = None + @check_precondition def get_nodes(self, gid, sid, did, scid): """ Generate Trigger function collection node. """ - yield self.generate_browser_collection_node(scid) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.sql_template_path, 'node.sql']), + scid=scid) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(scid, collection_count) @property def node_inode(self): diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/pg/sql/9.1_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/pg/sql/9.1_plus/node.sql index bb6ec9d..5ddffdc 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/pg/sql/9.1_plus/node.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/pg/sql/9.1_plus/node.sql @@ -14,4 +14,4 @@ WHERE AND pronamespace = {{scid}}::oid AND typname NOT IN ('trigger', 'event_trigger') ORDER BY - proname; + proname diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/pg/sql/9.2_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/pg/sql/9.2_plus/node.sql index bb6ec9d..5ddffdc 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/pg/sql/9.2_plus/node.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/pg/sql/9.2_plus/node.sql @@ -14,4 +14,4 @@ WHERE AND pronamespace = {{scid}}::oid AND typname NOT IN ('trigger', 'event_trigger') ORDER BY - proname; + proname diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/pg/sql/9.5_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/pg/sql/9.5_plus/node.sql index bb6ec9d..5ddffdc 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/pg/sql/9.5_plus/node.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/pg/sql/9.5_plus/node.sql @@ -14,4 +14,4 @@ WHERE AND pronamespace = {{scid}}::oid AND typname NOT IN ('trigger', 'event_trigger') ORDER BY - proname; + proname diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/ppas/sql/9.1_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/ppas/sql/9.1_plus/node.sql index c7f4159..eb956ad 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/ppas/sql/9.1_plus/node.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/ppas/sql/9.1_plus/node.sql @@ -15,4 +15,4 @@ WHERE AND pronamespace = {{scid}}::oid AND typname NOT IN ('trigger', 'event_trigger') ORDER BY - proname; + proname diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/ppas/sql/9.2_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/ppas/sql/9.2_plus/node.sql index c7f4159..eb956ad 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/ppas/sql/9.2_plus/node.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/ppas/sql/9.2_plus/node.sql @@ -15,4 +15,4 @@ WHERE AND pronamespace = {{scid}}::oid AND typname NOT IN ('trigger', 'event_trigger') ORDER BY - proname; + proname diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/ppas/sql/9.5_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/ppas/sql/9.5_plus/node.sql index c7f4159..eb956ad 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/ppas/sql/9.5_plus/node.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/function/ppas/sql/9.5_plus/node.sql @@ -15,4 +15,4 @@ WHERE AND pronamespace = {{scid}}::oid AND typname NOT IN ('trigger', 'event_trigger') ORDER BY - proname; + proname diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/ppas/sql/9.1_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/ppas/sql/9.1_plus/node.sql index 4b648c4..ee4c024 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/ppas/sql/9.1_plus/node.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/ppas/sql/9.1_plus/node.sql @@ -22,4 +22,4 @@ WHERE AND pronamespace = {{scid}}::oid AND typname NOT IN ('trigger', 'event_trigger') ORDER BY - proname; + proname diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/ppas/sql/9.2_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/ppas/sql/9.2_plus/node.sql index 4b648c4..ee4c024 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/ppas/sql/9.2_plus/node.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/ppas/sql/9.2_plus/node.sql @@ -22,4 +22,4 @@ WHERE AND pronamespace = {{scid}}::oid AND typname NOT IN ('trigger', 'event_trigger') ORDER BY - proname; + proname diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/ppas/sql/9.5_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/ppas/sql/9.5_plus/node.sql index 4b648c4..ee4c024 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/ppas/sql/9.5_plus/node.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/procedure/ppas/sql/9.5_plus/node.sql @@ -22,4 +22,4 @@ WHERE AND pronamespace = {{scid}}::oid AND typname NOT IN ('trigger', 'event_trigger') ORDER BY - proname; + proname diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_function/pg/sql/9.1_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_function/pg/sql/9.1_plus/node.sql index 1bcc813..f9993b6 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_function/pg/sql/9.1_plus/node.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_function/pg/sql/9.1_plus/node.sql @@ -14,4 +14,4 @@ WHERE AND pronamespace = {{scid}}::oid AND typname = 'trigger' AND lanname != 'edbspl' ORDER BY - proname; + proname diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_function/pg/sql/9.2_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_function/pg/sql/9.2_plus/node.sql index 12bb3b5..37985aa 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_function/pg/sql/9.2_plus/node.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_function/pg/sql/9.2_plus/node.sql @@ -15,4 +15,4 @@ WHERE AND typname IN ('trigger', 'event_trigger') AND lanname NOT IN ('edbspl', 'sql', 'internal') ORDER BY - proname; + proname diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_function/pg/sql/9.5_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_function/pg/sql/9.5_plus/node.sql index 12bb3b5..37985aa 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_function/pg/sql/9.5_plus/node.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_function/pg/sql/9.5_plus/node.sql @@ -15,4 +15,4 @@ WHERE AND typname IN ('trigger', 'event_trigger') AND lanname NOT IN ('edbspl', 'sql', 'internal') ORDER BY - proname; + proname diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_function/ppas/sql/9.1_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_function/ppas/sql/9.1_plus/node.sql index c2aaee3..1078b8c 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_function/ppas/sql/9.1_plus/node.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_function/ppas/sql/9.1_plus/node.sql @@ -14,4 +14,4 @@ WHERE AND pronamespace = {{scid}}::oid AND typname = 'trigger' AND lanname != 'edbspl' ORDER BY - proname; + proname diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_function/ppas/sql/9.2_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_function/ppas/sql/9.2_plus/node.sql index e690cac..9d4eadc 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_function/ppas/sql/9.2_plus/node.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_function/ppas/sql/9.2_plus/node.sql @@ -15,4 +15,4 @@ WHERE AND typname IN ('trigger', 'event_trigger') AND lanname NOT IN ('edbspl', 'sql', 'internal') ORDER BY - proname; + proname diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_function/ppas/sql/9.5_plus/node.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_function/ppas/sql/9.5_plus/node.sql index e690cac..9d4eadc 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_function/ppas/sql/9.5_plus/node.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/trigger_function/ppas/sql/9.5_plus/node.sql @@ -15,4 +15,4 @@ WHERE AND typname IN ('trigger', 'event_trigger') AND lanname NOT IN ('edbspl', 'sql', 'internal') ORDER BY - proname; + proname 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 29be4fd..264a925 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 @@ -28,6 +28,40 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(action=None): + """ + This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to self + """ + + def wrap(f): + @wraps(f) + def wrapped(self, *args, **kwargs): + + self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(kwargs['sid']) + if action and action in ["drop"]: + self.conn = self.manager.connection() + elif 'did' in kwargs: + self.conn = self.manager.connection(did=kwargs['did']) + else: + self.conn = self.manager.connection() + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + _( + "Connection to the server has been lost!" + ) + ) + + self.template_path = 'sequence/sql/9.1_plus' + self.acl = ['r', 'w', 'U'] + return f(self, *args, **kwargs) + + return wrapped + + return wrap + class SequenceModule(SchemaChildModule): """ class SequenceModule(CollectionNodeModule) @@ -59,11 +93,22 @@ class SequenceModule(SchemaChildModule): self.min_ver = None self.max_ver = None + @check_precondition(action='nodes') def get_nodes(self, gid, sid, did, scid): """ Generate the sequence node """ - yield self.generate_browser_collection_node(scid) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.template_path, 'nodes.sql']), scid=scid) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(scid, collection_count) @property def script_load(self): @@ -127,40 +172,6 @@ class SequenceView(PGChildNodeView): 200, {'Content-Type': 'application/x-javascript'} ) - def check_precondition(action=None): - """ - This function will behave as a decorator which will checks - database connection before running view, it will also attaches - manager,conn & template_path properties to self - """ - - def wrap(f): - @wraps(f) - def wrapped(self, *args, **kwargs): - - self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(kwargs['sid']) - if action and action in ["drop"]: - self.conn = self.manager.connection() - elif 'did' in kwargs: - self.conn = self.manager.connection(did=kwargs['did']) - else: - self.conn = self.manager.connection() - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - _( - "Connection to the server has been lost!" - ) - ) - - self.template_path = 'sequence/sql/9.1_plus' - self.acl = ['r', 'w', 'U'] - return f(self, *args, **kwargs) - - return wrapped - - return wrap - @check_precondition(action='list') def list(self, gid, sid, did, scid): """ 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 8bda490..042077a 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 @@ -30,6 +30,78 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to self + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold self & kwargs will hold gid,sid,did + self = args[0] + driver = get_driver(PG_DEFAULT_DRIVER) + self.manager = driver.connection_manager(kwargs['sid']) + self.conn = self.manager.connection(did=kwargs['did']) + self.qtIdent = driver.qtIdent + # We need datlastsysoid to check if current table is system table + self.datlastsysoid = self.manager.db_info[kwargs['did']]['datlastsysoid'] + + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + gettext( + "Connection to the server has been lost!" + ) + ) + + # We need datlastsysoid to check if current index is system index + self.datlastsysoid = self.manager.db_info[kwargs['did']]['datlastsysoid'] + + # we will set template path for sql scripts + ver = self.manager.version + # Template for Column node + if ver >= 90500: + self.template_path = 'table/sql/9.5_plus' + else: + self.template_path = 'table/sql/9.1_plus' + + # Template for Column ,check constraint and exclusion constraint node + if ver >= 90200: + self.column_template_path = 'column/sql/9.2_plus' + self.check_constraint_template_path = 'check_constraint/sql/9.2_plus' + self.exclusion_constraint_template_path = 'exclusion_constraint/sql/9.2_plus' + else: + self.column_template_path = 'column/sql/9.1_plus' + self.check_constraint_template_path = 'check_constraint/sql/9.1_plus' + self.exclusion_constraint_template_path = 'exclusion_constraint/sql/9.1_plus' + + # Template for PK & Unique constraint node + self.index_constraint_template_path = 'index_constraint/sql' + + # Template for foreign key constraint node + self.foreign_key_template_path = 'foreign_key/sql' + + # Template for index node + self.index_template_path = 'index/sql/9.1_plus' + + # Template for trigger node + self.trigger_template_path = 'trigger/sql/9.1_plus' + + # Template for rules node + self.rules_template_path = 'rules/sql' + + # Supported ACL for table + self.acl = ['a', 'r', 'w', 'd', 'D', 'x', 't'] + + # Supported ACL for columns + self.column_acl = ['a', 'r', 'w', 'x'] + + return f(*args, **kwargs) + + return wrap + class TableModule(SchemaChildModule): """ class TableModule(SchemaChildModule) @@ -66,11 +138,23 @@ class TableModule(SchemaChildModule): self.max_ver = None self.min_ver = None + @check_precondition def get_nodes(self, gid, sid, did, scid): """ Generate the collection node """ - yield self.generate_browser_collection_node(scid) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.template_path,'nodes.sql']), + scid=scid) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(scid, collection_count) @property def script_load(self): @@ -260,78 +344,6 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings): }) - def check_precondition(f): - """ - This function will behave as a decorator which will checks - database connection before running view, it will also attaches - manager,conn & template_path properties to self - """ - - @wraps(f) - def wrap(*args, **kwargs): - # Here args[0] will hold self & kwargs will hold gid,sid,did - self = args[0] - driver = get_driver(PG_DEFAULT_DRIVER) - self.manager = driver.connection_manager(kwargs['sid']) - self.conn = self.manager.connection(did=kwargs['did']) - self.qtIdent = driver.qtIdent - # We need datlastsysoid to check if current table is system table - self.datlastsysoid = self.manager.db_info[kwargs['did']]['datlastsysoid'] - - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - gettext( - "Connection to the server has been lost!" - ) - ) - - # We need datlastsysoid to check if current index is system index - self.datlastsysoid = self.manager.db_info[kwargs['did']]['datlastsysoid'] - - # we will set template path for sql scripts - ver = self.manager.version - # Template for Column node - if ver >= 90500: - self.template_path = 'table/sql/9.5_plus' - else: - self.template_path = 'table/sql/9.1_plus' - - # Template for Column ,check constraint and exclusion constraint node - if ver >= 90200: - self.column_template_path = 'column/sql/9.2_plus' - self.check_constraint_template_path = 'check_constraint/sql/9.2_plus' - self.exclusion_constraint_template_path = 'exclusion_constraint/sql/9.2_plus' - else: - self.column_template_path = 'column/sql/9.1_plus' - self.check_constraint_template_path = 'check_constraint/sql/9.1_plus' - self.exclusion_constraint_template_path = 'exclusion_constraint/sql/9.1_plus' - - # Template for PK & Unique constraint node - self.index_constraint_template_path = 'index_constraint/sql' - - # Template for foreign key constraint node - self.foreign_key_template_path = 'foreign_key/sql' - - # Template for index node - self.index_template_path = 'index/sql/9.1_plus' - - # Template for trigger node - self.trigger_template_path = 'trigger/sql/9.1_plus' - - # Template for rules node - self.rules_template_path = 'rules/sql' - - # Supported ACL for table - self.acl = ['a', 'r', 'w', 'd', 'D', 'x', 't'] - - # Supported ACL for columns - self.column_acl = ['a', 'r', 'w', 'x'] - - return f(*args, **kwargs) - - return wrap - @check_precondition def list(self, gid, sid, did, scid): """ diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/column/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/column/__init__.py index ef5cbe4..3c9c4e0 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/column/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/column/__init__.py @@ -28,6 +28,56 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to self + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold self & kwargs will hold gid,sid,did + self = args[0] + driver = get_driver(PG_DEFAULT_DRIVER) + self.manager = driver.connection_manager( + kwargs['sid'] + ) + self.conn = self.manager.connection(did=kwargs['did']) + self.qtIdent = driver.qtIdent + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + gettext( + "Connection to the server has been lost!" + ) + ) + + ver = self.manager.version + # we will set template path for sql scripts + if ver >= 90200: + self.template_path = 'column/sql/9.2_plus' + else: + self.template_path = 'column/sql/9.1_plus' + # Allowed ACL for column 'Select/Update/Insert/References' + self.acl = ['a', 'r', 'w', 'x'] + + # We need parent's name eg table name and schema name + SQL = render_template("/".join([self.template_path, + 'get_parent.sql']), + tid=kwargs['tid']) + status, rset = self.conn.execute_2darray(SQL) + if not status: + return internal_server_error(errormsg=rset) + + for row in rset['rows']: + self.schema = row['schema'] + self.table = row['table'] + + return f(*args, **kwargs) + + return wrap + class ColumnsModule(CollectionNodeModule): """ @@ -66,13 +116,26 @@ class ColumnsModule(CollectionNodeModule): self.max_ver = None super(ColumnsModule, self).__init__(*args, **kwargs) + @check_precondition def get_nodes(self, gid, sid, did, scid, **kwargs): """ Generate the collection node """ + collection_count = 0 + _id = kwargs['tid'] if 'tid' in kwargs else kwargs['vid'] + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.template_path, 'nodes.sql']), + tid=_id, show_sys_objects=self.show_system_objects) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + assert ('tid' in kwargs or 'vid' in kwargs) yield self.generate_browser_collection_node( - kwargs['tid'] if 'tid' in kwargs else kwargs['vid'] + kwargs['tid'] if 'tid' in kwargs else kwargs['vid'], collection_count ) @property @@ -182,56 +245,6 @@ class ColumnsView(PGChildNodeView, DataTypeReader): 'module.js': [{}, {}, {'get': 'module_js'}], }) - def check_precondition(f): - """ - This function will behave as a decorator which will checks - database connection before running view, it will also attaches - manager,conn & template_path properties to self - """ - - @wraps(f) - def wrap(*args, **kwargs): - # Here args[0] will hold self & kwargs will hold gid,sid,did - self = args[0] - driver = get_driver(PG_DEFAULT_DRIVER) - self.manager = driver.connection_manager( - kwargs['sid'] - ) - self.conn = self.manager.connection(did=kwargs['did']) - self.qtIdent = driver.qtIdent - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - gettext( - "Connection to the server has been lost!" - ) - ) - - ver = self.manager.version - # we will set template path for sql scripts - if ver >= 90200: - self.template_path = 'column/sql/9.2_plus' - else: - self.template_path = 'column/sql/9.1_plus' - # Allowed ACL for column 'Select/Update/Insert/References' - self.acl = ['a', 'r', 'w', 'x'] - - # We need parent's name eg table name and schema name - SQL = render_template("/".join([self.template_path, - 'get_parent.sql']), - tid=kwargs['tid']) - status, rset = self.conn.execute_2darray(SQL) - if not status: - return internal_server_error(errormsg=rset) - - for row in rset['rows']: - self.schema = row['schema'] - self.table = row['table'] - - return f(*args, **kwargs) - - return wrap - @check_precondition def list(self, gid, sid, did, scid, tid): """ 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 a82ee5a..c10d6b5 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 @@ -49,11 +49,18 @@ class ConstraintsModule(CollectionNodeModule): self.max_ver = None super(ConstraintsModule, self).__init__(*args, **kwargs) - def get_nodes(self, gid, sid, did, scid, tid): + def get_nodes(self, **kwargs): """ Generate the collection node """ - yield self.generate_browser_collection_node(tid) + cmd = {"cmd": "nodes"} + constraints = [] + for name in ConstraintRegistry.registry: + module = (ConstraintRegistry.registry[name])['nodeview'] + view = module(**cmd) + constraints = constraints + view.get_nodes(**kwargs) + + yield self.generate_browser_collection_node(kwargs['tid'], len(constraints)) @property def script_load(self): 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 d79c946..c2ba3c0 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 @@ -24,6 +24,53 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to self + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold self & kwargs will hold gid,sid,did + self = args[0] + self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager( + kwargs['sid'] + ) + self.conn = self.manager.connection(did=kwargs['did']) + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + gettext( + "Connection to the server has been lost!" + ) + ) + + # We need datlastsysoid to check if current index is system index + self.datlastsysoid = self.manager.db_info[kwargs['did']]['datlastsysoid'] + + # we will set template path for sql scripts + self.template_path = 'index/sql/9.1_plus' + + # We need parent's name eg table name and schema name + # when we create new index in update we can fetch it using + # property sql + SQL = render_template("/".join([self.template_path, + 'get_parent.sql']), + tid=kwargs['tid']) + status, rset = self.conn.execute_2darray(SQL) + if not status: + return internal_server_error(errormsg=rset) + + for row in rset['rows']: + self.schema = row['schema'] + self.table = row['table'] + + return f(*args, **kwargs) + + return wrap + class IndexesModule(CollectionNodeModule): """ @@ -92,13 +139,26 @@ class IndexesModule(CollectionNodeModule): # then true, othewise false return res + @check_precondition def get_nodes(self, gid, sid, did, scid, **kwargs): """ Generate the collection node """ + collection_count = 0 + _id = kwargs['tid'] if 'tid' in kwargs else kwargs['vid'] + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.template_path, + 'nodes.sql']), tid=_id) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + assert ('tid' in kwargs or 'vid' in kwargs) yield self.generate_browser_collection_node( - kwargs['tid'] if 'tid' in kwargs else kwargs['vid'] + kwargs['tid'] if 'tid' in kwargs else kwargs['vid'], collection_count ) @property @@ -213,53 +273,6 @@ class IndexesView(PGChildNodeView): {'get': 'get_op_class'}] }) - def check_precondition(f): - """ - This function will behave as a decorator which will checks - database connection before running view, it will also attaches - manager,conn & template_path properties to self - """ - - @wraps(f) - def wrap(*args, **kwargs): - # Here args[0] will hold self & kwargs will hold gid,sid,did - self = args[0] - self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager( - kwargs['sid'] - ) - self.conn = self.manager.connection(did=kwargs['did']) - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - gettext( - "Connection to the server has been lost!" - ) - ) - - # We need datlastsysoid to check if current index is system index - self.datlastsysoid = self.manager.db_info[kwargs['did']]['datlastsysoid'] - - # we will set template path for sql scripts - self.template_path = 'index/sql/9.1_plus' - - # We need parent's name eg table name and schema name - # when we create new index in update we can fetch it using - # property sql - SQL = render_template("/".join([self.template_path, - 'get_parent.sql']), - tid=kwargs['tid']) - status, rset = self.conn.execute_2darray(SQL) - if not status: - return internal_server_error(errormsg=rset) - - for row in rset['rows']: - self.schema = row['schema'] - self.table = row['table'] - - return f(*args, **kwargs) - - return wrap - @check_precondition def get_collations(self, gid, sid, did, scid, tid, idx=None): """ 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 d462454..3e77338 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 @@ -26,6 +26,34 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + This function will behave as a decorator which will check the + database connection before running a view. It will also attach + manager, conn & template_path properties to self + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold self & kwargs will hold gid,sid,did + self = args[0] + self.manager = get_driver( + PG_DEFAULT_DRIVER).connection_manager(kwargs['sid']) + self.conn = self.manager.connection(did=kwargs['did']) + + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + gettext( + "Connection to the server has been lost!" + ) + ) + + self.datlastsysoid = self.manager.db_info[kwargs['did']]['datlastsysoid'] + self.template_path = 'rules/sql' + return f(*args, **kwargs) + + return wrap class RuleModule(CollectionNodeModule): """ @@ -79,13 +107,26 @@ class RuleModule(CollectionNodeModule): else: return res + @check_precondition def get_nodes(self, gid, sid, did, scid, **kwargs): """ Generate the collection node """ + collection_count = 0 + _id = kwargs['tid'] if 'tid' in kwargs else kwargs['vid'] + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join( + [self.template_path, 'properties.sql']), tid=_id) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + assert ('tid' in kwargs or 'vid' in kwargs) yield self.generate_browser_collection_node( - kwargs['tid'] if 'tid' in kwargs else kwargs['vid'] + kwargs['tid'] if 'tid' in kwargs else kwargs['vid'], collection_count ) @property @@ -188,35 +229,6 @@ class RuleView(PGChildNodeView): 200, {'Content-Type': 'application/x-javascript'} ) - def check_precondition(f): - """ - This function will behave as a decorator which will check the - database connection before running a view. It will also attach - manager, conn & template_path properties to self - """ - - @wraps(f) - def wrap(*args, **kwargs): - # Here args[0] will hold self & kwargs will hold gid,sid,did - self = args[0] - self.manager = get_driver( - PG_DEFAULT_DRIVER).connection_manager(kwargs['sid']) - self.conn = self.manager.connection(did=kwargs['did']) - - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - gettext( - "Connection to the server has been lost!" - ) - ) - - self.datlastsysoid = self.manager.db_info[kwargs['did']]['datlastsysoid'] - self.template_path = 'rules/sql' - return f(*args, **kwargs) - - return wrap - @check_precondition def list(self, gid, sid, did, scid, tid): """ diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/9.1_plus/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/9.1_plus/nodes.sql index 43f14cb..fa11a0e 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/9.1_plus/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/9.1_plus/nodes.sql @@ -3,4 +3,4 @@ SELECT rel.oid, rel.relname AS name, (SELECT count(*) FROM pg_trigger WHERE tgrelid=rel.oid AND tgisinternal = FALSE AND tgenabled = 'O') AS has_enable_triggers FROM pg_class rel WHERE rel.relkind IN ('r','s','t') AND rel.relnamespace = {{ scid }}::oid - ORDER BY rel.relname; \ No newline at end of file + ORDER BY rel.relname \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/9.5_plus/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/9.5_plus/nodes.sql index 43f14cb..fa11a0e 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/9.5_plus/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/9.5_plus/nodes.sql @@ -3,4 +3,4 @@ SELECT rel.oid, rel.relname AS name, (SELECT count(*) FROM pg_trigger WHERE tgrelid=rel.oid AND tgisinternal = FALSE AND tgenabled = 'O') AS has_enable_triggers FROM pg_class rel WHERE rel.relkind IN ('r','s','t') AND rel.relnamespace = {{ scid }}::oid - ORDER BY rel.relname; \ No newline at end of file + ORDER BY rel.relname \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/9.1_plus/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/9.1_plus/nodes.sql index 095ada3..80c6491 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/9.1_plus/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/9.1_plus/nodes.sql @@ -2,4 +2,4 @@ SELECT t.oid, t.tgname as name, (CASE WHEN tgenabled = 'O' THEN true ElSE false FROM pg_trigger t WHERE NOT tgisinternal AND tgrelid = {{tid}}::OID - ORDER BY tgname; + ORDER BY tgname 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 b3e4eec..f64b127 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 @@ -25,6 +25,67 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to self + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold self & kwargs will hold gid,sid,did + self = args[0] + self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager( + kwargs['sid'] + ) + self.conn = self.manager.connection(did=kwargs['did']) + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + gettext( + "Connection to the server has been lost!" + ) + ) + + # We need datlastsysoid to check if current trigger is system trigger + self.datlastsysoid = self.manager.db_info[kwargs['did']]['datlastsysoid'] + + # we will set template path for sql scripts + self.template_path = 'trigger/sql/9.1_plus' + # Store server type + self.stype = self.manager.server_type + # We need parent's name eg table name and schema name + # when we create new trigger in update we can fetch it using + # property sql + SQL = render_template("/".join([self.template_path, + 'get_parent.sql']), + tid=kwargs['tid']) + status, rset = self.conn.execute_2darray(SQL) + if not status: + return internal_server_error(errormsg=rset) + + for row in rset['rows']: + self.schema = row['schema'] + self.table = row['table'] + + # Here we are storing trigger definition + # We will use it to check trigger type definition + self.trigger_definition = { + 'TRIGGER_TYPE_ROW': (1 << 0), + 'TRIGGER_TYPE_BEFORE': (1 << 1), + 'TRIGGER_TYPE_INSERT': (1 << 2), + 'TRIGGER_TYPE_DELETE': (1 << 3), + 'TRIGGER_TYPE_UPDATE': (1 << 4), + 'TRIGGER_TYPE_TRUNCATE': (1 << 5), + 'TRIGGER_TYPE_INSTEAD': (1 << 6) + } + + return f(*args, **kwargs) + + return wrap + + class TriggerModule(CollectionNodeModule): """ class TriggerModule(CollectionNodeModule) @@ -91,13 +152,26 @@ class TriggerModule(CollectionNodeModule): # then true, othewise false return res + @check_precondition def get_nodes(self, gid, sid, did, scid, **kwargs): """ Generate the collection node """ + collection_count = 0 + _id = kwargs['tid'] if 'tid' in kwargs else kwargs['vid'] + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.template_path, + 'nodes.sql']), tid=_id) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + assert ('tid' in kwargs or 'vid' in kwargs) yield self.generate_browser_collection_node( - kwargs['tid'] if 'tid' in kwargs else kwargs['vid'] + kwargs['tid'] if 'tid' in kwargs else kwargs['vid'], collection_count ) @property @@ -240,66 +314,6 @@ class TriggerView(PGChildNodeView): 'enable': [{'put': 'enable_disable_trigger'}] }) - def check_precondition(f): - """ - This function will behave as a decorator which will checks - database connection before running view, it will also attaches - manager,conn & template_path properties to self - """ - - @wraps(f) - def wrap(*args, **kwargs): - # Here args[0] will hold self & kwargs will hold gid,sid,did - self = args[0] - self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager( - kwargs['sid'] - ) - self.conn = self.manager.connection(did=kwargs['did']) - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - gettext( - "Connection to the server has been lost!" - ) - ) - - # We need datlastsysoid to check if current trigger is system trigger - self.datlastsysoid = self.manager.db_info[kwargs['did']]['datlastsysoid'] - - # we will set template path for sql scripts - self.template_path = 'trigger/sql/9.1_plus' - # Store server type - self.server_type = self.manager.server_type - # We need parent's name eg table name and schema name - # when we create new trigger in update we can fetch it using - # property sql - SQL = render_template("/".join([self.template_path, - 'get_parent.sql']), - tid=kwargs['tid']) - status, rset = self.conn.execute_2darray(SQL) - if not status: - return internal_server_error(errormsg=rset) - - for row in rset['rows']: - self.schema = row['schema'] - self.table = row['table'] - - # Here we are storing trigger definition - # We will use it to check trigger type definition - self.trigger_definition = { - 'TRIGGER_TYPE_ROW': (1 << 0), - 'TRIGGER_TYPE_BEFORE': (1 << 1), - 'TRIGGER_TYPE_INSERT': (1 << 2), - 'TRIGGER_TYPE_DELETE': (1 << 3), - 'TRIGGER_TYPE_UPDATE': (1 << 4), - 'TRIGGER_TYPE_TRUNCATE': (1 << 5), - 'TRIGGER_TYPE_INSTEAD': (1 << 6) - } - - return f(*args, **kwargs) - - return wrap - @check_precondition def get_trigger_functions(self, gid, sid, did, scid, tid, trid=None): """ @@ -312,7 +326,7 @@ class TriggerView(PGChildNodeView): # If server type is EDB-PPAS then we also need to add # inline edb-spl along with options fetched by below sql - if self.server_type == 'ppas': + if self.stype == 'ppas': res.append({ 'label': 'Inline EDB-SPL', 'value': 'Inline EDB-SPL' diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/pg/9.1_plus/sql/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/pg/9.1_plus/sql/nodes.sql index 3ad9a90..373088e 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/pg/9.1_plus/sql/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/pg/9.1_plus/sql/nodes.sql @@ -13,4 +13,4 @@ WHERE ( {{ CATALOGS.LIST('nsp') }} ) -ORDER BY 2; +ORDER BY 2 diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/pg/9.2_plus/sql/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/pg/9.2_plus/sql/nodes.sql index 3ad9a90..373088e 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/pg/9.2_plus/sql/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/pg/9.2_plus/sql/nodes.sql @@ -13,4 +13,4 @@ WHERE ( {{ CATALOGS.LIST('nsp') }} ) -ORDER BY 2; +ORDER BY 2 diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/ppas/9.1_plus/sql/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/ppas/9.1_plus/sql/nodes.sql index 4eb3327..7d890cf 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/ppas/9.1_plus/sql/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/ppas/9.1_plus/sql/nodes.sql @@ -14,4 +14,4 @@ WHERE ( {{ CATALOGS.LIST('nsp') }} ) -ORDER BY 2; +ORDER BY 2 diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/ppas/9.2_plus/sql/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/ppas/9.2_plus/sql/nodes.sql index 71d5535..a125086 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/ppas/9.2_plus/sql/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/ppas/9.2_plus/sql/nodes.sql @@ -14,4 +14,4 @@ WHERE ( {{ CATALOGS.LIST('nsp') }} ) -ORDER BY 2; +ORDER BY 2 diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schema/pg/9.1_plus/sql/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schema/pg/9.1_plus/sql/nodes.sql index 175841c..b4c3890 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schema/pg/9.1_plus/sql/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schema/pg/9.1_plus/sql/nodes.sql @@ -17,4 +17,4 @@ WHERE NOT ( {{ CATALOGS.LIST('nsp') }} ) -ORDER BY nspname; +ORDER BY nspname diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schema/pg/9.2_plus/sql/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schema/pg/9.2_plus/sql/nodes.sql index 175841c..b4c3890 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schema/pg/9.2_plus/sql/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schema/pg/9.2_plus/sql/nodes.sql @@ -17,4 +17,4 @@ WHERE NOT ( {{ CATALOGS.LIST('nsp') }} ) -ORDER BY nspname; +ORDER BY nspname diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schema/ppas/9.1_plus/sql/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schema/ppas/9.1_plus/sql/nodes.sql index 2fb77ba..a491672 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schema/ppas/9.1_plus/sql/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schema/ppas/9.1_plus/sql/nodes.sql @@ -18,4 +18,4 @@ WHERE NOT ( {{ CATALOGS.LIST('nsp') }} ) -ORDER BY nspname; +ORDER BY nspname diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schema/ppas/9.2_plus/sql/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schema/ppas/9.2_plus/sql/nodes.sql index 2fb77ba..a491672 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schema/ppas/9.2_plus/sql/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schema/ppas/9.2_plus/sql/nodes.sql @@ -18,4 +18,4 @@ WHERE NOT ( {{ CATALOGS.LIST('nsp') }} ) -ORDER BY nspname; +ORDER BY nspname 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 8ea7aa9..737605d 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 @@ -28,6 +28,42 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to self + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold self & kwargs will hold gid,sid,did + self = args[0] + self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(kwargs['sid']) + self.conn = self.manager.connection(did=kwargs['did']) + + # We need datlastsysoid to check if current type is system type + self.datlastsysoid = self.manager.db_info[kwargs['did']]['datlastsysoid'] + + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + gettext( + "Connection to the server has been lost!" + ) + ) + + # Declare allows acl on type + self.acl = ['U'] + + # we will set template path for sql scripts + self.template_path = 'type/sql/9.1_plus' + + return f(*args, **kwargs) + + return wrap + + class TypeModule(SchemaChildModule): """ class TypeModule(SchemaChildModule) @@ -65,11 +101,23 @@ class TypeModule(SchemaChildModule): self.min_ver = None self.max_ver = None + @check_precondition def get_nodes(self, gid, sid, did, scid): """ Generate the collection node """ - yield self.generate_browser_collection_node(scid) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.template_path,'nodes.sql']), + scid=scid, show_system_objects=self.show_system_objects) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(scid, collection_count) @property def script_load(self): @@ -208,41 +256,6 @@ class TypeView(PGChildNodeView, DataTypeReader): {'get': 'get_external_functions_list'}] }) - def check_precondition(f): - """ - This function will behave as a decorator which will checks - database connection before running view, it will also attaches - manager,conn & template_path properties to self - """ - - @wraps(f) - def wrap(*args, **kwargs): - # Here args[0] will hold self & kwargs will hold gid,sid,did - self = args[0] - self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(kwargs['sid']) - self.conn = self.manager.connection(did=kwargs['did']) - - # We need datlastsysoid to check if current type is system type - self.datlastsysoid = self.manager.db_info[kwargs['did']]['datlastsysoid'] - - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - gettext( - "Connection to the server has been lost!" - ) - ) - - # Declare allows acl on type - self.acl = ['U'] - - # we will set template path for sql scripts - self.template_path = 'type/sql/9.1_plus' - - return f(*args, **kwargs) - - return wrap - @check_precondition def list(self, gid, sid, did, scid): """ diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/templates/type/sql/9.1_plus/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/templates/type/sql/9.1_plus/nodes.sql index 6abcb19..8d6fb8d 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/templates/type/sql/9.1_plus/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/templates/type/sql/9.1_plus/nodes.sql @@ -7,4 +7,4 @@ WHERE t.typtype != 'd' AND t.typname NOT LIKE E'\\_%' AND t.typnamespace = {{sci {% if not show_system_objects %} AND ct.oid is NULL {% endif %} -ORDER BY t.typname; \ No newline at end of file +ORDER BY t.typname \ No newline at end of file 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 317a488..43d3617 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 @@ -43,6 +43,65 @@ from config import PG_DEFAULT_DRIVER """ +def check_precondition(f): + """ + This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to instance of the method. + + Assumptions: + This function will always be used as decorator of a class method. + """ + + @wraps(f) + def wrap(*args, **kwargs): + + # Here args[0] will hold self & kwargs will hold gid,sid,did + self = args[0] + pg_driver = get_driver(PG_DEFAULT_DRIVER) + self.qtIdent = pg_driver.qtIdent + self.manager = pg_driver.connection_manager( + kwargs['sid'] + ) + self.conn = self.manager.connection(did=kwargs['did']) + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + gettext("Connection to the server has been lost!") + ) + self.datlastsysoid = self.manager.db_info[ + kwargs['did']]['datlastsysoid'] + + # Set template path for sql scripts + if hasattr(self, 'NODE_TYPE'): + initial_path = self.NODE_TYPE + else: + initial_path = self.template_initial + + if initial_path == 'view': + self.template_path = initial_path + '/' + ( + ViewNode.ppas_template_path(self.manager.version) + if self.manager.server_type == 'ppas' else + ViewNode.pg_template_path(self.manager.version) + ) + else: + self.template_path = initial_path + '/' + ( + MViewNode.ppas_template_path(self.manager.version) + if self.manager.server_type == 'ppas' else + MViewNode.pg_template_path(self.manager.version) + ) + + ver = self.manager.version + if ver >= 90200: + self.column_template_path = 'column/sql/9.2_plus' + else: + self.column_template_path = 'column/sql/9.1_plus' + + return f(*args, **kwargs) + + return wrap + + class ViewModule(SchemaChildModule): """ class ViewModule(SchemaChildModule): @@ -79,11 +138,23 @@ class ViewModule(SchemaChildModule): self.min_ver = None self.max_ver = None + @check_precondition def get_nodes(self, gid, sid, did, scid): """ Generate the collection node """ - yield self.generate_browser_collection_node(scid) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join( + [self.template_path, 'sql/properties.sql']), scid=scid) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(scid, collection_count) @property def script_load(self): @@ -150,53 +221,6 @@ view_blueprint = ViewModule(__name__) mview_blueprint = MViewModule(__name__) -def check_precondition(f): - """ - This function will behave as a decorator which will checks - database connection before running view, it will also attaches - manager,conn & template_path properties to instance of the method. - - Assumptions: - This function will always be used as decorator of a class method. - """ - - @wraps(f) - def wrap(*args, **kwargs): - - # Here args[0] will hold self & kwargs will hold gid,sid,did - self = args[0] - pg_driver = get_driver(PG_DEFAULT_DRIVER) - self.qtIdent = pg_driver.qtIdent - self.manager = pg_driver.connection_manager( - kwargs['sid'] - ) - self.conn = self.manager.connection(did=kwargs['did']) - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - gettext("Connection to the server has been lost!") - ) - self.datlastsysoid = self.manager.db_info[ - kwargs['did']]['datlastsysoid'] - - # Set template path for sql scripts - self.template_path = self.template_initial + '/' + ( - self.ppas_template_path(self.manager.version) - if self.manager.server_type == 'ppas' else - self.pg_template_path(self.manager.version) - ) - - ver = self.manager.version - if ver >= 90200: - self.column_template_path = 'column/sql/9.2_plus' - else: - self.column_template_path = 'column/sql/9.1_plus' - - return f(*args, **kwargs) - - return wrap - - class ViewNode(PGChildNodeView, VacuumSettings): """ This class is responsible for generating routes for view node. diff --git a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.1_plus/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.1_plus/nodes.sql index b05880c..cf9777f 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.1_plus/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.1_plus/nodes.sql @@ -9,4 +9,4 @@ db.oid = {{ did|qtLiteral }}::OID{% else %} db.oid > {{ last_system_oid }}::OID {% endif %} -ORDER BY datname; +ORDER BY datname diff --git a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.2_plus/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.2_plus/nodes.sql index b05880c..cf9777f 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.2_plus/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.2_plus/nodes.sql @@ -9,4 +9,4 @@ db.oid = {{ did|qtLiteral }}::OID{% else %} db.oid > {{ last_system_oid }}::OID {% endif %} -ORDER BY datname; +ORDER BY datname diff --git a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.3_plus/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.3_plus/nodes.sql index b05880c..cf9777f 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.3_plus/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/9.3_plus/nodes.sql @@ -9,4 +9,4 @@ db.oid = {{ did|qtLiteral }}::OID{% else %} db.oid > {{ last_system_oid }}::OID {% endif %} -ORDER BY datname; +ORDER BY datname 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 749e543..2f19499 100644 --- a/web/pgadmin/browser/server_groups/servers/resource_groups/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/resource_groups/__init__.py @@ -25,6 +25,35 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to self + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold self & kwargs will hold gid,sid,did + self = args[0] + self.driver = get_driver(PG_DEFAULT_DRIVER) + self.manager = self.driver.connection_manager(kwargs['sid']) + self.conn = self.manager.connection() + + # If DB not connected then return error to browser + if not self.conn.connected(): + return precondition_required( + gettext( + "Connection to the server has been lost!" + ) + ) + + self.template_path = 'resource_groups/sql' + return f(*args, **kwargs) + + return wrap + + class ResourceGroupModule(CollectionNodeModule): """ class ResourceGroupModule(CollectionNodeModule) @@ -68,6 +97,7 @@ class ResourceGroupModule(CollectionNodeModule): self.max_ver = None self.server_type = ['ppas'] + @check_precondition def get_nodes(self, gid, sid): """ Method is used to generate the browser collection node @@ -76,7 +106,17 @@ class ResourceGroupModule(CollectionNodeModule): gid: Server Group ID sid: Server ID """ - yield self.generate_browser_collection_node(sid) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.template_path, 'properties.sql'])) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(sid, collection_count) @property def node_inode(self): @@ -201,34 +241,6 @@ class ResourceGroupView(NodeView): 200, {'Content-Type': 'application/x-javascript'} ) - def check_precondition(f): - """ - This function will behave as a decorator which will checks - database connection before running view, it will also attaches - manager,conn & template_path properties to self - """ - - @wraps(f) - def wrap(*args, **kwargs): - # Here args[0] will hold self & kwargs will hold gid,sid,did - self = args[0] - self.driver = get_driver(PG_DEFAULT_DRIVER) - self.manager = self.driver.connection_manager(kwargs['sid']) - self.conn = self.manager.connection() - - # If DB not connected then return error to browser - if not self.conn.connected(): - return precondition_required( - gettext( - "Connection to the server has been lost!" - ) - ) - - self.template_path = 'resource_groups/sql' - return f(*args, **kwargs) - - return wrap - @check_precondition def list(self, gid, sid): """ diff --git a/web/pgadmin/browser/server_groups/servers/roles/__init__.py b/web/pgadmin/browser/server_groups/servers/roles/__init__.py index bee3d02..56f344a 100644 --- a/web/pgadmin/browser/server_groups/servers/roles/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/roles/__init__.py @@ -24,6 +24,122 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(action=None): + """ + This function will behave as a decorator which will checks the status + of the database connection for the maintainance database of the server, + beforeexecuting rest of the operation for the wrapped function. It will + also attach manager, conn (maintenance connection for the server) as + properties of the instance. + """ + + def wrap(f): + @wraps(f) + def wrapped(self, **kwargs): + self.manager = get_driver( + PG_DEFAULT_DRIVER + ).connection_manager( + kwargs['sid'] + ) + self.conn = self.manager.connection() + + driver = get_driver(PG_DEFAULT_DRIVER) + self.qtIdent = driver.qtIdent + + if not self.conn.connected(): + return precondition_required( + _("Connection to the server has been lost!") + ) + + ver = self.manager.version + + self.sql_path = 'role/sql/{0}/'.format( + 'post9_4' if ver >= 90500 else \ + 'post9_1' if ver >= 90200 else \ + 'post9_0' if ver >= 90100 else \ + 'post8_4' + ) + + self.alterKeys = [ + u'rolcanlogin', u'rolsuper', u'rolcreatedb', + u'rolcreaterole', u'rolinherit', u'rolreplication', + u'rolconnlimit', u'rolvaliduntil', u'rolpassword' + ] if ver >= 90200 else [ + u'rolcanlogin', u'rolsuper', u'rolcreatedb', + u'rolcreaterole', u'rolinherit', u'rolconnlimit', + u'rolvaliduntil', u'rolpassword' + ] + + check_permission = False + fetch_name = False + forbidden_msg = None + + if action in ['drop', 'update']: + check_permission = True + fetch_name = True + if action == 'drop': + forbidden_msg = _( + "The current user does not have permission to drop the role." + ) + else: + forbidden_msg = _( + "The current user does not have permission to update the role." + ) + elif action == 'create': + check_permission = True + forbidden_msg = _( + "The current user does not have permission to create the role." + ) + elif (action == 'msql' and + 'rid' in kwargs and kwargs['rid'] != -1): + fetch_name = True + + if check_permission: + user = self.manager.user_info + + if not user['is_superuser'] and \ + not user['can_create_role']: + if (action != 'update' or + 'rid' in kwargs and kwargs['rid'] != -1 and + user['id'] != kwargs['rid']): + return forbidden(forbidden_msg) + + if fetch_name: + + status, res = self.conn.execute_dict( + render_template( + self.sql_path + 'permission.sql', + rid=kwargs['rid'], + conn=self.conn + ) + ) + + if not status: + return internal_server_error( + _( + "Error retrieving the role information.\n{0}" + ).format(res) + ) + + if len(res['rows']) == 0: + return gone( + _("Couldn't find the role on the database server.") + ) + + row = res['rows'][0] + + self.role = row['rolname'] + self.rolCanLogin = row['rolcanlogin'] + self.rolCatUpdate = row['rolcatupdate'] + self.rolSuper = row['rolsuper'] + + return f(self, **kwargs) + + return wrapped + + return wrap + + class RoleModule(CollectionNodeModule): NODE_TYPE = 'role' COLLECTION_LABEL = _("Login/Group Roles") @@ -34,12 +150,23 @@ class RoleModule(CollectionNodeModule): super(RoleModule, self).__init__(*args, **kwargs) + @check_precondition(action='nodes') def get_nodes(self, gid, sid): """ Generate the collection node """ if self.show_node: - yield self.generate_browser_collection_node(sid) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template(self.sql_path + 'nodes.sql') + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(sid, collection_count) pass @property @@ -429,121 +556,6 @@ rolmembership:{ return wrap - def check_precondition(action=None): - """ - This function will behave as a decorator which will checks the status - of the database connection for the maintainance database of the server, - beforeexecuting rest of the operation for the wrapped function. It will - also attach manager, conn (maintenance connection for the server) as - properties of the instance. - """ - - def wrap(f): - @wraps(f) - def wrapped(self, **kwargs): - self.manager = get_driver( - PG_DEFAULT_DRIVER - ).connection_manager( - kwargs['sid'] - ) - self.conn = self.manager.connection() - - driver = get_driver(PG_DEFAULT_DRIVER) - self.qtIdent = driver.qtIdent - - if not self.conn.connected(): - return precondition_required( - _("Connection to the server has been lost!") - ) - - ver = self.manager.version - - self.sql_path = 'role/sql/{0}/'.format( - 'post9_4' if ver >= 90500 else \ - 'post9_1' if ver >= 90200 else \ - 'post9_0' if ver >= 90100 else \ - 'post8_4' - ) - - self.alterKeys = [ - u'rolcanlogin', u'rolsuper', u'rolcreatedb', - u'rolcreaterole', u'rolinherit', u'rolreplication', - u'rolconnlimit', u'rolvaliduntil', u'rolpassword' - ] if ver >= 90200 else [ - u'rolcanlogin', u'rolsuper', u'rolcreatedb', - u'rolcreaterole', u'rolinherit', u'rolconnlimit', - u'rolvaliduntil', u'rolpassword' - ] - - check_permission = False - fetch_name = False - forbidden_msg = None - - if action in ['drop', 'update']: - check_permission = True - fetch_name = True - if action == 'drop': - forbidden_msg = _( - "The current user does not have permission to drop the role." - ) - else: - forbidden_msg = _( - "The current user does not have permission to update the role." - ) - elif action == 'create': - check_permission = True - forbidden_msg = _( - "The current user does not have permission to create the role." - ) - elif (action == 'msql' and - 'rid' in kwargs and kwargs['rid'] != -1): - fetch_name = True - - if check_permission: - user = self.manager.user_info - - if not user['is_superuser'] and \ - not user['can_create_role']: - if (action != 'update' or - 'rid' in kwargs and kwargs['rid'] != -1 and - user['id'] != kwargs['rid']): - return forbidden(forbidden_msg) - - if fetch_name: - - status, res = self.conn.execute_dict( - render_template( - self.sql_path + 'permission.sql', - rid=kwargs['rid'], - conn=self.conn - ) - ) - - if not status: - return internal_server_error( - _( - "Error retrieving the role information.\n{0}" - ).format(res) - ) - - if len(res['rows']) == 0: - return gone( - _("Couldn't find the role on the database server.") - ) - - row = res['rows'][0] - - self.role = row['rolname'] - self.rolCanLogin = row['rolcanlogin'] - self.rolCatUpdate = row['rolcatupdate'] - self.rolSuper = row['rolsuper'] - - return f(self, **kwargs) - - return wrapped - - return wrap - @check_precondition(action='list') def list(self, gid, sid): status, res = self.conn.execute_dict( diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/__init__.py b/web/pgadmin/browser/server_groups/servers/tablespaces/__init__.py index 3bed5f9..3211ae8 100644 --- a/web/pgadmin/browser/server_groups/servers/tablespaces/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/tablespaces/__init__.py @@ -25,15 +25,68 @@ from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER +def check_precondition(f): + """ + This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to self + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold self & kwargs will hold gid,sid,tsid + self = args[0] + self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(kwargs['sid']) + self.conn = self.manager.connection() + + # If DB not connected then return error to browser + if not self.conn.connected(): + current_app.logger.warning( + "Connection to the server has been lost!" + ) + return precondition_required( + gettext( + "Connection to the server has been lost!" + ) + ) + + ver = self.manager.version + if ver >= 90200: + self.template_path = 'tablespaces/sql/9.2_plus' + else: + self.template_path = 'tablespaces/sql/9.1_plus' + current_app.logger.debug( + "Using the template path: %s", self.template_path + ) + # Allowed ACL on tablespace + self.acl = ['C'] + + return f(*args, **kwargs) + + return wrap + + class TablespaceModule(CollectionNodeModule): NODE_TYPE = 'tablespace' COLLECTION_LABEL = gettext("Tablespaces") + @check_precondition def get_nodes(self, gid, sid): """ Generate the collection node """ - yield self.generate_browser_collection_node(sid) + collection_count = 0 + + count_sql = 'SELECT count(*) FROM( ' + node_sql = render_template("/".join([self.template_path, 'nodes.sql']), + conn=self.conn) + count_sql += node_sql + ' ) AS collection_count' + + status, rset = self.conn.execute_scalar(count_sql) + if status: + collection_count = rset + + yield self.generate_browser_collection_node(sid, collection_count) @property def script_load(self): @@ -93,46 +146,6 @@ class TablespaceView(PGChildNodeView): 200, {'Content-Type': 'application/x-javascript'} ) - def check_precondition(f): - """ - This function will behave as a decorator which will checks - database connection before running view, it will also attaches - manager,conn & template_path properties to self - """ - - @wraps(f) - def wrap(*args, **kwargs): - # Here args[0] will hold self & kwargs will hold gid,sid,tsid - self = args[0] - self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(kwargs['sid']) - self.conn = self.manager.connection() - - # If DB not connected then return error to browser - if not self.conn.connected(): - current_app.logger.warning( - "Connection to the server has been lost!" - ) - return precondition_required( - gettext( - "Connection to the server has been lost!" - ) - ) - - ver = self.manager.version - if ver >= 90200: - self.template_path = 'tablespaces/sql/9.2_plus' - else: - self.template_path = 'tablespaces/sql/9.1_plus' - current_app.logger.debug( - "Using the template path: %s", self.template_path - ) - # Allowed ACL on tablespace - self.acl = ['C'] - - return f(*args, **kwargs) - - return wrap - @check_precondition def list(self, gid, sid): SQL = render_template( diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/templates/tablespaces/sql/9.1_plus/nodes.sql b/web/pgadmin/browser/server_groups/servers/tablespaces/templates/tablespaces/sql/9.1_plus/nodes.sql index f0ac205..2df254e 100644 --- a/web/pgadmin/browser/server_groups/servers/tablespaces/templates/tablespaces/sql/9.1_plus/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/tablespaces/templates/tablespaces/sql/9.1_plus/nodes.sql @@ -6,4 +6,4 @@ FROM WHERE ts.oid={{ tsid|qtLiteral }}::OID {% endif %} -ORDER BY name; +ORDER BY name diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/templates/tablespaces/sql/9.2_plus/nodes.sql b/web/pgadmin/browser/server_groups/servers/tablespaces/templates/tablespaces/sql/9.2_plus/nodes.sql index 37d4538..91c8751 100644 --- a/web/pgadmin/browser/server_groups/servers/tablespaces/templates/tablespaces/sql/9.2_plus/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/tablespaces/templates/tablespaces/sql/9.2_plus/nodes.sql @@ -6,4 +6,4 @@ FROM WHERE ts.oid={{ tsid|qtLiteral }}::OID {% endif %} -ORDER BY name; +ORDER BY name diff --git a/web/pgadmin/browser/utils.py b/web/pgadmin/browser/utils.py index 9799586..fc4fe5e 100644 --- a/web/pgadmin/browser/utils.py +++ b/web/pgadmin/browser/utils.py @@ -15,7 +15,7 @@ import flask from flask import render_template, current_app from flask_babel import gettext from flask.views import View, MethodViewType, with_metaclass -from pgadmin.utils.ajax import make_json_response, precondition_required +from pgadmin.utils.ajax import make_json_response, precondition_required, gone from config import PG_DEFAULT_DRIVER @@ -128,7 +128,8 @@ class NodeView(with_metaclass(MethodViewType, View)): 'dependency': [{'get': 'dependencies'}], 'dependent': [{'get': 'dependents'}], 'children': [{'get': 'children'}], - 'module.js': [{}, {}, {'get': 'module_js'}] + 'module.js': [{}, {}, {'get': 'module_js'}], + 'coll': [{}, {'get': 'collection'}] }) @classmethod @@ -289,6 +290,14 @@ class NodeView(with_metaclass(MethodViewType, View)): ) ) + def collection(self, *args, **kwargs): + """Build the collection node.""" + for d in self.blueprint.get_nodes(*args, **kwargs): + return make_json_response( + data=d + ) + return gone(gettext("Couldn't find the object information.")) + class PGChildNodeView(NodeView): def children(self, **kwargs):