# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # MIT License. See license.txt from __future__ import unicode_literals ''' File based locking utility ''' import os from time import time from frappe.utils import get_site_path, touch_file class LockTimeoutError(Exception): pass def create_lock(name): '''Creates a file in the /locks folder by the given name''' lock_path = get_lock_path(name) if not check_lock(lock_path): return touch_file(lock_path) else: return False def lock_exists(name): '''Returns True if lock of the given name exists''' return os.path.exists(get_lock_path(name)) def check_lock(path, timeout=600): if not os.path.exists(path): return False if time() - os.path.getmtime(path) > timeout: raise LockTimeoutError(path) return True def delete_lock(name): lock_path = get_lock_path(name) try: os.remove(lock_path) except OSError: pass return True def get_lock_path(name): name = name.lower() locks_dir = 'locks' lock_path = get_site_path(locks_dir, name + '.lock') return lock_path