/* * 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) 2012 Digia Plc and/or its subsidiary(-ies). */ #ifndef _lucene_store_FSDirectory_ #define _lucene_store_FSDirectory_ #if defined(_LUCENE_PRAGMA_ONCE) # pragma once #endif #include #include #include #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. *

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; ///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