CrcSegInputStream.cpp

Go to the documentation of this file.
00001 /*
00002 // $Id: //open/dev/fennel/segment/CrcSegInputStream.cpp#8 $
00003 // Fennel is a library of data storage and processing components.
00004 // Copyright (C) 2005-2009 The Eigenbase Project
00005 // Copyright (C) 2005-2009 SQLstream, Inc.
00006 // Copyright (C) 2005-2009 LucidEra, Inc.
00007 // Portions Copyright (C) 1999-2009 John V. Sichi
00008 //
00009 // This program is free software; you can redistribute it and/or modify it
00010 // under the terms of the GNU General Public License as published by the Free
00011 // Software Foundation; either version 2 of the License, or (at your option)
00012 // any later version approved by The Eigenbase Project.
00013 //
00014 // This program is distributed in the hope that it will be useful,
00015 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017 // GNU General Public License for more details.
00018 //
00019 // You should have received a copy of the GNU General Public License
00020 // along with this program; if not, write to the Free Software
00021 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00022 */
00023 
00024 #include "fennel/common/CommonPreamble.h"
00025 #include "fennel/segment/CrcSegInputStream.h"
00026 
00027 FENNEL_BEGIN_CPPFILE("$Id: //open/dev/fennel/segment/CrcSegInputStream.cpp#8 $");
00028 
00029 SharedSegInputStream CrcSegInputStream::newCrcSegInputStream(
00030     SegmentAccessor const &segmentAccessor,
00031     PseudoUuid onlineUuid,
00032     PageId beginPageId)
00033 {
00034     return SharedSegInputStream(
00035         new CrcSegInputStream(
00036             segmentAccessor,onlineUuid,beginPageId),
00037         ClosableObjectDestructor());
00038 }
00039 
00040 CrcSegInputStream::CrcSegInputStream(
00041     SegmentAccessor const &segmentAccessorInit,
00042     PseudoUuid onlineUuidInit,
00043     PageId beginPageId)
00044     : SegInputStream(segmentAccessorInit,beginPageId,sizeof(SegStreamCrc))
00045 {
00046     onlineUuid = onlineUuidInit;
00047 }
00048 
00049 bool CrcSegInputStream::lockBufferParanoid()
00050 {
00051     if (!segmentAccessor.pSegment->isPageIdAllocated(currPageId)) {
00052         return false;
00053     }
00054     pageLock.lockShared(currPageId);
00055     if (!pageLock.getPage().isDataValid()) {
00056         return false;
00057     }
00058     if (!pageLock.isMagicNumberValid()) {
00059         return false;
00060     }
00061     SegStreamNode const &node = pageLock.getNodeForRead();
00062     SegStreamCrc const *pCrc =
00063         reinterpret_cast<SegStreamCrc const *>(&node+1);
00064     if (pCrc->pageId != currPageId) {
00065         return false;
00066     }
00067     if (pCrc->onlineUuid != onlineUuid) {
00068         return false;
00069     }
00070     crcComputer.reset();
00071     crcComputer.process_bytes(pCrc + 1,node.cbData);
00072     if (pCrc->checksum != crcComputer.checksum()) {
00073         return false;
00074     }
00075     PConstBuffer pFirstByte =
00076         reinterpret_cast<PConstBuffer>(&node) + cbPageHeader;
00077     setBuffer(pFirstByte,node.cbData);
00078     return true;
00079 }
00080 
00081 void CrcSegInputStream::lockBuffer()
00082 {
00083     if (!lockBufferParanoid()) {
00084         pageLock.unlock();
00085         currPageId = NULL_PAGE_ID;
00086         nullifyBuffer();
00087     }
00088 }
00089 
00090 FENNEL_END_CPPFILE("$Id: //open/dev/fennel/segment/CrcSegInputStream.cpp#8 $");
00091 
00092 // End CrcSegInputStream.cpp

Generated on Mon Jun 22 04:00:20 2009 for Fennel by  doxygen 1.5.1