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

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_example4.cpp: Using secondary indexes 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.   NdbDictionary::Index myIndex;
  44.   NdbConnection   *myConnection;     // For transactions
  45.   NdbOperation   *myOperation;      // For primary key operations
  46.   NdbIndexOperation *myIndexOperation; // For index operations
  47.   NdbRecAttr      *myRecAttr;        // Result of reading attribute value
  48.   
  49.   /********************************************
  50.    * Initialize NDB and wait until it's ready *
  51.    ********************************************/
  52.   if (myNdb->init() == -1) { 
  53.     APIERROR(myNdb->getNdbError());
  54.     exit(-1);
  55.   }
  56.   if (myNdb->waitUntilReady(30) != 0) {
  57.     std::cout << "NDB was not ready within 30 secs." << std::endl;
  58.     exit(-1);
  59.   }
  60.   
  61.   /*********************************************************
  62.    * Create a table named MYTABLENAME if it does not exist *
  63.    *********************************************************/
  64.   NdbDictionary::Dictionary* myDict = myNdb->getDictionary();
  65.   if (myDict->getTable("MYTABLENAME") != NULL) {
  66.     std::cout << "NDB already has example table: MYTABLENAME." << std::endl; 
  67.     exit(-1);
  68.   } 
  69.   myTable.setName("MYTABLENAME");
  70.   
  71.   myColumn.setName("ATTR1");
  72.   myColumn.setType(NdbDictionary::Column::Unsigned);
  73.   myColumn.setLength(1);
  74.   myColumn.setPrimaryKey(true);
  75.   myColumn.setNullable(false);
  76.   myTable.addColumn(myColumn);
  77.   myColumn.setName("ATTR2");
  78.   myColumn.setType(NdbDictionary::Column::Unsigned);
  79.   myColumn.setLength(1);
  80.   myColumn.setPrimaryKey(false);
  81.   myColumn.setNullable(false);
  82.   myTable.addColumn(myColumn);
  83.   if (myDict->createTable(myTable) == -1) 
  84.       APIERROR(myDict->getNdbError());
  85.   /**********************************************************
  86.    * Create an index named MYINDEXNAME if it does not exist *
  87.    **********************************************************/
  88.   if (myDict->getIndex("MYINDEXNAME", "MYTABLENAME") != NULL) {
  89.     std::cout << "NDB already has example index: MYINDEXNAME." << std::endl; 
  90.     exit(-1);
  91.   } 
  92.   myIndex.setName("MYINDEXNAME");
  93.   myIndex.setTable("MYTABLENAME");
  94.   myIndex.setType(NdbDictionary::Index::UniqueHashIndex);
  95.   const char* attr_arr[] = {"ATTR2"};
  96.   myIndex.addIndexColumns(1, attr_arr);
  97.   if (myDict->createIndex(myIndex) == -1) 
  98.       APIERROR(myDict->getNdbError());
  99.   /**************************************************************************
  100.    * Using 5 transactions, insert 10 tuples in table: (0,0),(1,1),...,(9,9) *
  101.    **************************************************************************/
  102.   for (int i = 0; i < 5; i++) {
  103.     myConnection = myNdb->startTransaction();
  104.     if (myConnection == NULL) APIERROR(myNdb->getNdbError());
  105.     
  106.     myOperation = myConnection->getNdbOperation("MYTABLENAME");
  107.     if (myOperation == NULL) APIERROR(myConnection->getNdbError());
  108.     
  109.     myOperation->insertTuple();
  110.     myOperation->equal("ATTR1", i);
  111.     myOperation->setValue("ATTR2", i);
  112.     myOperation = myConnection->getNdbOperation("MYTABLENAME");
  113.     if (myOperation == NULL) APIERROR(myConnection->getNdbError());
  114.     myOperation->insertTuple();
  115.     myOperation->equal("ATTR1", i+5);
  116.     myOperation->setValue("ATTR2", i+5);
  117.     
  118.     if (myConnection->execute( Commit ) == -1)
  119.       APIERROR(myConnection->getNdbError());
  120.     
  121.     myNdb->closeTransaction(myConnection);
  122.   }
  123.   
  124.   /*****************************************
  125.    * Read and print all tuples using index *
  126.    *****************************************/
  127.   std::cout << "ATTR1 ATTR2" << std::endl;
  128.   
  129.   for (int i = 0; i < 10; i++) {
  130.     myConnection = myNdb->startTransaction();
  131.     if (myConnection == NULL) APIERROR(myNdb->getNdbError());
  132.     
  133.     myIndexOperation = myConnection->getNdbIndexOperation("MYINDEXNAME",
  134.   "MYTABLENAME");
  135.     if (myIndexOperation == NULL) APIERROR(myConnection->getNdbError());
  136.     
  137.     myIndexOperation->readTuple();
  138.     myIndexOperation->equal("ATTR2", i);
  139.     
  140.     myRecAttr = myIndexOperation->getValue("ATTR1", NULL);
  141.     if (myRecAttr == NULL) APIERROR(myConnection->getNdbError());
  142.     if(myConnection->execute( Commit ) != -1)
  143.       printf(" %2d    %2dn", myRecAttr->u_32_value(), i);
  144.     }
  145.     myNdb->closeTransaction(myConnection);
  146.   /*****************************************************************
  147.    * Update the second attribute in half of the tuples (adding 10) *
  148.    *****************************************************************/
  149.   for (int i = 0; i < 10; i+=2) {
  150.     myConnection = myNdb->startTransaction();
  151.     if (myConnection == NULL) APIERROR(myNdb->getNdbError());
  152.     
  153.     myIndexOperation = myConnection->getNdbIndexOperation("MYINDEXNAME",
  154.   "MYTABLENAME");
  155.     if (myIndexOperation == NULL) APIERROR(myConnection->getNdbError());
  156.     
  157.     myIndexOperation->updateTuple();
  158.     myIndexOperation->equal( "ATTR2", i );
  159.     myIndexOperation->setValue( "ATTR2", i+10);
  160.     
  161.     if( myConnection->execute( Commit ) == -1 ) 
  162.       APIERROR(myConnection->getNdbError());
  163.     
  164.     myNdb->closeTransaction(myConnection);
  165.   }
  166.   
  167.   /*************************************************
  168.    * Delete one tuple (the one with primary key 3) *
  169.    *************************************************/
  170.   myConnection = myNdb->startTransaction();
  171.   if (myConnection == NULL) APIERROR(myNdb->getNdbError());
  172.   
  173.   myIndexOperation = myConnection->getNdbIndexOperation("MYINDEXNAME",
  174. "MYTABLENAME");
  175.   if (myIndexOperation == NULL) 
  176.     APIERROR(myConnection->getNdbError());
  177.   
  178.   myIndexOperation->deleteTuple();
  179.   myIndexOperation->equal( "ATTR2", 3 );
  180.   
  181.   if (myConnection->execute(Commit) == -1) 
  182.     APIERROR(myConnection->getNdbError());
  183.   
  184.   myNdb->closeTransaction(myConnection);
  185.   
  186.   /*****************************
  187.    * Read and print all tuples *
  188.    *****************************/
  189.   std::cout << "ATTR1 ATTR2" << std::endl;
  190.   
  191.   for (int i = 0; i < 10; i++) {
  192.     myConnection = myNdb->startTransaction();
  193.     if (myConnection == NULL) APIERROR(myNdb->getNdbError());
  194.     
  195.     myOperation = myConnection->getNdbOperation("MYTABLENAME");
  196.     if (myOperation == NULL) APIERROR(myConnection->getNdbError());
  197.     
  198.     myOperation->readTuple();
  199.     myOperation->equal("ATTR1", i);
  200.     
  201.     myRecAttr = myOperation->getValue("ATTR2", NULL);
  202.     if (myRecAttr == NULL) APIERROR(myConnection->getNdbError());
  203.     
  204.     if(myConnection->execute( Commit ) == -1)
  205.       if (i == 3) {
  206. std::cout << "Detected that deleted tuple doesn't exist!" << std::endl;
  207.       } else {
  208. APIERROR(myConnection->getNdbError());
  209.       }
  210.     
  211.     if (i != 3) {
  212.       printf(" %2d    %2dn", i, myRecAttr->u_32_value());
  213.     }
  214.     myNdb->closeTransaction(myConnection);
  215.   }
  216.   /**************
  217.    * Drop index *
  218.    **************/
  219.   if (myDict->dropIndex("MYINDEXNAME", "MYTABLENAME") == -1) 
  220.     APIERROR(myDict->getNdbError());
  221.   /**************
  222.    * Drop table *
  223.    **************/
  224.   if (myDict->dropTable("MYTABLENAME") == -1) 
  225.     APIERROR(myDict->getNdbError());
  226.   delete myNdb;
  227. }