ndb_user_transaction3.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.   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.     /* Operation 4 */
  286.     MyOperation = MyTransaction->getNdbOperation(SERVER_TABLE);
  287.     CHECK_NULL(MyOperation, "T3-4: getNdbOperation", 
  288.        MyTransaction);
  289.     
  290.     check = MyOperation->interpretedUpdateTuple();
  291.     CHECK_MINUS_ONE(check, "T3-4: interpretedUpdateTuple", 
  292.     MyTransaction);
  293.     
  294.     check = MyOperation->equal(IND_SERVER_ID,
  295.        (char*)&inServerId);
  296.     CHECK_MINUS_ONE(check, "T3-4: equal serverId",
  297.     MyTransaction);
  298.     check = MyOperation->equal(IND_SERVER_SUBSCRIBER_SUFFIX,
  299.        (char*)inSuffix);
  300.     CHECK_MINUS_ONE(check, "T3-4: equal suffix",
  301.     MyTransaction);
  302.     check = MyOperation->incValue(IND_SERVER_READS, (uint32)1);
  303.     CHECK_MINUS_ONE(check, "T3-4: inc value",
  304.     MyTransaction);
  305.     
  306.     (* outBranchExecuted) = 1;
  307.   } else {
  308.     (* outBranchExecuted) = 0;
  309.   }
  310.   DEBUG("commitn");
  311.   check = MyTransaction->execute( Commit ); 
  312.   CHECK_MINUS_ONE(check, "T3: Commit", 
  313.   MyTransaction);
  314.   
  315.   pNDB->closeTransaction(MyTransaction);
  316.   
  317.   get_time(outTransactionTime);
  318.   time_diff(outTransactionTime, &start);
  319.   return 0;
  320. }
  321. /**
  322.  * Transaction 4 - T4
  323.  * 
  324.  * Create session
  325.  *
  326.  * Input:
  327.  *   SubscriberNumber
  328.  *   ServerId
  329.  *   ServerBit
  330.  *   SessionDetails,
  331.  *   DoRollback
  332.  * Output:
  333.  *   ChangedBy
  334.  *   ChangedTime
  335.  *   Location
  336.  *   BranchExecuted
  337.  */
  338. int
  339. T4(void * obj,
  340.    const SubscriberNumber   inNumber,
  341.    const SubscriberSuffix   inSuffix,
  342.    const ServerId           inServerId,
  343.    const ServerBit          inServerBit,
  344.    const SessionDetails     inSessionDetails,
  345.    ChangedBy          outChangedBy,
  346.    ChangedTime        outChangedTime,
  347.    Location         * outLocation,
  348.    DoRollback         inDoRollback,
  349.    BranchExecuted   * outBranchExecuted,
  350.    BenchmarkTime    * outTransactionTime){
  351.   Ndb * pNDB = (Ndb *) obj;  
  352.   GroupId        groupId;
  353.   ActiveSessions sessions;
  354.   Permission     permission;
  355.   BenchmarkTime start;
  356.   get_time(&start);
  357.   int check;
  358.   NdbRecAttr * check2;
  359.   NdbConnection * MyTransaction = pNDB->startTransaction();
  360.   if (MyTransaction == NULL)   
  361.     error_handler("T4-1: startTranscation", pNDB->getNdbErrorString(), 0);
  362.   DEBUG3("T4(%.*s, %.2d): ", SUBSCRIBER_NUMBER_LENGTH, inNumber, inServerId);
  363.   NdbOperation * MyOperation = 0;
  364.   MyOperation= MyTransaction->getNdbOperation(SUBSCRIBER_TABLE);
  365.   CHECK_NULL(MyOperation, "T4-1: getNdbOperation", 
  366.      MyTransaction);
  367.   
  368.   check = MyOperation->readTupleExclusive();
  369.   CHECK_MINUS_ONE(check, "T4-1: readTuple", 
  370.   MyTransaction);
  371.   
  372.   check = MyOperation->equal(IND_SUBSCRIBER_NUMBER, 
  373.      inNumber);
  374.   CHECK_MINUS_ONE(check, "T4-1: equal subscriber",
  375.   MyTransaction);
  376.   check2 = MyOperation->getValue(IND_SUBSCRIBER_LOCATION, 
  377.  (char *)outLocation);
  378.   CHECK_NULL(check2, "T4-1: getValue location", 
  379.      MyTransaction);
  380.   check2 = MyOperation->getValue(IND_SUBSCRIBER_CHANGED_BY, 
  381.  outChangedBy);
  382.   CHECK_NULL(check2, "T4-1: getValue changed_by", 
  383.      MyTransaction);
  384.   check2 = MyOperation->getValue(IND_SUBSCRIBER_CHANGED_TIME, 
  385.                                  outChangedTime);
  386.   CHECK_NULL(check2, "T4-1: getValue changed_time",
  387.      MyTransaction);
  388.   check2 = MyOperation->getValue(IND_SUBSCRIBER_GROUP,
  389.  (char *)&groupId);
  390.   CHECK_NULL(check2, "T4-1: getValue group", 
  391.      MyTransaction);
  392.   check2 = MyOperation->getValue(IND_SUBSCRIBER_SESSIONS,
  393.  (char *)&sessions);
  394.   CHECK_NULL(check2, "T4-1: getValue sessions", 
  395.      MyTransaction);
  396.   
  397.   check = MyTransaction->execute( NoCommit ); 
  398.   CHECK_MINUS_ONE(check, "T4-1: NoCommit", 
  399.   MyTransaction);
  400.     /* Operation 2 */
  401.   MyOperation = MyTransaction->getNdbOperation(GROUP_TABLE);
  402.   CHECK_NULL(MyOperation, "T4-2: getNdbOperation", 
  403.      MyTransaction);
  404.   
  405.   check = MyOperation->readTuple();
  406.   CHECK_MINUS_ONE(check, "T4-2: readTuple", 
  407.   MyTransaction);
  408.   
  409.   check = MyOperation->equal(IND_GROUP_ID,
  410.      (char*)&groupId);
  411.   CHECK_MINUS_ONE(check, "T4-2: equal group",
  412.   MyTransaction);
  413.   
  414.   check2 = MyOperation->getValue(IND_GROUP_ALLOW_INSERT, 
  415.  (char *)&permission);
  416.   CHECK_NULL(check2, "T4-2: getValue allow_insert", 
  417.      MyTransaction);
  418.   check = MyTransaction->execute( NoCommit ); 
  419.   CHECK_MINUS_ONE(check, "T4-2: NoCommit", 
  420.   MyTransaction);
  421.   
  422.   if(((permission & inServerBit) == inServerBit) &&
  423.      ((sessions   & inServerBit) == 0)){
  424.     DEBUG("inserting - ");
  425.   
  426.     /* Operation 3 */
  427.     MyOperation = MyTransaction->getNdbOperation(SESSION_TABLE);
  428.     CHECK_NULL(MyOperation, "T4-3: getNdbOperation", 
  429.        MyTransaction);
  430.     
  431.     check = MyOperation->insertTuple();
  432.     CHECK_MINUS_ONE(check, "T4-3: insertTuple", 
  433.     MyTransaction);
  434.     
  435.     check = MyOperation->equal(IND_SESSION_SUBSCRIBER,
  436.        (char*)inNumber);
  437.     CHECK_MINUS_ONE(check, "T4-3: equal number",
  438.     MyTransaction);
  439.     check = MyOperation->equal(IND_SESSION_SERVER,
  440.        (char*)&inServerId);
  441.     CHECK_MINUS_ONE(check, "T4-3: equal server id",
  442.     MyTransaction);
  443.     
  444.     check = MyOperation->setValue(SESSION_DATA, 
  445.    (char *)inSessionDetails);
  446.     CHECK_MINUS_ONE(check, "T4-3: setValue session details", 
  447.        MyTransaction);
  448.     /* Operation 4 */
  449.     MyOperation = MyTransaction->getNdbOperation(SUBSCRIBER_TABLE);
  450.     CHECK_NULL(MyOperation, "T4-4: getNdbOperation", 
  451.        MyTransaction);
  452.     
  453.     check = MyOperation->interpretedUpdateTuple();
  454.     CHECK_MINUS_ONE(check, "T4-4: interpretedUpdateTuple", 
  455.     MyTransaction);
  456.     
  457.     check = MyOperation->equal(IND_SUBSCRIBER_NUMBER,
  458.        (char*)inNumber);
  459.     CHECK_MINUS_ONE(check, "T4-4: equal number",
  460.     MyTransaction);
  461.     check = MyOperation->incValue(IND_SUBSCRIBER_SESSIONS, 
  462.   (uint32)inServerBit);
  463.     CHECK_MINUS_ONE(check, "T4-4: inc value",
  464.     MyTransaction);
  465.     /* Operation 5 */
  466.     MyOperation = MyTransaction->getNdbOperation(SERVER_TABLE);
  467.     CHECK_NULL(MyOperation, "T4-5: getNdbOperation", 
  468.        MyTransaction);
  469.     
  470.     check = MyOperation->interpretedUpdateTuple();
  471.     CHECK_MINUS_ONE(check, "T4-5: interpretedUpdateTuple", 
  472.     MyTransaction);
  473.     
  474.     check = MyOperation->equal(IND_SERVER_ID,
  475.        (char*)&inServerId);
  476.     CHECK_MINUS_ONE(check, "T4-5: equal serverId",
  477.     MyTransaction);
  478.     check = MyOperation->equal(IND_SERVER_SUBSCRIBER_SUFFIX,
  479.        (char*)inSuffix);
  480.     CHECK_MINUS_ONE(check, "T4-5: equal suffix",
  481.     MyTransaction);
  482.     check = MyOperation->incValue(IND_SERVER_INSERTS, (uint32)1);
  483.     CHECK_MINUS_ONE(check, "T4-5: inc value",
  484.     MyTransaction);
  485.         
  486.     (* outBranchExecuted) = 1;
  487.   } else {
  488.     DEBUG1("%s", ((permission & inServerBit) ? "permission - " : "no permission - "));
  489.     DEBUG1("%s", ((sessions   & inServerBit) ? "in session - " : "no in session - "));
  490.     (* outBranchExecuted) = 0;
  491.   }
  492.   if(!inDoRollback){
  493.     DEBUG("commitn");
  494.     check = MyTransaction->execute( Commit ); 
  495.     CHECK_MINUS_ONE(check, "T4: Commit", 
  496.     MyTransaction);
  497.   } else {
  498.     DEBUG("rollbackn");
  499.     check = MyTransaction->execute(Rollback);
  500.     CHECK_MINUS_ONE(check, "T4:Rollback", 
  501.     MyTransaction);
  502.     
  503.   }
  504.   
  505.   pNDB->closeTransaction(MyTransaction);
  506.   
  507.   get_time(outTransactionTime);
  508.   time_diff(outTransactionTime, &start);
  509.   return 0;
  510. }
  511. /**
  512.  * Transaction 5 - T5
  513.  * 
  514.  * Delete session
  515.  *
  516.  * Input:
  517.  *   SubscriberNumber
  518.  *   ServerId
  519.  *   ServerBit
  520.  *   DoRollback
  521.  * Output:
  522.  *   ChangedBy
  523.  *   ChangedTime
  524.  *   Location
  525.  *   BranchExecuted
  526.  */
  527. int
  528. T5(void * obj,
  529.    const SubscriberNumber   inNumber,
  530.    const SubscriberSuffix   inSuffix,
  531.    const ServerId           inServerId,
  532.    const ServerBit          inServerBit,
  533.    ChangedBy          outChangedBy,
  534.    ChangedTime        outChangedTime,
  535.    Location         * outLocation,
  536.    DoRollback         inDoRollback,
  537.    BranchExecuted   * outBranchExecuted,
  538.    BenchmarkTime    * outTransactionTime){
  539.   
  540.   Ndb           * pNDB = (Ndb *) obj;  
  541.   NdbConnection * MyTransaction = 0;
  542.   NdbOperation  * MyOperation = 0;
  543.   GroupId        groupId;
  544.   ActiveSessions sessions;
  545.   Permission     permission;
  546.   BenchmarkTime start;
  547.   get_time(&start);
  548.   int check;
  549.   NdbRecAttr * check2;
  550.   MyTransaction = pNDB->startTransaction();
  551.   if (MyTransaction == NULL)   
  552.     error_handler("T5-1: startTranscation", pNDB->getNdbErrorString(), 0);
  553.   MyOperation= MyTransaction->getNdbOperation(SUBSCRIBER_TABLE);
  554.   CHECK_NULL(MyOperation, "T5-1: getNdbOperation", 
  555.      MyTransaction);
  556.   
  557.   
  558.   check = MyOperation->readTupleExclusive();
  559.   CHECK_MINUS_ONE(check, "T5-1: readTuple", 
  560.   MyTransaction);
  561.   
  562.   check = MyOperation->equal(IND_SUBSCRIBER_NUMBER, 
  563.      inNumber);
  564.   CHECK_MINUS_ONE(check, "T5-1: equal subscriber",
  565.   MyTransaction);
  566.   check2 = MyOperation->getValue(IND_SUBSCRIBER_LOCATION, 
  567.  (char *)outLocation);
  568.   CHECK_NULL(check2, "T5-1: getValue location", 
  569.      MyTransaction);
  570.   check2 = MyOperation->getValue(IND_SUBSCRIBER_CHANGED_BY, 
  571.  outChangedBy);
  572.   CHECK_NULL(check2, "T5-1: getValue changed_by", 
  573.      MyTransaction);
  574.   check2 = MyOperation->getValue(IND_SUBSCRIBER_CHANGED_TIME, 
  575.                                  outChangedTime);
  576.   CHECK_NULL(check2, "T5-1: getValue changed_time",
  577.      MyTransaction);
  578.   check2 = MyOperation->getValue(IND_SUBSCRIBER_GROUP,
  579.  (char *)&groupId);
  580.   CHECK_NULL(check2, "T5-1: getValue group", 
  581.      MyTransaction);
  582.   check2 = MyOperation->getValue(IND_SUBSCRIBER_SESSIONS,
  583.  (char *)&sessions);
  584.   CHECK_NULL(check2, "T5-1: getValue sessions", 
  585.      MyTransaction);
  586.   
  587.   check = MyTransaction->execute( NoCommit ); 
  588.   CHECK_MINUS_ONE(check, "T5-1: NoCommit", 
  589.   MyTransaction);
  590.   
  591.     /* Operation 2 */
  592.   MyOperation = MyTransaction->getNdbOperation(GROUP_TABLE);
  593.   CHECK_NULL(MyOperation, "T5-2: getNdbOperation", 
  594.      MyTransaction);
  595.   
  596.   
  597.   check = MyOperation->readTuple();
  598.   CHECK_MINUS_ONE(check, "T5-2: readTuple", 
  599.   MyTransaction);
  600.   
  601.   check = MyOperation->equal(IND_GROUP_ID,
  602.      (char*)&groupId);
  603.   CHECK_MINUS_ONE(check, "T5-2: equal group",
  604.   MyTransaction);
  605.   
  606.   check2 = MyOperation->getValue(IND_GROUP_ALLOW_DELETE, 
  607.  (char *)&permission);
  608.   CHECK_NULL(check2, "T5-2: getValue allow_delete", 
  609.      MyTransaction);
  610.   
  611.   check = MyTransaction->execute( NoCommit ); 
  612.   CHECK_MINUS_ONE(check, "T5-2: NoCommit", 
  613.   MyTransaction);
  614.   
  615.   DEBUG3("T5(%.*s, %.2d): ", SUBSCRIBER_NUMBER_LENGTH, inNumber, inServerId);
  616.   if(((permission & inServerBit) == inServerBit) &&
  617.      ((sessions   & inServerBit) == inServerBit)){
  618.   
  619.     DEBUG("deleting - ");
  620.   
  621.     /* Operation 3 */
  622.     MyOperation = MyTransaction->getNdbOperation(SESSION_TABLE);
  623.     CHECK_NULL(MyOperation, "T5-3: getNdbOperation", 
  624.        MyTransaction);
  625.     
  626.     check = MyOperation->deleteTuple();
  627.     CHECK_MINUS_ONE(check, "T5-3: deleteTuple", 
  628.     MyTransaction);
  629.     
  630.     check = MyOperation->equal(IND_SESSION_SUBSCRIBER,
  631.        (char*)inNumber);
  632.     CHECK_MINUS_ONE(check, "T5-3: equal number",
  633.     MyTransaction);
  634.     check = MyOperation->equal(IND_SESSION_SERVER,
  635.        (char*)&inServerId);
  636.     CHECK_MINUS_ONE(check, "T5-3: equal server id",
  637.     MyTransaction);
  638.     
  639.     /* Operation 4 */
  640.     MyOperation = MyTransaction->getNdbOperation(SUBSCRIBER_TABLE);
  641.     CHECK_NULL(MyOperation, "T5-4: getNdbOperation", 
  642.        MyTransaction);
  643.     
  644.     check = MyOperation->interpretedUpdateTuple();
  645.     CHECK_MINUS_ONE(check, "T5-4: interpretedUpdateTuple", 
  646.     MyTransaction);
  647.     
  648.     check = MyOperation->equal(IND_SUBSCRIBER_NUMBER,
  649.        (char*)inNumber);
  650.     CHECK_MINUS_ONE(check, "T5-4: equal number",
  651.     MyTransaction);
  652.     check = MyOperation->subValue(IND_SUBSCRIBER_SESSIONS, 
  653.   (uint32)inServerBit);
  654.     CHECK_MINUS_ONE(check, "T5-4: dec value",
  655.     MyTransaction);
  656.         
  657.     /* Operation 5 */
  658.     MyOperation = MyTransaction->getNdbOperation(SERVER_TABLE);
  659.     CHECK_NULL(MyOperation, "T5-5: getNdbOperation", 
  660.        MyTransaction);
  661.     
  662.     
  663.     check = MyOperation->interpretedUpdateTuple();
  664.     CHECK_MINUS_ONE(check, "T5-5: interpretedUpdateTuple", 
  665.     MyTransaction);
  666.     
  667.     check = MyOperation->equal(IND_SERVER_ID,
  668.        (char*)&inServerId);
  669.     CHECK_MINUS_ONE(check, "T5-5: equal serverId",
  670.     MyTransaction);
  671.     check = MyOperation->equal(IND_SERVER_SUBSCRIBER_SUFFIX,
  672.        (char*)inSuffix);
  673.     CHECK_MINUS_ONE(check, "T5-5: equal suffix",
  674.     MyTransaction);
  675.     check = MyOperation->incValue(IND_SERVER_DELETES, (uint32)1);
  676.     CHECK_MINUS_ONE(check, "T5-5: inc value",
  677.     MyTransaction);
  678.     (* outBranchExecuted) = 1;
  679.   } else {
  680.     DEBUG1("%s", ((permission & inServerBit) ? "permission - " : "no permission - "));
  681.     DEBUG1("%s", ((sessions   & inServerBit) ? "in session - " : "no in session - "));
  682.     (* outBranchExecuted) = 0;
  683.   }
  684.   if(!inDoRollback){
  685.     DEBUG("commitn");
  686.     check = MyTransaction->execute( Commit ); 
  687.     CHECK_MINUS_ONE(check, "T5: Commit", 
  688.     MyTransaction);
  689.   } else {
  690.     DEBUG("rollbackn");
  691.     check = MyTransaction->execute(Rollback);
  692.     CHECK_MINUS_ONE(check, "T5:Rollback", 
  693.     MyTransaction);
  694.     
  695.   }
  696.   
  697.   pNDB->closeTransaction(MyTransaction);
  698.   
  699.   get_time(outTransactionTime);
  700.   time_diff(outTransactionTime, &start);
  701.   return 0;
  702. }