select_all.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. //  select_all.cpp:  Prints all rows of a table
  15. //
  16. //  Usage:  select_all <table_name>+
  17. #include <NdbApi.hpp>
  18.  
  19. // Used for cout
  20. #include <iostream>
  21. using namespace std;
  22. #include <stdio.h>
  23. #include <string.h>
  24. #define APIERROR(error) 
  25.   { cout << "Error in " << __FILE__ << ", line:" << __LINE__ << ", code:" 
  26.          << error.code << ", msg: " << error.message << "." << endl; 
  27.     exit(-1); }
  28. void usage(const char* prg) {
  29.   cout << "Usage: " << prg << " <table name>" << endl;
  30.   cout << "Prints all rows of table named <table name>" << endl;
  31.   exit(0);
  32. }
  33. /*****************************************************************************
  34.  *************************** Result Set Container ****************************
  35.  *****************************************************************************/
  36. /*
  37.  * Container of NdbRecAttr objects.
  38.  * (NdbRecAttr objects are database rows read by a scan operation.)
  39.  */
  40. class ResultSetContainer {
  41. public:
  42.   /**
  43.    * Initialize ResultSetContainer object for table named <tableName>
  44.    * - Allocates memory 
  45.    * - Fetches attribute names from NDB Cluster
  46.    */
  47.   void init(NdbDictionary::Dictionary* dict, const char* tableName);
  48.   
  49.   /**
  50.    * Get no of attributes for stored NdbRecAttr objects
  51.    */
  52.   int getNoOfAttributes() const;
  53.   /**
  54.    * Get NdbRecAttr object no i
  55.    */
  56.   NdbRecAttr* & getAttrStore(int i);
  57.   /**
  58.    * Get attribute name of attribute no i
  59.    */
  60.   const char*  getAttrName(int i) const;
  61.   
  62.   /**
  63.    * Print header of rows
  64.    */
  65.   void header() const;
  66. private:
  67.   int         m_cols;      // No of attributes for stored NdbRecAttr objects
  68.   char        **m_names;   // Names of attributes
  69.   NdbRecAttr  **m_data;    // The actual stored NdbRecAttr objects
  70. };
  71. void ResultSetContainer::init(NdbDictionary::Dictionary * dict, 
  72.       const char* tableName) 
  73. {
  74.   // Get Table object from NDB (this contains metadata about all tables)
  75.   const NdbDictionary::Table * tab = dict->getTable(tableName);
  76.   
  77.   // Get table id of the table we are interested in
  78.   if (tab == 0) APIERROR(dict->getNdbError()); // E.g. table didn't exist
  79.   
  80.   // Get no of attributes and allocate memory
  81.   m_cols = tab->getNoOfColumns();
  82.   m_names = new char*       [m_cols];
  83.   m_data  = new NdbRecAttr* [m_cols];
  84.   
  85.   // Store all attribute names for the table
  86.   for (int i = 0; i < m_cols; i++) {
  87.     m_names[i] = new char[255];
  88.     BaseString::snprintf(m_names[i], 255, "%s", tab->getColumn(i)->getName());
  89.   }
  90. }
  91. int          ResultSetContainer::getNoOfAttributes() const {return m_cols;}
  92. NdbRecAttr*& ResultSetContainer::getAttrStore(int i)       {return m_data[i];}
  93. const char*  ResultSetContainer::getAttrName(int i) const  {return m_names[i];}
  94. /*****************************************************************************
  95.  **********************************  MAIN  ***********************************
  96.  *****************************************************************************/
  97. int main(int argc, const char** argv) 
  98. {
  99.   ndb_init();
  100.   Ndb* myNdb = new Ndb("ndbapi_example4"); // Object representing the database
  101.   NdbConnection* myNdbConnection;          // For transactions
  102.   NdbOperation* myNdbOperation;            // For operations
  103.   int check;
  104.   if (argc != 2) {
  105.     usage(argv[0]);
  106.     exit(0);
  107.   }
  108.   const char* tableName = argv[1];
  109.   /*******************************************
  110.    * Initialize NDB and wait until its ready *
  111.    *******************************************/
  112.   if (myNdb->init() == -1) { 
  113.     APIERROR(myNdb->getNdbError());
  114.     exit(-1);
  115.   }
  116.   if (myNdb->waitUntilReady(30) != 0) {
  117.     cout << "NDB was not ready within 30 secs." << endl;
  118.     exit(-1);
  119.   }
  120.   /***************************
  121.    * Define and execute scan *
  122.    ***************************/
  123.   cout << "Select * from " << tableName << endl;
  124.   ResultSetContainer * container = new ResultSetContainer;
  125.   container->init(myNdb->getDictionary(), tableName);
  126.   
  127.   myNdbConnection = myNdb->startTransaction();
  128.   if (myNdbConnection == NULL) APIERROR(myNdb->getNdbError());
  129.   
  130.   myNdbOperation = myNdbConnection->getNdbOperation(tableName);
  131.   if (myNdbOperation == NULL) APIERROR(myNdbConnection->getNdbError());
  132.   
  133.   // Define the operation to be an 'openScanRead' operation.
  134.   check = myNdbOperation->openScanRead(1); 
  135.   if (check == -1) APIERROR(myNdbConnection->getNdbError());
  136.   
  137.   // Set interpreted program to just be the single instruction 
  138.   // 'interpret_exit_ok'.  (This approves all rows of the table.)
  139.   if (myNdbOperation->interpret_exit_ok() == -1) 
  140.     APIERROR(myNdbConnection->getNdbError());
  141.   
  142.   // Get all attribute values of the row
  143.   for(int i = 0; i < container->getNoOfAttributes(); i++){
  144.     if((container->getAttrStore(i) = 
  145. myNdbOperation->getValue(container->getAttrName(i))) == 0) 
  146.       APIERROR(myNdbConnection->getNdbError());
  147.   }
  148.   // Execute scan operation
  149.   check = myNdbConnection->executeScan();               
  150.   if (check == -1) APIERROR(myNdbConnection->getNdbError());
  151.   
  152.   /****************
  153.    * Print header *
  154.    ****************/
  155.   for (int i = 0; i < container->getNoOfAttributes(); i++) 
  156.     cout << container->getAttrName(i) << "t";
  157.   
  158.   cout << endl;
  159.   for (int i = 0; i < container->getNoOfAttributes(); i++) {
  160.     for (int j = strlen(container->getAttrName(i)); j > 0; j--)
  161.       cout << "-";
  162.     cout << "t";
  163.   }
  164.   cout << "n";
  165.   /**************
  166.    * Scan table *
  167.    **************/
  168.   int eof;
  169.   int rows = 0;
  170.   // Print all rows of table
  171.   while ((eof = myNdbConnection->nextScanResult()) == 0) {
  172.     rows++;
  173.     
  174.     for (int i = 0; i < container->getNoOfAttributes(); i++) {
  175.       if (container->getAttrStore(i)->isNULL()) {
  176. cout << "NULL";
  177.       } else {
  178. // Element size of value (No of bits per element in attribute value)
  179. const int  size = container->getAttrStore(i)->attrSize();
  180. // No of elements in an array attribute (Is 1 if non-array attribute)
  181. const int aSize = container->getAttrStore(i)->arraySize();
  182. switch(container->getAttrStore(i)->attrType()){
  183. case UnSigned:
  184.   switch(size) {
  185.   case 8: cout << container->getAttrStore(i)->u_64_value(); break;
  186.   case 4: cout << container->getAttrStore(i)->u_32_value(); break;
  187.   case 2: cout << container->getAttrStore(i)->u_short_value(); break;
  188.   case 1: cout << (unsigned) container->getAttrStore(i)->u_char_value();
  189.     break;
  190.   default: cout << "Unknown size" << endl;
  191.   }
  192.   break;
  193.   
  194. case Signed:
  195.   switch(size) {
  196.   case 8: cout << container->getAttrStore(i)->int64_value(); break;
  197.   case 4: cout << container->getAttrStore(i)->int32_value(); break;
  198.   case 2: cout << container->getAttrStore(i)->short_value(); break;
  199.   case 1: cout << (int) container->getAttrStore(i)->char_value(); break;
  200.   default: cout << "Unknown size" << endl;
  201.   }
  202.   break;
  203.   
  204. case String:
  205.   {
  206.     char* buf = new char[aSize+1];
  207.     memcpy(buf, container->getAttrStore(i)->aRef(), aSize);
  208.     buf[aSize] = 0;
  209.     cout << buf;
  210.     delete [] buf;
  211.   }
  212.   break;
  213.   
  214. case Float:
  215.   cout << container->getAttrStore(i)->float_value();
  216.   break;
  217.   
  218. default:
  219.   cout << "Unknown";
  220.   break;
  221. }
  222.       }
  223.       cout << "t";
  224.     }
  225.     cout << endl;
  226.   }
  227.   if (eof == -1) APIERROR(myNdbConnection->getNdbError());
  228.   
  229.   myNdb->closeTransaction(myNdbConnection);
  230.   
  231.   cout << "Selected " << rows << " rows." << endl;
  232. }