userInterface.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. /***************************************************************
  14. * I N C L U D E D   F I L E S                                  *
  15. ***************************************************************/
  16. #include <ndb_global.h>
  17. #ifndef NDB_WIN32
  18. #include <sys/time.h>
  19. #endif
  20. #include "ndb_error.hpp"
  21. #include "userInterface.h"
  22. #include <NdbThread.h>
  23. #include <NdbTick.h>
  24. #include <NdbMutex.h>
  25. #include <NdbSleep.h>
  26. #include "ndb_schema.hpp"
  27. #include <NDBT.hpp>
  28. #include <NdbSchemaCon.hpp>
  29. /***************************************************************
  30. * L O C A L   C O N S T A N T S                                *
  31. ***************************************************************/
  32. /***************************************************************
  33. * L O C A L   D A T A   S T R U C T U R E S                    *
  34. ***************************************************************/
  35. /***************************************************************
  36. * L O C A L   F U N C T I O N S                                *
  37. ***************************************************************/
  38. extern int localDbPrepare(UserHandle *uh);
  39. static int dbCreate(UserHandle *uh);
  40. /***************************************************************
  41. * L O C A L   D A T A                                          *
  42. ***************************************************************/
  43. /***************************************************************
  44. * P U B L I C   D A T A                                        *
  45. ***************************************************************/
  46. /***************************************************************
  47. ****************************************************************
  48. * L O C A L   F U N C T I O N S   C O D E   S E C T I O N      *
  49. ****************************************************************
  50. ***************************************************************/
  51. /***************************************************************
  52. ****************************************************************
  53. * P U B L I C   F U N C T I O N S   C O D E   S E C T I O N    *
  54. ****************************************************************
  55. ***************************************************************/
  56. /*-----------------------------------*/
  57. /* Time related Functions            */
  58. /*                                   */
  59. /* Returns a double value in seconds */
  60. /*-----------------------------------*/
  61. double userGetTimeSync(void)
  62. {
  63.   static int initialized = 0;
  64.   static NDB_TICKS initSecs = 0;
  65.   static Uint32 initMicros = 0;
  66.   double timeValue = 0;
  67.   if ( !initialized ) {
  68.     initialized = 1;
  69.     NdbTick_CurrentMicrosecond(&initSecs, &initMicros);  
  70.     timeValue = 0.0;
  71.   } else {
  72.     NDB_TICKS secs = 0;
  73.     Uint32 micros = 0;
  74.   
  75.     NdbTick_CurrentMicrosecond(&secs, &micros);
  76.     double s  = (double)secs  - (double)initSecs;
  77.     double us = (double)secs - (double)initMicros;
  78.     
  79.     timeValue = s + (us / 1000000.0);
  80.   }
  81.   return timeValue;
  82. }
  83. // 0 - OK
  84. // 1 - Retry transaction
  85. // 2 - Permanent
  86. int 
  87. userDbCommit(UserHandle *uh){
  88.   if(uh->pCurrTrans != 0){
  89.     int check = uh->pCurrTrans->execute( Commit ); 
  90.     NdbError err = uh->pCurrTrans->getNdbError();
  91.     uh->pNDB->closeTransaction(uh->pCurrTrans);
  92.     uh->pCurrTrans = 0;
  93.     
  94.     if(err.status != NdbError::Success)
  95.       ndbout << err << endl;
  96.     
  97.     if(err.status == NdbError::TemporaryError && 
  98.        err.classification == NdbError::OverloadError){
  99.       NdbSleep_SecSleep(3);
  100.     }
  101.     
  102.     return err.status;
  103.   }
  104.   return 2;
  105. }
  106. /**
  107.  * TRUE - Normal table
  108.  * FALSE - Table w.o. checkpoing and logging
  109.  */
  110. #ifdef __cplusplus
  111. extern "C" {
  112. #endif
  113. extern int useTableLogging;
  114. #ifdef __cplusplus
  115. }
  116. #endif
  117. int
  118. create_table_server(Ndb * pNdb){
  119.   int check;
  120.   NdbSchemaCon * MySchemaTransaction = NdbSchemaCon::startSchemaTrans(pNdb);
  121.   if( MySchemaTransaction == NULL )
  122.     error_handler("startSchemaTransaction", pNdb->getNdbError(), 0);
  123.   
  124.   NdbSchemaOp * MySchemaOp = MySchemaTransaction->getNdbSchemaOp();
  125.   if( MySchemaOp == NULL ) 
  126.     error_handler("getNdbSchemaOp", MySchemaTransaction->getNdbError(), 0);
  127.   
  128.   // Create table
  129.   check = MySchemaOp->createTable( SERVER_TABLE,
  130.    8,       // Table size
  131.    TupleKey, // Key Type
  132.    1 // Nr of Pages
  133.    ,DistributionGroup,
  134.    6,
  135.    78,
  136.    80,
  137.    1,
  138.    useTableLogging
  139.                                    );
  140.   if( check == -1 ) 
  141.     error_handler("createTable", MySchemaTransaction->getNdbError(), 0);
  142.   
  143.   check = MySchemaOp->createAttribute
  144.     ( SERVER_SUBSCRIBER_SUFFIX,
  145.       TupleKey, 
  146.       sizeof(char) << 3,
  147.       SUBSCRIBER_NUMBER_SUFFIX_LENGTH,
  148.       String, 
  149.       MMBased,
  150.       NotNullAttribute,
  151.       NormalStorageAttribute,
  152.       0,
  153.       1,
  154.       16);
  155.   if( check == -1 ) 
  156.     error_handler("createAttribute (subscriber suffix)", 
  157.   MySchemaTransaction->getNdbError(), 0);
  158.   // Create first column, primary key 
  159.   check = MySchemaOp->createAttribute( SERVER_ID,
  160.        TupleKey, 
  161.        sizeof(ServerId) << 3,
  162.        1,
  163.        UnSigned, 
  164.        MMBased,
  165.        NotNullAttribute );
  166.   if( check == -1 ) 
  167.     error_handler("createAttribute (serverid)", 
  168.   MySchemaTransaction->getNdbError(), 0);
  169.   check = MySchemaOp->createAttribute( SERVER_NAME,
  170.        NoKey, 
  171.        sizeof(char) << 3,
  172.        SERVER_NAME_LENGTH,
  173.        String, 
  174.        MMBased,
  175.        NotNullAttribute );
  176.   if( check == -1 ) 
  177.     error_handler("createAttribute (server name)", 
  178.   MySchemaTransaction->getNdbError(), 0);
  179.   
  180.   check = MySchemaOp->createAttribute( SERVER_READS,
  181.        NoKey, 
  182.        sizeof(Counter) << 3,
  183.        1,
  184.        UnSigned,
  185.        MMBased,
  186.        NotNullAttribute );
  187.   if( check == -1 ) 
  188.     error_handler("createAttribute (server reads)", 
  189.   MySchemaTransaction->getNdbError(), 0);
  190.   check = MySchemaOp->createAttribute( SERVER_INSERTS,
  191.        NoKey, 
  192.        sizeof(Counter) << 3,
  193.        1,
  194.        UnSigned,
  195.        MMBased,
  196.        NotNullAttribute );
  197.   if( check == -1 ) 
  198.     error_handler("createAttribute (server inserts)", 
  199.   MySchemaTransaction->getNdbError(), 0);
  200.   check = MySchemaOp->createAttribute( SERVER_DELETES,
  201.        NoKey, 
  202.        sizeof(Counter) << 3,
  203.        1,
  204.        UnSigned,
  205.        MMBased,
  206.        NotNullAttribute );
  207.   if( check == -1 ) 
  208.     error_handler("createAttribute (server deletes)", 
  209.   MySchemaTransaction->getNdbError(), 0);
  210.   
  211.   if( MySchemaTransaction->execute() == -1 ) {
  212.     error_handler("schemaTransaction->execute()", 
  213.   MySchemaTransaction->getNdbError(), 0);
  214.   }    
  215.   NdbSchemaCon::closeSchemaTrans(MySchemaTransaction);
  216.   return 0;
  217. }
  218. int
  219. create_table_group(Ndb * pNdb){
  220.   int check;
  221.   NdbSchemaCon * MySchemaTransaction = NdbSchemaCon::startSchemaTrans(pNdb);
  222.   if( MySchemaTransaction == NULL )
  223.     error_handler("startSchemaTransaction", pNdb->getNdbError(), 0);
  224.   
  225.   NdbSchemaOp * MySchemaOp = MySchemaTransaction->getNdbSchemaOp();
  226.   if( MySchemaOp == NULL ) 
  227.     error_handler("getNdbSchemaOp", MySchemaTransaction->getNdbError(), 0);
  228.   
  229.   // Create table
  230.   check = MySchemaOp->createTable( GROUP_TABLE,
  231.    8,       // Table size
  232.    TupleKey, // Key Type
  233.    1 // Nr of Pages
  234.    ,All,
  235.    6,
  236.    78,
  237.    80,
  238.    1,
  239.    useTableLogging
  240.                                    );
  241.   if( check == -1 ) 
  242.     error_handler("createTable", MySchemaTransaction->getNdbError(), 0);
  243.   
  244.   // Create first column, primary key 
  245.   check = MySchemaOp->createAttribute( GROUP_ID,
  246.        TupleKey, 
  247.        sizeof(GroupId) << 3,
  248.        1,
  249.        UnSigned, 
  250.        MMBased,
  251.        NotNullAttribute );
  252.   if( check == -1 ) 
  253.     error_handler("createAttribute (group id)", 
  254.   MySchemaTransaction->getNdbError(), 0);
  255.   check = MySchemaOp->createAttribute( GROUP_NAME,
  256.        NoKey,
  257.        sizeof(char) << 3,
  258.        GROUP_NAME_LENGTH,
  259.        String, 
  260.        MMBased,
  261.        NotNullAttribute );
  262.   if( check == -1 ) 
  263.     error_handler("createAttribute (group name)", 
  264.   MySchemaTransaction->getNdbError(), 0);
  265.   
  266.   check = MySchemaOp->createAttribute( GROUP_ALLOW_READ,
  267.        NoKey, 
  268.        sizeof(Permission) << 3,
  269.        1,
  270.        String, 
  271.        MMBased,
  272.        NotNullAttribute );
  273.   if( check == -1 ) 
  274.     error_handler("createAttribute (group read)", 
  275.   MySchemaTransaction->getNdbError(), 0);
  276.   
  277.   check = MySchemaOp->createAttribute( GROUP_ALLOW_INSERT,
  278.        NoKey, 
  279.        sizeof(Permission) << 3,
  280.        1,
  281.        UnSigned,
  282.        MMBased,
  283.        NotNullAttribute );
  284.   if( check == -1 ) 
  285.     error_handler("createAttribute (group insert)", 
  286.   MySchemaTransaction->getNdbError(), 0);
  287.   check = MySchemaOp->createAttribute( GROUP_ALLOW_DELETE,
  288.        NoKey, 
  289.        sizeof(Permission) << 3,
  290.        1,
  291.        UnSigned,
  292.        MMBased,
  293.        NotNullAttribute );
  294.   if( check == -1 ) 
  295.     error_handler("createAttribute (group delete)", 
  296.   MySchemaTransaction->getNdbError(), 0);
  297.   
  298.   if( MySchemaTransaction->execute() == -1 ) {
  299.     error_handler("schemaTransaction->execute()", 
  300.   MySchemaTransaction->getNdbError(), 0);
  301.   }    
  302.   NdbSchemaCon::closeSchemaTrans(MySchemaTransaction);
  303.   return 0;
  304. }
  305. int
  306. create_table_subscriber(Ndb * pNdb){
  307.   int check;
  308.   NdbSchemaCon * MySchemaTransaction = NdbSchemaCon::startSchemaTrans(pNdb);
  309.   if( MySchemaTransaction == NULL )
  310.     error_handler("startSchemaTransaction", pNdb->getNdbError(), 0);
  311.   
  312.   NdbSchemaOp * MySchemaOp = MySchemaTransaction->getNdbSchemaOp();
  313.   if( MySchemaOp == NULL ) 
  314.     error_handler("getNdbSchemaOp", MySchemaTransaction->getNdbError(), 0);
  315.   
  316.   // Create table
  317.   check = MySchemaOp->createTable( SUBSCRIBER_TABLE,
  318.    8,       // Table size
  319.    TupleKey, // Key Type
  320.    1 // Nr of Pages
  321.    ,DistributionGroup,
  322.    6,
  323.    78,
  324.    80,
  325.    1,
  326.    useTableLogging
  327.                                    );
  328.   if( check == -1 ) 
  329.     error_handler("createTable", MySchemaTransaction->getNdbError(), 0);
  330.   
  331.   // Create first column, primary key 
  332.   check = MySchemaOp->createAttribute
  333.     ( SUBSCRIBER_NUMBER,
  334.       TupleKey, 
  335.       sizeof(char) << 3,
  336.       SUBSCRIBER_NUMBER_LENGTH,
  337.       String, 
  338.       MMBased,
  339.       NotNullAttribute,
  340.       NormalStorageAttribute,
  341.       0,
  342.       1,
  343.       16);
  344.   if( check == -1 ) 
  345.     error_handler("createAttribute (subscriber number)", 
  346.   MySchemaTransaction->getNdbError(), 0);
  347.   
  348.   check = MySchemaOp->createAttribute( SUBSCRIBER_NAME,
  349.        NoKey, 
  350.        sizeof(char) << 3,
  351.        SUBSCRIBER_NAME_LENGTH,
  352.        String, 
  353.        MMBased,
  354.        NotNullAttribute );
  355.   if( check == -1 ) 
  356.     error_handler("createAttribute (subscriber name)", 
  357.   MySchemaTransaction->getNdbError(), 0);
  358.   
  359.   check = MySchemaOp->createAttribute( SUBSCRIBER_GROUP,
  360.        NoKey, 
  361.        sizeof(GroupId) << 3,
  362.        1,
  363.        UnSigned,
  364.        MMBased,
  365.        NotNullAttribute );
  366.   if( check == -1 ) 
  367.     error_handler("createAttribute (subscriber_group)", 
  368.   MySchemaTransaction->getNdbError(), 0);
  369.   
  370.   check = MySchemaOp->createAttribute( SUBSCRIBER_LOCATION,
  371.        NoKey, 
  372.        sizeof(Location) << 3,
  373.        1,
  374.        UnSigned,
  375.        MMBased,
  376.        NotNullAttribute );
  377.   if( check == -1 ) 
  378.     error_handler("createAttribute (server reads)", 
  379.   MySchemaTransaction->getNdbError(), 0);
  380.   check = MySchemaOp->createAttribute( SUBSCRIBER_SESSIONS,
  381.        NoKey, 
  382.        sizeof(ActiveSessions) << 3,
  383.        1,
  384.        UnSigned,
  385.        MMBased,
  386.        NotNullAttribute );
  387.   if( check == -1 ) 
  388.     error_handler("createAttribute (subscriber_sessions)", 
  389.   MySchemaTransaction->getNdbError(), 0);
  390.   check = MySchemaOp->createAttribute( SUBSCRIBER_CHANGED_BY,
  391.        NoKey, 
  392.        sizeof(char) << 3,
  393.        CHANGED_BY_LENGTH,
  394.        String,
  395.        MMBased,
  396.        NotNullAttribute );
  397.   if( check == -1 ) 
  398.     error_handler("createAttribute (subscriber_changed_by)", 
  399.   MySchemaTransaction->getNdbError(), 0);
  400.   check = MySchemaOp->createAttribute( SUBSCRIBER_CHANGED_TIME,
  401.        NoKey, 
  402.        sizeof(char) << 3,
  403.        CHANGED_TIME_LENGTH,
  404.        String,
  405.        MMBased,
  406.        NotNullAttribute );
  407.   if( check == -1 ) 
  408.     error_handler("createAttribute (subscriber_changed_time)", 
  409.   MySchemaTransaction->getNdbError(), 0);
  410.   
  411.   if( MySchemaTransaction->execute() == -1 ) {
  412.     error_handler("schemaTransaction->execute()", 
  413.   MySchemaTransaction->getNdbError(), 0);
  414.   }    
  415.   NdbSchemaCon::closeSchemaTrans(MySchemaTransaction);
  416.   return 0;
  417. }
  418. int
  419. create_table_session(Ndb * pNdb){
  420.   int check;
  421.   NdbSchemaCon * MySchemaTransaction = NdbSchemaCon::startSchemaTrans(pNdb);
  422.   if( MySchemaTransaction == NULL )
  423.     error_handler("startSchemaTransaction", pNdb->getNdbError(), 0);
  424.   
  425.   NdbSchemaOp * MySchemaOp = MySchemaTransaction->getNdbSchemaOp();
  426.   if( MySchemaOp == NULL ) 
  427.     error_handler("getNdbSchemaOp", 
  428.   MySchemaTransaction->getNdbError(), 0);
  429.   
  430.   // Create table
  431.   check = MySchemaOp->createTable( SESSION_TABLE,
  432.    8,       // Table size
  433.    TupleKey, // Key Type
  434.    1 // Nr of Pages
  435.    ,DistributionGroup,
  436.    6,
  437.    78,
  438.    80,
  439.    1,
  440.    useTableLogging
  441.                                    );
  442.   if( check == -1 ) 
  443.     error_handler("createTable", MySchemaTransaction->getNdbError(), 0);
  444.   
  445.   check = MySchemaOp->createAttribute( SESSION_SUBSCRIBER,
  446.        TupleKey, 
  447.        sizeof(char) << 3,
  448.        SUBSCRIBER_NUMBER_LENGTH,
  449.        String, 
  450.        MMBased,
  451.        NotNullAttribute,
  452.        NormalStorageAttribute,
  453.        0,
  454.        1,
  455.        16);
  456.   if( check == -1 ) 
  457.     error_handler("createAttribute (session_subscriber)", 
  458.   MySchemaTransaction->getNdbError(), 0);
  459.   // Create first column, primary key 
  460.   check = MySchemaOp->createAttribute( SESSION_SERVER,
  461.        TupleKey, 
  462.        sizeof(ServerId) << 3,
  463.        1,
  464.        UnSigned,
  465.        MMBased,
  466.        NotNullAttribute );
  467.   if( check == -1 ) 
  468.     error_handler("createAttribute (session_server)", 
  469.   MySchemaTransaction->getNdbError(), 0);
  470.   check = MySchemaOp->createAttribute( SESSION_DATA,
  471.        NoKey, 
  472.        sizeof(char) << 3,
  473.        SESSION_DETAILS_LENGTH,
  474.        String, 
  475.        MMBased,
  476.        NotNullAttribute );
  477.   if( check == -1 ) 
  478.     error_handler("createAttribute (session_data)", 
  479.   MySchemaTransaction->getNdbError(), 0);
  480.   
  481.   if( MySchemaTransaction->execute() == -1 ) {
  482.     error_handler("schemaTransaction->execute()", 
  483.   MySchemaTransaction->getNdbError(), 0);
  484.   }    
  485.   NdbSchemaCon::closeSchemaTrans(MySchemaTransaction);
  486.   return 0;
  487. }
  488. void 
  489. create_table(const char * name, int (* function)(Ndb * pNdb), Ndb* pNdb){
  490.   printf("creating table %s...", name);
  491.   if(pNdb->getDictionary()->getTable(name) != 0){
  492.     printf(" it already existsn");
  493.     return;
  494.   } else {
  495.     printf("n");
  496.   }
  497.   function(pNdb);
  498.   printf("creating table %s... donen", name);
  499. }
  500. static int dbCreate(Ndb * pNdb)
  501. {
  502.   create_table(SUBSCRIBER_TABLE, create_table_subscriber, pNdb);
  503.   create_table(GROUP_TABLE     , create_table_group, pNdb);
  504.   create_table(SESSION_TABLE   , create_table_session, pNdb);
  505.   create_table(SERVER_TABLE    , create_table_server, pNdb);
  506.   return 0;
  507. }
  508. #ifndef NDB_WIN32
  509. #include <unistd.h>
  510. #endif
  511. UserHandle*
  512. userDbConnect(uint32 createDb, char *dbName)
  513. {
  514.   Ndb_cluster_connection *con= new Ndb_cluster_connection();
  515.   if(con->connect(12, 5, 1) != 0)
  516.   {
  517.     ndbout << "Unable to connect to management server." << endl;
  518.     return 0;
  519.   }
  520.   if (con->wait_until_ready(30,0) < 0)
  521.   {
  522.     ndbout << "Cluster nodes not ready in 30 seconds." << endl;
  523.     return 0;
  524.   }
  525.   Ndb * pNdb = new Ndb(con, dbName);
  526.   
  527.   //printf("Initializing...n");
  528.   pNdb->init();
  529.   
  530.   //printf("Waiting...");
  531.   while(pNdb->waitUntilReady() != 0){
  532.     //printf("...");
  533.   }
  534.   //  printf("donen");
  535.   
  536.   if( createDb )
  537.     dbCreate(pNdb);
  538.   
  539.   UserHandle * uh = new UserHandle;
  540.   uh->pNCC       = con;
  541.   uh->pNDB       = pNdb;
  542.   uh->pCurrTrans = 0;
  543.   return uh;
  544. }
  545. void userDbDisconnect(UserHandle *uh)
  546. {
  547.   delete uh;
  548. }
  549. int userDbInsertServer(UserHandle       *uh,
  550.                        ServerId         serverId,
  551.                SubscriberSuffix suffix,
  552.                ServerName       name)
  553. {
  554.   int check;
  555.   uint32 noOfRead   = 0;
  556.   uint32 noOfInsert = 0;
  557.   uint32 noOfDelete = 0;
  558.   NdbConnection * MyTransaction = 0;
  559.   if(uh->pCurrTrans != 0){
  560.     MyTransaction = uh->pCurrTrans;
  561.   } else {
  562.     uh->pCurrTrans = MyTransaction = uh->pNDB->startTransaction();
  563.   }
  564.   if (MyTransaction == NULL)   
  565.     error_handler("startTranscation", uh->pNDB->getNdbError(), 0);
  566.   
  567.   NdbOperation *MyOperation = MyTransaction->getNdbOperation(SERVER_TABLE);
  568.   CHECK_NULL(MyOperation, "getNdbOperation", MyTransaction);
  569.   
  570.   check = MyOperation->insertTuple();
  571.   CHECK_MINUS_ONE(check, "insert tuple", MyTransaction);  
  572.   
  573.   check = MyOperation->equal(SERVER_ID, (char*)&serverId);
  574.   CHECK_MINUS_ONE(check, "setValue id", MyTransaction);  
  575.   
  576.   check = MyOperation->setValue(SERVER_SUBSCRIBER_SUFFIX, suffix);
  577.   CHECK_MINUS_ONE(check, "setValue suffix", MyTransaction);  
  578.   check = MyOperation->setValue(SERVER_NAME, name);
  579.   CHECK_MINUS_ONE(check, "setValue name", MyTransaction);  
  580.   check = MyOperation->setValue(SERVER_READS, (char*)&noOfRead);
  581.   CHECK_MINUS_ONE(check, "setValue reads", MyTransaction);  
  582.   check = MyOperation->setValue(SERVER_INSERTS, (char*)&noOfInsert);
  583.   CHECK_MINUS_ONE(check, "setValue inserts", MyTransaction);  
  584.   check = MyOperation->setValue(SERVER_DELETES, (char*)&noOfDelete);
  585.   CHECK_MINUS_ONE(check, "setValue deletes", MyTransaction);  
  586.   return 0;
  587. }
  588. int userDbInsertSubscriber(UserHandle      *uh,
  589.                    SubscriberNumber number,
  590.                            uint32           groupId,
  591.                    SubscriberName   name)
  592. {
  593.   int check;
  594.   uint32 activeSessions = 0;
  595.   Location l = 0;
  596.   ChangedBy changedBy; snprintf(changedBy, sizeof(changedBy), "ChangedBy");
  597.   ChangedTime changedTime; snprintf(changedTime, sizeof(changedTime), "ChangedTime"); 
  598.   NdbConnection * MyTransaction = 0;
  599.   if(uh->pCurrTrans != 0){
  600.     MyTransaction = uh->pCurrTrans;
  601.   } else {
  602.     uh->pCurrTrans = MyTransaction = uh->pNDB->startTransaction();
  603.   }
  604.   if (MyTransaction == NULL)   
  605.     error_handler("startTranscation", uh->pNDB->getNdbError(), 0);
  606.   
  607.   NdbOperation *MyOperation = MyTransaction->getNdbOperation(SUBSCRIBER_TABLE);
  608.   CHECK_NULL(MyOperation, "getNdbOperation", MyTransaction);
  609.   
  610.   check = MyOperation->insertTuple();
  611.   CHECK_MINUS_ONE(check, "insertTuple", MyTransaction);
  612.   
  613.   check = MyOperation->equal(SUBSCRIBER_NUMBER, number);
  614.   CHECK_MINUS_ONE(check, "equal", MyTransaction);
  615.   check = MyOperation->setValue(SUBSCRIBER_NAME, name);
  616.   CHECK_MINUS_ONE(check, "setValue name", MyTransaction);
  617.   check = MyOperation->setValue(SUBSCRIBER_GROUP, (char*)&groupId);
  618.   CHECK_MINUS_ONE(check, "setValue group", MyTransaction);
  619.   check = MyOperation->setValue(SUBSCRIBER_LOCATION, (char*)&l);
  620.   CHECK_MINUS_ONE(check, "setValue location", MyTransaction);
  621.   check = MyOperation->setValue(SUBSCRIBER_SESSIONS, (char*)&activeSessions);
  622.   CHECK_MINUS_ONE(check, "setValue sessions", MyTransaction);
  623.   check = MyOperation->setValue(SUBSCRIBER_CHANGED_BY, changedBy);
  624.   CHECK_MINUS_ONE(check, "setValue changedBy", MyTransaction);
  625.   check = MyOperation->setValue(SUBSCRIBER_CHANGED_TIME, changedTime);
  626.   CHECK_MINUS_ONE(check, "setValue changedTime", MyTransaction);
  627.   return 0;
  628. }
  629. int userDbInsertGroup(UserHandle *uh,
  630.       GroupId    groupId, 
  631.       GroupName  name,
  632.       Permission allowRead,
  633.       Permission allowInsert,
  634.       Permission allowDelete)
  635. {
  636.   int check;
  637.   
  638.   NdbConnection * MyTransaction = 0;
  639.   if(uh->pCurrTrans != 0){
  640.     MyTransaction = uh->pCurrTrans;
  641.   } else {
  642.     uh->pCurrTrans = MyTransaction = uh->pNDB->startTransaction();
  643.   }
  644.   if (MyTransaction == NULL)   
  645.     error_handler("startTranscation", uh->pNDB->getNdbError(), 0);
  646.   NdbOperation *MyOperation = MyTransaction->getNdbOperation(GROUP_TABLE);
  647.   CHECK_NULL(MyOperation, "getNdbOperation", MyTransaction);  
  648.   
  649.   check = MyOperation->insertTuple();
  650.   CHECK_MINUS_ONE(check, "insertTuple", MyTransaction);  
  651.   
  652.   check = MyOperation->equal(GROUP_ID, (char*)&groupId);
  653.   CHECK_MINUS_ONE(check, "equal", MyTransaction);  
  654.   
  655.   check = MyOperation->setValue(GROUP_NAME, name);
  656.   CHECK_MINUS_ONE(check, "setValue name", MyTransaction);  
  657.   check = MyOperation->setValue(GROUP_ALLOW_READ, (char*)&allowRead);
  658.   CHECK_MINUS_ONE(check, "setValue allowRead", MyTransaction);  
  659.   check = MyOperation->setValue(GROUP_ALLOW_INSERT, (char*)&allowInsert);
  660.   CHECK_MINUS_ONE(check, "setValue allowInsert", MyTransaction);  
  661.   check = MyOperation->setValue(GROUP_ALLOW_DELETE, (char*)&allowDelete);
  662.   CHECK_MINUS_ONE(check, "setValue allowDelete", MyTransaction);  
  663.   
  664.   return 0;
  665. }