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

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 BACKUP_H
  14. #define BACKUP_H
  15. #include <ndb_limits.h>
  16. #include <SimulatedBlock.hpp>
  17. #include "FsBuffer.hpp"
  18. #include "BackupFormat.hpp"
  19. #include <NodeBitmask.hpp>
  20. #include <SimpleProperties.hpp>
  21. #include <SLList.hpp>
  22. #include <ArrayList.hpp>
  23. #include <SignalCounter.hpp>
  24. #include <blocks/mutexes.hpp>
  25. #include <NdbTCP.h>
  26. /**
  27.  * Backup - This block manages database backup and restore
  28.  */
  29. class Backup : public SimulatedBlock
  30. {
  31. public:
  32.   Backup(const Configuration & conf);
  33.   virtual ~Backup();
  34.   BLOCK_DEFINES(Backup);
  35.   
  36. protected:
  37.   void execSTTOR(Signal* signal);
  38.   void execDUMP_STATE_ORD(Signal* signal);
  39.   void execREAD_NODESCONF(Signal* signal);
  40.   void execNODE_FAILREP(Signal* signal);
  41.   void execINCL_NODEREQ(Signal* signal);
  42.   void execCONTINUEB(Signal* signal);
  43.   
  44.   /**
  45.    * Testing
  46.    */
  47.   void execBACKUP_REF(Signal* signal);
  48.   void execBACKUP_CONF(Signal* signal);
  49.   void execBACKUP_ABORT_REP(Signal* signal);
  50.   void execBACKUP_COMPLETE_REP(Signal* signal);
  51.   
  52.   /**
  53.    * Signals sent from master
  54.    */
  55.   void execDEFINE_BACKUP_REQ(Signal* signal);
  56.   void execBACKUP_DATA(Signal* signal);
  57.   void execSTART_BACKUP_REQ(Signal* signal);
  58.   void execBACKUP_FRAGMENT_REQ(Signal* signal);
  59.   void execSTOP_BACKUP_REQ(Signal* signal);
  60.   void execBACKUP_STATUS_REQ(Signal* signal);
  61.   void execABORT_BACKUP_ORD(Signal* signal);
  62.  
  63.   /**
  64.    * The actual scan
  65.    */
  66.   void execSCAN_HBREP(Signal* signal);
  67.   void execTRANSID_AI(Signal* signal);
  68.   void execSCAN_FRAGREF(Signal* signal);
  69.   void execSCAN_FRAGCONF(Signal* signal);
  70.   /**
  71.    * Trigger logging
  72.    */
  73.   void execBACKUP_TRIG_REQ(Signal* signal);
  74.   void execTRIG_ATTRINFO(Signal* signal);
  75.   void execFIRE_TRIG_ORD(Signal* signal);
  76.   
  77.   /**
  78.    * DICT signals
  79.    */
  80.   void execLIST_TABLES_CONF(Signal* signal);
  81.   void execGET_TABINFOREF(Signal* signal);
  82.   void execGET_TABINFO_CONF(Signal* signal);
  83.   void execCREATE_TRIG_REF(Signal* signal);
  84.   void execCREATE_TRIG_CONF(Signal* signal);
  85.   void execALTER_TRIG_REF(Signal* signal);
  86.   void execALTER_TRIG_CONF(Signal* signal);
  87.   void execDROP_TRIG_REF(Signal* signal);
  88.   void execDROP_TRIG_CONF(Signal* signal);
  89.   /**
  90.    * DIH signals
  91.    */
  92.   void execDI_FCOUNTCONF(Signal* signal);
  93.   void execDIGETPRIMCONF(Signal* signal);
  94.   /**
  95.    * FS signals
  96.    */
  97.   void execFSOPENREF(Signal* signal);
  98.   void execFSOPENCONF(Signal* signal);
  99.   void execFSCLOSEREF(Signal* signal);
  100.   void execFSCLOSECONF(Signal* signal);
  101.   
  102.   void execFSAPPENDREF(Signal* signal);
  103.   void execFSAPPENDCONF(Signal* signal);
  104.   
  105.   void execFSREMOVEREF(Signal* signal);
  106.   void execFSREMOVECONF(Signal* signal);
  107.   /**
  108.    * Master functinallity
  109.    */
  110.   void execBACKUP_REQ(Signal* signal);
  111.   void execABORT_BACKUP_REQ(Signal* signal);
  112.   
  113.   void execDEFINE_BACKUP_REF(Signal* signal);
  114.   void execDEFINE_BACKUP_CONF(Signal* signal);
  115.   void execSTART_BACKUP_REF(Signal* signal);
  116.   void execSTART_BACKUP_CONF(Signal* signal);
  117.   void execBACKUP_FRAGMENT_REF(Signal* signal);
  118.   void execBACKUP_FRAGMENT_CONF(Signal* signal);
  119.   void execSTOP_BACKUP_REF(Signal* signal);
  120.   void execSTOP_BACKUP_CONF(Signal* signal);
  121.   
  122.   void execBACKUP_STATUS_CONF(Signal* signal);
  123.   void execUTIL_SEQUENCE_REF(Signal* signal);
  124.   void execUTIL_SEQUENCE_CONF(Signal* signal);
  125.   void execWAIT_GCP_REF(Signal* signal);
  126.   void execWAIT_GCP_CONF(Signal* signal);
  127.   
  128.   
  129. private:
  130.   void defineBackupMutex_locked(Signal* signal, Uint32 ptrI,Uint32 retVal);
  131.   void dictCommitTableMutex_locked(Signal* signal, Uint32 ptrI,Uint32 retVal);
  132. public:
  133.   struct Node {
  134.     Uint32 nodeId;
  135.     Uint32 alive;
  136.     Uint32 nextList;
  137.     union { Uint32 prevList; Uint32 nextPool; };
  138.   };
  139.   typedef Ptr<Node> NodePtr;
  140. #define BACKUP_WORDS_PER_PAGE 8191
  141.   struct Page32 {
  142.     Uint32 data[BACKUP_WORDS_PER_PAGE];
  143.     Uint32 nextPool;
  144.   };
  145.   typedef Ptr<Page32> Page32Ptr;
  146.   struct Attribute {
  147.     struct Data {
  148.       Uint8 nullable;
  149.       Uint8 fixed;
  150.       Uint8 unused; 
  151.       Uint8 unused2;
  152.       Uint32 sz32;       // No of 32 bit words
  153.       Uint32 offset;     // Relative DataFixedAttributes/DataFixedKeys
  154.       Uint32 offsetNull; // In NullBitmask
  155.     } data;
  156.     Uint32 nextPool;
  157.   };
  158.   typedef Ptr<Attribute> AttributePtr;
  159.   
  160.   struct Fragment {
  161.     Uint32 tableId;
  162.     Uint32 node;
  163.     Uint16 scanned;  // 0 = not scanned x = scanned by node x
  164.     Uint16 scanning; // 0 = not scanning x = scanning on node x
  165.     Uint32 nextPool;
  166.   };
  167.   typedef Ptr<Fragment> FragmentPtr;
  168.   struct Table {
  169.     Table(ArrayPool<Attribute> &, ArrayPool<Fragment> &);
  170.     
  171.     Uint32 tableId;
  172.     Uint32 schemaVersion;
  173.     Uint32 frag_mask;
  174.     Uint32 tableType;
  175.     Uint32 noOfNull;
  176.     Uint32 noOfAttributes;
  177.     Uint32 noOfVariable;
  178.     Uint32 sz_FixedAttributes;
  179.     Uint32 triggerIds[3];
  180.     bool   triggerAllocated[3];
  181.     
  182.     Array<Attribute> attributes;
  183.     Array<Fragment> fragments;
  184.     Uint32 nextList;
  185.     union { Uint32 nextPool; Uint32 prevList; };
  186.   };
  187.   typedef Ptr<Table> TablePtr;
  188.   struct OperationRecord {
  189.   public:
  190.     OperationRecord(Backup & b) : backup(b) {}
  191.     /**
  192.      * Once per table
  193.      */
  194.     void init(const TablePtr & ptr);
  195.     
  196.     /**
  197.      * Once per fragment
  198.      */
  199.     bool newFragment(Uint32 tableId, Uint32 fragNo);
  200.     bool fragComplete(Uint32 tableId, Uint32 fragNo);
  201.     
  202.     /**
  203.      * Once per scan frag (next) req/conf
  204.      */
  205.     bool newScan();
  206.     bool scanConf(Uint32 noOfOps, Uint32 opLen);
  207.     bool closeScan();
  208.     
  209.     /**
  210.      * Per record
  211.      */
  212.     void newRecord(Uint32 * base);
  213.     bool finished();
  214.     
  215.     /**
  216.      * Per attribute
  217.      */
  218.     void     nullAttribute(Uint32 nullOffset);
  219.     Uint32 * newNullable(Uint32 attrId, Uint32 sz);
  220.     Uint32 * newAttrib(Uint32 offset, Uint32 sz);
  221.     Uint32 * newVariable(Uint32 id, Uint32 sz);
  222.     
  223.   private:
  224.     Uint32* base; 
  225.     Uint32* dst_Length;
  226.     Uint32* dst_Bitmask;
  227.     Uint32* dst_FixedAttribs;
  228.     BackupFormat::DataFile::VariableData* dst_VariableData;
  229.     
  230.     Uint32 noOfAttributes; // No of Attributes
  231.     Uint32 attrLeft;       // No of attributes left
  232.     Uint32 opNoDone;
  233.     Uint32 opNoConf;
  234.     Uint32 opLen;
  235.   public:
  236.     Uint32* dst;
  237.     Uint32 attrSzLeft;  // No of words missing for current attribute
  238.     Uint32 attrSzTotal; // No of AI words received
  239.     Uint32 tablePtr;    // Ptr.i to current table
  240.     FsBuffer dataBuffer;
  241.     Uint32 noOfRecords;
  242.     Uint32 noOfBytes;
  243.     Uint32 maxRecordSize;
  244.     
  245.   private:
  246.     Uint32* scanStart;
  247.     Uint32* scanStop;
  248.     /**
  249.      * sizes of part
  250.      */
  251.     Uint32 sz_Bitmask;
  252.     Uint32 sz_FixedAttribs;
  253.   public:
  254.     union { Uint32 nextPool; Uint32 nextList; };
  255.     Uint32 prevList;
  256.   private:
  257.     Backup & backup;
  258.     BlockNumber number() const { return backup.number(); }
  259.     void progError(int line, int cause, const char * extra) { 
  260.       backup.progError(line, cause, extra); 
  261.     }
  262.   };
  263.   friend struct OperationRecord;
  264.   struct TriggerRecord {
  265.     TriggerRecord() { event = ~0;}
  266.     OperationRecord * operation;
  267.     BackupFormat::LogFile::LogEntry * logEntry;
  268.     Uint32 maxRecordSize;
  269.     Uint32 tableId;
  270.     Uint32 tab_ptr_i;
  271.     Uint32 event;
  272.     Uint32 backupPtr;
  273.     Uint32 errorCode;
  274.     union { Uint32 nextPool; Uint32 nextList; };
  275.   };
  276.   typedef Ptr<TriggerRecord> TriggerPtr;
  277.   
  278.   /**
  279.    * BackupFile - At least 3 per backup
  280.    */
  281.   struct BackupFile {
  282.     BackupFile(Backup & backup, ArrayPool<Page32> & pp) 
  283.       : operation(backup),  pages(pp) {}
  284.     
  285.     Uint32 backupPtr; // Pointer to backup record
  286.     Uint32 tableId;
  287.     Uint32 fragmentNo;
  288.     Uint32 filePointer;
  289.     Uint32 errorCode;
  290.     BackupFormat::FileType fileType;
  291.     OperationRecord operation;
  292.     
  293.     Array<Page32> pages;
  294.     Uint32 nextList;
  295.     union { Uint32 prevList; Uint32 nextPool; };
  296.     
  297.     Uint8 fileOpened;
  298.     Uint8 fileRunning;
  299.     Uint8 fileClosing;
  300.     Uint8 scanRunning;
  301.   }; 
  302.   typedef Ptr<BackupFile> BackupFilePtr;
  303.  
  304.   /**
  305.    * State for BackupRecord
  306.    */
  307.   enum State {
  308.     INITIAL,
  309.     DEFINING, // Defining backup content and parameters
  310.     DEFINED,  // DEFINE_BACKUP_CONF sent in slave, received all in master
  311.     STARTED,  // Creating triggers
  312.     SCANNING, // Scanning fragments
  313.     STOPPING, // Closing files
  314.     CLEANING, // Cleaning resources
  315.     ABORTING  // Aborting backup
  316.   };
  317.   static const Uint32 validSlaveTransitionsCount;
  318.   static const Uint32 validMasterTransitionsCount;
  319.   static const State validSlaveTransitions[];
  320.   static const State validMasterTransitions[];
  321.   
  322.   class CompoundState {
  323.   public:
  324.     CompoundState(Backup & b, 
  325.   const State valid[],
  326.   Uint32 count, Uint32 _id) 
  327.       : backup(b)
  328.       , validTransitions(valid),
  329. noOfValidTransitions(count), id(_id)
  330.     { 
  331.       state = INITIAL;
  332.       abortState = state;
  333.     }
  334.     
  335.     void setState(State s);
  336.     State getState() const { return state;}
  337.     State getAbortState() const { return abortState;}
  338.     
  339.     void forceState(State s);
  340.     
  341.     BlockNumber number() const { return backup.number(); }
  342.     void progError(int line, int cause, const char * extra) { 
  343.       backup.progError(line, cause, extra); 
  344.     }
  345.   private:
  346.     Backup & backup;
  347.     State state;     
  348.     State abortState;     /**
  349.      When state == ABORTING, this contains the state 
  350.      when the abort started
  351.   */
  352.     const State * validTransitions;
  353.     const Uint32 noOfValidTransitions;
  354.     const Uint32 id;
  355.   };
  356.   friend class CompoundState;
  357.   
  358.   /**
  359.    * Backup record
  360.    *
  361.    * One record per backup
  362.    */
  363.   struct BackupRecord {
  364.     BackupRecord(Backup& b, ArrayPool<Page32> & pp, 
  365.  ArrayPool<Table> & tp, 
  366.  ArrayPool<BackupFile> & bp,
  367.  ArrayPool<TriggerRecord> & trp) 
  368.       : slaveState(b, validSlaveTransitions, validSlaveTransitionsCount,1)
  369.       , tables(tp), triggers(trp), files(bp), pages(pp)
  370.       , masterData(b), backup(b)
  371.       {
  372.       }
  373.     
  374.     Uint32 m_gsn;
  375.     CompoundState slaveState; 
  376.     
  377.     Uint32 clientRef;
  378.     Uint32 clientData;
  379.     Uint32 flags;
  380.     Uint32 backupId;
  381.     Uint32 backupKey[2];
  382.     Uint32 masterRef;
  383.     Uint32 errorCode;
  384.     NdbNodeBitmask nodes;
  385.     
  386.     Uint64 noOfBytes;
  387.     Uint64 noOfRecords;
  388.     Uint64 noOfLogBytes;
  389.     Uint64 noOfLogRecords;
  390.     
  391.     Uint32 startGCP;
  392.     Uint32 currGCP;
  393.     Uint32 stopGCP;
  394.     DLList<Table> tables;
  395.     SLList<TriggerRecord> triggers;
  396.     
  397.     SLList<BackupFile> files; 
  398.     Uint32 ctlFilePtr;  // Ptr.i to ctl-file
  399.     Uint32 logFilePtr;  // Ptr.i to log-file
  400.     Uint32 dataFilePtr; // Ptr.i to first data-file
  401.     
  402.     Uint32 backupDataLen;  // Used for (un)packing backup request
  403.     Array<Page32> pages;   // Used for (un)packing backup request
  404.     SimpleProperties props;// Used for (un)packing backup request
  405.     
  406.     struct MasterData {
  407.       MasterData(Backup & b) 
  408. {
  409. }
  410.       MutexHandle2<BACKUP_DEFINE_MUTEX> m_defineBackupMutex;
  411.       MutexHandle2<DICT_COMMIT_TABLE_MUTEX> m_dictCommitTableMutex;
  412.       Uint32 gsn;
  413.       SignalCounter sendCounter;
  414.       Uint32 errorCode;
  415.       struct {
  416. Uint32 tableId;
  417.       } createTrig;
  418.       struct {
  419. Uint32 tableId;
  420.       } dropTrig;
  421.       struct {
  422. Uint32 tableId;
  423.       } alterTrig;
  424.       union {
  425. struct {
  426.   Uint32 startBackup;
  427. } waitGCP;
  428. struct {
  429.   Uint32 signalNo;
  430.   Uint32 noOfSignals;
  431.   Uint32 tablePtr;
  432. } startBackup;
  433. struct {
  434.   Uint32 dummy;
  435. } stopBackup;
  436.       };
  437.     } masterData;
  438.     
  439.     Uint32 nextList;
  440.     union { Uint32 prevList; Uint32 nextPool; };
  441.     void setErrorCode(Uint32 errCode){
  442.       if(errorCode == 0)
  443. errorCode = errCode;
  444.     }
  445.     bool checkError() const {
  446.       return errorCode != 0;
  447.     }
  448.     Backup & backup;
  449.     BlockNumber number() const { return backup.number(); }
  450.     void progError(int line, int cause, const char * extra) { 
  451.       backup.progError(line, cause, extra); 
  452.     }
  453.   };
  454.   friend struct BackupRecord;
  455.   typedef Ptr<BackupRecord> BackupRecordPtr;
  456.   struct Config {
  457.     Uint32 m_dataBufferSize;
  458.     Uint32 m_logBufferSize;
  459.     Uint32 m_minWriteSize;
  460.     Uint32 m_maxWriteSize;
  461.   };
  462.   
  463.   /**
  464.    * Variables
  465.    */
  466.   Uint32 * c_startOfPages;
  467.   NodeId c_masterNodeId;
  468.   SLList<Node> c_nodes;
  469.   NdbNodeBitmask c_aliveNodes;
  470.   DLList<BackupRecord> c_backups;
  471.   Config c_defaults;
  472.   Uint32 m_diskless;
  473.   STATIC_CONST(NO_OF_PAGES_META_FILE = 2);
  474.   /**
  475.    * Pools
  476.    */
  477.   ArrayPool<Table> c_tablePool;
  478.   ArrayPool<Attribute> c_attributePool;  
  479.   ArrayPool<BackupRecord> c_backupPool;
  480.   ArrayPool<BackupFile> c_backupFilePool;
  481.   ArrayPool<Page32> c_pagePool;
  482.   ArrayPool<Fragment> c_fragmentPool;
  483.   ArrayPool<Node> c_nodePool;
  484.   ArrayPool<TriggerRecord> c_triggerPool;
  485.   Uint32 calculate_frag_mask(Uint32);
  486.   void checkFile(Signal*, BackupFilePtr);
  487.   void checkScan(Signal*, BackupFilePtr);
  488.   void fragmentCompleted(Signal*, BackupFilePtr);
  489.   
  490.   void backupAllData(Signal* signal, BackupRecordPtr);
  491.   
  492.   void getFragmentInfo(Signal*, BackupRecordPtr, TablePtr, Uint32 fragNo);
  493.   void getFragmentInfoDone(Signal*, BackupRecordPtr);
  494.   
  495.   void openFiles(Signal* signal, BackupRecordPtr ptr);
  496.   void openFilesReply(Signal*, BackupRecordPtr ptr, BackupFilePtr);
  497.   void closeFiles(Signal*, BackupRecordPtr ptr);
  498.   void closeFilesDone(Signal*, BackupRecordPtr ptr);  
  499.   
  500.   void sendDefineBackupReq(Signal *signal, BackupRecordPtr ptr);
  501.   void defineBackupReply(Signal* signal, BackupRecordPtr ptr, Uint32 nodeId);
  502.   void createTrigReply(Signal* signal, BackupRecordPtr ptr);
  503.   void alterTrigReply(Signal* signal, BackupRecordPtr ptr);
  504.   void startBackupReply(Signal* signal, BackupRecordPtr ptr, Uint32, Uint32);
  505.   void stopBackupReply(Signal* signal, BackupRecordPtr ptr, Uint32 nodeId);
  506.   
  507.   void defineBackupRef(Signal*, BackupRecordPtr, Uint32 errCode = 0);
  508.   void backupFragmentRef(Signal * signal, BackupFilePtr filePtr);
  509.   void nextFragment(Signal*, BackupRecordPtr);
  510.   
  511.   void sendCreateTrig(Signal*, BackupRecordPtr ptr, TablePtr tabPtr);
  512.   void createAttributeMask(TablePtr tab, Bitmask<MAXNROFATTRIBUTESINWORDS>&);
  513.   void sendStartBackup(Signal*, BackupRecordPtr, TablePtr);
  514.   void sendAlterTrig(Signal*, BackupRecordPtr ptr);
  515.   void sendDropTrig(Signal*, BackupRecordPtr ptr);
  516.   void sendDropTrig(Signal* signal, BackupRecordPtr ptr, TablePtr tabPtr);
  517.   void dropTrigReply(Signal*, BackupRecordPtr ptr);
  518.   
  519.   void sendSignalAllWait(BackupRecordPtr ptr, Uint32 gsn, Signal *signal, 
  520.  Uint32 signalLength,
  521.  bool executeDirect = false);
  522.   bool haveAllSignals(BackupRecordPtr ptr, Uint32 gsn, Uint32 nodeId);
  523.   void sendStopBackup(Signal*, BackupRecordPtr ptr);
  524.   void sendAbortBackupOrd(Signal* signal, BackupRecordPtr ptr, Uint32 errCode);
  525.   void sendAbortBackupOrdSlave(Signal* signal, BackupRecordPtr ptr, 
  526.        Uint32 errCode);
  527.   void masterAbort(Signal*, BackupRecordPtr ptr);
  528.   void masterSendAbortBackup(Signal*, BackupRecordPtr ptr);
  529.   void slaveAbort(Signal*, BackupRecordPtr ptr);
  530.   
  531.   void abortFile(Signal* signal, BackupRecordPtr ptr, BackupFilePtr filePtr);
  532.   void abortFileHook(Signal* signal, BackupFilePtr filePtr, bool scanDone);
  533.   
  534.   bool verifyNodesAlive(BackupRecordPtr, const NdbNodeBitmask& aNodeBitMask);
  535.   bool checkAbort(BackupRecordPtr ptr);
  536.   void checkNodeFail(Signal* signal,
  537.      BackupRecordPtr ptr,
  538.      NodeId newCoord,
  539.      Uint32 theFailedNodes[NodeBitmask::Size]);
  540.   void masterTakeOver(Signal* signal, BackupRecordPtr ptr);
  541.   NodeId getMasterNodeId() const { return c_masterNodeId; }
  542.   bool findTable(const BackupRecordPtr &, TablePtr &, Uint32 tableId) const;
  543.   TablePtr parseTableDescription(Signal*, BackupRecordPtr ptr, Uint32 len);
  544.   
  545.   bool insertFileHeader(BackupFormat::FileType, BackupRecord*, BackupFile*);
  546.   void sendBackupRef(Signal* signal, BackupRecordPtr ptr, Uint32 errorCode);
  547.   void sendBackupRef(BlockReference ref, Uint32 flags, Signal *signal,
  548.      Uint32 senderData, Uint32 errorCode);
  549.   void dumpUsedResources();
  550.   void cleanup(Signal*, BackupRecordPtr ptr);
  551.   void abort_scan(Signal*, BackupRecordPtr ptr);
  552.   void removeBackup(Signal*, BackupRecordPtr ptr);
  553.   void sendSTTORRY(Signal*);
  554.   void createSequence(Signal* signal);
  555.   void createSequenceReply(Signal*, class UtilSequenceConf *);
  556. };
  557. inline
  558. void
  559. Backup::OperationRecord::newRecord(Uint32 * p){
  560.   base = p;
  561.   dst_Length       = p; p += 1;
  562.   dst_Bitmask      = p; p += sz_Bitmask;
  563.   dst_FixedAttribs = p; p += sz_FixedAttribs;
  564.   dst_VariableData = (BackupFormat::DataFile::VariableData*)p;
  565.   BitmaskImpl::clear(sz_Bitmask, dst_Bitmask);
  566.   attrLeft = noOfAttributes;
  567.   attrSzLeft = attrSzTotal = 0;
  568. }
  569. inline
  570. Uint32 *
  571. Backup::OperationRecord::newAttrib(Uint32 offset, Uint32 sz){
  572.   attrLeft--;
  573.   attrSzLeft = sz;
  574.   dst = dst_FixedAttribs + offset;
  575.   return dst;
  576. }
  577. inline
  578. void
  579. Backup::OperationRecord::nullAttribute(Uint32 offsetNull){
  580.   attrLeft --;
  581.   BitmaskImpl::set(sz_Bitmask, dst_Bitmask, offsetNull);
  582. }
  583. inline
  584. Uint32 *
  585. Backup::OperationRecord::newNullable(Uint32 id, Uint32 sz){
  586.   attrLeft--;
  587.   attrSzLeft = sz;
  588.   
  589.   dst = &dst_VariableData->Data[0];
  590.   dst_VariableData->Sz = htonl(sz);
  591.   dst_VariableData->Id = htonl(id);
  592.   
  593.   dst_VariableData = (BackupFormat::DataFile::VariableData *)(dst + sz);
  594.   
  595.   // Clear all bits on newRecord -> dont need to clear this
  596.   // BitmaskImpl::clear(sz_Bitmask, dst_Bitmask, offsetNull);
  597.   return dst;
  598. }
  599. inline
  600. Uint32 *
  601. Backup::OperationRecord::newVariable(Uint32 id, Uint32 sz){
  602.   attrLeft--;
  603.   attrSzLeft = sz;
  604.   
  605.   dst = &dst_VariableData->Data[0];
  606.   dst_VariableData->Sz = htonl(sz);
  607.   dst_VariableData->Id = htonl(id);
  608.   
  609.   dst_VariableData = (BackupFormat::DataFile::VariableData *)(dst + sz);
  610.   return dst;
  611. }
  612. inline
  613. bool
  614. Backup::OperationRecord::finished(){
  615.   if(attrLeft != 0 || attrSzLeft != 0){
  616.     return false;
  617.   }
  618.   
  619.   opLen += attrSzTotal;
  620.   opNoDone++;
  621.   
  622.   scanStop = dst = (Uint32 *)dst_VariableData;
  623.   
  624.   const Uint32 len = (dst - base - 1);
  625.   * dst_Length = htonl(len);
  626.   
  627.   noOfRecords++;
  628.   
  629.   return true;
  630. }
  631. #endif