ndb_user_transaction5.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.   
  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.   DEBUG3("T3(%.*s, %.2d): ", SUBSCRIBER_NUMBER_LENGTH, inNumber, inServerId);
  256.   if(((permission & inServerBit) == inServerBit) &&
  257.      ((sessions   & inServerBit) == inServerBit)){
  258.     
  259.     DEBUG("reading - ");
  260.     /* Operation 3 */
  261.     MyOperation = MyTransaction->getNdbOperation(SESSION_TABLE);
  262.     CHECK_NULL(MyOperation, "T3-3: getNdbOperation", 
  263.        MyTransaction);
  264.     
  265.     check = MyOperation->simpleRead();
  266.     CHECK_MINUS_ONE(check, "T3-3: readTuple", 
  267.     MyTransaction);
  268.     
  269.     check = MyOperation->equal(IND_SESSION_SUBSCRIBER,
  270.        (char*)inNumber);
  271.     CHECK_MINUS_ONE(check, "T3-3: equal number",
  272.     MyTransaction);
  273.     check = MyOperation->equal(IND_SESSION_SERVER,
  274.        (char*)&inServerId);
  275.     CHECK_MINUS_ONE(check, "T3-3: equal server id",
  276.     MyTransaction);
  277.     
  278.     check2 = MyOperation->getValue(IND_SESSION_DATA, 
  279.    (char *)outSessionDetails);
  280.     CHECK_NULL(check2, "T3-3: getValue session details", 
  281.        MyTransaction);
  282.     
  283.     /* Operation 4 */
  284.     MyOperation = MyTransaction->getNdbOperation(SERVER_TABLE);
  285.     CHECK_NULL(MyOperation, "T3-4: getNdbOperation", 
  286.        MyTransaction);
  287.     
  288.     check = MyOperation->interpretedUpdateTuple();
  289.     CHECK_MINUS_ONE(check, "T3-4: interpretedUpdateTuple", 
  290.     MyTransaction);
  291.     
  292.     check = MyOperation->equal(IND_SERVER_ID,
  293.        (char*)&inServerId);
  294.     CHECK_MINUS_ONE(check, "T3-4: equal serverId",
  295.     MyTransaction);
  296.     check = MyOperation->equal(IND_SERVER_SUBSCRIBER_SUFFIX,
  297.        (char*)inSuffix);
  298.     CHECK_MINUS_ONE(check, "T3-4: equal suffix",
  299.     MyTransaction);
  300.     check = MyOperation->incValue(IND_SERVER_READS, (uint32)1);
  301.     CHECK_MINUS_ONE(check, "T3-4: inc value",
  302.     MyTransaction);
  303.     (* outBranchExecuted) = 1;
  304.   } else {
  305.     (* outBranchExecuted) = 0;
  306.   }
  307.   DEBUG("commit...");
  308.   check = MyTransaction->execute( Commit ); 
  309.   CHECK_MINUS_ONE(check, "T3: Commit", 
  310.   MyTransaction);
  311.   
  312.   pNDB->closeTransaction(MyTransaction);
  313.   
  314.   DEBUG("donen");
  315.   get_time(outTransactionTime);
  316.   time_diff(outTransactionTime, &start);
  317.   return 0;
  318. }
  319. /**
  320.  * Transaction 4 - T4
  321.  * 
  322.  * Create session
  323.  *
  324.  * Input:
  325.  *   SubscriberNumber
  326.  *   ServerId
  327.  *   ServerBit
  328.  *   SessionDetails,
  329.  *   DoRollback
  330.  * Output:
  331.  *   ChangedBy
  332.  *   ChangedTime
  333.  *   Location
  334.  *   BranchExecuted
  335.  */
  336. int
  337. T4(void * obj,
  338.    const SubscriberNumber   inNumber,
  339.    const SubscriberSuffix   inSuffix,
  340.    const ServerId           inServerId,
  341.    const ServerBit          inServerBit,
  342.    const SessionDetails     inSessionDetails,
  343.    ChangedBy          outChangedBy,
  344.    ChangedTime        outChangedTime,
  345.    Location         * outLocation,
  346.    DoRollback         inDoRollback,
  347.    BranchExecuted   * outBranchExecuted,
  348.    BenchmarkTime    * outTransactionTime){
  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.   DEBUG3("T4(%.*s, %.2d): ", SUBSCRIBER_NUMBER_LENGTH, inNumber, inServerId);
  424.   if(((permission & inServerBit) == inServerBit) &&
  425.      ((sessions   & inServerBit) == 0)){
  426.   
  427.     DEBUG("inserting - ");
  428.   
  429.     /* Operation 3 */
  430.     
  431.     MyOperation = MyTransaction->getNdbOperation(SESSION_TABLE);
  432.     CHECK_NULL(MyOperation, "T4-3: getNdbOperation", 
  433.        MyTransaction);
  434.     
  435.     check = MyOperation->insertTuple();
  436.     CHECK_MINUS_ONE(check, "T4-3: insertTuple", 
  437.     MyTransaction);
  438.     
  439.     check = MyOperation->equal(IND_SESSION_SUBSCRIBER,
  440.        (char*)inNumber);
  441.     CHECK_MINUS_ONE(check, "T4-3: equal number",
  442.     MyTransaction);
  443.     check = MyOperation->equal(IND_SESSION_SERVER,
  444.        (char*)&inServerId);
  445.     CHECK_MINUS_ONE(check, "T4-3: equal server id",
  446.     MyTransaction);
  447.     
  448.     check = MyOperation->setValue(SESSION_DATA, 
  449.    (char *)inSessionDetails);
  450.     CHECK_MINUS_ONE(check, "T4-3: setValue session details", 
  451.        MyTransaction);
  452.     
  453.     /* Operation 4 */
  454.     /* Operation 5 */
  455.     MyOperation = MyTransaction->getNdbOperation(SERVER_TABLE);
  456.     CHECK_NULL(MyOperation, "T4-5: getNdbOperation", 
  457.        MyTransaction);
  458.     
  459.     check = MyOperation->interpretedUpdateTuple();
  460.     CHECK_MINUS_ONE(check, "T4-5: interpretedUpdateTuple", 
  461.     MyTransaction);
  462.     
  463.     check = MyOperation->equal(IND_SERVER_ID,
  464.        (char*)&inServerId);
  465.     CHECK_MINUS_ONE(check, "T4-5: equal serverId",
  466.     MyTransaction);
  467.     check = MyOperation->equal(IND_SERVER_SUBSCRIBER_SUFFIX,
  468.        (char*)inSuffix);
  469.     CHECK_MINUS_ONE(check, "T4-5: equal suffix",
  470.     MyTransaction);
  471.     check = MyOperation->incValue(IND_SERVER_INSERTS, (uint32)1);
  472.     CHECK_MINUS_ONE(check, "T4-5: inc value",
  473.     MyTransaction);
  474.         
  475.     (* outBranchExecuted) = 1;
  476.   } else {
  477.     DEBUG1("%s", ((permission & inServerBit) ? "permission - " : "no permission - "));
  478.     DEBUG1("%s", ((sessions   & inServerBit) ? "in session - " : "no in session - "));
  479.     (* outBranchExecuted) = 0;
  480.   }
  481.   if(!inDoRollback && (* outBranchExecuted)){
  482.     DEBUG("commitn");
  483.     check = MyTransaction->execute( Commit ); 
  484.     CHECK_MINUS_ONE(check, "T4: Commit", 
  485.     MyTransaction);
  486.   } else {
  487.     DEBUG("rollbackn");
  488.     check = MyTransaction->execute(Rollback);
  489.     CHECK_MINUS_ONE(check, "T4:Rollback", 
  490.     MyTransaction);
  491.     
  492.   }
  493.   
  494.   pNDB->closeTransaction(MyTransaction);
  495.   
  496.   get_time(outTransactionTime);
  497.   time_diff(outTransactionTime, &start);
  498.   return 0;
  499. }
  500. /**
  501.  * Transaction 5 - T5
  502.  * 
  503.  * Delete session
  504.  *
  505.  * Input:
  506.  *   SubscriberNumber
  507.  *   ServerId
  508.  *   ServerBit
  509.  *   DoRollback
  510.  * Output:
  511.  *   ChangedBy
  512.  *   ChangedTime
  513.  *   Location
  514.  *   BranchExecuted
  515.  */
  516. int
  517. T5(void * obj,
  518.    const SubscriberNumber   inNumber,
  519.    const SubscriberSuffix   inSuffix,
  520.    const ServerId           inServerId,
  521.    const ServerBit          inServerBit,
  522.    ChangedBy          outChangedBy,
  523.    ChangedTime        outChangedTime,
  524.    Location         * outLocation,
  525.    DoRollback         inDoRollback,
  526.    BranchExecuted   * outBranchExecuted,
  527.    BenchmarkTime    * outTransactionTime){
  528.   
  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.   DEBUG3("T5(%.*s, %.2d): ", SUBSCRIBER_NUMBER_LENGTH, inNumber, inServerId);
  609.   if(((permission & inServerBit) == inServerBit) &&
  610.      ((sessions   & inServerBit) == inServerBit)){
  611.   
  612.     DEBUG("deleting - ");
  613.   
  614.     /* Operation 3 */
  615.     MyOperation = MyTransaction->getNdbOperation(SESSION_TABLE);
  616.     CHECK_NULL(MyOperation, "T5-3: getNdbOperation", 
  617.        MyTransaction);
  618.     
  619.     check = MyOperation->deleteTuple();
  620.     CHECK_MINUS_ONE(check, "T5-3: deleteTuple", 
  621.     MyTransaction);
  622.     
  623.     check = MyOperation->equal(IND_SESSION_SUBSCRIBER,
  624.        (char*)inNumber);
  625.     CHECK_MINUS_ONE(check, "T5-3: equal number",
  626.     MyTransaction);
  627.     check = MyOperation->equal(IND_SESSION_SERVER,
  628.        (char*)&inServerId);
  629.     CHECK_MINUS_ONE(check, "T5-3: equal server id",
  630.     MyTransaction);
  631.     
  632.     /* Operation 4 */
  633.         
  634.     /* Operation 5 */
  635.     MyOperation = MyTransaction->getNdbOperation(SERVER_TABLE);
  636.     CHECK_NULL(MyOperation, "T5-5: getNdbOperation", 
  637.        MyTransaction);
  638.     
  639.     
  640.     check = MyOperation->interpretedUpdateTuple();
  641.     CHECK_MINUS_ONE(check, "T5-5: interpretedUpdateTuple", 
  642.     MyTransaction);
  643.     
  644.     check = MyOperation->equal(IND_SERVER_ID,
  645.        (char*)&inServerId);
  646.     CHECK_MINUS_ONE(check, "T5-5: equal serverId",
  647.     MyTransaction);
  648.     check = MyOperation->equal(IND_SERVER_SUBSCRIBER_SUFFIX,
  649.        (char*)inSuffix);
  650.     CHECK_MINUS_ONE(check, "T5-5: equal suffix",
  651.     MyTransaction);
  652.     check = MyOperation->incValue(IND_SERVER_DELETES, (uint32)1);
  653.     CHECK_MINUS_ONE(check, "T5-5: inc value",
  654.     MyTransaction);
  655.     (* outBranchExecuted) = 1;
  656.   } else {
  657.     DEBUG1("%s", ((permission & inServerBit) ? "permission - " : "no permission - "));
  658.     DEBUG1("%s", ((sessions   & inServerBit) ? "in session - " : "no in session - "));
  659.     (* outBranchExecuted) = 0;
  660.   }
  661.   if(!inDoRollback && (* outBranchExecuted)){
  662.     DEBUG("commitn");
  663.     check = MyTransaction->execute( Commit ); 
  664.     CHECK_MINUS_ONE(check, "T5: Commit", 
  665.     MyTransaction);
  666.   } else {
  667.     DEBUG("rollbackn");
  668.     check = MyTransaction->execute(Rollback);
  669.     CHECK_MINUS_ONE(check, "T5:Rollback", 
  670.     MyTransaction);
  671.     
  672.   }
  673.   
  674.   pNDB->closeTransaction(MyTransaction);
  675.   
  676.   get_time(outTransactionTime);
  677.   time_diff(outTransactionTime, &start);
  678.   return 0;
  679. }