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

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 <ndb_opts.h>
  15. #include <NdbOut.hpp>
  16. #include <NdbApi.hpp>
  17. #include <NdbMain.h>
  18. #include <NDBT.hpp> 
  19. #include <NdbSleep.h>
  20. #include <NdbScanFilter.hpp>
  21.  
  22. int scanReadRecords(Ndb*, 
  23.     const NdbDictionary::Table*, 
  24.     const NdbDictionary::Index*,
  25.     int parallel,
  26.     int lockType,
  27.     bool headers,
  28.     bool useHexFormat,
  29.     char delim,
  30.     bool orderby);
  31. NDB_STD_OPTS_VARS;
  32. static const char* _dbname = "TEST_DB";
  33. static const char* _delimiter = "t";
  34. static int _unqualified, _header, _parallelism, _useHexFormat, _lock,
  35.   _order;
  36. static struct my_option my_long_options[] =
  37. {
  38.   NDB_STD_OPTS("ndb_desc"),
  39.   { "database", 'd', "Name of database table is in",
  40.     (gptr*) &_dbname, (gptr*) &_dbname, 0,
  41.     GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
  42.   { "parallelism", 'p', "parallelism",
  43.     (gptr*) &_parallelism, (gptr*) &_parallelism, 0,
  44.     GET_INT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, 
  45.   { "lock", 'l', "Read(0), Read-hold(1), Exclusive(2)",
  46.     (gptr*) &_lock, (gptr*) &_lock, 0,
  47.     GET_INT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, 
  48.   { "order", 'o', "Sort resultset according to index",
  49.     (gptr*) &_order, (gptr*) &_order, 0,
  50.     GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 }, 
  51.   { "header", 'h', "Print header",
  52.     (gptr*) &_header, (gptr*) &_header, 0,
  53.     GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0 }, 
  54.   { "useHexFormat", 'x', "Output numbers in hexadecimal format",
  55.     (gptr*) &_useHexFormat, (gptr*) &_useHexFormat, 0,
  56.     GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 }, 
  57.   { "delimiter", 'D', "Column delimiter",
  58.     (gptr*) &_delimiter, (gptr*) &_delimiter, 0,
  59.     GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
  60.   { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
  61. };
  62. static void usage()
  63. {
  64.   char desc[] = 
  65.     "tabnamen"
  66.     "This program reads all records from one table in NDB Clustern"
  67.     "and print them to stdout.  This is performed using a scan read.n"
  68.     "(It only print error messages if it encounters a permanent error.)n"
  69.     "It can also be used to dump the content of a table to file n"
  70.     "  ex: select_all --no-header --delimiter=';' T4 > T4.datan";
  71.   ndb_std_print_version();
  72.   my_print_help(my_long_options);
  73.   my_print_variables(my_long_options);
  74. }
  75. static my_bool
  76. get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
  77.        char *argument)
  78. {
  79.   return ndb_std_get_one_option(optid, opt, argument ? argument :
  80. "d:t:O,/tmp/ndb_select_all.trace");
  81. }
  82. int main(int argc, char** argv){
  83.   NDB_INIT(argv[0]);
  84.   const char *load_default_groups[]= { "mysql_cluster",0 };
  85.   load_defaults("my",load_default_groups,&argc,&argv);
  86.   const char* _tabname;
  87.   int ho_error;
  88.   if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
  89.     return NDBT_ProgramExit(NDBT_WRONGARGS);
  90.   if ((_tabname = argv[0]) == 0) {
  91.     usage();
  92.     return NDBT_ProgramExit(NDBT_WRONGARGS);
  93.   }
  94.   Ndb::setConnectString(opt_connect_str);
  95.   // Connect to Ndb
  96.   Ndb MyNdb(_dbname);
  97.   if(MyNdb.init() != 0){
  98.     ERR(MyNdb.getNdbError());
  99.     return NDBT_ProgramExit(NDBT_FAILED);
  100.   }
  101.   // Connect to Ndb and wait for it to become ready
  102.   while(MyNdb.waitUntilReady() != 0)
  103.     ndbout << "Waiting for ndb to become ready..." << endl;
  104.    
  105.   // Check if table exists in db
  106.   const NdbDictionary::Table* pTab = NDBT_Table::discoverTableFromDb(&MyNdb, _tabname);
  107.   const NdbDictionary::Index * pIdx = 0;
  108.   if(argc > 1){
  109.     pIdx = MyNdb.getDictionary()->getIndex(argv[1], _tabname);
  110.   }
  111.   if(pTab == NULL){
  112.     ndbout << " Table " << _tabname << " does not exist!" << endl;
  113.     return NDBT_ProgramExit(NDBT_WRONGARGS);
  114.   }
  115.   if(argc > 1 && pIdx == 0)
  116.   {
  117.     ndbout << " Index " << argv[1] << " does not exists" << endl;
  118.   }
  119.   
  120.   if(_order && pIdx == NULL){
  121.     ndbout << " Order flag given without an index" << endl;
  122.     return NDBT_ProgramExit(NDBT_WRONGARGS);
  123.   }
  124.   if (scanReadRecords(&MyNdb, 
  125.       pTab, 
  126.       pIdx,
  127.       _parallelism, 
  128.       _lock,
  129.       _header, 
  130.       _useHexFormat, 
  131.       (char)*_delimiter, _order) != 0){
  132.     return NDBT_ProgramExit(NDBT_FAILED);
  133.   }
  134.   return NDBT_ProgramExit(NDBT_OK);
  135. }
  136. int scanReadRecords(Ndb* pNdb, 
  137.     const NdbDictionary::Table* pTab, 
  138.     const NdbDictionary::Index* pIdx,
  139.     int parallel,
  140.     int _lock,
  141.     bool headers,
  142.     bool useHexFormat,
  143.     char delimiter, bool order){
  144.   int                  retryAttempt = 0;
  145.   const int            retryMax = 100;
  146.   int                  check;
  147.   NdbConnection        *pTrans;
  148.   NdbScanOperation        *pOp;
  149.   NdbIndexScanOperation * pIOp= 0;
  150.   NDBT_ResultRow * row = new NDBT_ResultRow(*pTab, delimiter);
  151.   while (true){
  152.     if (retryAttempt >= retryMax){
  153.       ndbout << "ERROR: has retried this operation " << retryAttempt 
  154.      << " times, failing!" << endl;
  155.       return -1;
  156.     }
  157.     pTrans = pNdb->startTransaction();
  158.     if (pTrans == NULL) {
  159.       const NdbError err = pNdb->getNdbError();
  160.       if (err.status == NdbError::TemporaryError){
  161. NdbSleep_MilliSleep(50);
  162. retryAttempt++;
  163. continue;
  164.       }
  165.       ERR(err);
  166.       return -1;
  167.     }
  168.     
  169.     pOp = (!pIdx) ? pTrans->getNdbScanOperation(pTab->getName()) : 
  170.       pIOp=pTrans->getNdbIndexScanOperation(pIdx->getName(), pTab->getName());
  171.     
  172.     if (pOp == NULL) {
  173.       ERR(pTrans->getNdbError());
  174.       pNdb->closeTransaction(pTrans);
  175.       return -1;
  176.     }
  177.     NdbResultSet * rs;
  178.     switch(_lock + (3 * order)){
  179.     case 1:
  180.       rs = pOp->readTuples(NdbScanOperation::LM_Read, 0, parallel);
  181.       break;
  182.     case 2:
  183.       rs = pOp->readTuples(NdbScanOperation::LM_Exclusive, 0, parallel);
  184.       break;
  185.     case 3:
  186.       rs = pIOp->readTuples(NdbScanOperation::LM_CommittedRead, 0, parallel, 
  187.     true);
  188.       break;
  189.     case 4:
  190.       rs = pIOp->readTuples(NdbScanOperation::LM_Read, 0, parallel, true);
  191.       break;
  192.     case 5:
  193.       rs = pIOp->readTuples(NdbScanOperation::LM_Exclusive, 0, parallel, true);
  194.       break;
  195.     case 0:
  196.     default:
  197.       rs = pOp->readTuples(NdbScanOperation::LM_CommittedRead, 0, parallel);
  198.       break;
  199.     }
  200.     if( rs == 0 ){
  201.       ERR(pTrans->getNdbError());
  202.       pNdb->closeTransaction(pTrans);
  203.       return -1;
  204.     }
  205.     
  206.     if(0){
  207.       NdbScanFilter sf(pOp);
  208. #if 0
  209.       sf.begin(NdbScanFilter::AND);
  210.       sf.le(0, (Uint32)10);
  211.       
  212.       sf.end();
  213. #elif 0
  214.       sf.begin(NdbScanFilter::OR);
  215.       sf.begin(NdbScanFilter::AND);
  216.       sf.ge(0, (Uint32)10);
  217.       sf.lt(0, (Uint32)20);
  218.       sf.end();
  219.       sf.begin(NdbScanFilter::AND);
  220.       sf.ge(0, (Uint32)30);
  221.       sf.lt(0, (Uint32)40);
  222.       sf.end();
  223.       sf.end();
  224. #elif 1
  225.       sf.begin(NdbScanFilter::AND);
  226.       sf.begin(NdbScanFilter::OR);
  227.       sf.begin(NdbScanFilter::AND);
  228.       sf.ge(0, (Uint32)10);
  229.       sf.lt(0, (Uint32)20);
  230.       sf.end();
  231.       sf.begin(NdbScanFilter::AND);
  232.       sf.ge(0, (Uint32)30);
  233.       sf.lt(0, (Uint32)40);
  234.       sf.end();
  235.       sf.end();
  236.       sf.begin(NdbScanFilter::OR);
  237.       sf.begin(NdbScanFilter::AND);
  238.       sf.ge(0, (Uint32)0);
  239.       sf.lt(0, (Uint32)50);
  240.       sf.end();
  241.       sf.begin(NdbScanFilter::AND);
  242.       sf.ge(0, (Uint32)100);
  243.       sf.lt(0, (Uint32)200);
  244.       sf.end();
  245.       sf.end();
  246.       sf.end();
  247. #endif
  248.     } else {
  249.       check = pOp->interpret_exit_ok();
  250.       if( check == -1 ) {
  251. ERR(pTrans->getNdbError());
  252. pNdb->closeTransaction(pTrans);
  253. return -1;
  254.       }
  255.     }
  256.     
  257.     for(int a = 0; a<pTab->getNoOfColumns(); a++){
  258.       if((row->attributeStore(a) = 
  259.   pOp->getValue(pTab->getColumn(a)->getName())) == 0) {
  260. ERR(pTrans->getNdbError());
  261. pNdb->closeTransaction(pTrans);
  262. return -1;
  263.       }
  264.     }
  265.     check = pTrans->execute(NoCommit);   
  266.     if( check == -1 ) {
  267.       const NdbError err = pTrans->getNdbError();
  268.       
  269.       if (err.status == NdbError::TemporaryError){
  270. pNdb->closeTransaction(pTrans);
  271. NdbSleep_MilliSleep(50);
  272. retryAttempt++;
  273. continue;
  274.       }
  275.       ERR(err);
  276.       pNdb->closeTransaction(pTrans);
  277.       return -1;
  278.     }
  279.     if (headers)
  280.       row->header(ndbout) << endl;
  281.     
  282.     int eof;
  283.     int rows = 0;
  284.     eof = rs->nextResult();
  285.     
  286.     while(eof == 0){
  287.       rows++;
  288.       if (useHexFormat) {
  289. ndbout.setHexFormat(1) << (*row) << endl;
  290.       } else {
  291. ndbout << (*row) << endl;
  292.       }
  293.       eof = rs->nextResult();
  294.     }
  295.     if (eof == -1) {
  296.       const NdbError err = pTrans->getNdbError();
  297.       if (err.status == NdbError::TemporaryError){
  298. pNdb->closeTransaction(pTrans);
  299. NdbSleep_MilliSleep(50);
  300. retryAttempt++;
  301. continue;
  302.       }
  303.       ERR(err);
  304.       pNdb->closeTransaction(pTrans);
  305.       return -1;
  306.     }
  307.     pNdb->closeTransaction(pTrans);
  308.     ndbout << rows << " rows returned" << endl;
  309.     return 0;
  310.   }
  311.   return -1;
  312. }