void Dbtup::fireDetachedTriggers(KeyReqStruct *req_struct, DLList<TupTriggerData>& triggerList, Operationrec* const regOperPtr, bool disk) { TriggerPtr trigPtr; /** * Set disk page */ req_struct->m_disk_page_ptr.i = m_pgman.m_ptr.i; ndbrequire(regOperPtr->is_first_operation()); triggerList.first(trigPtr); while (trigPtr.i != RNIL) { jam(); if ((trigPtr.p->monitorReplicas || regOperPtr->op_struct.primary_replica) && (trigPtr.p->monitorAllAttributes || trigPtr.p->attributeMask.overlaps(req_struct->changeMask))) { jam(); executeTrigger(req_struct, trigPtr.p, regOperPtr, disk); } triggerList.next(trigPtr); } }
void Dbtup::executeTriggers(KeyReqStruct *req_struct, DLList<TupTriggerData>& triggerList, Operationrec* regOperPtr, bool disk) { TriggerPtr trigPtr; triggerList.first(trigPtr); while (trigPtr.i != RNIL) { jam(); executeTrigger(req_struct, trigPtr.p, regOperPtr, disk); triggerList.next(trigPtr); } }
/* ---------------------------------------------------------------- */ Uint32 Dbtup::dropTrigger(Tablerec* table, const DropTrigReq* req, BlockNumber sender) { if (ERROR_INSERTED(4004)) { CLEAR_ERROR_INSERT_VALUE; return 9999; } Uint32 triggerId = req->getTriggerId(); TriggerType::Value ttype = req->getTriggerType(); TriggerActionTime::Value ttime = req->getTriggerActionTime(); TriggerEvent::Value tevent = req->getTriggerEvent(); // ndbout_c("Drop TupTrigger %u = %u %u %u %u by %u", triggerId, table, ttype, ttime, tevent, sender); DLList<TupTriggerData>* tlist = findTriggerList(table, ttype, ttime, tevent); ndbrequire(tlist != NULL); Ptr<TupTriggerData> ptr; for (tlist->first(ptr); !ptr.isNull(); tlist->next(ptr)) { jam(); if (ptr.p->triggerId == triggerId) { if(ttype==TriggerType::SUBSCRIPTION && sender != ptr.p->m_receiverBlock) { /** * You can only drop your own triggers for subscription triggers. * Trigger IDs are private for each block. * * SUMA encodes information in the triggerId * * Backup doesn't really care about the Ids though. */ jam(); continue; } jam(); tlist->release(ptr.i); return 0; } } return DropTrigRef::TriggerNotFound; }//Dbtup::dropTrigger()
void Dbtup::fireDeferredTriggers(Signal* signal, KeyReqStruct *req_struct, DLList<TupTriggerData>& triggerList, Operationrec* const regOperPtr) { TriggerPtr trigPtr; triggerList.first(trigPtr); while (trigPtr.i != RNIL) { jam(); if (trigPtr.p->monitorAllAttributes || trigPtr.p->attributeMask.overlaps(req_struct->changeMask)) { jam(); executeTrigger(req_struct, trigPtr, regOperPtr); }//if triggerList.next(trigPtr); }//while }//Dbtup::fireDeferredTriggers()