Exemplo n.º 1
0
 def hard_rebuild_case(domain, case_id, detail, lock=True, save=True):
     assert save or not lock, f"refusing to lock when not saving"
     if lock:
         # only record metric if locking since otherwise it has been
         # (most likley) recorded elsewhere
         case_load_counter("rebuild_case", domain)()
     case, lock_obj = FormProcessorSQL.get_case_with_lock(case_id, lock=lock)
     found = bool(case)
     if not found:
         case = CommCareCaseSQL(case_id=case_id, domain=domain)
         if lock:
             lock_obj = CommCareCaseSQL.get_obj_lock_by_id(case_id)
             acquire_lock(lock_obj, degrade_gracefully=False)
Exemplo n.º 2
0
 def hard_rebuild_case(domain, case_id, detail, save=True, lock=True):
     if lock:
         # only record metric if locking since otherwise it has been
         # (most likley) recorded elsewhere
         case_load_counter("rebuild_case", domain)()
     case, lock_obj = FormProcessorCouch.get_case_with_lock(case_id,
                                                            lock=lock,
                                                            wrap=True)
     found = bool(case)
     if not found:
         case = CommCareCase()
         case.case_id = case_id
         case.domain = domain
         if lock:
             lock_obj = CommCareCase.get_obj_lock_by_id(case_id)
             acquire_lock(lock_obj, degrade_gracefully=False)
Exemplo n.º 3
0
    def __init__(self,
                 domain=None,
                 deleted_ok=False,
                 lock=False,
                 wrap=True,
                 initial=None,
                 xforms=None,
                 load_src="unknown"):

        self._track_load = case_load_counter(load_src, domain)
        self._populate_from_initial(initial)
        self.domain = domain
        self.cached_xforms = xforms if xforms is not None else []
        self.deleted_ok = deleted_ok
        self.lock = lock
        self.wrap = wrap
        if self.lock and not self.wrap:
            raise ValueError(
                'Currently locking only supports explicitly wrapping cases!')
        self.locks = []
        self._changed = set()
        # this is used to allow casedb to be re-entrant. Each new context pushes the parent context locks
        # onto this stack and restores them when the context exits
        self.lock_stack = []
        self.processor_interface = FormProcessorInterface(self.domain)
Exemplo n.º 4
0
def batch_cases(accessor, case_ids):
    def take(n, iterable):
        # https://docs.python.org/2/library/itertools.html#recipes
        return list(islice(iterable, n))

    track_load = case_load_counter("livequery_restore", accessor.domain)
    ids = iter(case_ids)
    while True:
        next_ids = take(1000, ids)
        if not next_ids:
            break
        track_load(len(next_ids))
        yield accessor.get_cases(next_ids)
Exemplo n.º 5
0
    def __init__(self, timing_context, case_ids_to_sync, restore_state):
        self.restore_state = restore_state
        self.case_accessor = CaseAccessors(self.restore_state.domain)

        self.case_ids_to_sync = case_ids_to_sync
        self.all_maybe_syncing = copy(case_ids_to_sync)
        self.checked_cases = set()
        self.child_indices = defaultdict(set)
        self.extension_indices = defaultdict(set)
        self.all_dependencies_syncing = set()
        self.closed_cases = set()
        self.potential_elements_to_sync = {}

        self.timing_context = timing_context
        self._track_load = case_load_counter("cleanowner_restore",
                                             restore_state.domain)
Exemplo n.º 6
0
def batch_cases(accessor, case_ids):
    def take(n, iterable):
        # https://docs.python.org/2/library/itertools.html#recipes
        return list(islice(iterable, n))

    track_load = case_load_counter("livequery_restore", accessor.domain)
    metrics_histogram('commcare.restore.case_load',
                      len(case_ids),
                      'cases',
                      [10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000],
                      tags={'domain': accessor.domain})
    ids = iter(case_ids)
    while True:
        next_ids = take(1000, ids)
        if not next_ids:
            break
        track_load(len(next_ids))
        yield accessor.get_cases(next_ids)
Exemplo n.º 7
0
def _sync_case_for_messaging_rule(domain, case_id, rule_id):
    case_load_counter("messaging_rule_sync", domain)()
    try:
        case = CaseAccessors(domain).get_case(case_id)
Exemplo n.º 8
0
                bind=True)
def sync_case_for_messaging_rule(self, domain, case_id, rule_id):
    try:
        with CriticalSection([get_sync_key(case_id)], timeout=5 * 60):
            _sync_case_for_messaging_rule(domain, case_id, rule_id)
    except Exception as e:
        self.retry(exc=e)


def _sync_case_for_messaging(domain, case_id):
    try:
        case = CaseAccessors(domain).get_case(case_id)
        sms_tasks.clear_case_caches(case)
    except CaseNotFound:
        case = None
    case_load_counter("messaging_sync", domain)()
    update_messaging_for_case(domain, case_id, case)
    if case is not None:
        run_auto_update_rules_for_case(case)


def update_messaging_for_case(domain, case_id, case):
    if case is None or case.is_deleted:
        clear_messaging_for_case(domain, case_id)
    elif use_phone_entries():
        sms_tasks._sync_case_phone_number(case)


def clear_messaging_for_case(domain, case_id):
    sms_tasks.delete_phone_numbers_for_owners([case_id])
    delete_schedule_instances_for_cases(domain, [case_id])
Exemplo n.º 9
0
def _log_case_lookup(domain):
    case_load_counter("case_importer", domain)
Exemplo n.º 10
0
def _sync_case_for_messaging_rule(domain, case_id, rule_id):
    case_load_counter("messaging_rule_sync", domain)()
    try:
        case = CommCareCase.objects.get_case(case_id, domain)