]> git.phdru.name Git - xsetbg.git/commitdiff
Refactor mass insert into SQLiteMassInsert context manager
authorOleg Broytman <phd@phdru.name>
Fri, 24 Jul 2015 22:14:20 +0000 (01:14 +0300)
committerOleg Broytman <phd@phdru.name>
Fri, 24 Jul 2015 22:14:20 +0000 (01:14 +0300)
reload_db.py
xsetbg_db.py

index 8d8b0df815142eab3245485dae832a77574938ea..060b05c3c08009d09e377945309a9a162d73c1ca 100755 (executable)
@@ -10,10 +10,10 @@ __copyright__ = "Copyright (C) 2007-2015 PhiloSoft Design"
 __license__ = "GNU GPL"
 
 import sys
-from sqlobject import sqlhub, SQLObjectNotFound
+from sqlobject import SQLObjectNotFound
 from sqlobject.sqlbuilder import Insert
 from xsetbg_conf import xsetbg_conf
-from xsetbg_db import recreate_db
+from xsetbg_db import recreate_db, SQLiteMassInsert
 
 fs_encoding = xsetbg_conf.get("images", "fs_encoding")
 dump_file = open(sys.argv[1], 'rU')
@@ -26,35 +26,24 @@ def convert_str(s):
     else:
         return int(float(s))
 
-connection = xsetbg_db._connection
-
-connection.query("PRAGMA synchronous=OFF")
-connection.query("PRAGMA count_changes=OFF")
-connection.query("PRAGMA journal_mode=MEMORY")
-connection.query("PRAGMA temp_store=MEMORY")
-
-txn = connection.transaction()
-sqlhub.processConnection = txn
-
-for line in dump_file:
-    id, timestamp, filename = line.strip().split(None, 2)
-    id = convert_str(id)
-    timestamp = convert_str(timestamp)
-    if fs_encoding != 'utf-8':
-        filename = filename.decode(fs_encoding).encode('utf-8')
-    try:
-        row = xsetbg_db.byFull_name(filename)
-    except SQLObjectNotFound:
-        values = {'last_shown': timestamp, 'full_name': filename}
-        if id:
-            values['id'] = id
-        query = txn.sqlrepr(Insert(xsetbg_db.sqlmeta.table, values=values))
-        txn.query(query)
-    else:
-        assert id is None or row.id == id
-        assert row.last_shown == timestamp
 
-txn.commit()
-dump_file.close()
+with SQLiteMassInsert() as txn:
+    for line in dump_file:
+        id, timestamp, filename = line.strip().split(None, 2)
+        id = convert_str(id)
+        timestamp = convert_str(timestamp)
+        if fs_encoding != 'utf-8':
+            filename = filename.decode(fs_encoding).encode('utf-8')
+        try:
+            row = xsetbg_db.byFull_name(filename)
+        except SQLObjectNotFound:
+            values = {'last_shown': timestamp, 'full_name': filename}
+            if id:
+                values['id'] = id
+            query = txn.sqlrepr(Insert(xsetbg_db.sqlmeta.table, values=values))
+            txn.query(query)
+        else:
+            assert id is None or row.id == id
+            assert row.last_shown == timestamp
 
-connection.query("VACUUM %s" % xsetbg_db.sqlmeta.table)
+dump_file.close()
index e5fe5d0310927a0d2c5704f41cdd44cfffeff47d..dc23254cf386deb462a1c0b1dac90d8e4a07de56 100755 (executable)
@@ -32,6 +32,27 @@ def recreate_db():
     return xsetbg_db
 
 
+class SQLiteMassInsert(object):
+    def __init__(self):
+        self.connection = sqlhub.processConnection
+
+    def __enter__(self):
+        connection = self.connection
+        connection.query("PRAGMA synchronous=OFF")
+        connection.query("PRAGMA count_changes=OFF")
+        connection.query("PRAGMA journal_mode=MEMORY")
+        connection.query("PRAGMA temp_store=MEMORY")
+
+        txn = connection.transaction()
+        sqlhub.processConnection = txn
+        return txn
+
+    def __exit__(self, *args, **kw):
+        sqlhub.processConnection.commit()
+        connection = sqlhub.processConnection = self.connection
+        connection.query("VACUUM %s" % xsetbg_db.sqlmeta.table)
+
+
 db_dirs = []
 try:
     xsetbg_db_path = xsetbg_conf.get('xsetbg', 'database')