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()
int main() { using namespace std; DLList<int> myIntDLL; cout << "Prepending: 5" << endl; myIntDLL.prepend(5); myIntDLL.printList(); cout << "Prepending: 4" << endl; myIntDLL.prepend(4); myIntDLL.printList(); cout << "Prepending: 3" << endl; myIntDLL.prepend(3); myIntDLL.printList(); cout << "Appending: 9" << endl; myIntDLL.append(9); myIntDLL.printList(); cout << "Appending: 8" << endl; myIntDLL.append(8); myIntDLL.printList(); cout << "Appeding: 7" << endl; myIntDLL.append(7); myIntDLL.printList(); cout << "Current data: " << *myIntDLL.getValue() << endl; cout << "Moving to end" << endl; myIntDLL.moveToEnd(); cout << "Current data: " << *myIntDLL.getValue() << endl; cout << "Moving to start" << endl; myIntDLL.moveToStart(); cout << "Current data: " << *myIntDLL.getValue() << endl; cout << "Iterating through list with next function" << endl; for (int i = 0; i < 10; i++) { cout << "Current data: " << *myIntDLL.getValue() << endl; cout << "Next: " << myIntDLL.next() << endl; } cout << "Iterating through list with prev function" << endl; for (int i = 0; i < 10; i++) { cout << "Current data: " << *myIntDLL.getValue() << endl; cout << "Prev: " << myIntDLL.prev() << endl; } cout << "Number of links active: " << myIntDLL.numActive() << endl; cout << "Number of links free: " << myIntDLL.numFree() << endl; cout << "Clearing list" << endl; myIntDLL.clear(); myIntDLL.printList(); cout << "Number of links active: " << myIntDLL.numActive() << endl; cout << "Number of links free: " << myIntDLL.numFree() << endl; return 0; }