FirteX-高性能全文索引和检索平台API Documentation |
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