ndb_user_transaction5.cpp

来自「MySQL数据库开发源码 值得一看哦」· C++ 代码 · 共 770 行 · 第 1/2 页

CPP
770
字号
intT4(void * obj,   const SubscriberNumber   inNumber,   const SubscriberSuffix   inSuffix,   const ServerId           inServerId,   const ServerBit          inServerBit,   const SessionDetails     inSessionDetails,   ChangedBy          outChangedBy,   ChangedTime        outChangedTime,   Location         * outLocation,   DoRollback         inDoRollback,   BranchExecuted   * outBranchExecuted,   BenchmarkTime    * outTransactionTime){  Ndb * pNDB = (Ndb *) obj;    GroupId        groupId;  ActiveSessions sessions;  Permission     permission;  BenchmarkTime start;  get_time(&start);  int check;  NdbRecAttr * check2;  NdbConnection * MyTransaction = pNDB->startTransaction();  if (MyTransaction == NULL)	      error_handler("T4-1: startTranscation", pNDB->getNdbErrorString(), 0);  NdbOperation *MyOperation= MyTransaction->getNdbOperation(SUBSCRIBER_TABLE);  CHECK_NULL(MyOperation, "T4-1: getNdbOperation", 	     MyTransaction);    check = MyOperation->interpretedUpdateTuple();  CHECK_MINUS_ONE(check, "T4-1: readTuple", 		  MyTransaction);    check = MyOperation->equal(IND_SUBSCRIBER_NUMBER, 			     inNumber);  CHECK_MINUS_ONE(check, "T4-1: equal subscriber",		  MyTransaction);  check2 = MyOperation->getValue(IND_SUBSCRIBER_LOCATION, 				 (char *)outLocation);  CHECK_NULL(check2, "T4-1: getValue location", 	     MyTransaction);  check2 = MyOperation->getValue(IND_SUBSCRIBER_CHANGED_BY, 				 outChangedBy);  CHECK_NULL(check2, "T4-1: getValue changed_by", 	     MyTransaction);  check2 = MyOperation->getValue(IND_SUBSCRIBER_CHANGED_TIME,                                  outChangedTime);  CHECK_NULL(check2, "T4-1: getValue changed_time",	     MyTransaction);  check2 = MyOperation->getValue(IND_SUBSCRIBER_GROUP,				 (char *)&groupId);  CHECK_NULL(check2, "T4-1: getValue group", 	     MyTransaction);  check2 = MyOperation->getValue(IND_SUBSCRIBER_SESSIONS,				 (char *)&sessions);  CHECK_NULL(check2, "T4-1: getValue sessions", 	     MyTransaction);    check = MyOperation->incValue(IND_SUBSCRIBER_SESSIONS, 				(uint32)inServerBit);  CHECK_MINUS_ONE(check, "T4-4: inc value",		  MyTransaction);    check = MyTransaction->execute( NoCommit );   CHECK_MINUS_ONE(check, "T4-1: NoCommit", 		  MyTransaction);    /* Operation 2 */  MyOperation = MyTransaction->getNdbOperation(GROUP_TABLE);  CHECK_NULL(MyOperation, "T4-2: getNdbOperation", 	     MyTransaction);    check = MyOperation->readTuple();  CHECK_MINUS_ONE(check, "T4-2: readTuple", 		  MyTransaction);    check = MyOperation->equal(IND_GROUP_ID,		     (char*)&groupId);  CHECK_MINUS_ONE(check, "T4-2: equal group",		  MyTransaction);    check2 = MyOperation->getValue(IND_GROUP_ALLOW_INSERT, 				 (char *)&permission);  CHECK_NULL(check2, "T4-2: getValue allow_insert", 	     MyTransaction);  check = MyTransaction->execute( NoCommit );   CHECK_MINUS_ONE(check, "T4-2: NoCommit", 		  MyTransaction);    DEBUG3("T4(%.*s, %.2d): ", SUBSCRIBER_NUMBER_LENGTH, inNumber, inServerId);  if(((permission & inServerBit) == inServerBit) &&     ((sessions   & inServerBit) == 0)){      DEBUG("inserting - ");      /* Operation 3 */        MyOperation = MyTransaction->getNdbOperation(SESSION_TABLE);    CHECK_NULL(MyOperation, "T4-3: getNdbOperation", 	       MyTransaction);        check = MyOperation->insertTuple();    CHECK_MINUS_ONE(check, "T4-3: insertTuple", 		    MyTransaction);        check = MyOperation->equal(IND_SESSION_SUBSCRIBER,			       (char*)inNumber);    CHECK_MINUS_ONE(check, "T4-3: equal number",		    MyTransaction);    check = MyOperation->equal(IND_SESSION_SERVER,			       (char*)&inServerId);    CHECK_MINUS_ONE(check, "T4-3: equal server id",		    MyTransaction);        check = MyOperation->setValue(SESSION_DATA, 				   (char *)inSessionDetails);    CHECK_MINUS_ONE(check, "T4-3: setValue session details", 	       MyTransaction);        /* Operation 4 */    /* Operation 5 */    MyOperation = MyTransaction->getNdbOperation(SERVER_TABLE);    CHECK_NULL(MyOperation, "T4-5: getNdbOperation", 	       MyTransaction);        check = MyOperation->interpretedUpdateTuple();    CHECK_MINUS_ONE(check, "T4-5: interpretedUpdateTuple", 		    MyTransaction);        check = MyOperation->equal(IND_SERVER_ID,			       (char*)&inServerId);    CHECK_MINUS_ONE(check, "T4-5: equal serverId",		    MyTransaction);    check = MyOperation->equal(IND_SERVER_SUBSCRIBER_SUFFIX,			       (char*)inSuffix);    CHECK_MINUS_ONE(check, "T4-5: equal suffix",		    MyTransaction);    check = MyOperation->incValue(IND_SERVER_INSERTS, (uint32)1);    CHECK_MINUS_ONE(check, "T4-5: inc value",		    MyTransaction);            (* outBranchExecuted) = 1;  } else {    DEBUG1("%s", ((permission & inServerBit) ? "permission - " : "no permission - "));    DEBUG1("%s", ((sessions   & inServerBit) ? "in session - " : "no in session - "));    (* outBranchExecuted) = 0;  }  if(!inDoRollback && (* outBranchExecuted)){    DEBUG("commit\n");    check = MyTransaction->execute( Commit );     CHECK_MINUS_ONE(check, "T4: Commit", 		    MyTransaction);  } else {    DEBUG("rollback\n");    check = MyTransaction->execute(Rollback);    CHECK_MINUS_ONE(check, "T4:Rollback", 		    MyTransaction);      }    pNDB->closeTransaction(MyTransaction);    get_time(outTransactionTime);  time_diff(outTransactionTime, &start);  return 0;}/** * Transaction 5 - T5 *  * Delete session * * Input: *   SubscriberNumber *   ServerId *   ServerBit *   DoRollback * Output: *   ChangedBy *   ChangedTime *   Location *   BranchExecuted */intT5(void * obj,   const SubscriberNumber   inNumber,   const SubscriberSuffix   inSuffix,   const ServerId           inServerId,   const ServerBit          inServerBit,   ChangedBy          outChangedBy,   ChangedTime        outChangedTime,   Location         * outLocation,   DoRollback         inDoRollback,   BranchExecuted   * outBranchExecuted,   BenchmarkTime    * outTransactionTime){    Ndb           * pNDB = (Ndb *) obj;    NdbConnection * MyTransaction = 0;  NdbOperation  * MyOperation = 0;  GroupId        groupId;  ActiveSessions sessions;  Permission     permission;  BenchmarkTime start;  get_time(&start);  int check;  NdbRecAttr * check2;  MyTransaction = pNDB->startTransaction();  if (MyTransaction == NULL)	      error_handler("T5-1: startTranscation", pNDB->getNdbErrorString(), 0);    MyOperation= MyTransaction->getNdbOperation(SUBSCRIBER_TABLE);  CHECK_NULL(MyOperation, "T5-1: getNdbOperation", 	     MyTransaction);    check = MyOperation->interpretedUpdateTuple();  CHECK_MINUS_ONE(check, "T5-1: readTuple", 		  MyTransaction);    check = MyOperation->equal(IND_SUBSCRIBER_NUMBER, 			     inNumber);  CHECK_MINUS_ONE(check, "T5-1: equal subscriber",		  MyTransaction);  check2 = MyOperation->getValue(IND_SUBSCRIBER_LOCATION, 				 (char *)outLocation);  CHECK_NULL(check2, "T5-1: getValue location", 	     MyTransaction);  check2 = MyOperation->getValue(IND_SUBSCRIBER_CHANGED_BY, 				 outChangedBy);  CHECK_NULL(check2, "T5-1: getValue changed_by", 	     MyTransaction);  check2 = MyOperation->getValue(IND_SUBSCRIBER_CHANGED_TIME,                                  outChangedTime);  CHECK_NULL(check2, "T5-1: getValue changed_time",	     MyTransaction);  check2 = MyOperation->getValue(IND_SUBSCRIBER_GROUP,				 (char *)&groupId);  CHECK_NULL(check2, "T5-1: getValue group", 	     MyTransaction);  check2 = MyOperation->getValue(IND_SUBSCRIBER_SESSIONS,				 (char *)&sessions);  CHECK_NULL(check2, "T5-1: getValue sessions", 	     MyTransaction);    check = MyOperation->subValue(IND_SUBSCRIBER_SESSIONS, 				(uint32)inServerBit);  CHECK_MINUS_ONE(check, "T5-4: dec value",		  MyTransaction);  check = MyTransaction->execute( NoCommit );   CHECK_MINUS_ONE(check, "T5-1: NoCommit", 		  MyTransaction);      /* Operation 2 */  MyOperation = MyTransaction->getNdbOperation(GROUP_TABLE);  CHECK_NULL(MyOperation, "T5-2: getNdbOperation", 	     MyTransaction);      check = MyOperation->readTuple();  CHECK_MINUS_ONE(check, "T5-2: readTuple", 		  MyTransaction);    check = MyOperation->equal(IND_GROUP_ID,		     (char*)&groupId);  CHECK_MINUS_ONE(check, "T5-2: equal group",		  MyTransaction);    check2 = MyOperation->getValue(IND_GROUP_ALLOW_DELETE, 				 (char *)&permission);  CHECK_NULL(check2, "T5-2: getValue allow_delete", 	     MyTransaction);    check = MyTransaction->execute( NoCommit );   CHECK_MINUS_ONE(check, "T5-2: NoCommit", 		  MyTransaction);    DEBUG3("T5(%.*s, %.2d): ", SUBSCRIBER_NUMBER_LENGTH, inNumber, inServerId);  if(((permission & inServerBit) == inServerBit) &&     ((sessions   & inServerBit) == inServerBit)){      DEBUG("deleting - ");      /* Operation 3 */    MyOperation = MyTransaction->getNdbOperation(SESSION_TABLE);    CHECK_NULL(MyOperation, "T5-3: getNdbOperation", 	       MyTransaction);        check = MyOperation->deleteTuple();    CHECK_MINUS_ONE(check, "T5-3: deleteTuple", 		    MyTransaction);        check = MyOperation->equal(IND_SESSION_SUBSCRIBER,			       (char*)inNumber);    CHECK_MINUS_ONE(check, "T5-3: equal number",		    MyTransaction);    check = MyOperation->equal(IND_SESSION_SERVER,			       (char*)&inServerId);    CHECK_MINUS_ONE(check, "T5-3: equal server id",		    MyTransaction);        /* Operation 4 */            /* Operation 5 */    MyOperation = MyTransaction->getNdbOperation(SERVER_TABLE);    CHECK_NULL(MyOperation, "T5-5: getNdbOperation", 	       MyTransaction);            check = MyOperation->interpretedUpdateTuple();    CHECK_MINUS_ONE(check, "T5-5: interpretedUpdateTuple", 		    MyTransaction);        check = MyOperation->equal(IND_SERVER_ID,			       (char*)&inServerId);    CHECK_MINUS_ONE(check, "T5-5: equal serverId",		    MyTransaction);    check = MyOperation->equal(IND_SERVER_SUBSCRIBER_SUFFIX,			       (char*)inSuffix);    CHECK_MINUS_ONE(check, "T5-5: equal suffix",		    MyTransaction);    check = MyOperation->incValue(IND_SERVER_DELETES, (uint32)1);    CHECK_MINUS_ONE(check, "T5-5: inc value",		    MyTransaction);    (* outBranchExecuted) = 1;  } else {    DEBUG1("%s", ((permission & inServerBit) ? "permission - " : "no permission - "));    DEBUG1("%s", ((sessions   & inServerBit) ? "in session - " : "no in session - "));    (* outBranchExecuted) = 0;  }  if(!inDoRollback && (* outBranchExecuted)){    DEBUG("commit\n");    check = MyTransaction->execute( Commit );     CHECK_MINUS_ONE(check, "T5: Commit", 		    MyTransaction);  } else {    DEBUG("rollback\n");    check = MyTransaction->execute(Rollback);    CHECK_MINUS_ONE(check, "T5:Rollback", 		    MyTransaction);      }    pNDB->closeTransaction(MyTransaction);    get_time(outTransactionTime);  time_diff(outTransactionTime, &start);  return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?