Beispiel #1
0
/**
 * Transaction 4 - T4
 * 
 * Create session
 *
 * Input:
 *   SubscriberNumber
 *   ServerId
 *   ServerBit
 *   SessionDetails,
 *   DoRollback
 * Output:
 *   ChangedBy
 *   ChangedTime
 *   Location
 *   BranchExecuted
 */
void
start_T4(Ndb * pNDB, ThreadData * td, int async){

  DEBUG3("T4(%.*s, %.2d): - Starting", SUBSCRIBER_NUMBER_LENGTH, 
	 td->transactionData.number, 
	 td->transactionData.server_id);
  
  NdbConnection * pCON = 0;
  while((pCON = startTransaction(pNDB, td)) == 0){
    CHECK_ALLOWED_ERROR("T4-1: startTransaction", td, pNDB->getNdbError());
    NdbSleep_MilliSleep(10);
  }
  
  NdbOperation *MyOp= pCON->getNdbOperation(SUBSCRIBER_TABLE);
  CHECK_NULL(MyOp, "T4-1: getNdbOperation", td,
	     pCON->getNdbError());
  
  MyOp->interpretedUpdateTuple();
  MyOp->equal(IND_SUBSCRIBER_NUMBER, 
	      td->transactionData.number);
  MyOp->getValue(IND_SUBSCRIBER_LOCATION, 
		 (char *)&td->transactionData.location);
  MyOp->getValue(IND_SUBSCRIBER_CHANGED_BY, 
		 td->transactionData.changed_by);
  MyOp->getValue(IND_SUBSCRIBER_CHANGED_TIME, 
		 td->transactionData.changed_time);
  MyOp->getValue(IND_SUBSCRIBER_GROUP,
		 (char *)&td->transactionData.group_id);
  MyOp->getValue(IND_SUBSCRIBER_SESSIONS,
		 (char *)&td->transactionData.sessions); 
  MyOp->incValue(IND_SUBSCRIBER_SESSIONS, 
		 (uint32)td->transactionData.server_bit);
  stat_async = async;
  if (async == 1) {
    pCON->executeAsynchPrepare( NoCommit , T4_Callback_1, td);
  } else {
    int result = pCON->execute( NoCommit );
    T4_Callback_1(result, pCON, (void*)td);
    return;
  }//if
}
Beispiel #2
0
/**
 * Transaction 4 - T4
 *
 * Create session
 *
 * Input:
 *   SubscriberNumber
 *   ServerId
 *   ServerBit
 *   SessionDetails,
 *   DoRollback
 * Output:
 *   ChangedBy
 *   ChangedTime
 *   Location
 *   BranchExecuted
 */
