blob: 93f7a24de065cded7ad2e4700dd405527409f7c1 [file] [log] [blame]
/*------------------------------------------------------------------------------
* Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team
*
* Distributable under the terms of either the Apache License (Version 2.0) or
* the GNU Lesser General Public License, as specified in the COPYING file.
------------------------------------------------------------------------------*/
#ifndef _lucene_index_DirectoryIndexReader_
#define _lucene_index_DirectoryIndexReader_
#include <cstdint>
#include "IndexReader.h"
CL_CLASS_DEF(store,LuceneLock)
CL_NS_DEF(index)
class IndexDeletionPolicy;
/**
* IndexReader implementation that has access to a Directory.
* Instances that have a SegmentInfos object (i. e. segmentInfos != null)
* "own" the directory, which means that they try to acquire a write lock
* whenever index modifications are performed.
*/
class CLUCENE_EXPORT DirectoryIndexReader: public IndexReader {
private:
IndexDeletionPolicy* deletionPolicy;
SegmentInfos* segmentInfos;
CL_NS(store)::LuceneLock* writeLock;
bool stale;
/** Used by commit() to record pre-commit state in case
* rollback is necessary */
bool rollbackHasChanges;
SegmentInfos* rollbackSegmentInfos;
class FindSegmentsFile_Open;
class FindSegmentsFile_Reopen;
friend class FindSegmentsFile_Open;
friend class FindSegmentsFile_Reopen;
protected:
CL_NS(store)::Directory* _directory;
bool closeDirectory;
DirectoryIndexReader();
/**
* Re-opens the index using the passed-in SegmentInfos
*/
virtual DirectoryIndexReader* doReopen(SegmentInfos* infos) = 0;
void doClose();
/**
* Commit changes resulting from delete, undeleteAll, or
* setNorm operations
*
* If an exception is hit, then either no changes or all
* changes will have been committed to the index
* (transactional semantics).
* @throws IOException if there is a low-level IO error
*/
void doCommit();
virtual void commitChanges() = 0;
/**
* Tries to acquire the WriteLock on this directory->
* this method is only valid if this IndexReader is directory owner.
*
* @throws StaleReaderException if the index has changed
* since this reader was opened
* @throws CorruptIndexException if the index is corrupt
* @throws LockObtainFailedException if another writer
* has this index open (<code>write.lock</code> could not
* be obtained)
* @throws IOException if there is a low-level IO error
*/
void acquireWriteLock();
public:
virtual ~DirectoryIndexReader();
void init(CL_NS(store)::Directory* directory, SegmentInfos* segmentInfos, bool closeDirectory);
CLUCENE_LOCAL_DECL DirectoryIndexReader(CL_NS(store)::Directory* directory, SegmentInfos* segmentInfos, bool closeDirectory);
CLUCENE_LOCAL_DECL static DirectoryIndexReader* open(CL_NS(store)::Directory* directory, bool closeDirectory, IndexDeletionPolicy* deletionPolicy);
CLUCENE_LOCAL_DECL static DirectoryIndexReader* open(CL_NS(store)::Directory* directory,
int32_t readBufferSize, bool closeDirectory,
IndexDeletionPolicy* deletionPolicy);
IndexReader* reopen();
void setDeletionPolicy(IndexDeletionPolicy* deletionPolicy);
/** Returns the directory this index resides in.
*/
CL_NS(store)::Directory* directory();
/**
* Version number when this IndexReader was opened.
*/
int64_t getVersion();
FieldInfos* getFieldInfos();
/**
* Check whether this IndexReader is still using the
* current (i.e., most recently committed) version of the
* index. If a writer has committed any changes to the
* index since this reader was opened, this will return
* <code>false</code>, in which case you must open a _CLNEW
* IndexReader in order to see the changes. See the
* description of the <a href="IndexWriter.html#autoCommit"><code>autoCommit</code></a>
* flag which controls when the {@link IndexWriter}
* actually commits changes to the index.
*
* @throws CorruptIndexException if the index is corrupt
* @throws IOException if there is a low-level IO error
*/
bool isCurrent();
/**
* Checks is the index is optimized (if it has a single segment and no deletions)
* @return <code>true</code> if the index is optimized; <code>false</code> otherwise
*/
bool isOptimized();
/**
* Should internally checkpoint state that will change
* during commit so that we can rollback if necessary.
*/
CLUCENE_LOCAL_DECL void startCommit();
/**
* Rolls back state to just before the commit (this is
* called by commit() if there is some exception while
* committing).
*/
CLUCENE_LOCAL_DECL void rollbackCommit();
};
CL_NS_END
#endif