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

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. //  ndbapi_example1.cpp: Using synchronous transactions in NDB API
  15. //
  16. //  Correct output from this program is:
  17. //
  18. //  ATTR1 ATTR2
  19. //    0    10
  20. //    1     1
  21. //    2    12
  22. //  Detected that deleted tuple doesn't exist!
  23. //    4    14
  24. //    5     5
  25. //    6    16
  26. //    7     7
  27. //    8    18
  28. //    9     9
  29. #include <NdbApi.hpp>
  30. // Used for cout
  31. #include <stdio.h>
  32. #include <iostream>
  33. #define APIERROR(error) 
  34.   { std::cout << "Error in " << __FILE__ << ", line:" << __LINE__ << ", code:" 
  35.               << error.code << ", msg: " << error.message << "." << std::endl; 
  36.     exit(-1); }
  37. int main()
  38. {
  39.   ndb_init();
  40.   Ndb* myNdb = new Ndb( "TEST_DB_1" );  // Object representing the database
  41.   NdbDictionary::Table myTable;
  42.   NdbDictionary::Column myColumn;
  43.   NdbConnection  *myConnection;         // For other transactions
  44.   NdbOperation  *myOperation;          // For other operations
  45.   NdbRecAttr     *myRecAttr;            // Result of reading attribute value
  46.   
  47.   /********************************************
  48.    * Initialize NDB and wait until it's ready *
  49.    ********************************************/
  50.   if (myNdb->init() == -1) { 
  51.     APIERROR(myNdb->getNdbError());
  52.     exit(-1);
  53.   }
  54.   if (myNdb->waitUntilReady(30) != 0) {
  55.     std::cout << "NDB was not ready within 30 secs." << std::endl;
  56.     exit(-1);
  57.   }
  58.   
  59.   NdbDictionary::Dictionary* myDict = myNdb->getDictionary();
  60.   
  61.   /*********************************************************
  62.    * Create a table named MYTABLENAME if it does not exist *
  63.    *********************************************************/
  64.   if (myDict->getTable("MYTABLENAME") != NULL) {
  65.     std::cout << "NDB already has example table: MYTABLENAME." << std::endl; 
  66.     exit(-1);
  67.   } 
  68.   myTable.setName("MYTABLENAME");
  69.   
  70.   myColumn.setName("ATTR1");
  71.   myColumn.setType(NdbDictionary::Column::Unsigned);
  72.   myColumn.setLength(1);
  73.   myColumn.setPrimaryKey(true);
  74.   myColumn.setNullable(false);
  75.   myTable.addColumn(myColumn);
  76.   myColumn.setName("ATTR2");
  77.   myColumn.setType(NdbDictionary::Column::Unsigned);
  78.   myColumn.setLength(1);
  79.   myColumn.setPrimaryKey(false);
  80.   myColumn.setNullable(false);
  81.   myTable.addColumn(myColumn);
  82.   if (myDict->createTable(myTable) == -1) 
  83.       APIERROR(myDict->getNdbError());
  84.   /**************************************************************************
  85.    * Using 5 transactions, insert 10 tuples in table: (0,0),(1,1),...,(9,9) *
  86.    **************************************************************************/
  87.   for (int i = 0; i < 5; i++) {
  88.     myConnection = myNdb->startTransaction();
  89.     if (myConnection == NULL) APIERROR(myNdb->getNdbError());
  90.     
  91.     myOperation = myConnection->getNdbOperation("MYTABLENAME");
  92.     if (myOperation == NULL) APIERROR(myConnection->getNdbError());
  93.     
  94.     myOperation->insertTuple();
  95.     myOperation->equal("ATTR1", i);
  96.     myOperation->setValue("ATTR2", i);
  97.     myOperation = myConnection->getNdbOperation("MYTABLENAME");
  98.     if (myOperation == NULL) APIERROR(myConnection->getNdbError());
  99.     myOperation->insertTuple();
  100.     myOperation->equal("ATTR1", i+5);
  101.     myOperation->setValue("ATTR2", i+5);
  102.     
  103.     if (myConnection->execute( Commit ) == -1)
  104.       APIERROR(myConnection->getNdbError());
  105.     
  106.     myNdb->closeTransaction(myConnection);
  107.   }
  108.   
  109.   /*****************************************************************
  110.    * Update the second attribute in half of the tuples (adding 10) *
  111.    *****************************************************************/
  112.   for (int i = 0; i < 10; i+=2) {
  113.     myConnection = myNdb->startTransaction();
  114.     if (myConnection == NULL) APIERROR(myNdb->getNdbError());
  115.     
  116.     myOperation = myConnection->getNdbOperation("MYTABLENAME");
  117.     if (myOperation == NULL) APIERROR(myConnection->getNdbError());
  118.     
  119.     myOperation->updateTuple();
  120.     myOperation->equal( "ATTR1", i );
  121.     myOperation->setValue( "ATTR2", i+10);
  122.     
  123.     if( myConnection->execute( Commit ) == -1 ) 
  124.       APIERROR(myConnection->getNdbError());
  125.     
  126.     myNdb->closeTransaction(myConnection);
  127.   }
  128.   
  129.   /*************************************************
  130.    * Delete one tuple (the one with primary key 3) *
  131.    *************************************************/
  132.   myConnection = myNdb->startTransaction();
  133.   if (myConnection == NULL) APIERROR(myNdb->getNdbError());
  134.   
  135.   myOperation = myConnection->getNdbOperation("MYTABLENAME");
  136.   if (myOperation == NULL) 
  137.     APIERROR(myConnection->getNdbError());
  138.   
  139.   myOperation->deleteTuple();
  140.   myOperation->equal( "ATTR1", 3 );
  141.   
  142.   if (myConnection->execute(Commit) == -1) 
  143.     APIERROR(myConnection->getNdbError());
  144.   
  145.   myNdb->closeTransaction(myConnection);
  146.   
  147.   /*****************************
  148.    * Read and print all tuples *
  149.    *****************************/
  150.   std::cout << "ATTR1 ATTR2" << std::endl;
  151.   
  152.   for (int i = 0; i < 10; i++) {
  153.     myConnection = myNdb->startTransaction();
  154.     if (myConnection == NULL) APIERROR(myNdb->getNdbError());
  155.     
  156.     myOperation = myConnection->getNdbOperation("MYTABLENAME");
  157.     if (myOperation == NULL) APIERROR(myConnection->getNdbError());
  158.     
  159.     myOperation->readTuple();
  160.     myOperation->equal("ATTR1", i);
  161.     
  162.     myRecAttr = myOperation->getValue("ATTR2", NULL);
  163.     if (myRecAttr == NULL) APIERROR(myConnection->getNdbError());
  164.     
  165.     if(myConnection->execute( Commit ) == -1)
  166.       if (i == 3) {
  167. std::cout << "Detected that deleted tuple doesn't exist!" << std::endl;
  168.       } else {
  169. APIERROR(myConnection->getNdbError());
  170.       }
  171.     
  172.     if (i != 3) {
  173.       printf(" %2d    %2dn", i, myRecAttr->u_32_value());
  174.     }
  175.     myNdb->closeTransaction(myConnection);
  176.   }
  177.   delete myNdb;
  178. }