FirteX-高性能全文索引和检索平台

API Documentation


首页 | 名字空间列表 | 类继承关系 | 组合类型列表 | $(BL\录(B | 文件列表 | 名字空间成员 | 组合类型成员 | 文件成员

FSIndexOutput.h

浏览该文件的文档。
00001 //
00002 // Copyright(C) 2005--2006 Institute of Computing Tech, Chinese Academy of Sciences. 
00003 // All rights reserved.
00004 // This file is part of FirteX (www.firtex.org)
00005 //
00006 // Use of the FirteX is subject to the terms of the software license set forth in 
00007 // the LICENSE file included with this software, and also available at
00008 // http://www.firtex.org/license.html
00009 //
00010 // Author       : 郭瑞杰(GuoRuijie)
00011 // Email        : ruijieguo@software.ict.ac.cn,ruijieguo@gmail.com
00012 // Created      : 2005/12/9
00013 //
00014 #ifndef _FILECACHEWRITER_H
00015 #define _FILECACHEWRITER_H
00016 
00017 #include <stdio.h>
00018 #include "../utility/Misc.h"
00019 #include "IndexOutput.h"
00020 
00021 using namespace std;
00022 using namespace firtex::utility;
00023 
00024 namespace firtex
00025 {
00026         namespace store
00027         {
00028                 class CFSIndexOutput :  public CIndexOutput
00029                 {
00030                 public:
00031                         CFSIndexOutput(const tchar* filename):CIndexOutput(0)
00032                         {
00033                                 if ( CMisc::dirExists(filename) )
00034                                         m_fileHandle = ::fileOpen( filename, O_BINARY | O_RDWR | O_RANDOM | O_TRUNC, _S_IREAD | _S_IWRITE);
00035                                 else 
00036                                         m_fileHandle = ::fileOpen( filename, O_BINARY | O_RDWR | O_RANDOM | O_CREAT, _S_IREAD | _S_IWRITE);
00037 
00038                                 if ( m_fileHandle < 0 )
00039                                 {
00040                                         int err = errno;
00041                                         tstring sFileName = filename;
00042                                         if ( err == ENOENT )
00043                                                 FIRTEX_THROW2(FILEIO_ERROR,"File does not exist:" + sFileName);
00044                                         else if ( err == EACCES )
00045                                                 FIRTEX_THROW2(FILEIO_ERROR,"File Access denied:" + sFileName);
00046                                         else if ( err == EMFILE )
00047                                                 FIRTEX_THROW2(FILEIO_ERROR,"Too many open files:" + sFileName);
00048                                 }                               
00049                         }
00050                         CFSIndexOutput(const tchar* filename,char* buffer,size_t buffsize):CIndexOutput(buffer,buffsize)
00051                         {
00052                                 if ( CMisc::dirExists(filename) )
00053                                         m_fileHandle = ::fileOpen( filename, O_BINARY | O_RDWR | O_RANDOM | O_TRUNC, _S_IREAD | _S_IWRITE);
00054                                 else 
00055                                         m_fileHandle = ::fileOpen( filename, O_BINARY | O_RDWR | O_RANDOM | O_CREAT, _S_IREAD | _S_IWRITE);
00056 
00057                                 if ( m_fileHandle < 0 )
00058                                 {
00059                                         int err = errno;
00060                                         tstring sFileName = filename;
00061                                         if ( err == ENOENT )
00062                                                 FIRTEX_THROW2(FILEIO_ERROR,"File does not exist:" + sFileName);
00063                                         else if ( err == EACCES )
00064                                                 FIRTEX_THROW2(FILEIO_ERROR,"File Access denied:" + sFileName);
00065                                         else if ( err == EMFILE )
00066                                                 FIRTEX_THROW2(FILEIO_ERROR,"Too many open files:" + sFileName);
00067                                 }                               
00068                         }
00069                         CFSIndexOutput(const tchar* filename,size_t buffsize):CIndexOutput(buffsize)
00070                         {
00071                                 if ( CMisc::dirExists(filename) )
00072                                         m_fileHandle = ::fileOpen( filename, O_BINARY | O_RDWR | O_RANDOM | O_TRUNC, _S_IREAD | _S_IWRITE);
00073                                 else 
00074                                         m_fileHandle = ::fileOpen( filename, O_BINARY | O_RDWR | O_RANDOM | O_CREAT, _S_IREAD | _S_IWRITE);
00075 
00076                                 if ( m_fileHandle < 0 )
00077                                 {
00078                                         int err = errno;
00079                                         tstring sFileName = filename;
00080                                         if ( err == ENOENT )
00081                                                 FIRTEX_THROW2(FILEIO_ERROR,"File does not exist:" + sFileName);
00082                                         else if ( err == EACCES )
00083                                                 FIRTEX_THROW2(FILEIO_ERROR,"File Access denied:" + sFileName);
00084                                         else if ( err == EMFILE )
00085                                                 FIRTEX_THROW2(FILEIO_ERROR,"Too many open files:" + sFileName);
00086                                 }                               
00087                         }                       
00088 
00089                         CFSIndexOutput():CIndexOutput(),m_fileHandle(-1)
00090                         {                               
00091                         }               
00092 
00093                         virtual ~CFSIndexOutput(void)
00094                         {
00095                                 close();
00096                         }
00097                                 
00098                 public:
00099                         void flushBuffer(char* b, size_t len)
00100                         {
00101                                 if(len > 0 && ::fileWrite(m_fileHandle,b,(unsigned int)len) != len)
00102                                 {
00103                                         int err = errno;
00104                                         if(err == ENOSPC)
00105                                                 FIRTEX_THROW2(FILEIO_ERROR,"CFSIndexOutput::flushBuffer():no space in the disk.");
00106                                         else 
00107                                                 FIRTEX_THROW2(FILEIO_ERROR,"CFSIndexOutput::flushBuffer():file IO write error:");
00108                                 }
00109                         }
00110                         void seek(int64_t pos)
00111                         {
00112                                 CIndexOutput::seek(pos);                                
00113                                 if(fileSeek(m_fileHandle,pos,SEEK_SET) != pos)
00114                                         FIRTEX_THROW2(FILEIO_ERROR,"CFSIndexOutput::seek():file IO seek error.");
00115                         }
00116                         int64_t length()
00117                         {
00118                                 return m_bufferStart + (int64_t)m_bufferPosition;
00119                         }
00120                         void open(const tchar* filename)
00121                         {
00122                                 if(m_fileHandle >= 0)
00123                                 { 
00124                                         close();
00125                                 }
00126                                 if ( CMisc::dirExists(filename) )
00127                                         m_fileHandle = ::fileOpen( filename, O_BINARY | O_RDWR | O_RANDOM | O_TRUNC, _S_IREAD | _S_IWRITE);
00128                                 else 
00129                                         m_fileHandle = ::fileOpen( filename, O_BINARY | O_RDWR | O_RANDOM | O_CREAT, _S_IREAD | _S_IWRITE);
00130 
00131                                 if ( m_fileHandle < 0 )
00132                                 {
00133                                         int err = errno;
00134                                         if ( err == ENOENT )
00135                                                 FIRTEX_THROW2(FILEIO_ERROR,"File does not exist");
00136                                         else if ( err == EACCES )
00137                                                 FIRTEX_THROW2(FILEIO_ERROR,"File Access denied");
00138                                         else if ( err == EMFILE )
00139                                                 FIRTEX_THROW2(FILEIO_ERROR,"Too many open files");
00140                                 }                               
00141                         }
00142 
00143                         void close()
00144                         {
00145                                 if(m_fileHandle >= 0)
00146                                 {
00147                                         CIndexOutput::close();
00148                                         ::fileClose(m_fileHandle);                                      
00149                                         m_fileHandle = -1;                                      
00150                                 }                               
00151                         }                       
00152                 protected:                      
00153                         int             m_fileHandle;
00154                 };
00155         }
00156 }
00157 
00158 
00159 #endif

http://www.firtex.org http://www.sourceforge.net/projects/firtex