Changeset 369
- Timestamp:
- 01/19/06 11:55:31 (3 years ago)
- Files:
-
- reposearchplugin/0.9/tracreposearch/indexer.py (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
reposearchplugin/0.9/tracreposearch/indexer.py
r367 r369 10 10 from trac.core import TracError 11 11 from tracreposearch.search import TracRepoSearchPlugin 12 from tracreposearch.lock import lock, unlock, LOCK_EX 12 13 from trac.versioncontrol.api import Node 13 14 import anydbm … … 45 46 def sync(self): 46 47 self.dbm.sync() 47 48 49 index_lock = None 50 lock_count = 0 51 52 def acquire_lock(): 53 global index_lock, lock_count 54 lock_count += 1 55 if lock_count == 1: 56 index_lock = open('/tmp/repo-search.lock', 'w+') 57 lock(index_lock, LOCK_EX) 58 59 def release_lock(): 60 global index_lock, lock_count 61 lock_count -= 1 62 if lock_count == 0: 63 index_lock.close() 64 index_lock = None 65 66 def synchronized(f): 67 """ Synchronization decorator. """ 68 69 def wrap(*args, **kw): 70 acquire_lock() 71 try: 72 return f(*args, **kw) 73 finally: 74 release_lock() 75 return wrap 48 76 49 77 class Indexer: … … 63 91 self.index_dir = self.env.config.get('repo-search', 'index') 64 92 self.minimum_word_length = int(self.env.config.get('repo-search', 'minimum-word-length', 3)) 93 94 if not os.path.isdir(self.index_dir): 95 os.mkdir(self.index_dir) 96 65 97 try: 66 98 self._open_storage('r') … … 69 101 70 102 def _open_storage(self, mode): 71 if not os.path.isdir(self.index_dir):72 os.mkdir(self.index_dir)73 74 103 self.meta = anydbm.open(os.path.join(self.index_dir, 'meta.db'), mode) 75 104 self.words = dbdict(os.path.join(self.index_dir, 'words.db'), mode) 76 105 self.bigrams = dbdict(os.path.join(self.index_dir, 'bigrams.db'), mode) 106 _open_storage = synchronized(_open_storage) 77 107 78 108 def _bigram_word(self, word): … … 87 117 self.words.sync() 88 118 self.bigrams.sync() 119 sync = synchronized(sync) 89 120 90 121 def need_reindex(self, repo): 91 re turnnot hasattr(self, 'meta') or \122 result = not hasattr(self, 'meta') or \ 92 123 repo.youngest_rev != int(self.meta.get('last-repo-rev', -1)) \ 93 124 or self.env.config.get('repo-search', 'include', '1') \ 94 125 != self.meta.get('index-include', '') \ 95 126 or self.env.config.get('repo-search', 'exclude', '') \ 96 != self.meta.get('index-exclude', '1') \ 127 != self.meta.get('index-exclude', '1') 128 return result 129 need_reindex = synchronized(need_reindex) 97 130 98 131 def _bigram_search(self, bigrams): … … 110 143 return () 111 144 return words 145 _bigram_search = synchronized(_bigram_search) 112 146 113 147 def reindex_node(self, node): … … 137 171 else: 138 172 self.words[word] = [node.path] 173 reindex_node = synchronized(reindex_node) 139 174 140 175 def reindex(self, repo = None): … … 151 186 self._open_storage('r') 152 187 self.env.log.debug('Index finished') 188 reindex = synchronized(reindex) 153 189 154 190 def find_words(self, words): … … 177 213 all_files.intersection_update(word_files) 178 214 return all_files 215 find_words = synchronized(find_words)
