commit 6678e5021dd626afbccbf9aebb15819d40deae3f Author: Damian Johnson atagar@torproject.org Date: Thu Aug 31 12:07:28 2017 -0700
Move cache back into base module
Well, that didn't last very long. Got annoyed by calling 'nyx.cache.cache()'. Oh well. --- nyx/__init__.py | 72 +++++++++++++++++++++++++++++++++++++++++++++++++ nyx/cache.py | 83 --------------------------------------------------------- test/cache.py | 12 ++++----- 3 files changed, 78 insertions(+), 89 deletions(-)
diff --git a/nyx/__init__.py b/nyx/__init__.py index c2032bc..3c3c939 100644 --- a/nyx/__init__.py +++ b/nyx/__init__.py @@ -33,6 +33,7 @@ Tor curses monitoring application.
import distutils.spawn import os +import sqlite3 import sys import threading import time @@ -84,6 +85,7 @@ CONFIG = stem.util.conf.config_dict('nyx', {
NYX_INTERFACE = None TOR_CONTROLLER = None +CACHE = None BASE_DIR = os.path.sep.join(__file__.split(os.path.sep)[:-1])
# technically can change but we use this query a *lot* so needs to be cached @@ -94,6 +96,15 @@ stem.control.CACHEABLE_GETINFO_PARAMS = list(stem.control.CACHEABLE_GETINFO_PARA
stem.control.LOG_CACHE_FETCHES = False
+SCHEMA_VERSION = 1 # version of our scheme, bump this if you change the following +SCHEMA = ( + 'CREATE TABLE schema(version NUMBER)', + 'INSERT INTO schema(version) VALUES (%i)' % SCHEMA_VERSION, + + 'CREATE TABLE relays(fingerprint TEXT PRIMARY KEY, address TEXT, or_port NUMBER, nickname TEXT)', +) + + try: uses_settings = stem.util.conf.uses_settings('nyx', os.path.join(BASE_DIR, 'settings'), lazy_load = False) except IOError as exc: @@ -189,6 +200,21 @@ def tor_controller(): return TOR_CONTROLLER
+def cache(): + """ + Provides the sqlite cache for application data. + + :returns: :class:`~nyx.cache.Cache` for our applicaion + """ + + global CACHE + + if CACHE is None: + CACHE = Cache() + + return CACHE + + def show_message(message = None, *attr, **kwargs): """ Shows a message in our header. @@ -311,6 +337,52 @@ def join(entries, joiner = ' ', size = None): return result
+class Cache(object): + """ + Cache for frequently used information. + """ + + def __init__(self): + self._conn_lock = threading.RLock() + cache_path = nyx.data_directory('cache.sqlite') + + if cache_path: + try: + self._conn = sqlite3.connect(cache_path) + schema = self._conn.execute('SELECT version FROM schema').fetchone()[0] + except: + schema = None + + if schema == SCHEMA_VERSION: + stem.util.log.info('Cache loaded from %s' % cache_path) + else: + if schema is None: + stem.util.log.info('Cache at %s is missing a schema, clearing it.' % cache_path) + else: + stem.util.log.info('Cache at %s has schema version %s but the current version is %s, clearing it.' % (cache_path, schema, SCHEMA_VERSION)) + + self._conn.close() + os.remove(cache_path) + self._conn = sqlite3.connect(cache_path) + + for cmd in SCHEMA: + self._conn.execute(cmd) + else: + stem.util.log.info('Unable to cache to disk. Using an in-memory cache instead.') + self._conn = sqlite3.connect(':memory:') + + for cmd in SCHEMA: + self._conn.execute(cmd) + + def query(self, query, *param): + """ + Performs a query on our cache. + """ + + with self._conn_lock: + return self._conn.execute(query, param) + + class Interface(object): """ Overall state of the nyx interface. diff --git a/nyx/cache.py b/nyx/cache.py deleted file mode 100644 index f4c6f3f..0000000 --- a/nyx/cache.py +++ /dev/null @@ -1,83 +0,0 @@ -""" -Cache for frequently needed information. This persists to disk if we can, and -otherwise is an in-memory cache. -""" - -import os -import sqlite3 -import threading - -import stem.util.log - -import nyx - -CACHE = None - -SCHEMA_VERSION = 1 # version of our scheme, bump this if you change the following -SCHEMA = ( - 'CREATE TABLE schema(version NUMBER)', - 'INSERT INTO schema(version) VALUES (%i)' % SCHEMA_VERSION, - - 'CREATE TABLE relays(fingerprint TEXT PRIMARY KEY, address TEXT, or_port NUMBER, nickname TEXT)', -) - - -def cache(): - """ - Provides the sqlite cache for application data. - - :returns: :class:`~nyx.cache.Cache` for our applicaion - """ - - global CACHE - - if CACHE is None: - CACHE = Cache() - - return CACHE - - -class Cache(object): - """ - Cache for frequently used information. - """ - - def __init__(self): - self._conn_lock = threading.RLock() - cache_path = nyx.data_directory('cache.sqlite') - - if cache_path: - try: - self._conn = sqlite3.connect(cache_path) - schema = self._conn.execute('SELECT version FROM schema').fetchone()[0] - except: - schema = None - - if schema == SCHEMA_VERSION: - stem.util.log.info('Cache loaded from %s' % cache_path) - else: - if schema is None: - stem.util.log.info('Cache at %s is missing a schema, clearing it.' % cache_path) - else: - stem.util.log.info('Cache at %s has schema version %s but the current version is %s, clearing it.' % (cache_path, schema, SCHEMA_VERSION)) - - self._conn.close() - os.remove(cache_path) - self._conn = sqlite3.connect(cache_path) - - for cmd in SCHEMA: - self._conn.execute(cmd) - else: - stem.util.log.info('Unable to cache to disk. Using an in-memory cache instead.') - self._conn = sqlite3.connect(':memory:') - - for cmd in SCHEMA: - self._conn.execute(cmd) - - def query(self, query, *param): - """ - Performs a query on our cache. - """ - - with self._conn_lock: - return self._conn.execute(query, param) diff --git a/test/cache.py b/test/cache.py index f26ede9..91e9ab8 100644 --- a/test/cache.py +++ b/test/cache.py @@ -5,7 +5,7 @@ Unit tests for nyx.cache. import tempfile import unittest
-import nyx.cache +import nyx
from mock import Mock, patch
@@ -17,7 +17,7 @@ NICKNAME = 'caersidi'
class TestCache(unittest.TestCase): def setUp(self): - nyx.cache.CACHE = None # drop cached database reference + nyx.CACHE = None # drop cached database reference
@patch('nyx.data_directory', Mock(return_value = None)) def test_memory_cache(self): @@ -25,7 +25,7 @@ class TestCache(unittest.TestCase): Create a cache in memory. """
- cache = nyx.cache.cache() + cache = nyx.cache()
self.assertEqual((0, 'main', ''), cache.query('PRAGMA database_list').fetchone()) cache.query('INSERT INTO relays(fingerprint, address, or_port, nickname) VALUES (?,?,?,?)', FINGERPRINT, ADDRESS, PORT, NICKNAME) @@ -38,13 +38,13 @@ class TestCache(unittest.TestCase):
with tempfile.NamedTemporaryFile(suffix = '.sqlite') as tmp: with patch('nyx.data_directory', Mock(return_value = tmp.name)): - cache = nyx.cache.cache() + cache = nyx.cache()
self.assertEqual((0, 'main', tmp.name), cache.query('PRAGMA database_list').fetchone()) cache.query('INSERT INTO relays(fingerprint, address, or_port, nickname) VALUES (?,?,?,?)', FINGERPRINT, ADDRESS, PORT, NICKNAME) cache._conn.commit()
- nyx.cache.CACHE = None + nyx.CACHE = None
- cache = nyx.cache.cache() + cache = nyx.cache() self.assertEqual(NICKNAME, cache.query('SELECT nickname FROM relays WHERE fingerprint=?', FINGERPRINT).fetchone()[0])