delete_all.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 <ndb_opts.h>
  15. #include <NdbOut.hpp>
  16. #include <NdbApi.hpp>
  17. #include <NdbSleep.h>
  18. #include <NDBT.hpp>
  19. static int clear_table(Ndb* pNdb, const NdbDictionary::Table* pTab, int parallelism=240);
  20. NDB_STD_OPTS_VARS;
  21. static const char* _dbname = "TEST_DB";
  22. static struct my_option my_long_options[] =
  23. {
  24.   NDB_STD_OPTS("ndb_desc"),
  25.   { "database", 'd', "Name of database table is in",
  26.     (gptr*) &_dbname, (gptr*) &_dbname, 0,
  27.     GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
  28.   { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
  29. };
  30. static void usage()
  31. {
  32.   char desc[] = 
  33.     "tabnamen"
  34.     "This program will delete all records in the specified table using scan delete.n";
  35.   ndb_std_print_version();
  36.   my_print_help(my_long_options);
  37.   my_print_variables(my_long_options);
  38. }
  39. static my_bool
  40. get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
  41.        char *argument)
  42. {
  43.   return ndb_std_get_one_option(optid, opt, argument ? argument :
  44. "d:t:O,/tmp/ndb_delete_all.trace");
  45. }
  46. int main(int argc, char** argv){
  47.   NDB_INIT(argv[0]);
  48.   const char *load_default_groups[]= { "mysql_cluster",0 };
  49.   load_defaults("my",load_default_groups,&argc,&argv);
  50.   int ho_error;
  51.   if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
  52.     return NDBT_ProgramExit(NDBT_WRONGARGS);
  53.   Ndb::setConnectString(opt_connect_str);
  54.   // Connect to Ndb
  55.   Ndb MyNdb(_dbname);
  56.   if(MyNdb.init() != 0){
  57.     ERR(MyNdb.getNdbError());
  58.     return NDBT_ProgramExit(NDBT_FAILED);
  59.   }
  60.   
  61.   // Connect to Ndb and wait for it to become ready
  62.   while(MyNdb.waitUntilReady() != 0)
  63.     ndbout << "Waiting for ndb to become ready..." << endl;
  64.    
  65.   // Check if table exists in db
  66.   int res = NDBT_OK;
  67.   for(int i = 0; i<argc; i++){
  68.     const NdbDictionary::Table * pTab = NDBT_Table::discoverTableFromDb(&MyNdb, argv[i]);
  69.     if(pTab == NULL){
  70.       ndbout << " Table " << argv[i] << " does not exist!" << endl;
  71.       return NDBT_ProgramExit(NDBT_WRONGARGS);
  72.     }
  73.     ndbout << "Deleting all from " << argv[i] << "...";
  74.     if(clear_table(&MyNdb, pTab) == NDBT_FAILED){
  75.       res = NDBT_FAILED;
  76.       ndbout << "FAILED" << endl;
  77.     }
  78.   }
  79.   return NDBT_ProgramExit(res);
  80. }
  81. int clear_table(Ndb* pNdb, const NdbDictionary::Table* pTab, int parallelism)
  82. {
  83.   // Scan all records exclusive and delete 
  84.   // them one by one
  85.   int                  retryAttempt = 0;
  86.   const int            retryMax = 10;
  87.   int deletedRows = 0;
  88.   int check;
  89.   NdbConnection *pTrans;
  90.   NdbScanOperation *pOp;
  91.   NdbError err;
  92.   int par = parallelism;
  93.   while (true){
  94.   restart:
  95.     if (retryAttempt++ >= retryMax){
  96.       g_info << "ERROR: has retried this operation " << retryAttempt 
  97.      << " times, failing!" << endl;
  98.       return NDBT_FAILED;
  99.     }
  100.     
  101.     pTrans = pNdb->startTransaction();
  102.     if (pTrans == NULL) {
  103.       err = pNdb->getNdbError();
  104.       if (err.status == NdbError::TemporaryError){
  105. ERR(err);
  106. NdbSleep_MilliSleep(50);
  107. continue;
  108.       }
  109.       goto failed;
  110.     }
  111.     
  112.     pOp = pTrans->getNdbScanOperation(pTab->getName());
  113.     if (pOp == NULL) {
  114.       goto failed;
  115.     }
  116.     
  117.     NdbResultSet * rs = pOp->readTuplesExclusive(par);
  118.     if( rs == 0 ) {
  119.       goto failed;
  120.     }
  121.     
  122.     if(pTrans->execute(NoCommit) != 0){
  123.       err = pTrans->getNdbError();    
  124.       if(err.status == NdbError::TemporaryError){
  125. ERR(err);
  126. pNdb->closeTransaction(pTrans);
  127. NdbSleep_MilliSleep(50);
  128. continue;
  129.       }
  130.       goto failed;
  131.     }
  132.     
  133.     while((check = rs->nextResult(true)) == 0){
  134.       do {
  135. if (rs->deleteTuple() != 0){
  136.   goto failed;
  137. }
  138. deletedRows++;
  139.       } while((check = rs->nextResult(false)) == 0);
  140.       
  141.       if(check != -1){
  142. check = pTrans->execute(Commit);   
  143. pTrans->restart();
  144.       }
  145.       
  146.       err = pTrans->getNdbError();    
  147.       if(check == -1){
  148. if(err.status == NdbError::TemporaryError){
  149.   ERR(err);
  150.   pNdb->closeTransaction(pTrans);
  151.   NdbSleep_MilliSleep(50);
  152.   par = 1;
  153.   goto restart;
  154. }
  155. goto failed;
  156.       }
  157.     }
  158.     if(check == -1){
  159.       err = pTrans->getNdbError();    
  160.       if(err.status == NdbError::TemporaryError){
  161. ERR(err);
  162. pNdb->closeTransaction(pTrans);
  163. NdbSleep_MilliSleep(50);
  164. par = 1;
  165. goto restart;
  166.       }
  167.       goto failed;
  168.     }
  169.     pNdb->closeTransaction(pTrans);
  170.     return NDBT_OK;
  171.   }
  172.   return NDBT_FAILED;
  173.   
  174.  failed:
  175.   if(pTrans != 0) pNdb->closeTransaction(pTrans);
  176.   ERR(err);
  177.   return (err.code != 0 ? err.code : NDBT_FAILED);
  178. }