Restore.hpp
上传用户: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. #ifndef RESTORE_H
  14. #define RESTORE_H
  15. #include <ndb_global.h>
  16. #include <NdbOut.hpp>
  17. #include "../src/kernel/blocks/backup/BackupFormat.hpp"
  18. #include "../src/ndbapi/NdbDictionaryImpl.hpp"
  19. #include <NdbApi.hpp>
  20. #include <ndb_version.h>
  21. #include <version.h>
  22. static const char * delimiter = ";"; // Delimiter in file dump
  23. const int FileNameLenC = 256;
  24. const int TableNameLenC = 256;
  25. const int AttrNameLenC = 256;
  26. const Uint32 timeToWaitForNdbC = 10000;
  27. const Uint32 opsDefaultC = 1000;
  28. // Forward declarations
  29. //class AttributeDesc;
  30. struct AttributeDesc;
  31. struct AttributeData;
  32. struct AttributeS;
  33. struct AttributeData {
  34.   bool null;
  35.   Uint32 size;
  36.   union {
  37.     Int8 * int8_value;
  38.     Uint8 * u_int8_value;
  39.     
  40.     Int16 * int16_value;
  41.     Uint16 * u_int16_value;
  42.     Int32 * int32_value;
  43.     Uint32 * u_int32_value;
  44.     
  45.     Int64 * int64_value;
  46.     Uint64 * u_int64_value;
  47.     char * string_value;
  48.     
  49.     void* void_value;
  50.   };
  51. };
  52. struct AttributeDesc {
  53.   //private:
  54.   friend class TupleS;
  55.   friend class TableS;
  56.   friend class RestoreDataIterator;
  57.   friend class RestoreMetaData;
  58.   friend struct AttributeS;
  59.   Uint32 size; // bits       
  60.   Uint32 arraySize;
  61.   Uint32 attrId;
  62.   NdbDictionary::Column *m_column;
  63.   Uint32 m_nullBitIndex;
  64. public:
  65.   
  66.   AttributeDesc(NdbDictionary::Column *column);
  67.   AttributeDesc();
  68.   Uint32 getSizeInWords() const { return (size * arraySize + 31)/ 32;}
  69. }; // AttributeDesc
  70. struct AttributeS {
  71.   const AttributeDesc * Desc;
  72.   AttributeData Data;
  73. };
  74. class TupleS {
  75. private:
  76.   friend class RestoreDataIterator;
  77.   
  78.   class TableS *m_currentTable;
  79.   AttributeData *allAttrData;
  80.   bool prepareRecord(TableS &);
  81.   
  82. public:
  83.   TupleS() {
  84.     m_currentTable= 0;
  85.     allAttrData= 0;
  86.   };
  87.   ~TupleS()
  88.   {
  89.     if (allAttrData)
  90.       delete [] allAttrData;
  91.   };
  92.   TupleS(const TupleS& tuple); // disable copy constructor
  93.   TupleS & operator=(const TupleS& tuple);
  94.   int getNoOfAttributes() const;
  95.   TableS * getTable() const;
  96.   const AttributeDesc * getDesc(int i) const;
  97.   AttributeData * getData(int i) const;
  98. }; // class TupleS
  99. class TableS {
  100.   
  101.   friend class TupleS;
  102.   friend class RestoreMetaData;
  103.   friend class RestoreDataIterator;
  104.   
  105.   Uint32 schemaVersion;
  106.   Uint32 backupVersion;
  107.   Vector<AttributeDesc *> allAttributesDesc;
  108.   Vector<AttributeDesc *> m_fixedKeys;
  109.   //Vector<AttributeDesc *> m_variableKey; 
  110.   Vector<AttributeDesc *> m_fixedAttribs;
  111.   Vector<AttributeDesc *> m_variableAttribs;
  112.   
  113.   Uint32 m_noOfNullable;
  114.   Uint32 m_nullBitmaskSize;
  115.   Uint32 m_auto_val_id;
  116.   Uint64 m_max_auto_val;
  117.   int pos;
  118.   void createAttr(NdbDictionary::Column *column);
  119. public:
  120.   class NdbDictionary::Table* m_dictTable;
  121.   TableS (Uint32 version, class NdbTableImpl* dictTable);
  122.   ~TableS();
  123.   Uint32 getTableId() const { 
  124.     return m_dictTable->getTableId(); 
  125.   }
  126.   /*
  127.   void setMysqlTableName(char * tableName) {
  128.     strpcpy(mysqlTableName, tableName);
  129.   }
  130.   
  131.   char * 
  132.   void setMysqlDatabaseName(char * databaseName) {
  133.     strpcpy(mysqlDatabaseName, databaseName);
  134.   }
  135.   table.setMysqlDatabaseName(database);
  136.   */
  137.   void setBackupVersion(Uint32 version) { 
  138.     backupVersion = version;
  139.   }
  140.   
  141.   Uint32 getBackupVersion() const { 
  142.     return backupVersion;
  143.   }
  144.   
  145.   const char * getTableName() const { 
  146.     return m_dictTable->getName();
  147.   }
  148.   
  149.   int getNoOfAttributes() const { 
  150.     return allAttributesDesc.size();
  151.   };
  152.   
  153.   bool have_auto_inc() const {
  154.     return m_auto_val_id != ~(Uint32)0;
  155.   };
  156.   bool have_auto_inc(Uint32 id) const {
  157.     return m_auto_val_id == id;
  158.   };
  159.   Uint64 get_max_auto_val() const {
  160.     return m_max_auto_val;
  161.   };
  162.   void update_max_auto_val(const char *data, int size) {
  163.     union {
  164.       Uint8  u8;
  165.       Uint16 u16;
  166.       Uint32 u32;
  167.     } val;
  168.     Uint64 v;
  169.     switch(size){
  170.     case 64:
  171.       memcpy(&v,data,8);
  172.       break;
  173.     case 32:
  174.       memcpy(&val.u32,data,4);
  175.       v= val.u32;
  176.       break;
  177.     case 16:
  178.       memcpy(&val.u16,data,2);
  179.       v= val.u16;
  180.       break;
  181.     case 8:
  182.       memcpy(&val.u8,data,1);
  183.       v= val.u8;
  184.       break;
  185.     default:
  186.       return;
  187.     };
  188.     if(v > m_max_auto_val)
  189.       m_max_auto_val= v;
  190.   };
  191.   /**
  192.    * Get attribute descriptor
  193.    */
  194.   const AttributeDesc * operator[](int attributeId) const { 
  195.     return allAttributesDesc[attributeId]; 
  196.   }
  197.   TableS& operator=(TableS& org) ; 
  198. }; // TableS;
  199. class BackupFile {
  200. protected:
  201.   FILE * m_file;
  202.   char m_path[PATH_MAX];
  203.   char m_fileName[PATH_MAX];
  204.   bool m_hostByteOrder;
  205.   BackupFormat::FileHeader m_fileHeader;
  206.   BackupFormat::FileHeader m_expectedFileHeader;
  207.   
  208.   Uint32 m_nodeId;
  209.   
  210.   void * m_buffer;
  211.   void * m_buffer_ptr;
  212.   Uint32 m_buffer_sz;
  213.   Uint32 m_buffer_data_left;
  214.   void (* free_data_callback)();
  215.   bool openFile();
  216.   void setCtlFile(Uint32 nodeId, Uint32 backupId, const char * path);
  217.   void setDataFile(const BackupFile & bf, Uint32 no);
  218.   void setLogFile(const BackupFile & bf, Uint32 no);
  219.   
  220.   Uint32 buffer_get_ptr(void **p_buf_ptr, Uint32 size, Uint32 nmemb);
  221.   Uint32 buffer_read(void *ptr, Uint32 size, Uint32 nmemb);
  222.   Uint32 buffer_get_ptr_ahead(void **p_buf_ptr, Uint32 size, Uint32 nmemb);
  223.   Uint32 buffer_read_ahead(void *ptr, Uint32 size, Uint32 nmemb);
  224.   void setName(const char * path, const char * name);
  225.   BackupFile(void (* free_data_callback)() = 0);
  226.   ~BackupFile();
  227. public:
  228.   bool readHeader();
  229.   bool validateFooter();
  230.   const char * getPath() const { return m_path;}
  231.   const char * getFilename() const { return m_fileName;}
  232.   Uint32 getNodeId() const { return m_nodeId;}
  233.   const BackupFormat::FileHeader & getFileHeader() const { return m_fileHeader;}
  234.   bool Twiddle(const AttributeDesc *  attr_desc, AttributeData * attr_data, Uint32 arraySize = 0);
  235. };
  236. class RestoreMetaData : public BackupFile {
  237.   Vector<TableS *> allTables;
  238.   bool readMetaFileHeader();
  239.   bool readMetaTableDesc();
  240.   bool readGCPEntry();
  241.   Uint32 readMetaTableList();
  242.   Uint32 m_startGCP;
  243.   Uint32 m_stopGCP;
  244.   
  245.   bool parseTableDescriptor(const Uint32 * data, Uint32 len);
  246. public:
  247.   RestoreMetaData(const char * path, Uint32 nodeId, Uint32 bNo);
  248.   virtual ~RestoreMetaData();
  249.   
  250.   int loadContent();
  251.   
  252.   Uint32 getNoOfTables() const { return allTables.size();}
  253.   
  254.   const TableS * operator[](int i) const { return allTables[i];}
  255.   TableS * getTable(Uint32 tableId) const;
  256.   Uint32 getStopGCP() const;
  257. }; // RestoreMetaData
  258. class RestoreDataIterator : public BackupFile {
  259.   const RestoreMetaData & m_metaData;
  260.   Uint32 m_count;
  261.   TableS* m_currentTable;
  262.   TupleS m_tuple;
  263. public:
  264.   // Constructor
  265.   RestoreDataIterator(const RestoreMetaData &, void (* free_data_callback)());
  266.   ~RestoreDataIterator() {};
  267.   
  268.   // Read data file fragment header
  269.   bool readFragmentHeader(int & res);
  270.   bool validateFragmentFooter();
  271.   const TupleS *getNextTuple(int & res);
  272. };
  273. class LogEntry {
  274. public:
  275.   enum EntryType {
  276.     LE_INSERT,
  277.     LE_DELETE,
  278.     LE_UPDATE
  279.   };
  280.   EntryType m_type;
  281.   TableS * m_table;  
  282.   Vector<AttributeS*> m_values;
  283.   Vector<AttributeS*> m_values_e;
  284.   AttributeS *add_attr() {
  285.     AttributeS * attr;
  286.     if (m_values_e.size() > 0) {
  287.       attr = m_values_e[m_values_e.size()-1];
  288.       m_values_e.erase(m_values_e.size()-1);
  289.     }
  290.     else
  291.     {
  292.       attr = new AttributeS;
  293.     }
  294.     m_values.push_back(attr);
  295.     return attr;
  296.   }
  297.   void clear() {
  298.     for(Uint32 i= 0; i < m_values.size(); i++)
  299.       m_values_e.push_back(m_values[i]);
  300.     m_values.clear();
  301.   }
  302.   ~LogEntry()
  303.   {
  304.     Uint32 i;
  305.     for(i= 0; i< m_values.size(); i++)
  306.       delete m_values[i];
  307.     for(i= 0; i< m_values_e.size(); i++)
  308.       delete m_values_e[i];
  309.   }
  310.   Uint32 size() const { return m_values.size(); }
  311.   const AttributeS * operator[](int i) const { return m_values[i];}
  312. };
  313. class RestoreLogIterator : public BackupFile {
  314. private:
  315.   const RestoreMetaData & m_metaData;
  316.   Uint32 m_count;  
  317.   Uint32 m_last_gci;
  318.   LogEntry m_logEntry;
  319. public:
  320.   RestoreLogIterator(const RestoreMetaData &);
  321.   virtual ~RestoreLogIterator() {};
  322.   const LogEntry * getNextLogEntry(int & res);
  323. };
  324. NdbOut& operator<<(NdbOut& ndbout, const TableS&);
  325. NdbOut& operator<<(NdbOut& ndbout, const TupleS&);
  326. NdbOut& operator<<(NdbOut& ndbout, const LogEntry&);
  327. NdbOut& operator<<(NdbOut& ndbout, const RestoreMetaData&);
  328. #endif