⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 restore_main.cpp

📁 这个文件是windows mysql源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
static inline boolisBlobTable(const TableS* table){  return table->getMainTable() != NULL;}static inline boolisIndex(const TableS* table){  const NdbTableImpl & tmptab = NdbTableImpl::getImpl(* table->m_dictTable);  return (int) tmptab.m_indexType != (int) NdbDictionary::Index::Undefined;}static inline boolcheckDbAndTableName(const TableS* table){  if (g_tables.size() == 0 &&      g_databases.size() == 0)    return true;  if (g_databases.size() == 0)    g_databases.push_back("TEST_DB");  // Filter on the main table name for indexes and blobs  const char *table_name;  if (isBlobTable(table))    table_name= table->getMainTable()->getTableName();  else if (isIndex(table))    table_name=      NdbTableImpl::getImpl(*table->m_dictTable).m_primaryTable.c_str();  else    table_name= table->getTableName();  unsigned i;  for (i= 0; i < g_databases.size(); i++)  {    if (strncmp(table_name, g_databases[i].c_str(),                g_databases[i].length()) == 0 &&        table_name[g_databases[i].length()] == '/')    {      // we have a match      if (g_databases.size() > 1 || g_tables.size() == 0)        return true;      break;    }  }  if (i == g_databases.size())    return false; // no match found  while (*table_name != '/') table_name++;  table_name++;  while (*table_name != '/') table_name++;  table_name++;  for (i= 0; i < g_tables.size(); i++)  {    if (strcmp(table_name, g_tables[i].c_str()) == 0)    {      // we have a match      return true;    }  }  return false;}static voidfree_data_callback(){  for(Uint32 i= 0; i < g_consumers.size(); i++)     g_consumers[i]->tuple_free();}const char * g_connect_string = 0;static void exitHandler(int code){  NDBT_ProgramExit(code);  if (opt_core)    abort();  else    exit(code);}intmain(int argc, char** argv){  NDB_INIT(argv[0]);  debug << "Start readArguments" << endl;  if (!readArguments(&argc, &argv))  {    exitHandler(NDBT_FAILED);  }  g_options.appfmt(" -b %d", ga_backupId);  g_options.appfmt(" -n %d", ga_nodeId);  if (_restore_meta)    g_options.appfmt(" -m");  if (_restore_data)    g_options.appfmt(" -r");  g_options.appfmt(" -p %d", ga_nParallelism);  g_connect_string = opt_connect_str;  /**   * we must always load meta data, even if we will only print it to stdout   */  debug << "Start restoring meta data" << endl;  RestoreMetaData metaData(ga_backupPath, ga_nodeId, ga_backupId);  if (!metaData.readHeader())  {    err << "Failed to read " << metaData.getFilename() << endl << endl;    exitHandler(NDBT_FAILED);  }  const BackupFormat::FileHeader & tmp = metaData.getFileHeader();  const Uint32 version = tmp.NdbVersion;    char buf[NDB_VERSION_STRING_BUF_SZ];  info.setLevel(254);  info << "Ndb version in backup files: "        <<  getVersionString(version, 0, buf, sizeof(buf)) << endl;    /**   * check wheater we can restore the backup (right version).   */  if (version > NDB_VERSION)  {    err << "Restore program older than backup version. Not supported. "        << "Use new restore program" << endl;    exitHandler(NDBT_FAILED);  }  debug << "Load content" << endl;  int res  = metaData.loadContent();    if (res == 0)  {    err << "Restore: Failed to load content" << endl;    exitHandler(NDBT_FAILED);  }  debug << "Get no of Tables" << endl;   if (metaData.getNoOfTables() == 0)   {    err << "The backup contains no tables" << endl;    exitHandler(NDBT_FAILED);  }  debug << "Validate Footer" << endl;  if (!metaData.validateFooter())   {    err << "Restore: Failed to validate footer." << endl;    exitHandler(NDBT_FAILED);  }  debug << "Init Backup objects" << endl;  Uint32 i;  for(i= 0; i < g_consumers.size(); i++)  {    if (!g_consumers[i]->init())    {      clearConsumers();      err << "Failed to initialize consumers" << endl;      exitHandler(NDBT_FAILED);    }  }  Vector<OutputStream *> table_output(metaData.getNoOfTables());  debug << "Restoring tables" << endl;  for(i = 0; i<metaData.getNoOfTables(); i++)  {    const TableS *table= metaData[i];    table_output.push_back(NULL);    if (!checkDbAndTableName(table))      continue;    if (checkSysTable(table))    {      if (!tab_path || isBlobTable(table) || isIndex(table))      {        table_output[i]= ndbout.m_out;      }      else      {        FILE* res;        char filename[FN_REFLEN], tmp_path[FN_REFLEN];        const char *table_name;        table_name= table->getTableName();        while (*table_name != '/') table_name++;        table_name++;        while (*table_name != '/') table_name++;        table_name++;        convert_dirname(tmp_path, tab_path, NullS);        res= my_fopen(fn_format(filename, table_name, tmp_path, ".txt", 4),                      opt_append ?                      O_WRONLY|O_APPEND|O_CREAT :                      O_WRONLY|O_TRUNC|O_CREAT,                      MYF(MY_WME));        if (res == 0)        {          exitHandler(NDBT_FAILED);        }        FileOutputStream *f= new FileOutputStream(res);        table_output[i]= f;      }      for(Uint32 j= 0; j < g_consumers.size(); j++)	if (!g_consumers[j]->table(* table))	{	  err << "Restore: Failed to restore table: `";          err << table->getTableName() << "` ... Exiting " << endl;	  exitHandler(NDBT_FAILED);        }    }  }  debug << "Close tables" << endl;   for(i= 0; i < g_consumers.size(); i++)    if (!g_consumers[i]->endOfTables())    {      err << "Restore: Failed while closing tables" << endl;      exitHandler(NDBT_FAILED);    }   debug << "Iterate over data" << endl;   if (ga_restore || ga_print)   {    if(_restore_data || _print_data)    {      RestoreDataIterator dataIter(metaData, &free_data_callback);            // Read data file header      if (!dataIter.readHeader())      {	err << "Failed to read header of data file. Exiting..." << endl;	exitHandler(NDBT_FAILED);      }                  while (dataIter.readFragmentHeader(res= 0))      {	const TupleS* tuple;	while ((tuple = dataIter.getNextTuple(res= 1)) != 0)	{          const TableS* table = tuple->getTable();          OutputStream *output = table_output[table->getLocalId()];          if (!output)            continue;          OutputStream *tmp = ndbout.m_out;          ndbout.m_out = output;          for(Uint32 j= 0; j < g_consumers.size(); j++)             g_consumers[j]->tuple(* tuple);          ndbout.m_out =  tmp;	} // while (tuple != NULL);		if (res < 0)	{	  err <<" Restore: An error occured while restoring data. Exiting...";          err << endl;	  exitHandler(NDBT_FAILED);	}	if (!dataIter.validateFragmentFooter()) {	  err << "Restore: Error validating fragment footer. ";          err << "Exiting..." << endl;	  exitHandler(NDBT_FAILED);	}      } // while (dataIter.readFragmentHeader(res))            if (res < 0)      {	err << "Restore: An error occured while restoring data. Exiting... "	    << "res= " << res << endl;	exitHandler(NDBT_FAILED);      }                  dataIter.validateFooter(); //not implemented            for (i= 0; i < g_consumers.size(); i++)	g_consumers[i]->endOfTuples();    }    if(_restore_data || _print_log)    {      RestoreLogIterator logIter(metaData);      if (!logIter.readHeader())      {	err << "Failed to read header of data file. Exiting..." << endl;	exitHandler(NDBT_FAILED);      }            const LogEntry * logEntry = 0;      while ((logEntry = logIter.getNextLogEntry(res= 0)) != 0)      {        const TableS* table = logEntry->m_table;        OutputStream *output = table_output[table->getLocalId()];        if (!output)          continue;        for(Uint32 j= 0; j < g_consumers.size(); j++)          g_consumers[j]->logEntry(* logEntry);      }      if (res < 0)      {	err << "Restore: An restoring the data log. Exiting... res=" 	    << res << endl;	exitHandler(NDBT_FAILED);      }      logIter.validateFooter(); //not implemented      for (i= 0; i < g_consumers.size(); i++)	g_consumers[i]->endOfLogEntrys();    }        if(_restore_data)    {      for(i = 0; i<metaData.getNoOfTables(); i++)      {        const TableS* table = metaData[i];        OutputStream *output = table_output[table->getLocalId()];        if (!output)          continue;        for(Uint32 j= 0; j < g_consumers.size(); j++)          if (!g_consumers[j]->finalize_table(*table))          {            err << "Restore: Failed to finalize restore table: %s. ";            err << "Exiting... " << metaData[i]->getTableName() << endl;            exitHandler(NDBT_FAILED);          }      }    }  }  for(Uint32 j= 0; j < g_consumers.size(); j++)   {    if (g_consumers[j]->has_temp_error())    {      clearConsumers();      ndbout_c("\nRestore successful, but encountered temporary error, "               "please look at configuration.");    }                 }    clearConsumers();  for(i = 0; i < metaData.getNoOfTables(); i++)  {    if (table_output[i] &&        table_output[i] != ndbout.m_out)    {      my_fclose(((FileOutputStream *)table_output[i])->getFile(), MYF(MY_WME));      delete table_output[i];      table_output[i] = NULL;    }  }  if (opt_verbose)    return NDBT_ProgramExit(NDBT_OK);  else    return 0;} // maintemplate class Vector<BackupConsumer*>;template class Vector<OutputStream*>;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -