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

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 <limits.h>
  14. #include <errno.h>
  15. #include "Ndbfs.hpp"
  16. #include "AsyncFile.hpp"
  17. #include "Filename.hpp"
  18. #include "Error.hpp"
  19. #include <signaldata/FsOpenReq.hpp>
  20. #include <signaldata/FsCloseReq.hpp>
  21. #include <signaldata/FsReadWriteReq.hpp>
  22. #include <signaldata/FsAppendReq.hpp>
  23. #include <signaldata/FsRemoveReq.hpp>
  24. #include <signaldata/FsConf.hpp>
  25. #include <signaldata/FsRef.hpp>
  26. #include <signaldata/NdbfsContinueB.hpp>
  27. #include <signaldata/DumpStateOrd.hpp>
  28. #include <RefConvert.hpp>
  29. #include <NdbSleep.h>
  30. #include <NdbOut.hpp>
  31. #include <Configuration.hpp>
  32. #define DEBUG(x) { ndbout << "FS::" << x << endl; }
  33. VoidFs::VoidFs(const Configuration & conf) :
  34.   SimulatedBlock(NDBFS, conf)
  35. {
  36.   BLOCK_CONSTRUCTOR(VoidFs);
  37.   
  38.   // Set received signals
  39.   addRecSignal(GSN_DUMP_STATE_ORD,  &VoidFs::execDUMP_STATE_ORD);
  40.   addRecSignal(GSN_STTOR,  &VoidFs::execSTTOR);
  41.   addRecSignal(GSN_FSOPENREQ, &VoidFs::execFSOPENREQ);
  42.   addRecSignal(GSN_FSCLOSEREQ, &VoidFs::execFSCLOSEREQ);
  43.   addRecSignal(GSN_FSWRITEREQ, &VoidFs::execFSWRITEREQ);
  44.   addRecSignal(GSN_FSREADREQ, &VoidFs::execFSREADREQ);
  45.   addRecSignal(GSN_FSSYNCREQ, &VoidFs::execFSSYNCREQ);
  46.   addRecSignal(GSN_FSAPPENDREQ, &VoidFs::execFSAPPENDREQ);
  47.   addRecSignal(GSN_FSREMOVEREQ, &VoidFs::execFSREMOVEREQ);
  48.    // Set send signals
  49. }
  50. VoidFs::~VoidFs()
  51. {
  52. }
  53. void
  54. VoidFs::execSTTOR(Signal* signal)
  55. {
  56.   jamEntry();
  57.   
  58.   if(signal->theData[1] == 0){ // StartPhase 0
  59.     jam();
  60.     signal->theData[3] = 255;
  61.     sendSignal(NDBCNTR_REF, GSN_STTORRY, signal, 4, JBB);
  62.     return;
  63.   }
  64.   ndbrequire(0);
  65. }
  66. void 
  67. VoidFs::execFSOPENREQ(Signal* signal)
  68. {
  69.   jamEntry();
  70.   const FsOpenReq * const fsOpenReq = (FsOpenReq *)&signal->theData[0];
  71.   const BlockReference userRef = fsOpenReq->userReference;
  72.   const Uint32 userPointer = fsOpenReq->userPointer;
  73.   Uint32 flags = fsOpenReq->fileFlags;
  74.   if(flags == FsOpenReq::OM_READONLY){
  75.     // Initialise FsRef signal
  76.     FsRef * const fsRef = (FsRef *)&signal->theData[0];
  77.     fsRef->userPointer = userPointer;
  78.     fsRef->errorCode = FsRef::fsErrFileDoesNotExist;
  79.     fsRef->osErrorCode = ~0; 
  80.     sendSignal(userRef, GSN_FSOPENREF, signal, 3, JBB);
  81.     return;
  82.   }
  83.   if(flags & FsOpenReq::OM_WRITEONLY || flags & FsOpenReq::OM_READWRITE){
  84.     signal->theData[0] = userPointer;
  85.     signal->theData[1] = c_maxFileNo++;
  86.     sendSignal(userRef, GSN_FSOPENCONF, signal, 2, JBB);
  87.   }
  88. }
  89. void 
  90. VoidFs::execFSREMOVEREQ(Signal* signal)
  91. {
  92.   jamEntry();
  93.   const FsRemoveReq * const req = (FsRemoveReq *)signal->getDataPtr();
  94.   const Uint32 userRef = req->userReference;
  95.   const Uint32 userPointer = req->userPointer;
  96.   signal->theData[0] = userPointer;
  97.   sendSignal(userRef, GSN_FSREMOVECONF, signal, 1, JBB);
  98. }
  99. /*
  100.  * PR0: File Pointer DR0: User reference DR1: User Pointer DR2: Flag bit 0= 1
  101.  * remove file
  102.  */
  103. void 
  104. VoidFs::execFSCLOSEREQ(Signal * signal)
  105. {
  106.   jamEntry();
  107.   
  108.   const FsCloseReq * const req = (FsCloseReq *)signal->getDataPtr();
  109.   const Uint32 userRef = req->userReference;
  110.   const Uint32 userPointer = req->userPointer;
  111.   
  112.   signal->theData[0] = userPointer;
  113.   sendSignal(userRef, GSN_FSCLOSECONF, signal, 1, JBB);
  114. }
  115. void 
  116. VoidFs::execFSWRITEREQ(Signal* signal)
  117. {
  118.   jamEntry();
  119.   const FsReadWriteReq * const req = (FsReadWriteReq *)signal->getDataPtr();
  120.   const Uint32 userRef = req->userReference;
  121.   const Uint32 userPointer = req->userPointer;
  122.   signal->theData[0] = userPointer;
  123.   sendSignal(userRef, GSN_FSWRITECONF, signal, 1, JBB);
  124. }
  125. void 
  126. VoidFs::execFSREADREQ(Signal* signal)
  127. {
  128.   jamEntry();
  129.   const FsReadWriteReq * const req = (FsReadWriteReq *)signal->getDataPtr();
  130.   const Uint32 userRef = req->userReference;
  131.   const Uint32 userPointer = req->userPointer;
  132.   signal->theData[0] = userPointer;
  133.   sendSignal(userRef, GSN_FSREADCONF, signal, 1, JBB);
  134. #if 0
  135.   FsRef * const fsRef = (FsRef *)&signal->theData[0];
  136.   fsRef->userPointer = userPointer;
  137.   fsRef->errorCode = FsRef::fsErrEnvironmentError;
  138.   fsRef->osErrorCode = ~0; // Indicate local error
  139.   sendSignal(userRef, GSN_FSREADREF, signal, 3, JBB);
  140. #endif
  141. }
  142. void
  143. VoidFs::execFSSYNCREQ(Signal * signal)
  144. {
  145.   jamEntry();
  146.   BlockReference userRef = signal->theData[1];
  147.   const UintR userPointer = signal->theData[2]; 
  148.   signal->theData[0] = userPointer;
  149.   sendSignal(userRef, GSN_FSSYNCCONF, signal, 1, JBB);
  150.   return;
  151. }
  152. void 
  153. VoidFs::execFSAPPENDREQ(Signal * signal)
  154. {
  155.   const FsAppendReq * const fsReq = (FsAppendReq *)&signal->theData[0];
  156.   const UintR userPointer = fsReq->userPointer; 
  157.   const BlockReference userRef = fsReq->userReference;
  158.   const Uint32 size = fsReq->size;
  159.   
  160.   signal->theData[0] = userPointer;
  161.   signal->theData[1] = size << 2;
  162.   sendSignal(userRef, GSN_FSAPPENDCONF, signal, 2, JBB);
  163. }
  164. void
  165. VoidFs::execDUMP_STATE_ORD(Signal* signal)
  166. {
  167. }//VoidFs::execDUMP_STATE_ORD()
  168. BLOCK_FUNCTIONS(VoidFs)