summaryrefslogtreecommitdiff
path: root/storage/ndb/src/kernel/blocks/ndbfs/VoidFs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/src/kernel/blocks/ndbfs/VoidFs.cpp')
-rw-r--r--storage/ndb/src/kernel/blocks/ndbfs/VoidFs.cpp200
1 files changed, 200 insertions, 0 deletions
diff --git a/storage/ndb/src/kernel/blocks/ndbfs/VoidFs.cpp b/storage/ndb/src/kernel/blocks/ndbfs/VoidFs.cpp
new file mode 100644
index 00000000000..d093089acfc
--- /dev/null
+++ b/storage/ndb/src/kernel/blocks/ndbfs/VoidFs.cpp
@@ -0,0 +1,200 @@
+/* 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 */
+
+#include <limits.h>
+#include <errno.h>
+
+#include "Ndbfs.hpp"
+#include "AsyncFile.hpp"
+#include "Filename.hpp"
+#include "Error.hpp"
+
+#include <signaldata/FsOpenReq.hpp>
+#include <signaldata/FsCloseReq.hpp>
+#include <signaldata/FsReadWriteReq.hpp>
+#include <signaldata/FsAppendReq.hpp>
+#include <signaldata/FsRemoveReq.hpp>
+#include <signaldata/FsConf.hpp>
+#include <signaldata/FsRef.hpp>
+#include <signaldata/NdbfsContinueB.hpp>
+#include <signaldata/DumpStateOrd.hpp>
+
+#include <RefConvert.hpp>
+#include <NdbSleep.h>
+#include <NdbOut.hpp>
+#include <Configuration.hpp>
+
+#define DEBUG(x) { ndbout << "FS::" << x << endl; }
+
+VoidFs::VoidFs(const Configuration & conf) :
+ SimulatedBlock(NDBFS, conf)
+{
+ BLOCK_CONSTRUCTOR(VoidFs);
+
+ // Set received signals
+ addRecSignal(GSN_DUMP_STATE_ORD, &VoidFs::execDUMP_STATE_ORD);
+ addRecSignal(GSN_STTOR, &VoidFs::execSTTOR);
+ addRecSignal(GSN_FSOPENREQ, &VoidFs::execFSOPENREQ);
+ addRecSignal(GSN_FSCLOSEREQ, &VoidFs::execFSCLOSEREQ);
+ addRecSignal(GSN_FSWRITEREQ, &VoidFs::execFSWRITEREQ);
+ addRecSignal(GSN_FSREADREQ, &VoidFs::execFSREADREQ);
+ addRecSignal(GSN_FSSYNCREQ, &VoidFs::execFSSYNCREQ);
+ addRecSignal(GSN_FSAPPENDREQ, &VoidFs::execFSAPPENDREQ);
+ addRecSignal(GSN_FSREMOVEREQ, &VoidFs::execFSREMOVEREQ);
+ // Set send signals
+}
+
+VoidFs::~VoidFs()
+{
+}
+
+void
+VoidFs::execSTTOR(Signal* signal)
+{
+ jamEntry();
+
+ if(signal->theData[1] == 0){ // StartPhase 0
+ jam();
+ signal->theData[3] = 255;
+ sendSignal(NDBCNTR_REF, GSN_STTORRY, signal, 4, JBB);
+ return;
+ }
+ ndbrequire(0);
+}
+
+void
+VoidFs::execFSOPENREQ(Signal* signal)
+{
+ jamEntry();
+ const FsOpenReq * const fsOpenReq = (FsOpenReq *)&signal->theData[0];
+ const BlockReference userRef = fsOpenReq->userReference;
+ const Uint32 userPointer = fsOpenReq->userPointer;
+
+ Uint32 flags = fsOpenReq->fileFlags;
+ if(flags == FsOpenReq::OM_READONLY){
+ // Initialise FsRef signal
+ FsRef * const fsRef = (FsRef *)&signal->theData[0];
+ fsRef->userPointer = userPointer;
+ fsRef->errorCode = FsRef::fsErrFileDoesNotExist;
+ fsRef->osErrorCode = ~0;
+ sendSignal(userRef, GSN_FSOPENREF, signal, 3, JBB);
+ return;
+ }
+
+ if(flags & FsOpenReq::OM_WRITEONLY || flags & FsOpenReq::OM_READWRITE){
+ signal->theData[0] = userPointer;
+ signal->theData[1] = c_maxFileNo++;
+ sendSignal(userRef, GSN_FSOPENCONF, signal, 2, JBB);
+ }
+}
+
+void
+VoidFs::execFSREMOVEREQ(Signal* signal)
+{
+ jamEntry();
+ const FsRemoveReq * const req = (FsRemoveReq *)signal->getDataPtr();
+ const Uint32 userRef = req->userReference;
+ const Uint32 userPointer = req->userPointer;
+
+ signal->theData[0] = userPointer;
+ sendSignal(userRef, GSN_FSREMOVECONF, signal, 1, JBB);
+}
+
+/*
+ * PR0: File Pointer DR0: User reference DR1: User Pointer DR2: Flag bit 0= 1
+ * remove file
+ */
+void
+VoidFs::execFSCLOSEREQ(Signal * signal)
+{
+ jamEntry();
+
+ const FsCloseReq * const req = (FsCloseReq *)signal->getDataPtr();
+ const Uint32 userRef = req->userReference;
+ const Uint32 userPointer = req->userPointer;
+
+ signal->theData[0] = userPointer;
+ sendSignal(userRef, GSN_FSCLOSECONF, signal, 1, JBB);
+}
+
+void
+VoidFs::execFSWRITEREQ(Signal* signal)
+{
+ jamEntry();
+ const FsReadWriteReq * const req = (FsReadWriteReq *)signal->getDataPtr();
+ const Uint32 userRef = req->userReference;
+ const Uint32 userPointer = req->userPointer;
+
+ signal->theData[0] = userPointer;
+ sendSignal(userRef, GSN_FSWRITECONF, signal, 1, JBB);
+}
+
+void
+VoidFs::execFSREADREQ(Signal* signal)
+{
+ jamEntry();
+
+ const FsReadWriteReq * const req = (FsReadWriteReq *)signal->getDataPtr();
+ const Uint32 userRef = req->userReference;
+ const Uint32 userPointer = req->userPointer;
+
+ signal->theData[0] = userPointer;
+ sendSignal(userRef, GSN_FSREADCONF, signal, 1, JBB);
+#if 0
+ FsRef * const fsRef = (FsRef *)&signal->theData[0];
+ fsRef->userPointer = userPointer;
+ fsRef->errorCode = FsRef::fsErrEnvironmentError;
+ fsRef->osErrorCode = ~0; // Indicate local error
+ sendSignal(userRef, GSN_FSREADREF, signal, 3, JBB);
+#endif
+}
+
+void
+VoidFs::execFSSYNCREQ(Signal * signal)
+{
+ jamEntry();
+
+ BlockReference userRef = signal->theData[1];
+ const UintR userPointer = signal->theData[2];
+
+ signal->theData[0] = userPointer;
+ sendSignal(userRef, GSN_FSSYNCCONF, signal, 1, JBB);
+
+ return;
+}
+
+void
+VoidFs::execFSAPPENDREQ(Signal * signal)
+{
+ const FsAppendReq * const fsReq = (FsAppendReq *)&signal->theData[0];
+ const UintR userPointer = fsReq->userPointer;
+ const BlockReference userRef = fsReq->userReference;
+ const Uint32 size = fsReq->size;
+
+ signal->theData[0] = userPointer;
+ signal->theData[1] = size << 2;
+ sendSignal(userRef, GSN_FSAPPENDCONF, signal, 2, JBB);
+}
+
+void
+VoidFs::execDUMP_STATE_ORD(Signal* signal)
+{
+}//VoidFs::execDUMP_STATE_ORD()
+
+
+
+BLOCK_FUNCTIONS(VoidFs)
+