Fix OperationalError: enforce Kodi restart with clean DB once
- Fixes #570
This commit is contained in:
parent
d2e0479225
commit
97d829779f
4 changed files with 28 additions and 19 deletions
|
@ -511,6 +511,10 @@ class InitialSetup(object):
|
||||||
LOG.info("Using PMS %s with machineIdentifier %s",
|
LOG.info("Using PMS %s with machineIdentifier %s",
|
||||||
app.CONN.server, app.CONN.machine_identifier)
|
app.CONN.server, app.CONN.machine_identifier)
|
||||||
self.save_pms_settings(app.CONN.server, self.pms_token)
|
self.save_pms_settings(app.CONN.server, self.pms_token)
|
||||||
|
if utils.settings('kodi_db_has_been_wiped_clean') == 'false':
|
||||||
|
# If the user chose to go to the PKC settings on the first run
|
||||||
|
# Will trigger a reboot
|
||||||
|
utils.wipe_database()
|
||||||
if reboot is True:
|
if reboot is True:
|
||||||
utils.reboot_kodi()
|
utils.reboot_kodi()
|
||||||
return
|
return
|
||||||
|
@ -531,6 +535,10 @@ class InitialSetup(object):
|
||||||
# User already answered the installation questions
|
# User already answered the installation questions
|
||||||
if utils.settings('InstallQuestionsAnswered') == 'true':
|
if utils.settings('InstallQuestionsAnswered') == 'true':
|
||||||
LOG.info('Installation questions already answered')
|
LOG.info('Installation questions already answered')
|
||||||
|
if utils.settings('kodi_db_has_been_wiped_clean') == 'false':
|
||||||
|
# If the user chose to go to the PKC settings on the first run
|
||||||
|
# Will trigger a reboot
|
||||||
|
utils.wipe_database()
|
||||||
if reboot is True:
|
if reboot is True:
|
||||||
utils.reboot_kodi()
|
utils.reboot_kodi()
|
||||||
# Reload relevant settings
|
# Reload relevant settings
|
||||||
|
@ -594,20 +602,18 @@ class InitialSetup(object):
|
||||||
# Make sure that we only ask these questions upon first installation
|
# Make sure that we only ask these questions upon first installation
|
||||||
utils.settings('InstallQuestionsAnswered', value='true')
|
utils.settings('InstallQuestionsAnswered', value='true')
|
||||||
|
|
||||||
# New installation - make sure we start with a clean slate
|
|
||||||
utils.wipe_database()
|
|
||||||
|
|
||||||
if goto_settings is False:
|
if goto_settings is False:
|
||||||
# Open Settings page now? You will need to restart!
|
# Open Settings page now? You will need to restart!
|
||||||
goto_settings = utils.yesno_dialog(utils.lang(29999),
|
goto_settings = utils.yesno_dialog(utils.lang(29999),
|
||||||
utils.lang(39017))
|
utils.lang(39017))
|
||||||
if goto_settings:
|
if goto_settings:
|
||||||
app.APP.suspend = True
|
app.APP.stop_pkc = True
|
||||||
executebuiltin(
|
executebuiltin(
|
||||||
'Addon.OpenSettings(plugin.video.plexkodiconnect)')
|
'Addon.OpenSettings(plugin.video.plexkodiconnect)')
|
||||||
elif reboot is True:
|
# New installation - make sure we start with a clean slate
|
||||||
utils.reboot_kodi()
|
# Will trigger a reboot, usually
|
||||||
# Reload relevant settings
|
utils.wipe_database()
|
||||||
|
# Reload relevant settings if that is not the case
|
||||||
app.CONN.load()
|
app.CONN.load()
|
||||||
app.ACCOUNT.load()
|
app.ACCOUNT.load()
|
||||||
app.SYNC.load()
|
app.SYNC.load()
|
||||||
|
|
|
@ -94,6 +94,9 @@ class Service():
|
||||||
self.connection_check_running = False
|
self.connection_check_running = False
|
||||||
self.auth_running = False
|
self.auth_running = False
|
||||||
|
|
||||||
|
def isCanceled(self):
|
||||||
|
return xbmc.abortRequested or app.APP.stop_pkc
|
||||||
|
|
||||||
def on_connection_check(self, result):
|
def on_connection_check(self, result):
|
||||||
"""
|
"""
|
||||||
Call this method after PF.check_connection()
|
Call this method after PF.check_connection()
|
||||||
|
@ -361,7 +364,7 @@ class Service():
|
||||||
self.playqueue = playqueue.PlayqueueMonitor()
|
self.playqueue = playqueue.PlayqueueMonitor()
|
||||||
|
|
||||||
# Main PKC program loop
|
# Main PKC program loop
|
||||||
while not xbmc.abortRequested:
|
while not self.isCanceled():
|
||||||
# Check for Kodi profile change
|
# Check for Kodi profile change
|
||||||
if utils.window('plex_kodiProfile') != v.KODI_PROFILE:
|
if utils.window('plex_kodiProfile') != v.KODI_PROFILE:
|
||||||
# Profile change happened, terminate this thread and others
|
# Profile change happened, terminate this thread and others
|
||||||
|
|
|
@ -403,16 +403,11 @@ def kodi_sql(media_type=None):
|
||||||
else:
|
else:
|
||||||
db_path = v.DB_VIDEO_PATH
|
db_path = v.DB_VIDEO_PATH
|
||||||
conn = connect(db_path, timeout=5.0)
|
conn = connect(db_path, timeout=5.0)
|
||||||
try:
|
conn.execute('PRAGMA journal_mode=WAL;')
|
||||||
conn.execute('PRAGMA journal_mode=WAL;')
|
|
||||||
except OperationalError:
|
|
||||||
LOG.warn('Issue with sqlite WAL mode - force-rebooting Kodi')
|
|
||||||
settings('lastfullsync', value='0')
|
|
||||||
reboot_kodi()
|
|
||||||
conn.execute('PRAGMA cache_size = -8000;')
|
conn.execute('PRAGMA cache_size = -8000;')
|
||||||
conn.execute('PRAGMA synchronous=NORMAL;')
|
conn.execute('PRAGMA synchronous=NORMAL;')
|
||||||
# Use transactions
|
|
||||||
conn.execute('BEGIN')
|
conn.execute('BEGIN')
|
||||||
|
# Use transactions
|
||||||
return conn
|
return conn
|
||||||
|
|
||||||
|
|
||||||
|
@ -485,7 +480,11 @@ def wipe_database():
|
||||||
settings('SyncInstallRunDone', value="false")
|
settings('SyncInstallRunDone', value="false")
|
||||||
settings('lastfullsync', value="0")
|
settings('lastfullsync', value="0")
|
||||||
LOG.info('Wiping done')
|
LOG.info('Wiping done')
|
||||||
init_dbs()
|
if settings('kodi_db_has_been_wiped_clean') != 'true':
|
||||||
|
# Root cause is sqlite WAL mode - Kodi might still have DB access open
|
||||||
|
LOG.warn('Need to restart Kodi before filling Kodi DB again')
|
||||||
|
settings('kodi_db_has_been_wiped_clean', value='true')
|
||||||
|
reboot_kodi()
|
||||||
|
|
||||||
|
|
||||||
def init_dbs():
|
def init_dbs():
|
||||||
|
@ -526,15 +525,15 @@ def reset(ask_user=True):
|
||||||
return
|
return
|
||||||
xbmc.sleep(1000)
|
xbmc.sleep(1000)
|
||||||
|
|
||||||
# Wipe everything
|
|
||||||
wipe_database()
|
|
||||||
|
|
||||||
# Reset all PlexKodiConnect Addon settings? (this is usually NOT
|
# Reset all PlexKodiConnect Addon settings? (this is usually NOT
|
||||||
# recommended and unnecessary!)
|
# recommended and unnecessary!)
|
||||||
if ask_user and yesno_dialog(lang(29999), lang(39603)):
|
if ask_user and yesno_dialog(lang(29999), lang(39603)):
|
||||||
# Delete the settings
|
# Delete the settings
|
||||||
LOG.info("Deleting: settings.xml")
|
LOG.info("Deleting: settings.xml")
|
||||||
path_ops.remove("%ssettings.xml" % v.ADDON_PROFILE)
|
path_ops.remove("%ssettings.xml" % v.ADDON_PROFILE)
|
||||||
|
|
||||||
|
# Wipe everything
|
||||||
|
wipe_database()
|
||||||
reboot_kodi()
|
reboot_kodi()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -84,6 +84,7 @@
|
||||||
<setting id="FanArtTVAPIKey" type="text" default="639191cb0774661597f28a47e7e2bad5" visible="false"/>
|
<setting id="FanArtTVAPIKey" type="text" default="639191cb0774661597f28a47e7e2bad5" visible="false"/>
|
||||||
<setting id="syncEmptyShows" type="bool" label="30508" default="false" visible="false"/>
|
<setting id="syncEmptyShows" type="bool" label="30508" default="false" visible="false"/>
|
||||||
<setting id="lastfullsync" type="number" label="Time stamp when last successful full sync was conducted" default="0" visible="false" />
|
<setting id="lastfullsync" type="number" label="Time stamp when last successful full sync was conducted" default="0" visible="false" />
|
||||||
|
<setting id="kodi_db_has_been_wiped_clean" type="bool" label="PKC needs to completely clean the Kodi DB at least once, then reboot, to avoid Kodi error messages, e.g. OperationalError" default="false" visible="false" />
|
||||||
</category>
|
</category>
|
||||||
|
|
||||||
<category label="39057"><!-- Customize Paths -->
|
<category label="39057"><!-- Customize Paths -->
|
||||||
|
|
Loading…
Reference in a new issue