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

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.   DEBUG2("T1(%.*s):n", SUBSCRIBER_NUMBER_LENGTH, number);
  44.   BenchmarkTime start;
  45.   get_time(&start);
  46.   int check;
  47.   NdbRecAttr * check2;
  48.   NdbConnection * MyTransaction = pNDB->startTransaction();
  49.   if (MyTransaction == NULL)   
  50.     error_handler("T1-1: startTranscation", pNDB->getNdbErrorString(), 0);
  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.   DEBUG2("T2(%.*s):n", SUBSCRIBER_NUMBER_LENGTH, number);
  108.   BenchmarkTime start;
  109.   get_time(&start);
  110.   int check;
  111.   NdbRecAttr * check2;
  112.   NdbConnection * MyTransaction = pNDB->startTransaction();
  113.   if (MyTransaction == NULL)   
  114.     error_handler("T2-1: startTranscation", pNDB->getNdbErrorString(), 0);
  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.   DEBUG3("T3(%.*s, %.2d): ", SUBSCRIBER_NUMBER_LENGTH, inNumber, inServerId);
  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.   NdbOperation *MyOperation= MyTransaction->getNdbOperation(SUBSCRIBER_TABLE);
  196.   CHECK_NULL(MyOperation, "T3-1: getNdbOperation", 
  197.      MyTransaction);
  198.     
  199.   check = MyOperation->readTuple();
  200.   CHECK_MINUS_ONE(check, "T3-1: readTuple", 
  201.   MyTransaction);
  202.   
  203.   check = MyOperation->equal(IND_SUBSCRIBER_NUMBER, 
  204.      inNumber);
  205.   CHECK_MINUS_ONE(check, "T3-1: equal subscriber",
  206.   MyTransaction);
  207.   check2 = MyOperation->getValue(IND_SUBSCRIBER_LOCATION, 
  208.  (char *)outLocation);
  209.   CHECK_NULL(check2, "T3-1: getValue location", 
  210.      MyTransaction);
  211.   check2 = MyOperation->getValue(IND_SUBSCRIBER_CHANGED_BY, 
  212.  outChangedBy);
  213.   CHECK_NULL(check2, "T3-1: getValue changed_by", 
  214.      MyTransaction);
  215.   check2 = MyOperation->getValue(IND_SUBSCRIBER_CHANGED_TIME, 
  216.                                  outChangedTime);
  217.   CHECK_NULL(check2, "T3-1: getValue changed_time",
  218.      MyTransaction);
  219.   check2 = MyOperation->getValue(IND_SUBSCRIBER_GROUP,
  220.  (char *)&groupId);
  221.   CHECK_NULL(check2, "T3-1: getValue group", 
  222.      MyTransaction);
  223.   check2 = MyOperation->getValue(IND_SUBSCRIBER_SESSIONS,
  224.  (char *)&sessions);
  225.   CHECK_NULL(check2, "T3-1: getValue sessions", 
  226.      MyTransaction);
  227.   
  228.   check = MyTransaction->execute( NoCommit ); 
  229.   CHECK_MINUS_ONE(check, "T3-1: NoCommit", 
  230.   MyTransaction);
  231.   
  232.     /* Operation 2 */
  233.   MyOperation = MyTransaction->getNdbOperation(GROUP_TABLE);
  234.   CHECK_NULL(MyOperation, "T3-2: getNdbOperation", 
  235.      MyTransaction);
  236.   
  237.   
  238.   check = MyOperation->readTuple();
  239.   CHECK_MINUS_ONE(check, "T3-2: readTuple", 
  240.   MyTransaction);
  241.   
  242.   check = MyOperation->equal(IND_GROUP_ID,
  243.      (char*)&groupId);
  244.   CHECK_MINUS_ONE(check, "T3-2: equal group",
  245.   MyTransaction);
  246.   
  247.   check2 = MyOperation->getValue(IND_GROUP_ALLOW_READ, 
  248.  (char *)&permission);
  249.   CHECK_NULL(check2, "T3-2: getValue allow_read", 
  250.      MyTransaction);
  251.   check = MyTransaction->execute( NoCommit ); 
  252.   CHECK_MINUS_ONE(check, "T3-2: NoCommit", 
  253.   MyTransaction);
  254.   
  255.   if(((permission & inServerBit) == inServerBit) &&
  256.      ((sessions   & inServerBit) == inServerBit)){
  257.     
  258.     DEBUG("reading - ");
  259.     /* Operation 3 */
  260.     MyOperation = MyTransaction->getNdbOperation(SESSION_TABLE);
  261.     CHECK_NULL(MyOperation, "T3-3: getNdbOperation", 
  262.        MyTransaction);
  263.     
  264.     check = MyOperation->readTuple();
  265.     CHECK_MINUS_ONE(check, "T3-3: readTuple", 
  266.     MyTransaction);
  267.     
  268.     check = MyOperation->equal(IND_SESSION_SUBSCRIBER,
  269.        (char*)inNumber);
  270.     CHECK_MINUS_ONE(check, "T3-3: equal number",
  271.     MyTransaction);
  272.     check = MyOperation->equal(IND_SESSION_SERVER,
  273.        (char*)&inServerId);
  274.     CHECK_MINUS_ONE(check, "T3-3: equal server id",
  275.     MyTransaction);
  276.     
  277.     check2 = MyOperation->getValue(IND_SESSION_DATA, 
  278.    (char *)outSessionDetails);
  279.     CHECK_NULL(check2, "T3-3: getValue session details", 
  280.        MyTransaction);
  281.     
  282.     /* Operation 4 */
  283.     MyOperation = MyTransaction->getNdbOperation(SERVER_TABLE);
  284.     CHECK_NULL(MyOperation, "T3-4: getNdbOperation", 
  285.        MyTransaction);
  286.     
  287.     check = MyOperation->interpretedUpdateTuple();
  288.     CHECK_MINUS_ONE(check, "T3-4: interpretedUpdateTuple", 
  289.     MyTransaction);
  290.     
  291.     check = MyOperation->equal(IND_SERVER_ID,
  292.        (char*)&inServerId);
  293.     CHECK_MINUS_ONE(check, "T3-4: equal serverId",
  294.     MyTransaction);
  295.     check = MyOperation->equal(IND_SERVER_SUBSCRIBER_SUFFIX,
  296.        (char*)inSuffix);
  297.     CHECK_MINUS_ONE(check, "T3-4: equal suffix",
  298.     MyTransaction);
  299.     check = MyOperation->incValue(IND_SERVER_READS, (uint32)1);
  300.     CHECK_MINUS_ONE(check, "T3-4: inc value",
  301.     MyTransaction);
  302.     (* outBranchExecuted) = 1;
  303.   } else {
  304.     (* outBranchExecuted) = 0;
  305.   }
  306.   DEBUG("commit...");
  307.   check = MyTransaction->execute( Commit ); 
  308.   CHECK_MINUS_ONE(check, "T3: Commit", 
  309.   MyTransaction);
  310.   
  311.   pNDB->closeTransaction(MyTransaction);
  312.   
  313.   DEBUG("donen");
  314.   get_time(outTransactionTime);
  315.   time_diff(outTransactionTime, &start);
  316.   return 0;
  317. }
  318. /**
  319.  * Transaction 4 - T4
  320.  * 
  321.  * Create session
  322.  *
  323.  * Input:
  324.  *   SubscriberNumber
  325.  *   ServerId
  326.  *   ServerBit
  327.  *   SessionDetails,
  328.  *   DoRollback
  329.  * Output:
  330.  *   ChangedBy
  331.  *   ChangedTime
  332.  *   Location
  333.  *   BranchExecuted
  334.  */
  335. int
  336. T4(void * obj,
  337.    const SubscriberNumber   inNumber,
  338.    const SubscriberSuffix   inSuffix,
  339.    const ServerId           inServerId,
  340.    const ServerBit          inServerBit,
  341.    const SessionDetails     inSessionDetails,
  342.    ChangedBy          outChangedBy,
  343.    ChangedTime        outChangedTime,
  344.    Location         * outLocation,
  345.    DoRollback         inDoRollback,
  346.    BranchExecuted   * outBranchExecuted,
  347.    BenchmarkTime    * outTransactionTime){
  348.   DEBUG3("T4(%.*s, %.2d): ", SUBSCRIBER_NUMBER_LENGTH, inNumber, inServerId);
  349.   Ndb * pNDB = (Ndb *) obj;  
  350.   GroupId        groupId;
  351.   ActiveSessions sessions;
  352.   Permission     permission;
  353.   BenchmarkTime start;
  354.   get_time(&start);
  355.   int check;
  356.   NdbRecAttr * check2;
  357.   NdbConnection * MyTransaction = pNDB->startTransaction();
  358.   if (MyTransaction == NULL)   
  359.     error_handler("T4-1: startTranscation", pNDB->getNdbErrorString(), 0);
  360.   NdbOperation *MyOperation= MyTransaction->getNdbOperation(SUBSCRIBER_TABLE);
  361.   CHECK_NULL(MyOperation, "T4-1: getNdbOperation", 
  362.      MyTransaction);
  363.   
  364.   check = MyOperation->interpretedUpdateTuple();
  365.   CHECK_MINUS_ONE(check, "T4-1: readTuple", 
  366.   MyTransaction);
  367.   
  368.   check = MyOperation->equal(IND_SUBSCRIBER_NUMBER, 
  369.      inNumber);
  370.   CHECK_MINUS_ONE(check, "T4-1: equal subscriber",
  371.   MyTransaction);
  372.   check2 = MyOperation->getValue(IND_SUBSCRIBER_LOCATION, 
  373.  (char *)outLocation);
  374.   CHECK_NULL(check2, "T4-1: getValue location", 
  375.      MyTransaction);
  376.   check2 = MyOperation->getValue(IND_SUBSCRIBER_CHANGED_BY, 
  377.  outChangedBy);
  378.   CHECK_NULL(check2, "T4-1: getValue changed_by", 
  379.      MyTransaction);
  380.   check2 = MyOperation->getValue(IND_SUBSCRIBER_CHANGED_TIME, 
  381.                                  outChangedTime);
  382.   CHECK_NULL(check2, "T4-1: getValue changed_time",
  383.      MyTransaction);
  384.   check2 = MyOperation->getValue(IND_SUBSCRIBER_GROUP,
  385.  (char *)&groupId);
  386.   CHECK_NULL(check2, "T4-1: getValue group", 
  387.      MyTransaction);
  388.   check2 = MyOperation->getValue(IND_SUBSCRIBER_SESSIONS,
  389.  (char *)&sessions);
  390.   CHECK_NULL(check2, "T4-1: getValue sessions", 
  391.      MyTransaction);
  392.   
  393.   check = MyOperation->incValue(IND_SUBSCRIBER_SESSIONS, 
  394. (uint32)inServerBit);
  395.   CHECK_MINUS_ONE(check, "T4-4: inc value",
  396.   MyTransaction);
  397.   
  398.   check = MyTransaction->execute( NoCommit ); 
  399.   CHECK_MINUS_ONE(check, "T4-1: NoCommit", 
  400.   MyTransaction);
  401.     /* Operation 2 */
  402.   MyOperation = MyTransaction->getNdbOperation(GROUP_TABLE);
  403.   CHECK_NULL(MyOperation, "T4-2: getNdbOperation", 
  404.      MyTransaction);
  405.   
  406.   check = MyOperation->readTuple();
  407.   CHECK_MINUS_ONE(check, "T4-2: readTuple", 
  408.   MyTransaction);
  409.   
  410.   check = MyOperation->equal(IND_GROUP_ID,
  411.      (char*)&groupId);
  412.   CHECK_MINUS_ONE(check, "T4-2: equal group",
  413.   MyTransaction);
  414.   
  415.   check2 = MyOperation->getValue(IND_GROUP_ALLOW_INSERT, 
  416.  (char *)&permission);
  417.   CHECK_NULL(check2, "T4-2: getValue allow_insert", 
  418.      MyTransaction);
  419.   check = MyTransaction->execute( NoCommit ); 
  420.   CHECK_MINUS_ONE(check, "T4-2: NoCommit", 
  421.   MyTransaction);
  422.   
  423.   if(((permission & inServerBit) == inServerBit) &&
  424.      ((sessions   & inServerBit) == 0)){
  425.   
  426.     DEBUG("inserting - ");
  427.   
  428.     /* Operation 3 */
  429.     
  430.     MyOperation = MyTransaction->getNdbOperation(SESSION_TABLE);
  431.     CHECK_NULL(MyOperation, "T4-3: getNdbOperation", 
  432.        MyTransaction);
  433.     
  434.     check = MyOperation->insertTuple();
  435.     CHECK_MINUS_ONE(check, "T4-3: insertTuple", 
  436.     MyTransaction);
  437.     
  438.     check = MyOperation->equal(IND_SESSION_SUBSCRIBER,
  439.        (char*)inNumber);
  440.     CHECK_MINUS_ONE(check, "T4-3: equal number",
  441.     MyTransaction);
  442.     check = MyOperation->equal(IND_SESSION_SERVER,
  443.        (char*)&inServerId);
  444.     CHECK_MINUS_ONE(check, "T4-3: equal server id",
  445.     MyTransaction);
  446.     
  447.     check = MyOperation->setValue(SESSION_DATA, 
  448.    (char *)inSessionDetails);
  449.     CHECK_MINUS_ONE(check, "T4-3: setValue session details", 
  450.        MyTransaction);
  451.     
  452.     /* Operation 4 */
  453.     /* Operation 5 */
  454.     MyOperation = MyTransaction->getNdbOperation(SERVER_TABLE);
  455.     CHECK_NULL(MyOperation, "T4-5: getNdbOperation", 
  456.        MyTransaction);
  457.     
  458.     check = MyOperation->interpretedUpdateTuple();
  459.     CHECK_MINUS_ONE(check, "T4-5: interpretedUpdateTuple", 
  460.     MyTransaction);
  461.     
  462.     check = MyOperation->equal(IND_SERVER_ID,
  463.        (char*)&inServerId);
  464.     CHECK_MINUS_ONE(check, "T4-5: equal serverId",
  465.     MyTransaction);
  466.     check = MyOperation->equal(IND_SERVER_SUBSCRIBER_SUFFIX,
  467.        (char*)inSuffix);
  468.     CHECK_MINUS_ONE(check, "T4-5: equal suffix",
  469.     MyTransaction);
  470.     check = MyOperation->incValue(IND_SERVER_INSERTS, (uint32)1);
  471.     CHECK_MINUS_ONE(check, "T4-5: inc value",
  472.     MyTransaction);
  473.         
  474.     (* outBranchExecuted) = 1;
  475.   } else {
  476.     DEBUG1("%s", ((permission & inServerBit) ? "permission - " : "no permission - "));
  477.     DEBUG1("%s", ((sessions   & inServerBit) ? "in session - " : "no in session - "));
  478.     (* outBranchExecuted) = 0;
  479.   }
  480.   if(!inDoRollback && (* outBranchExecuted)){
  481.     DEBUG("commitn");
  482.     check = MyTransaction->execute( Commit ); 
  483.     CHECK_MINUS_ONE(check, "T4: Commit", 
  484.     MyTransaction);
  485.   } else {
  486.     DEBUG("rollbackn");
  487.     check = MyTransaction->execute(Rollback);
  488.     CHECK_MINUS_ONE(check, "T4:Rollback", 
  489.     MyTransaction);
  490.     
  491.   }
  492.   
  493.   pNDB->closeTransaction(MyTransaction);
  494.   
  495.   get_time(outTransactionTime);
  496.   time_diff(outTransactionTime, &start);
  497.   return 0;
  498. }
  499. /**
  500.  * Transaction 5 - T5
  501.  * 
  502.  * Delete session
  503.  *
  504.  * Input:
  505.  *   SubscriberNumber
  506.  *   ServerId
  507.  *   ServerBit
  508.  *   DoRollback
  509.  * Output:
  510.  *   ChangedBy
  511.  *   ChangedTime
  512.  *   Location
  513.  *   BranchExecuted
  514.  */
  515. int
  516. T5(void * obj,
  517.    const SubscriberNumber   inNumber,
  518.    const SubscriberSuffix   inSuffix,
  519.    const ServerId           inServerId,
  520.    const ServerBit          inServerBit,
  521.    ChangedBy          outChangedBy,
  522.    ChangedTime        outChangedTime,
  523.    Location         * outLocation,
  524.    DoRollback         inDoRollback,
  525.    BranchExecuted   * outBranchExecuted,
  526.    BenchmarkTime    * outTransactionTime){
  527.   
  528.   DEBUG3("T5(%.*s, %.2d): ", SUBSCRIBER_NUMBER_LENGTH, inNumber, inServerId);
  529.   Ndb           * pNDB = (Ndb *) obj;  
  530.   NdbConnection * MyTransaction = 0;
  531.   NdbOperation  * MyOperation = 0;
  532.   GroupId        groupId;
  533.   ActiveSessions sessions;
  534.   Permission     permission;
  535.   BenchmarkTime start;
  536.   get_time(&start);
  537.   int check;
  538.   NdbRecAttr * check2;
  539.   MyTransaction = pNDB->startTransaction();
  540.   if (MyTransaction == NULL)   
  541.     error_handler("T5-1: startTranscation", pNDB->getNdbErrorString(), 0);
  542.   
  543.   MyOperation= MyTransaction->getNdbOperation(SUBSCRIBER_TABLE);
  544.   CHECK_NULL(MyOperation, "T5-1: getNdbOperation", 
  545.      MyTransaction);
  546.   
  547.   check = MyOperation->interpretedUpdateTuple();
  548.   CHECK_MINUS_ONE(check, "T5-1: readTuple", 
  549.   MyTransaction);
  550.   
  551.   check = MyOperation->equal(IND_SUBSCRIBER_NUMBER, 
  552.      inNumber);
  553.   CHECK_MINUS_ONE(check, "T5-1: equal subscriber",
  554.   MyTransaction);
  555.   check2 = MyOperation->getValue(IND_SUBSCRIBER_LOCATION, 
  556.  (char *)outLocation);
  557.   CHECK_NULL(check2, "T5-1: getValue location", 
  558.      MyTransaction);
  559.   check2 = MyOperation->getValue(IND_SUBSCRIBER_CHANGED_BY, 
  560.  outChangedBy);
  561.   CHECK_NULL(check2, "T5-1: getValue changed_by", 
  562.      MyTransaction);
  563.   check2 = MyOperation->getValue(IND_SUBSCRIBER_CHANGED_TIME, 
  564.                                  outChangedTime);
  565.   CHECK_NULL(check2, "T5-1: getValue changed_time",
  566.      MyTransaction);
  567.   check2 = MyOperation->getValue(IND_SUBSCRIBER_GROUP,
  568.  (char *)&groupId);
  569.   CHECK_NULL(check2, "T5-1: getValue group", 
  570.      MyTransaction);
  571.   check2 = MyOperation->getValue(IND_SUBSCRIBER_SESSIONS,
  572.  (char *)&sessions);
  573.   CHECK_NULL(check2, "T5-1: getValue sessions", 
  574.      MyTransaction);
  575.   
  576.   check = MyOperation->subValue(IND_SUBSCRIBER_SESSIONS, 
  577. (uint32)inServerBit);
  578.   CHECK_MINUS_ONE(check, "T5-4: dec value",
  579.   MyTransaction);
  580.   check = MyTransaction->execute( NoCommit ); 
  581.   CHECK_MINUS_ONE(check, "T5-1: NoCommit", 
  582.   MyTransaction);
  583.   
  584.     /* Operation 2 */
  585.   MyOperation = MyTransaction->getNdbOperation(GROUP_TABLE);
  586.   CHECK_NULL(MyOperation, "T5-2: getNdbOperation", 
  587.      MyTransaction);
  588.   
  589.   
  590.   check = MyOperation->readTuple();
  591.   CHECK_MINUS_ONE(check, "T5-2: readTuple", 
  592.   MyTransaction);
  593.   
  594.   check = MyOperation->equal(IND_GROUP_ID,
  595.      (char*)&groupId);
  596.   CHECK_MINUS_ONE(check, "T5-2: equal group",
  597.   MyTransaction);
  598.   
  599.   check2 = MyOperation->getValue(IND_GROUP_ALLOW_DELETE, 
  600.  (char *)&permission);
  601.   CHECK_NULL(check2, "T5-2: getValue allow_delete", 
  602.      MyTransaction);
  603.   
  604.   check = MyTransaction->execute( NoCommit ); 
  605.   CHECK_MINUS_ONE(check, "T5-2: NoCommit", 
  606.   MyTransaction);
  607.   
  608.   if(((permission & inServerBit) == inServerBit) &&
  609.      ((sessions   & inServerBit) == inServerBit)){
  610.   
  611.     DEBUG("deleting - ");
  612.   
  613.     /* Operation 3 */
  614.     MyOperation = MyTransaction->getNdbOperation(SESSION_TABLE);
  615.     CHECK_NULL(MyOperation, "T5-3: getNdbOperation", 
  616.        MyTransaction);
  617.     
  618.     check = MyOperation->deleteTuple();
  619.     CHECK_MINUS_ONE(check, "T5-3: deleteTuple", 
  620.     MyTransaction);
  621.     
  622.     check = MyOperation->equal(IND_SESSION_SUBSCRIBER,
  623.        (char*)inNumber);
  624.     CHECK_MINUS_ONE(check, "T5-3: equal number",
  625.     MyTransaction);
  626.     check = MyOperation->equal(IND_SESSION_SERVER,
  627.        (char*)&inServerId);
  628.     CHECK_MINUS_ONE(check, "T5-3: equal server id",
  629.     MyTransaction);
  630.     
  631.     /* Operation 4 */
  632.         
  633.     /* Operation 5 */
  634.     MyOperation = MyTransaction->getNdbOperation(SERVER_TABLE);
  635.     CHECK_NULL(MyOperation, "T5-5: getNdbOperation", 
  636.        MyTransaction);
  637.     
  638.     
  639.     check = MyOperation->interpretedUpdateTuple();
  640.     CHECK_MINUS_ONE(check, "T5-5: interpretedUpdateTuple", 
  641.     MyTransaction);
  642.     
  643.     check = MyOperation->equal(IND_SERVER_ID,
  644.        (char*)&inServerId);
  645.     CHECK_MINUS_ONE(check, "T5-5: equal serverId",
  646.     MyTransaction);
  647.     check = MyOperation->equal(IND_SERVER_SUBSCRIBER_SUFFIX,
  648.        (char*)inSuffix);
  649.     CHECK_MINUS_ONE(check, "T5-5: equal suffix",
  650.     MyTransaction);
  651.     check = MyOperation->incValue(IND_SERVER_DELETES, (uint32)1);
  652.     CHECK_MINUS_ONE(check, "T5-5: inc value",
  653.     MyTransaction);
  654.     (* outBranchExecuted) = 1;
  655.   } else {
  656.     DEBUG1("%s", ((permission & inServerBit) ? "permission - " : "no permission - "));
  657.     DEBUG1("%s", ((sessions   & inServerBit) ? "in session - " : "no in session - "));
  658.     (* outBranchExecuted) = 0;
  659.   }
  660.   if(!inDoRollback && (* outBranchExecuted)){
  661.     DEBUG("commitn");
  662.     check = MyTransaction->execute( Commit ); 
  663.     CHECK_MINUS_ONE(check, "T5: Commit", 
  664.     MyTransaction);
  665.   } else {
  666.     DEBUG("rollbackn");
  667.     check = MyTransaction->execute(Rollback);
  668.     CHECK_MINUS_ONE(check, "T5:Rollback", 
  669.     MyTransaction);
  670.     
  671.   }
  672.   
  673.   pNDB->closeTransaction(MyTransaction);
  674.   
  675.   get_time(outTransactionTime);
  676.   time_diff(outTransactionTime, &start);
  677.   return 0;
  678. }