X-Git-Url: http://git.treefish.org/~alex/photosort.git/blobdiff_plain/5ad2c3b2ac3baf7b9e64d07a7f0b37d3493a03d4..5b9ec26e3f502c56d73d11cafb8b411541db89d5:/src/locator.py?ds=inline diff --git a/src/locator.py b/src/locator.py new file mode 100644 index 0000000..55142c5 --- /dev/null +++ b/src/locator.py @@ -0,0 +1,74 @@ +import logging +import os +import sqlite3 +import time + +import misc + +class Locator: + def __init__(self, base_dir, exclude_dir, db_file): + self._base_dir = base_dir + self._exclude_dir = exclude_dir + if not os.path.isfile(db_file): + self._conn = sqlite3.connect(db_file) + self._create_db() + else: + self._conn = sqlite3.connect(db_file) + logging.info("Opened locator for %s.", self._base_dir) + + def locate_file(self, name, size, meta_time): + c = self._conn.cursor() + c.execute("SELECT file_dir FROM cache WHERE name=? AND size=? AND meta_time=?", + (name, size, meta_time)) + cached = c.fetchone() + if cached: + if os.path.isfile(cached[0]) and \ + os.path.getsize(cached[0]) == size and \ + misc.extract_meta_time(cached[0]) == meta_time: + self._update_cache_access_time(name, size, meta_time) + return cached[0] + else: + self._remove_from_cache(name, size, meta_time) + else: + file_dir = misc.find_file(name, size, meta_time) + if file_dir: + self._clean_cache() + self._add_to_cache(name, size, meta_time, file_dir) + return file_dir + + def close(self): + logging.info("Closing locator for %s...", self._base_dir) + self._conn.close() + + def _update_cache_access_time(self, name, size, meta_time): + c = self._conn.cursor() + c.execute("UPDATE cache SET access_time=? WHERE name=? AND size=? AND meta_time=?", + (int(time.time()), name, size, meta_time)) + self._conn.commit() + + def _remove_from_cache(self, name, size, meta_time): + c = self._conn.cursor() + c.execute("DELETE FROM cache WHERE name=? AND size=? AND meta_time=?", + (name, size, meta_time)) + self._conn.commit() + + def _add_to_cache(self, name, size, meta_time, file_dir): + c = self._conn.cursor() + c.execute('''INSERT INTO cache (name, size, meta_time, file_dir, access_time) + VALUES (?, ?, ?, ?, ?)''', + (name, size, meta_time, file_dir, int(time.time()))) + self._conn.commit() + + def _clean_cache(self): + c = self._conn.cursor() + c.execute("DELETE FROM cache WHERE access_time