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

📄 restore.cpp

📁 MySQL数据库开发源码 值得一看哦
💻 CPP
📖 第 1 页 / 共 2 页
字号:
boolBackupFile::openFile(){  if(m_file != NULL){    fclose(m_file);    m_file = 0;  }    m_file = fopen(m_fileName, "r");  return m_file != 0;}Uint32 BackupFile::buffer_get_ptr_ahead(void **p_buf_ptr, Uint32 size, Uint32 nmemb){  Uint32 sz = size*nmemb;  if (sz > m_buffer_data_left) {    if (free_data_callback)      (*free_data_callback)();    memcpy(m_buffer, m_buffer_ptr, m_buffer_data_left);    size_t r = fread(((char *)m_buffer) + m_buffer_data_left, 1, m_buffer_sz - m_buffer_data_left, m_file);    m_buffer_data_left += r;    m_buffer_ptr = m_buffer;    if (sz > m_buffer_data_left)      sz = size * (m_buffer_data_left / size);  }  *p_buf_ptr = m_buffer_ptr;  return sz/size;}Uint32 BackupFile::buffer_get_ptr(void **p_buf_ptr, Uint32 size, Uint32 nmemb){  Uint32 r = buffer_get_ptr_ahead(p_buf_ptr, size, nmemb);  m_buffer_ptr = ((char*)m_buffer_ptr)+(r*size);  m_buffer_data_left -= (r*size);  return r;}Uint32 BackupFile::buffer_read_ahead(void *ptr, Uint32 size, Uint32 nmemb){  void *buf_ptr;  Uint32 r = buffer_get_ptr_ahead(&buf_ptr, size, nmemb);  memcpy(ptr, buf_ptr, r*size);  return r;}Uint32 BackupFile::buffer_read(void *ptr, Uint32 size, Uint32 nmemb){  void *buf_ptr;  Uint32 r = buffer_get_ptr(&buf_ptr, size, nmemb);  memcpy(ptr, buf_ptr, r*size);  return r;}voidBackupFile::setCtlFile(Uint32 nodeId, Uint32 backupId, const char * path){  m_nodeId = nodeId;  m_expectedFileHeader.BackupId = backupId;  m_expectedFileHeader.FileType = BackupFormat::CTL_FILE;  char name[PATH_MAX]; const Uint32 sz = sizeof(name);  BaseString::snprintf(name, sz, "BACKUP-%d.%d.ctl", backupId, nodeId);    setName(path, name);}voidBackupFile::setDataFile(const BackupFile & bf, Uint32 no){  m_nodeId = bf.m_nodeId;  m_expectedFileHeader = bf.m_fileHeader;  m_expectedFileHeader.FileType = BackupFormat::DATA_FILE;    char name[PATH_MAX]; const Uint32 sz = sizeof(name);  BaseString::snprintf(name, sz, "BACKUP-%d-%d.%d.Data", 	   m_expectedFileHeader.BackupId, no, m_nodeId);  setName(bf.m_path, name);}voidBackupFile::setLogFile(const BackupFile & bf, Uint32 no){  m_nodeId = bf.m_nodeId;  m_expectedFileHeader = bf.m_fileHeader;  m_expectedFileHeader.FileType = BackupFormat::LOG_FILE;    char name[PATH_MAX]; const Uint32 sz = sizeof(name);  BaseString::snprintf(name, sz, "BACKUP-%d.%d.log", 	   m_expectedFileHeader.BackupId, m_nodeId);  setName(bf.m_path, name);}voidBackupFile::setName(const char * p, const char * n){  const Uint32 sz = sizeof(m_path);  if(p != 0 && strlen(p) > 0){    if(p[strlen(p)-1] == '/'){      BaseString::snprintf(m_path, sz, "%s", p);    } else {      BaseString::snprintf(m_path, sz, "%s%s", p, "/");    }  } else {    m_path[0] = 0;  }  BaseString::snprintf(m_fileName, sizeof(m_fileName), "%s%s", m_path, n);  debug << "Filename = " << m_fileName << endl;}boolBackupFile::readHeader(){  if(!openFile()){    return false;  }    if(buffer_read(&m_fileHeader, sizeof(m_fileHeader), 1) != 1){    err << "readDataFileHeader: Error reading header" << endl;    return false;  }    // Convert from network to host byte order for platform compatibility  m_fileHeader.NdbVersion  = ntohl(m_fileHeader.NdbVersion);  m_fileHeader.SectionType = ntohl(m_fileHeader.SectionType);  m_fileHeader.SectionLength = ntohl(m_fileHeader.SectionLength);  m_fileHeader.FileType = ntohl(m_fileHeader.FileType);  m_fileHeader.BackupId = ntohl(m_fileHeader.BackupId);  m_fileHeader.BackupKey_0 = ntohl(m_fileHeader.BackupKey_0);  m_fileHeader.BackupKey_1 = ntohl(m_fileHeader.BackupKey_1);  debug << "FileHeader: " << m_fileHeader.Magic << " " <<    m_fileHeader.NdbVersion << " " <<    m_fileHeader.SectionType << " " <<    m_fileHeader.SectionLength << " " <<    m_fileHeader.FileType << " " <<    m_fileHeader.BackupId << " " <<    m_fileHeader.BackupKey_0 << " " <<    m_fileHeader.BackupKey_1 << " " <<    m_fileHeader.ByteOrder << endl;    debug << "ByteOrder is " << m_fileHeader.ByteOrder << endl;  debug << "magicByteOrder is " << magicByteOrder << endl;    if (m_fileHeader.FileType != m_expectedFileHeader.FileType){    abort();  }    // Check for BackupFormat::FileHeader::ByteOrder if swapping is needed  if (m_fileHeader.ByteOrder == magicByteOrder) {    m_hostByteOrder = true;  } else if (m_fileHeader.ByteOrder == swappedMagicByteOrder){    m_hostByteOrder = false;  } else {    abort();  }    return true;} // BackupFile::readHeaderboolBackupFile::validateFooter(){  return true;}bool RestoreDataIterator::readFragmentHeader(int & ret){  BackupFormat::DataFile::FragmentHeader Header;    debug << "RestoreDataIterator::getNextFragment" << endl;    if (buffer_read(&Header, sizeof(Header), 1) != 1){    ret = 0;    return false;  } // if    Header.SectionType  = ntohl(Header.SectionType);  Header.SectionLength  = ntohl(Header.SectionLength);  Header.TableId  = ntohl(Header.TableId);  Header.FragmentNo  = ntohl(Header.FragmentNo);  Header.ChecksumType  = ntohl(Header.ChecksumType);    debug << "FragmentHeader: " << Header.SectionType 	<< " " << Header.SectionLength 	<< " " << Header.TableId 	<< " " << Header.FragmentNo 	<< " " << Header.ChecksumType << endl;    m_currentTable = m_metaData.getTable(Header.TableId);  if(m_currentTable == 0){    ret = -1;    return false;  }    if(!m_tuple.prepareRecord(*m_currentTable))  {    ret =-1;    return false;  }  info << "_____________________________________________________" << endl       << "Processing data in table: " << m_currentTable->getTableName()        << "(" << Header.TableId << ") fragment "        << Header.FragmentNo << endl;    m_count = 0;  ret = 0;  return true;} // RestoreDataIterator::getNextFragmentboolRestoreDataIterator::validateFragmentFooter() {  BackupFormat::DataFile::FragmentFooter footer;    if (buffer_read(&footer, sizeof(footer), 1) != 1){    err << "getFragmentFooter:Error reading fragment footer" << endl;    return false;  }     // TODO: Handle footer, nothing yet  footer.SectionType  = ntohl(footer.SectionType);  footer.SectionLength  = ntohl(footer.SectionLength);  footer.TableId  = ntohl(footer.TableId);  footer.FragmentNo  = ntohl(footer.FragmentNo);  footer.NoOfRecords  = ntohl(footer.NoOfRecords);  footer.Checksum  = ntohl(footer.Checksum);  assert(m_count == footer.NoOfRecords);    return true;} // RestoreDataIterator::getFragmentFooterAttributeDesc::AttributeDesc(NdbDictionary::Column *c)  : m_column(c){  size = 8*NdbColumnImpl::getImpl(* c).m_attrSize;  arraySize = NdbColumnImpl::getImpl(* c).m_arraySize;}void TableS::createAttr(NdbDictionary::Column *column){  AttributeDesc * d = new AttributeDesc(column);  if(d == NULL) {    ndbout_c("Restore: Failed to allocate memory");    abort();  }  d->attrId = allAttributesDesc.size();  allAttributesDesc.push_back(d);  if (d->m_column->getAutoIncrement())    m_auto_val_id= d->attrId;  if(d->m_column->getPrimaryKey() && backupVersion <= MAKE_VERSION(4,1,7))  {    m_fixedKeys.push_back(d);    return;  }    if(!d->m_column->getNullable())  {    m_fixedAttribs.push_back(d);    return;  }  /* Nullable attr*/  d->m_nullBitIndex = m_noOfNullable;   m_noOfNullable++;  m_nullBitmaskSize = (m_noOfNullable + 31) / 32;  m_variableAttribs.push_back(d);} // TableS::createAttrUint16 Twiddle16(Uint16 in){  Uint16 retVal = 0;  retVal = ((in & 0xFF00) >> 8) |    ((in & 0x00FF) << 8);  return(retVal);} // Twiddle16Uint32 Twiddle32(Uint32 in){  Uint32 retVal = 0;  retVal = ((in & 0x000000FF) << 24) |     ((in & 0x0000FF00) << 8)  |    ((in & 0x00FF0000) >> 8)  |    ((in & 0xFF000000) >> 24);    return(retVal);} // Twiddle32Uint64 Twiddle64(Uint64 in){  Uint64 retVal = 0;  retVal =     ((in & (Uint64)0x00000000000000FFLL) << 56) |     ((in & (Uint64)0x000000000000FF00LL) << 40) |     ((in & (Uint64)0x0000000000FF0000LL) << 24) |     ((in & (Uint64)0x00000000FF000000LL) << 8) |     ((in & (Uint64)0x000000FF00000000LL) >> 8) |     ((in & (Uint64)0x0000FF0000000000LL) >> 24) |     ((in & (Uint64)0x00FF000000000000LL) >> 40) |     ((in & (Uint64)0xFF00000000000000LL) >> 56);  return(retVal);} // Twiddle64RestoreLogIterator::RestoreLogIterator(const RestoreMetaData & md)  : m_metaData(md) {  debug << "RestoreLog constructor" << endl;  setLogFile(md, 0);  m_count = 0;  m_last_gci = 0;}const LogEntry *RestoreLogIterator::getNextLogEntry(int & res) {  // Read record length  typedef BackupFormat::LogFile::LogEntry LogE;  LogE * logE= 0;  Uint32 len= ~0;  const Uint32 stopGCP = m_metaData.getStopGCP();  do {    if (buffer_read_ahead(&len, sizeof(Uint32), 1) != 1){      res= -1;      return 0;    }    len= ntohl(len);    Uint32 data_len = sizeof(Uint32) + len*4;    if (buffer_get_ptr((void **)(&logE), 1, data_len) != data_len) {      res= -2;      return 0;    }        if(len == 0){      res= 0;      return 0;    }    logE->TableId= ntohl(logE->TableId);    logE->TriggerEvent= ntohl(logE->TriggerEvent);        const bool hasGcp= (logE->TriggerEvent & 0x10000) != 0;    logE->TriggerEvent &= 0xFFFF;        if(hasGcp){      len--;      m_last_gci = ntohl(logE->Data[len-2]);    }  } while(m_last_gci > stopGCP + 1);    m_logEntry.m_table = m_metaData.getTable(logE->TableId);  switch(logE->TriggerEvent){  case TriggerEvent::TE_INSERT:    m_logEntry.m_type = LogEntry::LE_INSERT;    break;  case TriggerEvent::TE_UPDATE:    m_logEntry.m_type = LogEntry::LE_UPDATE;    break;  case TriggerEvent::TE_DELETE:    m_logEntry.m_type = LogEntry::LE_DELETE;    break;  default:    res = -1;    return NULL;  }  const TableS * tab = m_logEntry.m_table;  m_logEntry.clear();  AttributeHeader * ah = (AttributeHeader *)&logE->Data[0];  AttributeHeader *end = (AttributeHeader *)&logE->Data[len - 2];  AttributeS *  attr;  while(ah < end){    attr= m_logEntry.add_attr();    if(attr == NULL) {      ndbout_c("Restore: Failed to allocate memory");      res = -1;      return 0;    }    attr->Desc = (* tab)[ah->getAttributeId()];    assert(attr->Desc != 0);    const Uint32 sz = ah->getDataSize();    if(sz == 0){      attr->Data.null = true;      attr->Data.void_value = NULL;    } else {      attr->Data.null = false;      attr->Data.void_value = ah->getDataPtr();    }        Twiddle(attr->Desc, &(attr->Data));        ah = ah->getNext();  }  m_count ++;  res = 0;  return &m_logEntry;}NdbOut &operator<<(NdbOut& ndbout, const AttributeS& attr){  const AttributeData & data = attr.Data;  const AttributeDesc & desc = *(attr.Desc);  if (data.null)  {    ndbout << "<NULL>";    return ndbout;  }    NdbRecAttr tmprec(0);  tmprec.setup(desc.m_column, (char *)data.void_value);  ndbout << tmprec;  return ndbout;}// Print tuple dataNdbOut& operator<<(NdbOut& ndbout, const TupleS& tuple){  ndbout << tuple.getTable()->getTableName() << "; ";  for (int i = 0; i < tuple.getNoOfAttributes(); i++)   {    AttributeData * attr_data = tuple.getData(i);    const AttributeDesc * attr_desc = tuple.getDesc(i);    const AttributeS attr = {attr_desc, *attr_data};    debug << i << " " << attr_desc->m_column->getName();    ndbout << attr;        if (i != (tuple.getNoOfAttributes() - 1))      ndbout << delimiter << " ";  } // for  return ndbout;}// Print tuple dataNdbOut& operator<<(NdbOut& ndbout, const LogEntry& logE){  switch(logE.m_type)  {  case LogEntry::LE_INSERT:    ndbout << "INSERT " << logE.m_table->getTableName() << " ";    break;  case LogEntry::LE_DELETE:    ndbout << "DELETE " << logE.m_table->getTableName() << " ";    break;  case LogEntry::LE_UPDATE:    ndbout << "UPDATE " << logE.m_table->getTableName() << " ";    break;  default:    ndbout << "Unknown log entry type (not insert, delete or update)" ;  }    for (Uint32 i= 0; i < logE.size();i++)   {    const AttributeS * attr = logE[i];    ndbout << attr->Desc->m_column->getName() << "=";    ndbout << (* attr);    if (i < (logE.size() - 1))      ndbout << ", ";  }  return ndbout;}#include <NDBT.hpp>NdbOut & operator<<(NdbOut& ndbout, const TableS & table){    ndbout << (* (NDBT_Table*)table.m_dictTable) << endl;  return ndbout;}template class Vector<TableS*>;template class Vector<AttributeS*>;template class Vector<AttributeDesc*>;template class Vector<FragmentInfo*>;

⌨️ 快捷键说明

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