| /* |
| * 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. |
| * |
| * Changes are Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). |
| */ |
| #ifndef _lucene_store_FSDirectory_ |
| #define _lucene_store_FSDirectory_ |
| |
| #if defined(_LUCENE_PRAGMA_ONCE) |
| # pragma once |
| #endif |
| |
| #include <QtCore/QFile> |
| #include <QtCore/QString> |
| #include <QtCore/QStringList> |
| |
| #include "Directory.h" |
| #include "Lock.h" |
| #include "CLucene/util/VoidMap.h" |
| #include "CLucene/util/StringBuffer.h" |
| |
| CL_NS_DEF(store) |
| |
| /** |
| * Straightforward implementation of {@link Directory} as a directory of files. |
| * <p>If the system property 'disableLuceneLocks' has the String value of |
| * "true", lock creation will be disabled. |
| * |
| * @see Directory |
| */ |
| class FSDirectory : public Directory |
| { |
| public: |
| // Destructor - only call this if you are sure the directory |
| // is not being used anymore. Otherwise use the ref-counting |
| // facilities of _CLDECDELETE |
| ~FSDirectory(); |
| |
| // Get a list of strings, one for each file in the directory. |
| QStringList list() const; |
| |
| // Returns true iff a file with the given name exists. |
| bool fileExists(const QString& name) const; |
| |
| // Returns the text name of the directory |
| QString getDirName() const; ///<returns reference |
| |
| /** |
| Returns the directory instance for the named location. |
| |
| Do not delete this instance, only use close, otherwise other instances |
| will lose this instance. |
| |
| <p>Directories are cached, so that, for a given canonical path, the same |
| FSDirectory instance will always be returned. This permits |
| synchronization on directories. |
| |
| @param file the path to the directory. |
| @param create if true, create, or erase any existing contents. |
| @return the FSDirectory for the named file. |
| */ |
| static FSDirectory* getDirectory(const QString& file, const bool create); |
| |
| // Returns the time the named file was last modified. |
| int64_t fileModified(const QString& name) const; |
| |
| //static |
| // Returns the time the named file was last modified. |
| static int64_t fileModified(const QString& dir, const QString& name); |
| |
| // static |
| // Returns the length in bytes of a file in the directory. |
| int64_t fileLength(const QString& name) const; |
| |
| // Returns a stream reading an existing file. |
| IndexInput* openInput(const QString& name); |
| IndexInput* openInput(const QString& name, int32_t bufferSize); |
| |
| // Renames an existing file in the directory. |
| void renameFile(const QString& from, const QString& to); |
| |
| // Set the modified time of an existing file to now. |
| void touchFile(const QString& name); |
| |
| // Creates a new, empty file in the directory with the given name. |
| // Returns a stream writing this file. |
| IndexOutput* createOutput(const QString& name); |
| |
| // Construct a {@link Lock}. |
| // @param name the name of the lock file |
| LuceneLock* makeLock(const QString& name); |
| |
| // Decrease the ref-count to the directory by one. If the object is no |
| // longer needed, then the object is removed from the directory pool. |
| void close(); |
| |
| // If MMap is available, this can disable use of mmap reading. |
| void setUseMMap(bool value) { useMMap = value; } |
| |
| // Gets whether the directory is using MMap for inputstreams. |
| bool getUseMMap() const { return useMMap; } |
| |
| QString toString() const; |
| |
| static QString DirectoryType() { return QLatin1String("FS"); } |
| QString getDirectoryType() const { return QLatin1String("FS"); } |
| |
| // Set whether Lucene's use of lock files is disabled. By default, |
| // lock files are enabled. They should only be disabled if the index |
| // is on a read-only medium like a CD-ROM. |
| static void setDisableLocks(bool doDisableLocks) |
| { disableLocks = doDisableLocks; } |
| |
| // Returns whether Lucene's use of lock files is disabled. |
| // @return true if locks are disabled, false if locks are enabled. |
| static bool getDisableLocks() { return disableLocks; } |
| |
| protected: |
| FSDirectory(const QString& path, const bool createDir); |
| // Removes an existing file in the directory. |
| bool doDeleteFile(const QString& name); |
| |
| private: |
| class FSLock : public LuceneLock { |
| public: |
| FSLock (const QString& lockDir, const QString& name); |
| ~FSLock(); |
| |
| bool obtain(); |
| void release(); |
| bool isLocked(); |
| QString toString() const; |
| |
| QString lockDir; |
| QString lockFile; |
| }; |
| friend class FSDirectory::FSLock; |
| |
| class FSIndexInput : public BufferedIndexInput { |
| public: |
| FSIndexInput(const QString& path, int32_t bufferSize = |
| CL_NS(store)::BufferedIndexOutput::BUFFER_SIZE); |
| ~FSIndexInput(); |
| |
| void close(); |
| IndexInput* clone() const; |
| |
| int64_t length() |
| { return handle->_length; } |
| |
| QString getDirectoryType() const |
| { return FSDirectory::DirectoryType(); } |
| |
| protected: |
| FSIndexInput(const FSIndexInput& clone); |
| // Random-access methods |
| void seekInternal(const int64_t position); |
| // IndexInput methods |
| void readInternal(uint8_t* b, const int32_t len); |
| |
| private: |
| // We used a shared handle between all the fsindexinput clones. |
| // This reduces number of file handles we need, and it means |
| // we dont have to use file tell (which is slow) before doing a read. |
| class SharedHandle : LUCENE_REFBASE { |
| public: |
| SharedHandle(); |
| ~SharedHandle(); |
| |
| int64_t _fpos; |
| int64_t _length; |
| |
| QFile fhandle; |
| DEFINE_MUTEX(*THIS_LOCK) |
| }; |
| SharedHandle* handle; |
| int64_t _pos; |
| }; |
| friend class FSDirectory::FSIndexInput; |
| |
| class FSIndexOutput : public BufferedIndexOutput { |
| public: |
| FSIndexOutput(const QString& path); |
| ~FSIndexOutput(); |
| |
| void close(); |
| int64_t length(); |
| void seek(const int64_t pos); |
| |
| protected: |
| void flushBuffer(const uint8_t* b, const int32_t size); |
| |
| private: |
| QFile fhandle; |
| }; |
| friend class FSDirectory::FSIndexOutput; |
| |
| private: |
| QString directory; |
| int refCount; |
| void create(); |
| |
| QString lockDir; |
| QString getLockPrefix() const; |
| static bool disableLocks; |
| |
| void priv_getFN(QString& buffer, const QString& name) const; |
| bool useMMap; |
| }; |
| |
| CL_NS_END |
| |
| #endif |