[tor-commits] [stem/master] Make schema a constant, near the version

atagar at torproject.org atagar at torproject.org
Wed Aug 30 16:40:51 UTC 2017


commit 19b8393652a3cba6741d1051d49af02b735c883e
Author: Damian Johnson <atagar at torproject.org>
Date:   Tue Aug 29 13:19:10 2017 -0700

    Make schema a constant, near the version
    
    Placing the schema version with the schema itself will help us remember to bump
    it when the later changes.
---
 stem/cached_tor_manual.sqlite | Bin 217088 -> 218112 bytes
 stem/manual.py                |  41 ++++++++++++++++++++++++++++-------------
 2 files changed, 28 insertions(+), 13 deletions(-)

diff --git a/stem/cached_tor_manual.sqlite b/stem/cached_tor_manual.sqlite
index bc50d083..898b09bc 100644
Binary files a/stem/cached_tor_manual.sqlite and b/stem/cached_tor_manual.sqlite differ
diff --git a/stem/manual.py b/stem/manual.py
index 21eb68ee..366b0ea9 100644
--- a/stem/manual.py
+++ b/stem/manual.py
@@ -84,7 +84,18 @@ Category = stem.util.enum.Enum('GENERAL', 'CLIENT', 'RELAY', 'DIRECTORY', 'AUTHO
 GITWEB_MANUAL_URL = 'https://gitweb.torproject.org/tor.git/plain/doc/tor.1.txt'
 CACHE_PATH = os.path.join(os.path.dirname(__file__), 'cached_tor_manual.sqlite')
 DATABASE = None  # cache database connections
-SCHEMA_VERSION = 1  # version of the schema used by our sqlite cache
+
+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 metadata(name TEXT, synopsis TEXT, description TEXT, man_commit TEXT, stem_commit TEXT)',
+  'CREATE TABLE commandline(name TEXT PRIMARY KEY, description TEXT)',
+  'CREATE TABLE signals(name TEXT PRIMARY KEY, description TEXT)',
+  'CREATE TABLE files(name TEXT PRIMARY KEY, description TEXT)',
+  'CREATE TABLE torrc(key TEXT PRIMARY KEY, name TEXT, category TEXT, usage TEXT, summary TEXT, description TEXT, position NUMBER)',
+)
 
 CATEGORY_SECTIONS = OrderedDict((
   ('GENERAL OPTIONS', Category.GENERAL),
@@ -396,13 +407,15 @@ class Manual(object):
 
     with sqlite3.connect(path) as conn:
       try:
-        name, synopsis, description, man_commit, stem_commit, schema = conn.execute('SELECT name, synopsis, description, man_commit, stem_commit, schema FROM metadata').fetchone()
+        schema = conn.execute('SELECT version FROM schema').fetchone()[0]
+
+        if schema != SCHEMA_VERSION:
+          raise SchemeMismatch("Stem's current manual schema version is %s, but %s was version %s" % (SCHEMA_VERSION, path, schema), schema, SCHEMA_VERSION)
+
+        name, synopsis, description, man_commit, stem_commit = conn.execute('SELECT name, synopsis, description, man_commit, stem_commit FROM metadata').fetchone()
       except sqlite3.OperationalError as exc:
         raise IOError('Failed to read database metadata from %s: %s' % (path, exc))
 
-      if schema != SCHEMA_VERSION:
-        raise SchemeMismatch("Stem's current manual schema version is %s, but %s was version %s" % (SCHEMA_VERSION, path, schema), schema, SCHEMA_VERSION)
-
       commandline = dict(conn.execute('SELECT name, description FROM commandline').fetchall())
       signals = dict(conn.execute('SELECT name, description FROM signals').fetchall())
       files = dict(conn.execute('SELECT name, description FROM files').fetchall())
@@ -553,14 +566,16 @@ class Manual(object):
       return self._save_as_config(path)
 
   def _save_as_sqlite(self, path):
-    with sqlite3.connect(path + '.new') as conn:
-      conn.execute('CREATE TABLE metadata(name TEXT, synopsis TEXT, description TEXT, man_commit TEXT, stem_commit TEXT, schema NUMBER)')
-      conn.execute('CREATE TABLE commandline(name TEXT PRIMARY KEY, description TEXT)')
-      conn.execute('CREATE TABLE signals(name TEXT PRIMARY KEY, description TEXT)')
-      conn.execute('CREATE TABLE files(name TEXT PRIMARY KEY, description TEXT)')
-      conn.execute('CREATE TABLE torrc(key TEXT PRIMARY KEY, name TEXT, category TEXT, usage TEXT, summary TEXT, description TEXT, position NUMBER)')
+    tmp_path = path + '.new'
+
+    if os.path.exists(tmp_path):
+      os.remove(tmp_path)
+
+    with sqlite3.connect(tmp_path) as conn:
+      for cmd in SCHEMA:
+        conn.execute(cmd)
 
-      conn.execute('INSERT INTO metadata(name, synopsis, description, man_commit, stem_commit, schema) VALUES (?,?,?,?,?,?)', (self.name, self.synopsis, self.description, self.man_commit, self.stem_commit, SCHEMA_VERSION))
+      conn.execute('INSERT INTO metadata(name, synopsis, description, man_commit, stem_commit) VALUES (?,?,?,?,?)', (self.name, self.synopsis, self.description, self.man_commit, self.stem_commit))
 
       for k, v in self.commandline_options.items():
         conn.execute('INSERT INTO commandline(name, description) VALUES (?,?)', (k, v))
@@ -577,7 +592,7 @@ class Manual(object):
     if os.path.exists(path):
       os.remove(path)
 
-    os.rename(path + '.new', path)
+    os.rename(tmp_path, path)
 
   def _save_as_config(self, path):
     conf = stem.util.conf.Config()





More information about the tor-commits mailing list