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

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 <NdbTCP.h>
  15. #include <NdbOut.hpp>
  16. #include "BackupFormat.hpp"
  17. #include <AttributeHeader.hpp>
  18. #include <SimpleProperties.hpp>
  19. bool readHeader(FILE*, BackupFormat::FileHeader *);
  20. bool readFragHeader(FILE*, BackupFormat::DataFile::FragmentHeader *);
  21. bool readFragFooter(FILE*, BackupFormat::DataFile::FragmentFooter *);
  22. Int32 readRecord(FILE*, Uint32 **);
  23. NdbOut & operator<<(NdbOut&, const BackupFormat::FileHeader &); 
  24. NdbOut & operator<<(NdbOut&, const BackupFormat::DataFile::FragmentHeader &); 
  25. NdbOut & operator<<(NdbOut&, const BackupFormat::DataFile::FragmentFooter &); 
  26. bool readTableList(FILE*, BackupFormat::CtlFile::TableList **);
  27. bool readTableDesc(FILE*, BackupFormat::CtlFile::TableDescription **);
  28. bool readGCPEntry(FILE*, BackupFormat::CtlFile::GCPEntry **);
  29. NdbOut & operator<<(NdbOut&, const BackupFormat::CtlFile::TableList &); 
  30. NdbOut & operator<<(NdbOut&, const BackupFormat::CtlFile::TableDescription &); 
  31. NdbOut & operator<<(NdbOut&, const BackupFormat::CtlFile::GCPEntry &); 
  32. Int32 readLogEntry(FILE*, Uint32**);
  33. static Uint32 recNo;
  34. static Uint32 logEntryNo;
  35. int
  36. main(int argc, const char * argv[]){
  37.   ndb_init();
  38.   if(argc <= 1){
  39.     printf("Usage: %s <filename>", argv[0]);
  40.     exit(1);
  41.   }
  42.   FILE * f = fopen(argv[1], "rb");
  43.   if(!f){
  44.     ndbout << "No such file!" << endl;
  45.     exit(1);
  46.   }
  47.   BackupFormat::FileHeader fileHeader;
  48.   if(!readHeader(f, &fileHeader)){
  49.     ndbout << "Invalid file!" << endl;
  50.     exit(1);
  51.   }
  52.   ndbout << fileHeader << endl;
  53.   switch(fileHeader.FileType){
  54.   case BackupFormat::DATA_FILE:
  55.     while(!feof(f)){
  56.       BackupFormat::DataFile::FragmentHeader fragHeader;
  57.       if(!readFragHeader(f, &fragHeader))
  58. break;
  59.       ndbout << fragHeader << endl;
  60.       
  61.       Uint32 len, * data;
  62.       while((len = readRecord(f, &data)) > 0){
  63. #if 0
  64. ndbout << "-> " << hex;
  65. for(Uint32 i = 0; i<len; i++){
  66.   ndbout << data[i] << " ";
  67. }
  68. ndbout << endl;
  69. #endif
  70.       }
  71.       
  72.       BackupFormat::DataFile::FragmentFooter fragFooter;
  73.       if(!readFragFooter(f, &fragFooter))
  74. break;
  75.       ndbout << fragFooter << endl;
  76.     }
  77.     break;
  78.   case BackupFormat::CTL_FILE:{
  79.     BackupFormat::CtlFile::TableList * tabList;
  80.     if(!readTableList(f, &tabList)){
  81.       ndbout << "Invalid file! No table list" << endl;
  82.       break;
  83.     }
  84.     ndbout << (* tabList) << endl;
  85.     const Uint32 noOfTables = tabList->SectionLength - 2;
  86.     for(Uint32 i = 0; i<noOfTables; i++){
  87.       BackupFormat::CtlFile::TableDescription * tabDesc;
  88.       if(!readTableDesc(f, &tabDesc)){
  89. ndbout << "Invalid file missing table description" << endl;
  90. break;
  91.       }
  92.       ndbout << (* tabDesc) << endl;
  93.     }
  94.     BackupFormat::CtlFile::GCPEntry * gcpE;
  95.     if(!readGCPEntry(f, &gcpE)){
  96.       ndbout << "Invalid file! GCP ENtry" << endl;
  97.       break;
  98.     }
  99.     ndbout << (* gcpE) << endl;
  100.     
  101.     break;
  102.   }
  103.   case BackupFormat::LOG_FILE:{
  104.     logEntryNo = 0;
  105.     typedef BackupFormat::LogFile::LogEntry LogEntry;
  106.     Uint32 len, * data;
  107.     while((len = readLogEntry(f, &data)) > 0){
  108.       LogEntry * logEntry = (LogEntry *) data;
  109.       /**
  110.        * Log Entry
  111.        */
  112.       Uint32 event = ntohl(logEntry->TriggerEvent);
  113.       bool gcp = (event & 0x10000) != 0;
  114.       event &= 0xFFFF;
  115.       if(gcp)
  116. len --;
  117.       
  118.       ndbout << "LogEntry Table: " << (Uint32)ntohl(logEntry->TableId) 
  119.      << " Event: " << event
  120.      << " Length: " << (len - 2);
  121.       
  122.       const Uint32 dataLen = len - 2;
  123. #if 0
  124.       Uint32 pos = 0;
  125.       while(pos < dataLen){
  126. AttributeHeader * ah = (AttributeHeader*)&logEntry->Data[pos];
  127. ndbout_c(" Attribut: %d Size: %d",
  128.  ah->getAttributeId(),
  129.  ah->getDataSize());
  130. pos += ah->getDataSize() + 1;
  131.       }
  132. #endif
  133.       if(gcp)
  134.   ndbout << " GCP: " << (Uint32)ntohl(logEntry->Data[dataLen]);
  135.       ndbout << endl;
  136.     }
  137.     break;
  138.   }
  139.   default:
  140.     ndbout << "Unsupported file type for printer: " 
  141.    << fileHeader.FileType << endl;
  142.     break;
  143.   }
  144.   fclose(f);
  145.   return 0;
  146. }
  147. #define RETURN_FALSE() { ndbout_c("false: %d", __LINE__); abort(); return false; }
  148. static bool endian = false;
  149. bool 
  150. readHeader(FILE* f, BackupFormat::FileHeader * dst){
  151.   if(fread(dst, 4, 3, f) != 3)
  152.     RETURN_FALSE();
  153.   if(memcmp(dst->Magic, BACKUP_MAGIC, sizeof(BACKUP_MAGIC)) != 0)
  154.     RETURN_FALSE();
  155.   dst->NdbVersion = ntohl(dst->NdbVersion);
  156.   if(dst->NdbVersion != 210)
  157.     RETURN_FALSE();
  158.   if(fread(&dst->SectionType, 4, 2, f) != 2)
  159.     RETURN_FALSE();
  160.   dst->SectionType = ntohl(dst->SectionType);
  161.   dst->SectionLength = ntohl(dst->SectionLength);
  162.   if(dst->SectionType != BackupFormat::FILE_HEADER)
  163.     RETURN_FALSE();
  164.   if(dst->SectionLength != ((sizeof(BackupFormat::FileHeader) - 12) >> 2))
  165.     RETURN_FALSE();
  166.   if(fread(&dst->FileType, 4, dst->SectionLength - 2, f) != 
  167.      (dst->SectionLength - 2))
  168.     RETURN_FALSE();
  169.   dst->FileType = ntohl(dst->FileType);
  170.   dst->BackupId = ntohl(dst->BackupId);
  171.   dst->BackupKey_0 = ntohl(dst->BackupKey_0);
  172.   dst->BackupKey_1 = ntohl(dst->BackupKey_1);
  173.   if(dst->FileType < BackupFormat::CTL_FILE || 
  174.      dst->FileType > BackupFormat::DATA_FILE)
  175.     RETURN_FALSE();
  176.   
  177.   if(dst->ByteOrder != 0x12345678)
  178.     endian = true;
  179.   
  180.   return true;
  181. }
  182. bool 
  183. readFragHeader(FILE* f, BackupFormat::DataFile::FragmentHeader * dst){
  184.   if(fread(dst, 1, sizeof(* dst), f) != sizeof(* dst))
  185.     return false;
  186.   dst->SectionType = ntohl(dst->SectionType);
  187.   dst->SectionLength = ntohl(dst->SectionLength);
  188.   dst->TableId = ntohl(dst->TableId);
  189.   dst->FragmentNo = ntohl(dst->FragmentNo);
  190.   dst->ChecksumType = ntohl(dst->ChecksumType);
  191.   if(dst->SectionLength != (sizeof(* dst) >> 2))
  192.     RETURN_FALSE();
  193.   
  194.   if(dst->SectionType != BackupFormat::FRAGMENT_HEADER)
  195.     RETURN_FALSE();
  196.   recNo = 0;
  197.   return true;
  198. }
  199. bool 
  200. readFragFooter(FILE* f, BackupFormat::DataFile::FragmentFooter * dst){
  201.   if(fread(dst, 1, sizeof(* dst), f) != sizeof(* dst))
  202.     RETURN_FALSE();
  203.   
  204.   dst->SectionType = ntohl(dst->SectionType);
  205.   dst->SectionLength = ntohl(dst->SectionLength);
  206.   dst->TableId = ntohl(dst->TableId);
  207.   dst->FragmentNo = ntohl(dst->FragmentNo);
  208.   dst->NoOfRecords = ntohl(dst->NoOfRecords);
  209.   dst->Checksum = ntohl(dst->Checksum);
  210.   
  211.   if(dst->SectionLength != (sizeof(* dst) >> 2))
  212.     RETURN_FALSE();
  213.   
  214.   if(dst->SectionType != BackupFormat::FRAGMENT_FOOTER)
  215.     RETURN_FALSE();
  216.   return true;
  217. }
  218. static Uint32 buf[8192];
  219. Int32
  220. readRecord(FILE* f, Uint32 **dst){
  221.   Uint32 len;
  222.   if(fread(&len, 1, 4, f) != 4)
  223.     RETURN_FALSE();
  224.   len = ntohl(len);
  225.   
  226.   if(fread(buf, 4, len, f) != len)
  227.     return -1;
  228.   if(len > 0)
  229.     recNo++;
  230.   * dst = &buf[0];
  231.   
  232.   return len;
  233. }
  234. Int32
  235. readLogEntry(FILE* f, Uint32 **dst){
  236.   Uint32 len;
  237.   if(fread(&len, 1, 4, f) != 4)
  238.     RETURN_FALSE();
  239.   
  240.   len = ntohl(len);
  241.   
  242.   if(fread(&buf[1], 4, len, f) != len)
  243.     return -1;
  244.   
  245.   buf[0] = len;
  246.   
  247.   if(len > 0)
  248.     logEntryNo++;
  249.   
  250.   * dst = &buf[0];
  251.   
  252.   return len;
  253. }
  254. NdbOut & 
  255. operator<<(NdbOut& ndbout, const BackupFormat::FileHeader & hf){
  256.   
  257.   char buf[9];
  258.   memcpy(buf, hf.Magic, sizeof(hf.Magic));
  259.   buf[8] = 0;
  260.   ndbout << "-- FileHeader:" << endl;
  261.   ndbout << "Magic: " << buf << endl;
  262.   ndbout << "NdbVersion: " << hf.NdbVersion << endl;
  263.   ndbout << "SectionType: " << hf.SectionType << endl;
  264.   ndbout << "SectionLength: " << hf.SectionLength << endl;
  265.   ndbout << "FileType: " << hf.FileType << endl;
  266.   ndbout << "BackupId: " << hf.BackupId << endl;
  267.   ndbout << "BackupKey: [ " << hex << hf.BackupKey_0 
  268.  << " "<< hf.BackupKey_1 << " ]" << endl;
  269.   ndbout << "ByteOrder: " << hex << hf.ByteOrder << endl;
  270.   return ndbout;
  271. NdbOut & operator<<(NdbOut& ndbout, 
  272.     const BackupFormat::DataFile::FragmentHeader & hf){
  273.   ndbout << "-- Fragment header:" << endl;
  274.   ndbout << "SectionType: " << hf.SectionType << endl;
  275.   ndbout << "SectionLength: " << hf.SectionLength << endl;
  276.   ndbout << "TableId: " << hf.TableId << endl;
  277.   ndbout << "FragmentNo: " << hf.FragmentNo << endl;
  278.   ndbout << "ChecksumType: " << hf.ChecksumType << endl;
  279.   
  280.   return ndbout;
  281. NdbOut & operator<<(NdbOut& ndbout, 
  282.     const BackupFormat::DataFile::FragmentFooter & hf){
  283.   
  284.   ndbout << "-- Fragment footer:" << endl;
  285.   ndbout << "SectionType: " << hf.SectionType << endl;
  286.   ndbout << "SectionLength: " << hf.SectionLength << endl;
  287.   ndbout << "TableId: " << hf.TableId << endl;
  288.   ndbout << "FragmentNo: " << hf.FragmentNo << endl;
  289.   ndbout << "NoOfRecords: " << hf.NoOfRecords << endl;
  290.   ndbout << "Checksum: " << hf.Checksum << endl;
  291.   
  292.   return ndbout;
  293. bool 
  294. readTableList(FILE* f, BackupFormat::CtlFile::TableList **ret){
  295.   BackupFormat::CtlFile::TableList * dst = 
  296.     (BackupFormat::CtlFile::TableList *)&buf[0];
  297.   
  298.   if(fread(dst, 4, 2, f) != 2)
  299.     RETURN_FALSE();
  300.   dst->SectionType = ntohl(dst->SectionType);
  301.   dst->SectionLength = ntohl(dst->SectionLength);
  302.   
  303.   if(dst->SectionType != BackupFormat::TABLE_LIST)
  304.     RETURN_FALSE();
  305.   
  306.   const Uint32 len = dst->SectionLength - 2;
  307.   if(fread(&dst->TableIds[0], 4, len, f) != len)
  308.     RETURN_FALSE();
  309.   for(Uint32 i = 0; i<len; i++){
  310.     dst->TableIds[i] = ntohl(dst->TableIds[i]);
  311.   }
  312.   * ret = dst;
  313.   return true;
  314. }
  315. bool 
  316. readTableDesc(FILE* f, BackupFormat::CtlFile::TableDescription **ret){
  317.   BackupFormat::CtlFile::TableDescription * dst = 
  318.     (BackupFormat::CtlFile::TableDescription *)&buf[0];
  319.   
  320.   if(fread(dst, 4, 2, f) != 2)
  321.     RETURN_FALSE();
  322.   dst->SectionType = ntohl(dst->SectionType);
  323.   dst->SectionLength = ntohl(dst->SectionLength);
  324.   
  325.   if(dst->SectionType != BackupFormat::TABLE_DESCRIPTION)
  326.     RETURN_FALSE();
  327.   
  328.   const Uint32 len = dst->SectionLength - 2;
  329.   if(fread(&dst->DictTabInfo[0], 4, len, f) != len)
  330.     RETURN_FALSE();
  331.   
  332.   * ret = dst;
  333.   
  334.   return true;
  335. }
  336. bool 
  337. readGCPEntry(FILE* f, BackupFormat::CtlFile::GCPEntry **ret){
  338.   BackupFormat::CtlFile::GCPEntry * dst = 
  339.     (BackupFormat::CtlFile::GCPEntry *)&buf[0];
  340.   
  341.   if(fread(dst, 4, 4, f) != 4)
  342.     RETURN_FALSE();
  343.   dst->SectionType = ntohl(dst->SectionType);
  344.   dst->SectionLength = ntohl(dst->SectionLength);
  345.   
  346.   if(dst->SectionType != BackupFormat::GCP_ENTRY)
  347.     RETURN_FALSE();
  348.   
  349.   dst->StartGCP = ntohl(dst->StartGCP);
  350.   dst->StopGCP = ntohl(dst->StopGCP);
  351.   * ret = dst;
  352.   
  353.   return true;
  354. }
  355. NdbOut & 
  356. operator<<(NdbOut& ndbout, const BackupFormat::CtlFile::TableList & hf) {
  357.   ndbout << "-- Table List:" << endl;
  358.   ndbout << "SectionType: " << hf.SectionType << endl;
  359.   ndbout << "SectionLength: " << hf.SectionLength << endl;
  360.   for(Uint32 i = 0; i < hf.SectionLength - 2; i++){
  361.     ndbout << hf.TableIds[i] << " ";
  362.     if((i + 1) % 16 == 0)
  363.       ndbout << endl;
  364.   }
  365.   return ndbout;
  366. }
  367. NdbOut & 
  368. operator<<(NdbOut& ndbout, const BackupFormat::CtlFile::TableDescription & hf){
  369.   ndbout << "-- Table Description:" << endl;
  370.   ndbout << "SectionType: " << hf.SectionType << endl;
  371.   ndbout << "SectionLength: " << hf.SectionLength << endl;
  372.   SimplePropertiesLinearReader it(&hf.DictTabInfo[0],  hf.SectionLength - 2);
  373.   char buf[1024];
  374.   for(it.first(); it.valid(); it.next()){
  375.     switch(it.getValueType()){
  376.     case SimpleProperties::Uint32Value:
  377.       ndbout << "Key: " << it.getKey()
  378.      << " value(" << it.getValueLen() << ") : " 
  379.      << it.getUint32() << endl;
  380.       break;
  381.     case SimpleProperties::StringValue:
  382.       if(it.getValueLen() < sizeof(buf)){
  383. it.getString(buf);
  384. ndbout << "Key: " << it.getKey()
  385.        << " value(" << it.getValueLen() << ") : " 
  386.        << """ << buf << """ << endl;
  387.       } else {
  388. ndbout << "Key: " << it.getKey()
  389.        << " value(" << it.getValueLen() << ") : " 
  390.        << """ << "<TOO LONG>" << """ << endl;
  391.       }
  392.       break;
  393.     default:
  394.       ndbout << "Unknown type for key: " << it.getKey() 
  395.      << " type: " << it.getValueType() << endl;
  396.     }
  397.   }
  398.   
  399.   return ndbout;
  400. NdbOut & 
  401. operator<<(NdbOut& ndbout, const BackupFormat::CtlFile::GCPEntry & hf) {
  402.   ndbout << "-- GCP Entry:" << endl;
  403.   ndbout << "SectionType: " << hf.SectionType << endl;
  404.   ndbout << "SectionLength: " << hf.SectionLength << endl;
  405.   ndbout << "Start GCP: " << hf.StartGCP << endl;
  406.   ndbout << "Stop GCP: " << hf.StopGCP << endl;
  407.   
  408.   return ndbout;
  409. }