From a763cd37c945ebe9d2b5ed5b279e803885b55c34 Mon Sep 17 00:00:00 2001
From: shaun <shaun@bluebit.com.au>
Date: Sat, 5 Nov 2016 09:19:28 +1100
Subject: [PATCH] use with to close cursor use settings for isolation in
 connect dont re raise the exception in the __exit__

---
 resources/lib/database.py    | 27 ++++++++++++---------------
 resources/lib/librarysync.py | 23 ++++++++++++-----------
 2 files changed, 24 insertions(+), 26 deletions(-)

diff --git a/resources/lib/database.py b/resources/lib/database.py
index 74eb564e..d36ca24d 100644
--- a/resources/lib/database.py
+++ b/resources/lib/database.py
@@ -7,7 +7,7 @@ import sqlite3
 
 import xbmc
 
-from utils import window, should_stop
+from utils import window, should_stop, settings
 
 #################################################################################################
 
@@ -79,22 +79,25 @@ def kodi_commit():
 class DatabaseConn(object):
     # To be called as context manager - i.e. with DatabaseConn() as conn: #dostuff
 
-    def __init__(self, database_file="video", commit_mode="", timeout=20):
+    def __init__(self, database_file="video", commit_on_close=True, timeout=120):
         """
         database_file can be custom: emby, texture, music, video, :memory: or path to the file
         commit_mode set to None to autocommit (isolation_level). See python documentation.
         """
         self.db_file = database_file
-        self.commit_mode = commit_mode
+        self.commit_on_close = commit_on_close
         self.timeout = timeout
 
     def __enter__(self):
         # Open the connection
         self.path = self._SQL(self.db_file)
         log.info("opening database: %s", self.path)
-        self.conn = sqlite3.connect(self.path,
-                                    isolation_level=self.commit_mode,
-                                    timeout=self.timeout)
+        
+        if settings('dblock') == "true":
+            self.conn = sqlite3.connect(self.path, isolation_level=None, timeout=self.timeout)
+        else:
+            self.conn = sqlite3.connect(self.path, timeout=self.timeout)
+            
         return self.conn
 
     def _SQL(self, media_type):
@@ -114,17 +117,11 @@ class DatabaseConn(object):
         if exc_type is not None:
             # Errors were raised in the with statement
             log.error("Type: %s Value: %s", exc_type, exc_val)
-            if "database is locked" in exc_val:
-                self.conn.rollback()
-            else:
-                raise
 
-        elif self.commit_mode is not None and changes:
+        if self.commit_on_close == True and changes:
             log.info("number of rows updated: %s", changes)
-            if self.db_file == "video" and kodi_commit():
-                self.conn.commit()
-            else:
-                self.conn.commit()
+            kodi_commit()
+            self.conn.commit()
 
         log.info("close: %s", self.path)
         self.conn.close()
diff --git a/resources/lib/librarysync.py b/resources/lib/librarysync.py
index 2704fe65..a6e2cb90 100644
--- a/resources/lib/librarysync.py
+++ b/resources/lib/librarysync.py
@@ -25,6 +25,7 @@ import videonodes
 from objects import Movies, MusicVideos, TVShows, Music
 from utils import window, settings, language as lang, should_stop
 from ga_client import GoogleAnalytics
+from contextlib import closing
 
 ##################################################################################################
 
@@ -849,17 +850,17 @@ class LibrarySync(threading.Thread):
     def _verify_emby_database(self):
         # Create the tables for the emby database
         with self.database('emby') as conn:
-            cursor = conn.cursor()
-            # emby, view, version
-            cursor.execute(
-                """CREATE TABLE IF NOT EXISTS emby(
-                emby_id TEXT UNIQUE, media_folder TEXT, emby_type TEXT, media_type TEXT,
-                kodi_id INTEGER, kodi_fileid INTEGER, kodi_pathid INTEGER, parent_id INTEGER,
-                checksum INTEGER)""")
-            cursor.execute(
-                """CREATE TABLE IF NOT EXISTS view(
-                view_id TEXT UNIQUE, view_name TEXT, media_type TEXT, kodi_tagid INTEGER)""")
-            cursor.execute("CREATE TABLE IF NOT EXISTS version(idVersion TEXT)")
+            with closing(conn.cursor()) as cursor:
+                # emby, view, version
+                cursor.execute(
+                    """CREATE TABLE IF NOT EXISTS emby(
+                    emby_id TEXT UNIQUE, media_folder TEXT, emby_type TEXT, media_type TEXT,
+                    kodi_id INTEGER, kodi_fileid INTEGER, kodi_pathid INTEGER, parent_id INTEGER,
+                    checksum INTEGER)""")
+                cursor.execute(
+                    """CREATE TABLE IF NOT EXISTS view(
+                    view_id TEXT UNIQUE, view_name TEXT, media_type TEXT, kodi_tagid INTEGER)""")
+                cursor.execute("CREATE TABLE IF NOT EXISTS version(idVersion TEXT)")
 
     def run(self):