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()16 SimpleFSLockFactory::SimpleFSLockFactory() {
17 }
18 
SimpleFSLockFactory(const String & lockDir)19 SimpleFSLockFactory::SimpleFSLockFactory(const String& lockDir) {
20     setLockDir(lockDir);
21 }
22 
~SimpleFSLockFactory()23 SimpleFSLockFactory::~SimpleFSLockFactory() {
24 }
25 
makeLock(const String & lockName)26 LockPtr SimpleFSLockFactory::makeLock(const String& lockName) {
27     return newLucene<SimpleFSLock>(lockDir, lockPrefix.empty() ? lockName : lockPrefix + L"-" + lockName);
28 }
29 
clearLock(const String & lockName)30 void 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)39 SimpleFSLock::SimpleFSLock(const String& lockDir, const String& lockFileName) {
40     this->lockDir = lockDir;
41     this->lockFile = lockFileName;
42 }
43 
~SimpleFSLock()44 SimpleFSLock::~SimpleFSLock() {
45 }
46 
obtain()47 bool 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()64 void 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()71 bool SimpleFSLock::isLocked() {
72     return FileUtils::fileExists(FileUtils::joinPath(lockDir, lockFile));
73 }
74 
toString()75 String SimpleFSLock::toString() {
76     return getClassName() + L"@" + FileUtils::joinPath(lockDir, lockFile);
77 }
78 
79 }
80