void
start_T4(Ndb * pNDB, ThreadData * td, int async) {

    DEBUG3("T4(%.*s, %.2d): - Starting", SUBSCRIBER_NUMBER_LENGTH,
           td->transactionData.number,
           td->transactionData.server_id);

    NdbConnection * pCON = 0;
    while((pCON = startTransaction(pNDB, td)) == 0) {
        CHECK_ALLOWED_ERROR("T4-1: startTransaction", td, pNDB->getNdbError());
        NdbSleep_MilliSleep(10);
    }

    if (td->ndbRecordSharedData)
    {
        char* rowPtr= (char*) &td->transactionData;
        const NdbRecord* record= td->ndbRecordSharedData->
                                 subscriberTableNdbRecord;
        Uint32 m=0;
        unsigned char* mask= (unsigned char*) &m;

        SET_MASK(mask, IND_SUBSCRIBER_LOCATION);
        SET_MASK(mask, IND_SUBSCRIBER_CHANGED_BY);
        SET_MASK(mask, IND_SUBSCRIBER_CHANGED_TIME);
        SET_MASK(mask, IND_SUBSCRIBER_GROUP);
        SET_MASK(mask, IND_SUBSCRIBER_SESSIONS);

        const NdbOperation* MyOp= pCON->readTuple(record, rowPtr, record, rowPtr,
                                  NdbOperation::LM_Read,
                                  mask);
        CHECK_NULL((void*)MyOp, "T4-1: readTuple", td,
                   pCON->getNdbError());

        m= 0;

        /* Create program to add something to the subscriber
         * sessions column
         */
        Uint32 codeBuf[20];

        for (Uint32 p=0; p<20; p++)
            codeBuf[p]= 0;

        NdbInterpretedCode program(pNDB->getDictionary()->
                                   getTable(SUBSCRIBER_TABLE),
                                   codeBuf,
                                   20);

        if (program.add_val(IND_SUBSCRIBER_SESSIONS,
                            (uint32)td->transactionData.server_bit) ||
                program.interpret_exit_ok() ||
                program.finalise())
        {
            CHECK_NULL(NULL , "T4-1: Program create failed", td,
                       program.getNdbError());
        }

        NdbOperation::OperationOptions opts;
        opts.optionsPresent= NdbOperation::OperationOptions::OO_INTERPRETED;
        opts.interpretedCode= &program;

        MyOp= pCON->updateTuple(record, rowPtr, record, rowPtr,
                                mask,
                                &opts,
                                sizeof(opts));
        CHECK_NULL((void*)MyOp, "T4-1: updateTuple", td,
                   pCON->getNdbError());

    }
    else
    {
        /* Use old Api */
        if (td->useCombinedUpdate)
        {
            NdbOperation *MyOp= pCON->getNdbOperation(SUBSCRIBER_TABLE);
            CHECK_NULL(MyOp, "T4-1: getNdbOperation", td,
                       pCON->getNdbError());

            MyOp->interpretedUpdateTuple();
            MyOp->equal(IND_SUBSCRIBER_NUMBER,
                        td->transactionData.number);
            MyOp->getValue(IND_SUBSCRIBER_LOCATION,
                           (char *)&td->transactionData.location);
            MyOp->getValue(IND_SUBSCRIBER_CHANGED_BY,
                           td->transactionData.changed_by);
            MyOp->getValue(IND_SUBSCRIBER_CHANGED_TIME,
                           td->transactionData.changed_time);
            MyOp->getValue(IND_SUBSCRIBER_GROUP,
                           (char *)&td->transactionData.group_id);
            MyOp->getValue(IND_SUBSCRIBER_SESSIONS,
                           (char *)&td->transactionData.sessions);
            MyOp->incValue(IND_SUBSCRIBER_SESSIONS,
                           (uint32)td->transactionData.server_bit);
        }
        else
        {
            /* Separate read op + update op
             * Relies on relative ordering of operation execution on a single
             * row
             */
            NdbOperation *MyOp= pCON->getNdbOperation(SUBSCRIBER_TABLE);
            CHECK_NULL(MyOp, "T4-1: getNdbOperation (read)", td,
                       pCON->getNdbError());
            MyOp->readTuple();
            MyOp->equal(IND_SUBSCRIBER_NUMBER,
                        td->transactionData.number);
            MyOp->getValue(IND_SUBSCRIBER_LOCATION,
                           (char *)&td->transactionData.location);
            MyOp->getValue(IND_SUBSCRIBER_CHANGED_BY,
                           td->transactionData.changed_by);
            MyOp->getValue(IND_SUBSCRIBER_CHANGED_TIME,
                           td->transactionData.changed_time);
            MyOp->getValue(IND_SUBSCRIBER_GROUP,
                           (char *)&td->transactionData.group_id);
            MyOp->getValue(IND_SUBSCRIBER_SESSIONS,
                           (char *)&td->transactionData.sessions);
            MyOp= pCON->getNdbOperation(SUBSCRIBER_TABLE);
            CHECK_NULL(MyOp, "T4-1: getNdbOperation (update)", td,
                       pCON->getNdbError());
            MyOp->interpretedUpdateTuple();
            MyOp->equal(IND_SUBSCRIBER_NUMBER,
                        td->transactionData.number);
            MyOp->incValue(IND_SUBSCRIBER_SESSIONS,
                           (uint32)td->transactionData.server_bit);
        }
    }
    stat_async = async;
    if (async == 1) {
        pCON->executeAsynchPrepare( NoCommit , T4_Callback_1, td);
    } else {
        int result = pCON->execute( NoCommit );
        T4_Callback_1(result, pCON, (void*)td);
        return;
    }//if
}