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

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. #include <ndb_global.h>
  14. #include <NdbOut.hpp>
  15. #include <NdbSleep.h>
  16. #include <NDBT_Tables.hpp>
  17. #include <getarg.h>
  18. #include <NDBT.hpp>
  19. #include <Ndb.hpp>
  20. #include <NdbDictionary.hpp>
  21. //extern NdbOut g_info;
  22. int main(int argc, const char** argv)
  23. {
  24.   ndb_init();
  25.   int _row = 0;
  26.   int _hex = 0;
  27.   int _primaryKey = 0;
  28.   const char* _tableName = NULL;
  29.   struct getargs args[] = {
  30.     { "row", 'r', 
  31.       arg_integer, &_row, "The row number", "row" },
  32.     { "primarykey", 'p', 
  33.       arg_integer, &_primaryKey, "The primary key", "primarykey" },
  34.     { "hex", 'h', 
  35.       arg_flag, &_hex, "Print hex", "hex" }
  36.   };
  37.   int num_args = sizeof(args) / sizeof(args[0]);
  38.   int optind = 0, i;
  39.   if(getarg(args, num_args, argc, argv, &optind) || argv[optind] == NULL) {
  40.     arg_printusage(args, num_args, argv[0], "table namen");
  41.     return NDBT_WRONGARGS;
  42.   }
  43.   // Check if table name is supplied
  44.   if (argv[optind] != NULL) 
  45.     _tableName = argv[optind];
  46.   const NdbDictionary::Table* table = NDBT_Tables::getTable(_tableName);
  47.   //  const NDBT_Attribute* attribute = table->getAttribute(_column);
  48.   g_info << "Table " << _tableName << endl
  49.  << "Row: " << _row << ", PrimaryKey: " << _primaryKey
  50.  << endl;
  51.   Ndb* ndb = new Ndb("TEST_DB");
  52.   if (ndb->init() == 0 && ndb->waitUntilReady(30) == 0)
  53.   {
  54.     NdbConnection* conn = ndb->startTransaction();
  55.     if (conn == NULL)
  56.     {
  57.       g_info << "ERROR: " << ndb->getNdbError() << endl;
  58.       delete ndb;
  59.       return -1;
  60.     }
  61.     NdbOperation* op = conn->getNdbOperation(_tableName);
  62.     if (op == NULL)
  63.     {
  64.       g_info << "ERROR: " << conn->getNdbError() << endl;
  65.       delete ndb;
  66.       return -1;
  67.     }
  68.     op->readTuple();
  69.     NdbRecAttr** data = new NdbRecAttr*[table->getNoOfColumns()];
  70.     for (i = 0; i < table->getNoOfColumns(); i++)
  71.     {
  72.       const NdbDictionary::Column* c = table->getColumn(i);
  73.       if (c->getPrimaryKey())
  74.       {
  75. op->equal(c->getName(), _primaryKey);
  76. data[i] = op->getValue(c->getName(), NULL);
  77.       }
  78.       else
  79.       {
  80. data[i] = op->getValue(c->getName(), NULL);
  81.       }      
  82.     }
  83.     if (conn->execute(Commit) == 0)
  84.     {
  85.       // Print column names
  86.       for (i = 0; i < table->getNoOfColumns(); i++)
  87.       {
  88. const NdbDictionary::Column* c = table->getColumn(i);
  89. g_info 
  90.   << c->getName()
  91.   << "[" << c->getType() << "]   ";   
  92.       }
  93.       g_info << endl;
  94.       if (_hex)
  95.       {
  96. g_info << hex;
  97.       }
  98.       for (i = 0; i < table->getNoOfColumns(); i++)
  99.       {
  100. NdbRecAttr* a = data[i];
  101. switch(a->getType())
  102. {
  103. case NdbDictionary::Column::Char:
  104. case NdbDictionary::Column::Varchar:
  105. case NdbDictionary::Column::Binary:
  106. case NdbDictionary::Column::Varbinary:
  107. {
  108.   if (_hex)
  109.   {
  110.     char* b = a->aRef();
  111.     for (int j = 0; j < a->arraySize(); j++)
  112.     {
  113.       //ndbout_c("%x", b[j]);
  114.       g_info << hex << b[j] << "[" << dec << j << "]";
  115.     }
  116.   }
  117.   else
  118.   {
  119.     g_info << """ 
  120.    << a->aRef() << """;
  121.   }
  122.   g_info << "   ";
  123. }
  124. break;
  125. case NdbDictionary::Column::Int:
  126. case NdbDictionary::Column::Unsigned:
  127. {
  128.   g_info << a->int32_value() << "   ";
  129. }
  130. break;
  131. case NdbDictionary::Column::Bigint:
  132. case NdbDictionary::Column::Bigunsigned:
  133. {
  134.   g_info << a->int64_value() << "   ";
  135. }
  136. break;
  137. case NdbDictionary::Column::Float:
  138. {
  139.   g_info << a->float_value() << "   ";
  140. }
  141. break;
  142.   
  143. case NdbDictionary::Column::Undefined:
  144. default:
  145. {
  146.   g_info << "Undefined!!!   ";
  147. }
  148. break;
  149. } // case
  150. g_info << "   ";
  151.       } // for   
  152.       g_info << endl;   
  153.     } // if (conn
  154.     else
  155.     {
  156.       g_info << "Failed to commit read transaction... " 
  157.      << conn->getNdbError()
  158.      << ", commitStatus = " << conn->commitStatus()
  159.      << endl;
  160.     }
  161.     delete[] data;
  162.     
  163.     ndb->closeTransaction(conn);
  164.   } // if (ndb.init
  165.   else
  166.   {
  167.     g_info << "ERROR: Unable to connect to NDB, " 
  168.    << ndb->getNdbError() << endl;
  169.   }
  170.   delete ndb;
  171.   return 0;
  172. }