summaryrefslogtreecommitdiff
path: root/storage/ndb/tools/restore/Restore.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/tools/restore/Restore.hpp')
-rw-r--r--storage/ndb/tools/restore/Restore.hpp379
1 files changed, 379 insertions, 0 deletions
diff --git a/storage/ndb/tools/restore/Restore.hpp b/storage/ndb/tools/restore/Restore.hpp
new file mode 100644
index 00000000000..d7f6e3b7799
--- /dev/null
+++ b/storage/ndb/tools/restore/Restore.hpp
@@ -0,0 +1,379 @@
+/* Copyright (C) 2003 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#ifndef RESTORE_H
+#define RESTORE_H
+
+#include <ndb_global.h>
+#include <NdbOut.hpp>
+#include "../src/kernel/blocks/backup/BackupFormat.hpp"
+#include "../src/ndbapi/NdbDictionaryImpl.hpp"
+#include <NdbApi.hpp>
+
+#include <ndb_version.h>
+#include <version.h>
+
+static const char * delimiter = ";"; // Delimiter in file dump
+
+const int FileNameLenC = 256;
+const int TableNameLenC = 256;
+const int AttrNameLenC = 256;
+const Uint32 timeToWaitForNdbC = 10000;
+const Uint32 opsDefaultC = 1000;
+
+// Forward declarations
+//class AttributeDesc;
+struct AttributeDesc;
+struct AttributeData;
+struct AttributeS;
+
+struct AttributeData {
+ bool null;
+ Uint32 size;
+ union {
+ Int8 * int8_value;
+ Uint8 * u_int8_value;
+
+ Int16 * int16_value;
+ Uint16 * u_int16_value;
+
+ Int32 * int32_value;
+ Uint32 * u_int32_value;
+
+ Int64 * int64_value;
+ Uint64 * u_int64_value;
+
+ char * string_value;
+
+ void* void_value;
+ };
+};
+
+struct AttributeDesc {
+ //private:
+ friend class TupleS;
+ friend class TableS;
+ friend class RestoreDataIterator;
+ friend class RestoreMetaData;
+ friend struct AttributeS;
+ Uint32 size; // bits
+ Uint32 arraySize;
+ Uint32 attrId;
+ NdbDictionary::Column *m_column;
+
+ Uint32 m_nullBitIndex;
+public:
+
+ AttributeDesc(NdbDictionary::Column *column);
+ AttributeDesc();
+
+ Uint32 getSizeInWords() const { return (size * arraySize + 31)/ 32;}
+}; // AttributeDesc
+
+struct AttributeS {
+ const AttributeDesc * Desc;
+ AttributeData Data;
+};
+
+class TupleS {
+private:
+ friend class RestoreDataIterator;
+
+ class TableS *m_currentTable;
+ AttributeData *allAttrData;
+ bool prepareRecord(TableS &);
+
+public:
+ TupleS() {
+ m_currentTable= 0;
+ allAttrData= 0;
+ };
+ ~TupleS()
+ {
+ if (allAttrData)
+ delete [] allAttrData;
+ };
+ TupleS(const TupleS& tuple); // disable copy constructor
+ TupleS & operator=(const TupleS& tuple);
+ int getNoOfAttributes() const;
+ TableS * getTable() const;
+ const AttributeDesc * getDesc(int i) const;
+ AttributeData * getData(int i) const;
+}; // class TupleS
+
+class TableS {
+
+ friend class TupleS;
+ friend class RestoreMetaData;
+ friend class RestoreDataIterator;
+
+ Uint32 schemaVersion;
+ Uint32 backupVersion;
+ Vector<AttributeDesc *> allAttributesDesc;
+ Vector<AttributeDesc *> m_fixedKeys;
+ //Vector<AttributeDesc *> m_variableKey;
+ Vector<AttributeDesc *> m_fixedAttribs;
+ Vector<AttributeDesc *> m_variableAttribs;
+
+ Uint32 m_noOfNullable;
+ Uint32 m_nullBitmaskSize;
+
+ Uint32 m_auto_val_id;
+ Uint64 m_max_auto_val;
+
+ int pos;
+
+ void createAttr(NdbDictionary::Column *column);
+
+public:
+ class NdbDictionary::Table* m_dictTable;
+ TableS (Uint32 version, class NdbTableImpl* dictTable);
+ ~TableS();
+
+ Uint32 getTableId() const {
+ return m_dictTable->getTableId();
+ }
+ /*
+ void setMysqlTableName(char * tableName) {
+ strpcpy(mysqlTableName, tableName);
+ }
+
+ char *
+ void setMysqlDatabaseName(char * databaseName) {
+ strpcpy(mysqlDatabaseName, databaseName);
+ }
+
+ table.setMysqlDatabaseName(database);
+ */
+ void setBackupVersion(Uint32 version) {
+ backupVersion = version;
+ }
+
+ Uint32 getBackupVersion() const {
+ return backupVersion;
+ }
+
+ const char * getTableName() const {
+ return m_dictTable->getName();
+ }
+
+ int getNoOfAttributes() const {
+ return allAttributesDesc.size();
+ };
+
+ bool have_auto_inc() const {
+ return m_auto_val_id != ~(Uint32)0;
+ };
+
+ bool have_auto_inc(Uint32 id) const {
+ return m_auto_val_id == id;
+ };
+
+ Uint64 get_max_auto_val() const {
+ return m_max_auto_val;
+ };
+
+ void update_max_auto_val(const char *data, int size) {
+ union {
+ Uint8 u8;
+ Uint16 u16;
+ Uint32 u32;
+ } val;
+ Uint64 v;
+ switch(size){
+ case 64:
+ memcpy(&v,data,8);
+ break;
+ case 32:
+ memcpy(&val.u32,data,4);
+ v= val.u32;
+ break;
+ case 16:
+ memcpy(&val.u16,data,2);
+ v= val.u16;
+ break;
+ case 8:
+ memcpy(&val.u8,data,1);
+ v= val.u8;
+ break;
+ default:
+ return;
+ };
+ if(v > m_max_auto_val)
+ m_max_auto_val= v;
+ };
+ /**
+ * Get attribute descriptor
+ */
+ const AttributeDesc * operator[](int attributeId) const {
+ return allAttributesDesc[attributeId];
+ }
+
+ TableS& operator=(TableS& org) ;
+}; // TableS;
+
+class BackupFile {
+protected:
+ FILE * m_file;
+ char m_path[PATH_MAX];
+ char m_fileName[PATH_MAX];
+ bool m_hostByteOrder;
+ BackupFormat::FileHeader m_fileHeader;
+ BackupFormat::FileHeader m_expectedFileHeader;
+
+ Uint32 m_nodeId;
+
+ void * m_buffer;
+ void * m_buffer_ptr;
+ Uint32 m_buffer_sz;
+ Uint32 m_buffer_data_left;
+ void (* free_data_callback)();
+
+ bool openFile();
+ void setCtlFile(Uint32 nodeId, Uint32 backupId, const char * path);
+ void setDataFile(const BackupFile & bf, Uint32 no);
+ void setLogFile(const BackupFile & bf, Uint32 no);
+
+ Uint32 buffer_get_ptr(void **p_buf_ptr, Uint32 size, Uint32 nmemb);
+ Uint32 buffer_read(void *ptr, Uint32 size, Uint32 nmemb);
+ Uint32 buffer_get_ptr_ahead(void **p_buf_ptr, Uint32 size, Uint32 nmemb);
+ Uint32 buffer_read_ahead(void *ptr, Uint32 size, Uint32 nmemb);
+
+ void setName(const char * path, const char * name);
+
+ BackupFile(void (* free_data_callback)() = 0);
+ ~BackupFile();
+public:
+ bool readHeader();
+ bool validateFooter();
+
+ const char * getPath() const { return m_path;}
+ const char * getFilename() const { return m_fileName;}
+ Uint32 getNodeId() const { return m_nodeId;}
+ const BackupFormat::FileHeader & getFileHeader() const { return m_fileHeader;}
+ bool Twiddle(const AttributeDesc * attr_desc, AttributeData * attr_data, Uint32 arraySize = 0);
+};
+
+class RestoreMetaData : public BackupFile {
+
+ Vector<TableS *> allTables;
+ bool readMetaFileHeader();
+ bool readMetaTableDesc();
+
+ bool readGCPEntry();
+ Uint32 readMetaTableList();
+
+ Uint32 m_startGCP;
+ Uint32 m_stopGCP;
+
+ bool parseTableDescriptor(const Uint32 * data, Uint32 len);
+
+public:
+ RestoreMetaData(const char * path, Uint32 nodeId, Uint32 bNo);
+ virtual ~RestoreMetaData();
+
+ int loadContent();
+
+ Uint32 getNoOfTables() const { return allTables.size();}
+
+ const TableS * operator[](int i) const { return allTables[i];}
+ TableS * getTable(Uint32 tableId) const;
+
+ Uint32 getStopGCP() const;
+}; // RestoreMetaData
+
+
+class RestoreDataIterator : public BackupFile {
+ const RestoreMetaData & m_metaData;
+ Uint32 m_count;
+ TableS* m_currentTable;
+ TupleS m_tuple;
+
+public:
+
+ // Constructor
+ RestoreDataIterator(const RestoreMetaData &, void (* free_data_callback)());
+ ~RestoreDataIterator() {};
+
+ // Read data file fragment header
+ bool readFragmentHeader(int & res);
+ bool validateFragmentFooter();
+
+ const TupleS *getNextTuple(int & res);
+};
+
+class LogEntry {
+public:
+ enum EntryType {
+ LE_INSERT,
+ LE_DELETE,
+ LE_UPDATE
+ };
+ EntryType m_type;
+ TableS * m_table;
+ Vector<AttributeS*> m_values;
+ Vector<AttributeS*> m_values_e;
+ AttributeS *add_attr() {
+ AttributeS * attr;
+ if (m_values_e.size() > 0) {
+ attr = m_values_e[m_values_e.size()-1];
+ m_values_e.erase(m_values_e.size()-1);
+ }
+ else
+ {
+ attr = new AttributeS;
+ }
+ m_values.push_back(attr);
+ return attr;
+ }
+ void clear() {
+ for(Uint32 i= 0; i < m_values.size(); i++)
+ m_values_e.push_back(m_values[i]);
+ m_values.clear();
+ }
+ ~LogEntry()
+ {
+ Uint32 i;
+ for(i= 0; i< m_values.size(); i++)
+ delete m_values[i];
+ for(i= 0; i< m_values_e.size(); i++)
+ delete m_values_e[i];
+ }
+ Uint32 size() const { return m_values.size(); }
+ const AttributeS * operator[](int i) const { return m_values[i];}
+};
+
+class RestoreLogIterator : public BackupFile {
+private:
+ const RestoreMetaData & m_metaData;
+
+ Uint32 m_count;
+ LogEntry m_logEntry;
+public:
+ RestoreLogIterator(const RestoreMetaData &);
+ virtual ~RestoreLogIterator() {};
+
+ const LogEntry * getNextLogEntry(int & res);
+};
+
+NdbOut& operator<<(NdbOut& ndbout, const TableS&);
+NdbOut& operator<<(NdbOut& ndbout, const TupleS&);
+NdbOut& operator<<(NdbOut& ndbout, const LogEntry&);
+NdbOut& operator<<(NdbOut& ndbout, const RestoreMetaData&);
+
+#endif
+
+