ndb_user_transaction2.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:22k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. //#define DEBUG_ON
  14. extern "C" {
  15. #include "user_transaction.h"
  16. };
  17. #include "macros.h"
  18. #include "ndb_schema.hpp"
  19. #include "ndb_error.hpp"
  20. #include <time.h>
  21. #include <NdbApi.hpp>
  22. /**
  23.  * Transaction 1 - T1 
  24.  *
  25.  * Update location and changed by/time on a subscriber
  26.  *
  27.  * Input: 
  28.  *   SubscriberNumber,
  29.  *   Location,
  30.  *   ChangedBy,
  31.  *   ChangedTime
  32.  *
  33.  * Output:
  34.  */
  35. int
  36. T1(void * obj,
  37.    const SubscriberNumber number, 
  38.    const Location new_location, 
  39.    const ChangedBy changed_by, 
  40.    const ChangedTime changed_time,
  41.    BenchmarkTime * transaction_time){
  42.   Ndb * pNDB = (Ndb *) obj;
  43.   BenchmarkTime start;
  44.   get_time(&start);
  45.   int check;
  46.   NdbRecAttr * check2;
  47.   NdbConnection * MyTransaction = pNDB->startTransaction();
  48.   if (MyTransaction == NULL)   
  49.     error_handler("T1: startTranscation", pNDB->getNdbErrorString(), 0);
  50.   
  51.   NdbOperation *MyOperation = MyTransaction->getNdbOperation(SUBSCRIBER_TABLE);
  52.   CHECK_NULL(MyOperation, "T1: getNdbOperation", MyTransaction);
  53.   
  54.   check = MyOperation->updateTuple();
  55.   CHECK_MINUS_ONE(check, "T1: updateTuple", 
  56.   MyTransaction);
  57.   
  58.   check = MyOperation->equal(IND_SUBSCRIBER_NUMBER, 
  59.      number);
  60.   CHECK_MINUS_ONE(check, "T1: equal subscriber",
  61.   MyTransaction);
  62.   check = MyOperation->setValue(IND_SUBSCRIBER_LOCATION, 
  63. (char *)&new_location);
  64.   CHECK_MINUS_ONE(check, "T1: setValue location", 
  65.   MyTransaction);
  66.   check = MyOperation->setValue(IND_SUBSCRIBER_CHANGED_BY, 
  67. changed_by);
  68.   CHECK_MINUS_ONE(check, "T1: setValue changed_by", 
  69.   MyTransaction);
  70.   check = MyOperation->setValue(IND_SUBSCRIBER_CHANGED_TIME, 
  71. changed_time);
  72.   CHECK_MINUS_ONE(check, "T1: setValue changed_time", 
  73.   MyTransaction);
  74.   check = MyTransaction->execute( Commit ); 
  75.   CHECK_MINUS_ONE(check, "T1: Commit", 
  76.   MyTransaction);
  77.   
  78.   pNDB->closeTransaction(MyTransaction);
  79.   
  80.   get_time(transaction_time);
  81.   time_diff(transaction_time, &start);
  82.   return 0;
  83. }
  84. /**
  85.  * Transaction 2 - T2
  86.  *
  87.  * Read from Subscriber:
  88.  *
  89.  * Input: 
  90.  *   SubscriberNumber
  91.  *
  92.  * Output:
  93.  *   Location
  94.  *   Changed by
  95.  *   Changed Timestamp
  96.  *   Name
  97.  */
  98. int
  99. T2(void * obj,
  100.    const SubscriberNumber number, 
  101.    Location * readLocation, 
  102.    ChangedBy changed_by, 
  103.    ChangedTime changed_time,
  104.    SubscriberName subscriberName,
  105.    BenchmarkTime * transaction_time){
  106.   Ndb * pNDB = (Ndb *) obj;
  107.   BenchmarkTime start;
  108.   get_time(&start);
  109.   int check;
  110.   NdbRecAttr * check2;
  111.   NdbConnection * MyTransaction = pNDB->startTransaction();
  112.   if (MyTransaction == NULL)   
  113.     error_handler("T2: startTranscation", pNDB->getNdbErrorString(), 0);
  114.   
  115.   NdbOperation *MyOperation= MyTransaction->getNdbOperation(SUBSCRIBER_TABLE);
  116.   CHECK_NULL(MyOperation, "T2: getNdbOperation", 
  117.      MyTransaction);
  118.   
  119.   
  120.   check = MyOperation->readTuple();
  121.   CHECK_MINUS_ONE(check, "T2: readTuple", 
  122.   MyTransaction);
  123.   
  124.   check = MyOperation->equal(IND_SUBSCRIBER_NUMBER, 
  125.      number);
  126.   CHECK_MINUS_ONE(check, "T2: equal subscriber",
  127.   MyTransaction);
  128.   check2 = MyOperation->getValue(IND_SUBSCRIBER_LOCATION, 
  129. (char *)readLocation);
  130.   CHECK_NULL(check2, "T2: getValue location", 
  131.      MyTransaction);
  132.   check2 = MyOperation->getValue(IND_SUBSCRIBER_CHANGED_BY, 
  133.  changed_by);
  134.   CHECK_NULL(check2, "T2: getValue changed_by", 
  135.      MyTransaction);
  136.   check2 = MyOperation->getValue(IND_SUBSCRIBER_CHANGED_TIME, 
  137.                                  changed_time);
  138.   CHECK_NULL(check2, "T2: getValue changed_time",
  139.      MyTransaction);
  140.   check2 = MyOperation->getValue(IND_SUBSCRIBER_NAME, 
  141. subscriberName);
  142.   CHECK_NULL(check2, "T2: getValue name", 
  143.      MyTransaction);
  144.   check = MyTransaction->execute( Commit ); 
  145.   CHECK_MINUS_ONE(check, "T2: Commit", 
  146.   MyTransaction);
  147.   
  148.   pNDB->closeTransaction(MyTransaction);
  149.   
  150.   get_time(transaction_time);
  151.   time_diff(transaction_time, &start);
  152.   return 0;
  153. }
  154. /**
  155.  * Transaction 3 - T3
  156.  *
  157.  * Read session details
  158.  *
  159.  * Input:
  160.  *   SubscriberNumber
  161.  *   ServerId
  162.  *   ServerBit
  163.  *
  164.  * Output:
  165.  *   BranchExecuted
  166.  *   SessionDetails
  167.  *   ChangedBy
  168.  *   ChangedTime
  169.  *   Location
  170.  */
  171. int
  172. T3(void * obj,
  173.    const SubscriberNumber   inNumber,
  174.    const SubscriberSuffix   inSuffix,
  175.    const ServerId           inServerId,
  176.    const ServerBit          inServerBit,
  177.    SessionDetails     outSessionDetails,
  178.    ChangedBy          outChangedBy,
  179.    ChangedTime        outChangedTime,
  180.    Location         * outLocation,
  181.    BranchExecuted   * outBranchExecuted,
  182.    BenchmarkTime    * outTransactionTime){
  183.   
  184.   Ndb * pNDB = (Ndb *) obj;
  185.   GroupId        groupId;
  186.   ActiveSessions sessions;
  187.   Permission     permission;
  188.   BenchmarkTime start;
  189.   get_time(&start);
  190.   int check;
  191.   NdbRecAttr * check2;
  192.   NdbConnection * MyTransaction = pNDB->startTransaction();
  193.   if (MyTransaction == NULL)   
  194.     error_handler("T3-1: startTranscation", pNDB->getNdbErrorString(), 0);
  195.   
  196.   NdbOperation *MyOperation= MyTransaction->getNdbOperation(SUBSCRIBER_TABLE);
  197.   CHECK_NULL(MyOperation, "T3-1: getNdbOperation", 
  198.      MyTransaction);
  199.   
  200.   
  201.   check = MyOperation->readTuple();
  202.   CHECK_MINUS_ONE(check, "T3-1: readTuple", 
  203.   MyTransaction);
  204.   
  205.   check = MyOperation->equal(IND_SUBSCRIBER_NUMBER, 
  206.      inNumber);
  207.   CHECK_MINUS_ONE(check, "T3-1: equal subscriber",
  208.   MyTransaction);
  209.   check2 = MyOperation->getValue(IND_SUBSCRIBER_LOCATION, 
  210.  (char *)outLocation);
  211.   CHECK_NULL(check2, "T3-1: getValue location", 
  212.      MyTransaction);
  213.   check2 = MyOperation->getValue(IND_SUBSCRIBER_CHANGED_BY, 
  214.  outChangedBy);
  215.   CHECK_NULL(check2, "T3-1: getValue changed_by", 
  216.      MyTransaction);
  217.   check2 = MyOperation->getValue(IND_SUBSCRIBER_CHANGED_TIME, 
  218.                                  outChangedTime);
  219.   CHECK_NULL(check2, "T3-1: getValue changed_time",
  220.      MyTransaction);
  221.   check2 = MyOperation->getValue(IND_SUBSCRIBER_GROUP,
  222.  (char *)&groupId);
  223.   CHECK_NULL(check2, "T3-1: getValue group", 
  224.      MyTransaction);
  225.   check2 = MyOperation->getValue(IND_SUBSCRIBER_SESSIONS,
  226.  (char *)&sessions);
  227.   CHECK_NULL(check2, "T3-1: getValue sessions", 
  228.      MyTransaction);
  229.   
  230.   check = MyTransaction->execute( NoCommit ); 
  231.   CHECK_MINUS_ONE(check, "T3-1: NoCommit", 
  232.   MyTransaction);
  233.   
  234.     /* Operation 2 */
  235.   MyOperation = MyTransaction->getNdbOperation(GROUP_TABLE);
  236.   CHECK_NULL(MyOperation, "T3-2: getNdbOperation", 
  237.      MyTransaction);
  238.   
  239.   
  240.   check = MyOperation->readTuple();
  241.   CHECK_MINUS_ONE(check, "T3-2: readTuple", 
  242.   MyTransaction);
  243.   
  244.   check = MyOperation->equal(IND_GROUP_ID,
  245.      (char*)&groupId);
  246.   CHECK_MINUS_ONE(check, "T3-2: equal group",
  247.   MyTransaction);
  248.   
  249.   check2 = MyOperation->getValue(IND_GROUP_ALLOW_READ, 
  250.  (char *)&permission);
  251.   CHECK_NULL(check2, "T3-2: getValue allow_read", 
  252.      MyTransaction);
  253.   check = MyTransaction->execute( NoCommit ); 
  254.   CHECK_MINUS_ONE(check, "T3-2: NoCommit", 
  255.   MyTransaction);
  256.   
  257.   DEBUG3("T3(%.*s, %.2d): ", SUBSCRIBER_NUMBER_LENGTH, inNumber, inServerId);
  258.   if(((permission & inServerBit) == inServerBit) &&
  259.      ((sessions   & inServerBit) == inServerBit)){
  260.     
  261.     DEBUG("reading - ");
  262.     /* Operation 3 */
  263.     MyOperation = MyTransaction->getNdbOperation(SESSION_TABLE);
  264.     CHECK_NULL(MyOperation, "T3-3: getNdbOperation", 
  265.        MyTransaction);
  266.     
  267.     check = MyOperation->readTuple();
  268.     CHECK_MINUS_ONE(check, "T3-3: readTuple", 
  269.     MyTransaction);
  270.     
  271.     check = MyOperation->equal(IND_SESSION_SUBSCRIBER,
  272.        (char*)inNumber);
  273.     CHECK_MINUS_ONE(check, "T3-3: equal number",
  274.     MyTransaction);
  275.     check = MyOperation->equal(IND_SESSION_SERVER,
  276.        (char*)&inServerId);
  277.     CHECK_MINUS_ONE(check, "T3-3: equal server id",
  278.     MyTransaction);
  279.     
  280.     check2 = MyOperation->getValue(IND_SESSION_DATA, 
  281.    (char *)outSessionDetails);
  282.     CHECK_NULL(check2, "T3-3: getValue session details", 
  283.        MyTransaction);
  284.     
  285.     check = MyTransaction->execute( NoCommit ); 
  286.     CHECK_MINUS_ONE(check, "T3-3: NoCommit", 
  287.     MyTransaction);
  288.     /* Operation 4 */
  289.     MyOperation = MyTransaction->getNdbOperation(SERVER_TABLE);
  290.     CHECK_NULL(MyOperation, "T3-4: getNdbOperation", 
  291.        MyTransaction);
  292.     
  293.     check = MyOperation->interpretedUpdateTuple();
  294.     CHECK_MINUS_ONE(check, "T3-4: interpretedUpdateTuple", 
  295.     MyTransaction);
  296.     
  297.     check = MyOperation->equal(IND_SERVER_ID,
  298.        (char*)&inServerId);
  299.     CHECK_MINUS_ONE(check, "T3-4: equal serverId",
  300.     MyTransaction);
  301.     check = MyOperation->equal(IND_SERVER_SUBSCRIBER_SUFFIX,
  302.        (char*)inSuffix);
  303.     CHECK_MINUS_ONE(check, "T3-4: equal suffix",
  304.     MyTransaction);
  305.     check = MyOperation->incValue(IND_SERVER_READS, (uint32)1);
  306.     CHECK_MINUS_ONE(check, "T3-4: inc value",
  307.     MyTransaction);
  308.     
  309.     check = MyTransaction->execute( NoCommit ); 
  310.     CHECK_MINUS_ONE(check, "T3-4: NoCommit", 
  311.     MyTransaction);
  312.     (* outBranchExecuted) = 1;
  313.   } else {
  314.     (* outBranchExecuted) = 0;
  315.   }
  316.   DEBUG("commitn");
  317.   check = MyTransaction->execute( Commit ); 
  318.   CHECK_MINUS_ONE(check, "T3: Commit", 
  319.   MyTransaction);
  320.   
  321.   pNDB->closeTransaction(MyTransaction);
  322.   
  323.   get_time(outTransactionTime);
  324.   time_diff(outTransactionTime, &start);
  325.   return 0;
  326. }
  327. /**
  328.  * Transaction 4 - T4
  329.  * 
  330.  * Create session
  331.  *
  332.  * Input:
  333.  *   SubscriberNumber
  334.  *   ServerId
  335.  *   ServerBit
  336.  *   SessionDetails,
  337.  *   DoRollback
  338.  * Output:
  339.  *   ChangedBy
  340.  *   ChangedTime
  341.  *   Location
  342.  *   BranchExecuted
  343.  */
  344. int
  345. T4(void * obj,
  346.    const SubscriberNumber   inNumber,
  347.    const SubscriberSuffix   inSuffix,
  348.    const ServerId           inServerId,
  349.    const ServerBit          inServerBit,
  350.    const SessionDetails     inSessionDetails,
  351.    ChangedBy          outChangedBy,
  352.    ChangedTime        outChangedTime,
  353.    Location         * outLocation,
  354.    DoRollback         inDoRollback,
  355.    BranchExecuted   * outBranchExecuted,
  356.    BenchmarkTime    * outTransactionTime){
  357.   Ndb * pNDB = (Ndb *) obj;  
  358.   GroupId        groupId;
  359.   ActiveSessions sessions;
  360.   Permission     permission;
  361.   BenchmarkTime start;
  362.   get_time(&start);
  363.   int check;
  364.   NdbRecAttr * check2;
  365.   NdbConnection * MyTransaction = pNDB->startTransaction();
  366.   if (MyTransaction == NULL)   
  367.     error_handler("T4-1: startTranscation", pNDB->getNdbErrorString(), 0);
  368.   DEBUG3("T4(%.*s, %.2d): ", SUBSCRIBER_NUMBER_LENGTH, inNumber, inServerId);
  369.   NdbOperation * MyOperation = 0;
  370.   MyOperation= MyTransaction->getNdbOperation(SUBSCRIBER_TABLE);
  371.   CHECK_NULL(MyOperation, "T4-1: getNdbOperation", 
  372.      MyTransaction);
  373.   
  374.   check = MyOperation->readTupleExclusive();
  375.   CHECK_MINUS_ONE(check, "T4-1: readTuple", 
  376.   MyTransaction);
  377.   
  378.   check = MyOperation->equal(IND_SUBSCRIBER_NUMBER, 
  379.      inNumber);
  380.   CHECK_MINUS_ONE(check, "T4-1: equal subscriber",
  381.   MyTransaction);
  382.   check2 = MyOperation->getValue(IND_SUBSCRIBER_LOCATION, 
  383.  (char *)outLocation);
  384.   CHECK_NULL(check2, "T4-1: getValue location", 
  385.      MyTransaction);
  386.   check2 = MyOperation->getValue(IND_SUBSCRIBER_CHANGED_BY, 
  387.  outChangedBy);
  388.   CHECK_NULL(check2, "T4-1: getValue changed_by", 
  389.      MyTransaction);
  390.   check2 = MyOperation->getValue(IND_SUBSCRIBER_CHANGED_TIME, 
  391.                                  outChangedTime);
  392.   CHECK_NULL(check2, "T4-1: getValue changed_time",
  393.      MyTransaction);
  394.   check2 = MyOperation->getValue(IND_SUBSCRIBER_GROUP,
  395.  (char *)&groupId);
  396.   CHECK_NULL(check2, "T4-1: getValue group", 
  397.      MyTransaction);
  398.   check2 = MyOperation->getValue(IND_SUBSCRIBER_SESSIONS,
  399.  (char *)&sessions);
  400.   CHECK_NULL(check2, "T4-1: getValue sessions", 
  401.      MyTransaction);
  402.   
  403.   check = MyTransaction->execute( NoCommit ); 
  404.   CHECK_MINUS_ONE(check, "T4-1: NoCommit", 
  405.   MyTransaction);
  406.     /* Operation 2 */
  407.   MyOperation = MyTransaction->getNdbOperation(GROUP_TABLE);
  408.   CHECK_NULL(MyOperation, "T4-2: getNdbOperation", 
  409.      MyTransaction);
  410.   
  411.   check = MyOperation->readTuple();
  412.   CHECK_MINUS_ONE(check, "T4-2: readTuple", 
  413.   MyTransaction);
  414.   
  415.   check = MyOperation->equal(IND_GROUP_ID,
  416.      (char*)&groupId);
  417.   CHECK_MINUS_ONE(check, "T4-2: equal group",
  418.   MyTransaction);
  419.   
  420.   check2 = MyOperation->getValue(IND_GROUP_ALLOW_INSERT, 
  421.  (char *)&permission);
  422.   CHECK_NULL(check2, "T4-2: getValue allow_insert", 
  423.      MyTransaction);
  424.   check = MyTransaction->execute( NoCommit ); 
  425.   CHECK_MINUS_ONE(check, "T4-2: NoCommit", 
  426.   MyTransaction);
  427.   
  428.   if(((permission & inServerBit) == inServerBit) &&
  429.      ((sessions   & inServerBit) == 0)){
  430.     DEBUG("inserting - ");
  431.   
  432.     /* Operation 3 */
  433.     MyOperation = MyTransaction->getNdbOperation(SESSION_TABLE);
  434.     CHECK_NULL(MyOperation, "T4-3: getNdbOperation", 
  435.        MyTransaction);
  436.     
  437.     check = MyOperation->insertTuple();
  438.     CHECK_MINUS_ONE(check, "T4-3: insertTuple", 
  439.     MyTransaction);
  440.     
  441.     check = MyOperation->equal(IND_SESSION_SUBSCRIBER,
  442.        (char*)inNumber);
  443.     CHECK_MINUS_ONE(check, "T4-3: equal number",
  444.     MyTransaction);
  445.     check = MyOperation->equal(IND_SESSION_SERVER,
  446.        (char*)&inServerId);
  447.     CHECK_MINUS_ONE(check, "T4-3: equal server id",
  448.     MyTransaction);
  449.     
  450.     check = MyOperation->setValue(SESSION_DATA, 
  451.    (char *)inSessionDetails);
  452.     CHECK_MINUS_ONE(check, "T4-3: setValue session details", 
  453.        MyTransaction);
  454.     check = MyTransaction->execute( NoCommit ); 
  455.     CHECK_MINUS_ONE(check, "T4-3: NoCommit", 
  456.     MyTransaction);
  457.     /* Operation 4 */
  458.     MyOperation = MyTransaction->getNdbOperation(SUBSCRIBER_TABLE);
  459.     CHECK_NULL(MyOperation, "T4-4: getNdbOperation", 
  460.        MyTransaction);
  461.     
  462.     check = MyOperation->interpretedUpdateTuple();
  463.     CHECK_MINUS_ONE(check, "T4-4: interpretedUpdateTuple", 
  464.     MyTransaction);
  465.     
  466.     check = MyOperation->equal(IND_SUBSCRIBER_NUMBER,
  467.        (char*)inNumber);
  468.     CHECK_MINUS_ONE(check, "T4-4: equal number",
  469.     MyTransaction);
  470.     check = MyOperation->incValue(IND_SUBSCRIBER_SESSIONS, 
  471.   (uint32)inServerBit);
  472.     CHECK_MINUS_ONE(check, "T4-4: inc value",
  473.     MyTransaction);
  474.     check = MyTransaction->execute( NoCommit ); 
  475.     CHECK_MINUS_ONE(check, "T4-4: NoCommit", 
  476.     MyTransaction);
  477.     /* Operation 5 */
  478.     MyOperation = MyTransaction->getNdbOperation(SERVER_TABLE);
  479.     CHECK_NULL(MyOperation, "T4-5: getNdbOperation", 
  480.        MyTransaction);
  481.     
  482.     check = MyOperation->interpretedUpdateTuple();
  483.     CHECK_MINUS_ONE(check, "T4-5: interpretedUpdateTuple", 
  484.     MyTransaction);
  485.     
  486.     check = MyOperation->equal(IND_SERVER_ID,
  487.        (char*)&inServerId);
  488.     CHECK_MINUS_ONE(check, "T4-5: equal serverId",
  489.     MyTransaction);
  490.     check = MyOperation->equal(IND_SERVER_SUBSCRIBER_SUFFIX,
  491.        (char*)inSuffix);
  492.     CHECK_MINUS_ONE(check, "T4-5: equal suffix",
  493.     MyTransaction);
  494.     check = MyOperation->incValue(IND_SERVER_INSERTS, (uint32)1);
  495.     CHECK_MINUS_ONE(check, "T4-5: inc value",
  496.     MyTransaction);
  497.         
  498.     check = MyTransaction->execute( NoCommit ); 
  499.     CHECK_MINUS_ONE(check, "T4-5: NoCommit", 
  500.     MyTransaction);
  501.     (* outBranchExecuted) = 1;
  502.   } else {
  503.     DEBUG1("%s", ((permission & inServerBit) ? "permission - " : "no permission - "));
  504.     DEBUG1("%s", ((sessions   & inServerBit) ? "in session - " : "no in session - "));
  505.     (* outBranchExecuted) = 0;
  506.   }
  507.   if(!inDoRollback){
  508.     DEBUG("commitn");
  509.     check = MyTransaction->execute( Commit ); 
  510.     CHECK_MINUS_ONE(check, "T4: Commit", 
  511.     MyTransaction);
  512.   } else {
  513.     DEBUG("rollbackn");
  514.     check = MyTransaction->execute(Rollback);
  515.     CHECK_MINUS_ONE(check, "T4:Rollback", 
  516.     MyTransaction);
  517.     
  518.   }
  519.   
  520.   pNDB->closeTransaction(MyTransaction);
  521.   
  522.   get_time(outTransactionTime);
  523.   time_diff(outTransactionTime, &start);
  524.   return 0;
  525. }
  526. /**
  527.  * Transaction 5 - T5
  528.  * 
  529.  * Delete session
  530.  *
  531.  * Input:
  532.  *   SubscriberNumber
  533.  *   ServerId
  534.  *   ServerBit
  535.  *   DoRollback
  536.  * Output:
  537.  *   ChangedBy
  538.  *   ChangedTime
  539.  *   Location
  540.  *   BranchExecuted
  541.  */
  542. int
  543. T5(void * obj,
  544.    const SubscriberNumber   inNumber,
  545.    const SubscriberSuffix   inSuffix,
  546.    const ServerId           inServerId,
  547.    const ServerBit          inServerBit,
  548.    ChangedBy          outChangedBy,
  549.    ChangedTime        outChangedTime,
  550.    Location         * outLocation,
  551.    DoRollback         inDoRollback,
  552.    BranchExecuted   * outBranchExecuted,
  553.    BenchmarkTime    * outTransactionTime){
  554.   
  555.   Ndb           * pNDB = (Ndb *) obj;  
  556.   NdbConnection * MyTransaction = 0;
  557.   NdbOperation  * MyOperation = 0;
  558.   GroupId        groupId;
  559.   ActiveSessions sessions;
  560.   Permission     permission;
  561.   BenchmarkTime start;
  562.   get_time(&start);
  563.   int check;
  564.   NdbRecAttr * check2;
  565.   MyTransaction = pNDB->startTransaction();
  566.   if (MyTransaction == NULL)   
  567.     error_handler("T5-1: startTranscation", pNDB->getNdbErrorString(), 0);
  568.   MyOperation= MyTransaction->getNdbOperation(SUBSCRIBER_TABLE);
  569.   CHECK_NULL(MyOperation, "T5-1: getNdbOperation", 
  570.      MyTransaction);
  571.   
  572.   
  573.   check = MyOperation->readTupleExclusive();
  574.   CHECK_MINUS_ONE(check, "T5-1: readTuple", 
  575.   MyTransaction);
  576.   
  577.   check = MyOperation->equal(IND_SUBSCRIBER_NUMBER, 
  578.      inNumber);
  579.   CHECK_MINUS_ONE(check, "T5-1: equal subscriber",
  580.   MyTransaction);
  581.   check2 = MyOperation->getValue(IND_SUBSCRIBER_LOCATION, 
  582.  (char *)outLocation);
  583.   CHECK_NULL(check2, "T5-1: getValue location", 
  584.      MyTransaction);
  585.   check2 = MyOperation->getValue(IND_SUBSCRIBER_CHANGED_BY, 
  586.  outChangedBy);
  587.   CHECK_NULL(check2, "T5-1: getValue changed_by", 
  588.      MyTransaction);
  589.   check2 = MyOperation->getValue(IND_SUBSCRIBER_CHANGED_TIME, 
  590.                                  outChangedTime);
  591.   CHECK_NULL(check2, "T5-1: getValue changed_time",
  592.      MyTransaction);
  593.   check2 = MyOperation->getValue(IND_SUBSCRIBER_GROUP,
  594.  (char *)&groupId);
  595.   CHECK_NULL(check2, "T5-1: getValue group", 
  596.      MyTransaction);
  597.   check2 = MyOperation->getValue(IND_SUBSCRIBER_SESSIONS,
  598.  (char *)&sessions);
  599.   CHECK_NULL(check2, "T5-1: getValue sessions", 
  600.      MyTransaction);
  601.   
  602.   check = MyTransaction->execute( NoCommit ); 
  603.   CHECK_MINUS_ONE(check, "T5-1: NoCommit", 
  604.   MyTransaction);
  605.   
  606.     /* Operation 2 */
  607.   MyOperation = MyTransaction->getNdbOperation(GROUP_TABLE);
  608.   CHECK_NULL(MyOperation, "T5-2: getNdbOperation", 
  609.      MyTransaction);
  610.   
  611.   
  612.   check = MyOperation->readTuple();
  613.   CHECK_MINUS_ONE(check, "T5-2: readTuple", 
  614.   MyTransaction);
  615.   
  616.   check = MyOperation->equal(IND_GROUP_ID,
  617.      (char*)&groupId);
  618.   CHECK_MINUS_ONE(check, "T5-2: equal group",
  619.   MyTransaction);
  620.   
  621.   check2 = MyOperation->getValue(IND_GROUP_ALLOW_DELETE, 
  622.  (char *)&permission);
  623.   CHECK_NULL(check2, "T5-2: getValue allow_delete", 
  624.      MyTransaction);
  625.   
  626.   check = MyTransaction->execute( NoCommit ); 
  627.   CHECK_MINUS_ONE(check, "T5-2: NoCommit", 
  628.   MyTransaction);
  629.   
  630.   DEBUG3("T5(%.*s, %.2d): ", SUBSCRIBER_NUMBER_LENGTH, inNumber, inServerId);
  631.   if(((permission & inServerBit) == inServerBit) &&
  632.      ((sessions   & inServerBit) == inServerBit)){
  633.   
  634.     DEBUG("deleting - ");
  635.   
  636.     /* Operation 3 */
  637.     MyOperation = MyTransaction->getNdbOperation(SESSION_TABLE);
  638.     CHECK_NULL(MyOperation, "T5-3: getNdbOperation", 
  639.        MyTransaction);
  640.     
  641.     check = MyOperation->deleteTuple();
  642.     CHECK_MINUS_ONE(check, "T5-3: deleteTuple", 
  643.     MyTransaction);
  644.     
  645.     check = MyOperation->equal(IND_SESSION_SUBSCRIBER,
  646.        (char*)inNumber);
  647.     CHECK_MINUS_ONE(check, "T5-3: equal number",
  648.     MyTransaction);
  649.     check = MyOperation->equal(IND_SESSION_SERVER,
  650.        (char*)&inServerId);
  651.     CHECK_MINUS_ONE(check, "T5-3: equal server id",
  652.     MyTransaction);
  653.     
  654.     check = MyTransaction->execute( NoCommit ); 
  655.     CHECK_MINUS_ONE(check, "T5-3: NoCommit", 
  656.     MyTransaction);
  657.     /* Operation 4 */
  658.     MyOperation = MyTransaction->getNdbOperation(SUBSCRIBER_TABLE);
  659.     CHECK_NULL(MyOperation, "T5-4: getNdbOperation", 
  660.        MyTransaction);
  661.     
  662.     check = MyOperation->interpretedUpdateTuple();
  663.     CHECK_MINUS_ONE(check, "T5-4: interpretedUpdateTuple", 
  664.     MyTransaction);
  665.     
  666.     check = MyOperation->equal(IND_SUBSCRIBER_NUMBER,
  667.        (char*)inNumber);
  668.     CHECK_MINUS_ONE(check, "T5-4: equal number",
  669.     MyTransaction);
  670.     check = MyOperation->subValue(IND_SUBSCRIBER_SESSIONS, 
  671.   (uint32)inServerBit);
  672.     CHECK_MINUS_ONE(check, "T5-4: dec value",
  673.     MyTransaction);
  674.         
  675.     check = MyTransaction->execute( NoCommit ); 
  676.     CHECK_MINUS_ONE(check, "T5-4: NoCommit", 
  677.     MyTransaction);
  678.     /* Operation 5 */
  679.     MyOperation = MyTransaction->getNdbOperation(SERVER_TABLE);
  680.     CHECK_NULL(MyOperation, "T5-5: getNdbOperation", 
  681.        MyTransaction);
  682.     
  683.     
  684.     check = MyOperation->interpretedUpdateTuple();
  685.     CHECK_MINUS_ONE(check, "T5-5: interpretedUpdateTuple", 
  686.     MyTransaction);
  687.     
  688.     check = MyOperation->equal(IND_SERVER_ID,
  689.        (char*)&inServerId);
  690.     CHECK_MINUS_ONE(check, "T5-5: equal serverId",
  691.     MyTransaction);
  692.     check = MyOperation->equal(IND_SERVER_SUBSCRIBER_SUFFIX,
  693.        (char*)inSuffix);
  694.     CHECK_MINUS_ONE(check, "T5-5: equal suffix",
  695.     MyTransaction);
  696.     check = MyOperation->incValue(IND_SERVER_DELETES, (uint32)1);
  697.     CHECK_MINUS_ONE(check, "T5-5: inc value",
  698.     MyTransaction);
  699.     check = MyTransaction->execute( NoCommit ); 
  700.     CHECK_MINUS_ONE(check, "T5-5: NoCommit", 
  701.     MyTransaction);
  702.     (* outBranchExecuted) = 1;
  703.   } else {
  704.     DEBUG1("%s", ((permission & inServerBit) ? "permission - " : "no permission - "));
  705.     DEBUG1("%s", ((sessions   & inServerBit) ? "in session - " : "no in session - "));
  706.     (* outBranchExecuted) = 0;
  707.   }
  708.   if(!inDoRollback){
  709.     DEBUG("commitn");
  710.     check = MyTransaction->execute( Commit ); 
  711.     CHECK_MINUS_ONE(check, "T5: Commit", 
  712.     MyTransaction);
  713.   } else {
  714.     DEBUG("rollbackn");
  715.     check = MyTransaction->execute(Rollback);
  716.     CHECK_MINUS_ONE(check, "T5:Rollback", 
  717.     MyTransaction);
  718.     
  719.   }
  720.   
  721.   pNDB->closeTransaction(MyTransaction);
  722.   
  723.   get_time(outTransactionTime);
  724.   time_diff(outTransactionTime, &start);
  725.   return 0;
  726. }