]> git.treefish.org Git - photosort.git/blob - src/locator.py
d283085d8be4d9b0a5407a57a23140207650e20d
[photosort.git] / src / locator.py
1 import logging
2 import os
3 import sqlite3
4 import time
5
6 import misc
7
8 class Locator:
9     def __init__(self, base_dir, exclude_dir, db_file):
10         self._base_dir = base_dir
11         self._exclude_dir = exclude_dir
12         if not os.path.isfile(db_file):
13             self._conn = sqlite3.connect(db_file, check_same_thread=False)
14             self._create_db()
15         else:
16             self._conn = sqlite3.connect(db_file, check_same_thread=False)
17         logging.info("Opened locator for %s.", self._base_dir)
18
19     def locate_file(self, name, size, meta_time):
20         c = self._conn.cursor()
21         c.execute("SELECT file_dir FROM cache WHERE name=? AND size=? AND meta_time=?",
22                   (name, size, meta_time))
23
24         cached = c.fetchone()
25         if cached:
26             # if os.path.isfile(cached[0]) and \
27             #    os.path.getsize(cached[0]) == size and \
28             #    misc.extract_meta_time(cached[0]) == meta_time:
29             if os.path.isfile(cached[0]) and \
30                os.path.getsize(cached[0]) == size:
31                 self._update_cache_access_time(name, size, meta_time)
32                 return cached[0]
33             else:
34                 self._remove_from_cache(name, size, meta_time)
35
36         file_dir = misc.find_file(self._base_dir, name, size, meta_time,
37                                   self._exclude_dir)
38         if file_dir:
39             self._clean_cache()
40             self._add_to_cache(name, size, meta_time, file_dir)
41         return file_dir
42
43     def close(self):
44         logging.info("Closing locator for %s...", self._base_dir)
45         self._conn.close()
46
47     def _update_cache_access_time(self, name, size, meta_time):
48         c = self._conn.cursor()
49         c.execute("UPDATE cache SET access_time=? WHERE name=? AND size=? AND meta_time=?",
50                   (int(time.time()), name, size, meta_time))
51         self._conn.commit()
52
53     def _remove_from_cache(self, name, size, meta_time):
54         c = self._conn.cursor()
55         c.execute("DELETE FROM cache WHERE name=? AND size=? AND meta_time=?",
56                   (name, size, meta_time))
57         self._conn.commit()
58
59     def _add_to_cache(self, name, size, meta_time, file_dir):
60         c = self._conn.cursor()
61         c.execute('''INSERT INTO cache (name, size, meta_time, file_dir, access_time)
62                      VALUES (?, ?, ?, ?, ?)''',
63                   (name, size, meta_time, file_dir, int(time.time())))
64         self._conn.commit()
65
66     def _clean_cache(self):
67         c = self._conn.cursor()
68         c.execute("DELETE FROM cache WHERE access_time<?", (int(time.time()) - 604800,))
69         self._conn.commit()
70
71     def _create_db(self):
72         logging.info("Creating locator database for %s...", self._base_dir)
73         c = self._conn.cursor()
74         c.execute('''CREATE TABLE cache(
75                        name TEXT, size INTEGER, meta_time INTEGER, file_dir TEXT,
76                        access_time INTEGER,
77                        PRIMARY KEY (name, size, meta_time))''')
78         self._conn.commit()