From f83404a6b5f41625d8836a7c8ab24f28b7319e1b Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 19 Mar 2014 12:02:09 +0530 Subject: [PATCH] more caching for frequent queries --- frappe/__init__.py | 9 ++++++++- frappe/database.py | 12 +++++++----- frappe/defaults.py | 15 +++++++++------ frappe/model/doctype.py | 2 ++ frappe/permissions.py | 2 +- frappe/sessions.py | 2 ++ frappe/utils/user.py | 7 +++++-- 7 files changed, 34 insertions(+), 15 deletions(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index d5258e737f..50cac5b698 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -284,7 +284,14 @@ def get_roles(username=None): def has_permission(doctype, ptype="read", refdoc=None): import frappe.permissions return frappe.permissions.has_permission(doctype, ptype, refdoc) - + +def is_table(doctype): + tables = cache().get_value("is_table") + if tables==None: + tables = db.sql_list("select name from tabDocType where ifnull(istable,0)=1") + cache().set_value("is_table", tables) + return doctype in tables + def clear_perms(doctype): db.sql("""delete from tabDocPerm where parent=%s""", doctype) diff --git a/frappe/database.py b/frappe/database.py index e63feb995a..6ce6db3dcf 100644 --- a/frappe/database.py +++ b/frappe/database.py @@ -19,6 +19,7 @@ class Database: def __init__(self, host=None, user=None, password=None, ac_name=None, use_default = 0): self.host = host or frappe.conf.db_host or 'localhost' self.user = user or frappe.conf.db_name + self._conn = None if ac_name: self.user = self.get_db_login(ac_name) or frappe.conf.db_name @@ -30,11 +31,7 @@ class Database: self.auto_commit_on_many_writes = 0 self.password = password or frappe.conf.db_password - - self.connect() - if self.user != 'root': - self.use(self.user) - + def get_db_login(self, ac_name): return ac_name @@ -47,6 +44,8 @@ class Database: use_unicode=True, charset='utf8') self._conn.converter[246]=float self._cursor = self._conn.cursor() + if self.user != 'root': + self.use(self.user) frappe.local.rollback_observers = [] def use(self, db_name): @@ -69,6 +68,9 @@ class Database: * returns as a dictionary if as_dict = 1 * returns as a list of lists (with cleaned up dates) if as_list = 1 """ + if not self._conn: + self.connect() + # in transaction validations self.check_transaction_status(query) diff --git a/frappe/defaults.py b/frappe/defaults.py index 4fb34e0873..632f574a1c 100644 --- a/frappe/defaults.py +++ b/frappe/defaults.py @@ -32,11 +32,14 @@ def get_restrictions(user=None): return build_restrictions(user) def build_restrictions(user): - out = {} - for key, value in frappe.db.sql("""select defkey, defvalue - from tabDefaultValue where parent=%s and parenttype='Restriction'""", (user,)): - out.setdefault(key, []) - out[key].append(value) + out = frappe.cache().get_value("restrictions:" + user) + if out==None: + out = {} + for key, value in frappe.db.sql("""select defkey, defvalue + from tabDefaultValue where parent=%s and parenttype='Restriction'""", (user,)): + out.setdefault(key, []) + out[key].append(value) + frappe.cache().set_value("restrictions:" + user, out) return out def get_defaults(user=None): @@ -131,7 +134,7 @@ def clear_default(key=None, value=None, parent=None, name=None, parenttype=None) def get_defaults_for(parent="Control Panel"): """get all defaults""" defaults = frappe.cache().get_value("__defaults:" + parent) - if not defaults: + if defaults==None: res = frappe.db.sql("""select defkey, defvalue from `tabDefaultValue` where parent = %s order by creation""", (parent,), as_dict=1) diff --git a/frappe/model/doctype.py b/frappe/model/doctype.py index 6d5802a246..0d02cba40b 100644 --- a/frappe/model/doctype.py +++ b/frappe/model/doctype.py @@ -262,6 +262,8 @@ def clear_cache(doctype=None): # clear all for dt in frappe.db.sql("""select name from tabDocType"""): clear_single(dt[0]) + + frappe.cache().delete_value("is_table") def add_code(doctype, doclist): import os diff --git a/frappe/permissions.py b/frappe/permissions.py index 9b53aaa836..a8a2241f16 100644 --- a/frappe/permissions.py +++ b/frappe/permissions.py @@ -16,7 +16,7 @@ def check_admin_or_system_manager(): def has_permission(doctype, ptype="read", refdoc=None, verbose=True): """check if user has permission""" - if frappe.db.get_value("DocType", doctype, "istable")==1: + if frappe.is_table(doctype): return True meta = frappe.get_doctype(doctype) diff --git a/frappe/sessions.py b/frappe/sessions.py index f452e89e16..0299fee32b 100644 --- a/frappe/sessions.py +++ b/frappe/sessions.py @@ -33,6 +33,8 @@ def clear_cache(user=None): if user: cache.delete_value("bootinfo:" + user) cache.delete_value("lang:" + user) + cache.delete_value("roles:" + user) + cache.delete_value("restrictions:" + user) # clear notifications if frappe.flags.in_install_app!="frappe": diff --git a/frappe/utils/user.py b/frappe/utils/user.py index 0dee77b9e1..1c1d340146 100644 --- a/frappe/utils/user.py +++ b/frappe/utils/user.py @@ -223,8 +223,11 @@ def get_roles(username=None, with_standard=True): if username=='Guest': return ['Guest'] - roles = [r[0] for r in frappe.db.sql("""select role from tabUserRole - where parent=%s and role!='All'""", (username,))] + ['All'] + roles = frappe.cache().get_value("roles:" + username) + if not roles: + roles = [r[0] for r in frappe.db.sql("""select role from tabUserRole + where parent=%s and role!='All'""", (username,))] + ['All'] + frappe.cache().set_value("roles:" + username, roles) # filter standard if required if not with_standard: