fix: better cache validation
- Only delete a single doc if we know which doc changed - Drop all docs other wise (kinda bad, but this isn't used frequently, will fix when visiting entire caching system again)
This commit is contained in:
parent
cee2b50461
commit
bfa6a5fbdf
2 changed files with 18 additions and 19 deletions
|
|
@ -857,7 +857,7 @@ class Database:
|
|||
:param modified_by: Set this user as `modified_by`.
|
||||
:param update_modified: default True. Set as false, if you don't want to update the timestamp.
|
||||
:param debug: Print the query in the developer / js console.
|
||||
:param for_update: Will add a row-level lock to the value that is being set so that it can be released on commit.
|
||||
:param for_update: [DEPRECATED] This function now performs updates in single query, locking is not required.
|
||||
"""
|
||||
is_single_doctype = not (dn and dt != dn)
|
||||
to_update = field if isinstance(field, dict) else {field: val}
|
||||
|
|
@ -880,10 +880,14 @@ class Database:
|
|||
|
||||
else:
|
||||
query = frappe.qb.engine.build_conditions(table=dt, filters=dn, update=True)
|
||||
# TODO: Fix this; doesn't work rn - gavin@frappe.io
|
||||
# frappe.cache().hdel_keys(dt, "document_cache")
|
||||
# Workaround: clear all document caches
|
||||
frappe.cache().delete_value("document_cache")
|
||||
|
||||
if isinstance(dn, str):
|
||||
frappe.clear_document_cache(dt, dn)
|
||||
else:
|
||||
# TODO: Fix this; doesn't work rn - gavin@frappe.io
|
||||
# frappe.cache().hdel_keys(dt, "document_cache")
|
||||
# Workaround: clear all document caches
|
||||
frappe.cache().delete_value("document_cache")
|
||||
|
||||
for column, value in to_update.items():
|
||||
query = query.set(column, value)
|
||||
|
|
|
|||
|
|
@ -735,7 +735,7 @@ class TestDBSetValue(FrappeTestCase):
|
|||
frappe.db.get_value("ToDo", todo.name, ["modified", "modified_by"]),
|
||||
)
|
||||
|
||||
def test_for_update(self):
|
||||
def test_set_value(self):
|
||||
self.todo1.reload()
|
||||
|
||||
with patch.object(Database, "sql") as sql_called:
|
||||
|
|
@ -746,28 +746,23 @@ class TestDBSetValue(FrappeTestCase):
|
|||
f"{self.todo1.description}-edit by `test_for_update`",
|
||||
)
|
||||
first_query = sql_called.call_args_list[0].args[0]
|
||||
second_query = sql_called.call_args_list[1].args[0]
|
||||
|
||||
self.assertTrue(sql_called.call_count == 2)
|
||||
self.assertTrue("FOR UPDATE" in first_query)
|
||||
if frappe.conf.db_type == "postgres":
|
||||
from frappe.database.postgres.database import modify_query
|
||||
|
||||
self.assertTrue(modify_query("UPDATE `tabToDo` SET") in second_query)
|
||||
self.assertTrue(modify_query("UPDATE `tabToDo` SET") in first_query)
|
||||
if frappe.conf.db_type == "mariadb":
|
||||
self.assertTrue("UPDATE `tabToDo` SET" in second_query)
|
||||
self.assertTrue("UPDATE `tabToDo` SET" in first_query)
|
||||
|
||||
def test_cleared_cache(self):
|
||||
self.todo2.reload()
|
||||
frappe.get_cached_doc(self.todo2.doctype, self.todo2.name) # init cache
|
||||
|
||||
with patch.object(frappe, "clear_document_cache") as clear_cache:
|
||||
frappe.db.set_value(
|
||||
self.todo2.doctype,
|
||||
self.todo2.name,
|
||||
"description",
|
||||
f"{self.todo2.description}-edit by `test_cleared_cache`",
|
||||
)
|
||||
clear_cache.assert_called()
|
||||
description = f"{self.todo2.description}-edit by `test_cleared_cache`"
|
||||
|
||||
frappe.db.set_value(self.todo2.doctype, self.todo2.name, "description", description)
|
||||
cached_doc = frappe.get_cached_doc(self.todo2.doctype, self.todo2.name)
|
||||
self.assertEqual(cached_doc.description, description)
|
||||
|
||||
def test_update_alias(self):
|
||||
args = (self.todo1.doctype, self.todo1.name, "description", "Updated by `test_update_alias`")
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue