1 ///////////////////////////////////////////////////////////////////////////// 2 // Copyright (c) 2009-2014 Alan Wright. All rights reserved. 3 // Distributable under the terms of either the Apache License (Version 2.0) 4 // or the GNU Lesser General Public License. 5 ///////////////////////////////////////////////////////////////////////////// 6 7 #include "LuceneInc.h" 8 #include <boost/filesystem/fstream.hpp> 9 #include "SimpleFSLockFactory.h" 10 #include "_SimpleFSLockFactory.h" 11 #include "FileUtils.h" 12 #include "StringUtils.h" 13 14 namespace Lucene { 15 SimpleFSLockFactory()16SimpleFSLockFactory::SimpleFSLockFactory() { 17 } 18 SimpleFSLockFactory(const String & lockDir)19SimpleFSLockFactory::SimpleFSLockFactory(const String& lockDir) { 20 setLockDir(lockDir); 21 } 22 ~SimpleFSLockFactory()23SimpleFSLockFactory::~SimpleFSLockFactory() { 24 } 25 makeLock(const String & lockName)26LockPtr SimpleFSLockFactory::makeLock(const String& lockName) { 27 return newLucene<SimpleFSLock>(lockDir, lockPrefix.empty() ? lockName : lockPrefix + L"-" + lockName); 28 } 29 clearLock(const String & lockName)30void SimpleFSLockFactory::clearLock(const String& lockName) { 31 if (FileUtils::isDirectory(lockDir)) { 32 String lockPath(FileUtils::joinPath(lockDir, lockPrefix.empty() ? lockName : lockPrefix + L"-" + lockName)); 33 if (FileUtils::fileExists(lockPath) && !FileUtils::removeFile(lockPath)) { 34 boost::throw_exception(IOException(L"Cannot delete " + lockPath)); 35 } 36 } 37 } 38 SimpleFSLock(const String & lockDir,const String & lockFileName)39SimpleFSLock::SimpleFSLock(const String& lockDir, const String& lockFileName) { 40 this->lockDir = lockDir; 41 this->lockFile = lockFileName; 42 } 43 ~SimpleFSLock()44SimpleFSLock::~SimpleFSLock() { 45 } 46 obtain()47bool SimpleFSLock::obtain() { 48 // Ensure that lockDir exists and is a directory 49 if (!FileUtils::fileExists(lockDir)) { 50 if (!FileUtils::createDirectory(lockDir)) { 51 boost::throw_exception(RuntimeException(L"Cannot create directory: " + lockDir)); 52 } 53 } else if (!FileUtils::isDirectory(lockDir)) { 54 boost::throw_exception(RuntimeException(L"Found regular file where directory expected: " + lockDir)); 55 } 56 boost::filesystem::ofstream f; 57 try { 58 f.open(FileUtils::joinPath(lockDir, lockFile), std::ios::binary | std::ios::out); 59 } catch (...) { 60 } 61 return f.is_open(); 62 } 63 release()64void SimpleFSLock::release() { 65 String path(FileUtils::joinPath(lockDir, lockFile)); 66 if (FileUtils::fileExists(path) && !FileUtils::removeFile(path)) { 67 boost::throw_exception(LockReleaseFailedException(L"failed to delete " + path)); 68 } 69 } 70 isLocked()71bool SimpleFSLock::isLocked() { 72 return FileUtils::fileExists(FileUtils::joinPath(lockDir, lockFile)); 73 } 74 toString()75String SimpleFSLock::toString() { 76 return getClassName() + L"@" + FileUtils::joinPath(lockDir, lockFile); 77 } 78 79 } 80