Skip to content

Commit 59a4312

Browse files
committed
Tentaive of reconnection in mysql driver
1 parent 4536f25 commit 59a4312

2 files changed

Lines changed: 43 additions & 22 deletions

File tree

addon.xml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
22
<addon id="plugin.video.mediathekview"
33
name="MediathekView"
4-
version="0.4.4.8"
4+
version="0.4.4.9"
55
provider-name="MediathekView.de, Leo Moll">
66
<requires>
77
<import addon="xbmc.python" version="2.25.0"/>
@@ -27,9 +27,6 @@
2727
<description lang="en_GB">Gives access to most video-platforms from German public service broadcasters using the database of MediathekView.de</description>
2828
<description lang="it_IT">Fornisce l'accesso a gran parte delle piattaforme video operate dalle emittenti pubbliche tedesche usando la banca dati di MediathekView.de</description>
2929
<news>v0.5.0 (2018-XX-XX):
30-
- Herunterladen funktioniert nicht bei MySQL Datenbank
31-
- Doppelte Einträge in NFO Dateien für Serienepisoden
32-
- NFO Datei für Filme manchmal nicht abgeschlossen
3330
- Bei manchen Filme fehlte im Kontext-Menü die Möglichkeit sie herunterzuladen
3431
- Old Maria DB / MySQL support
3532
- Datenbank-Downloads werden direkt nach der Verarbeitung gelöscht

resources/lib/storemysql.py

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
# -*- coding: utf-8 -*-
2-
# Copyright 2017 Leo Moll
3-
#
2+
"""
3+
The MySQL database support module
4+
5+
Copyright 2017-20180 Leo Moll and Dominik Schlösser
6+
"""
7+
# pylint: disable=import-error
8+
# pylint: disable=mixed-indentation, bad-whitespace, bad-continuation, missing-docstring
49

510
# -- Imports ------------------------------------------------
611
import time
@@ -12,13 +17,20 @@
1217

1318
# -- Classes ------------------------------------------------
1419
class StoreMySQL( object ):
20+
"""The MySQL database support class"""
1521

1622
def __init__( self, logger, notifier, settings ):
1723
self.conn = None
1824
self.logger = logger
1925
self.notifier = notifier
2026
self.settings = settings
27+
# updater state variables
28+
self.ft_channel = None
29+
self.ft_channelid = None
30+
self.ft_show = None
31+
self.ft_showid = None
2132
# useful query fragments
33+
# pylint: disable=line-too-long
2234
self.sql_query_films = "SELECT film.id,`title`,`show`,`channel`,`description`,TIME_TO_SEC(`duration`) AS `seconds`,`size`,`aired`,`url_sub`,`url_video`,`url_video_sd`,`url_video_hd` FROM `film` LEFT JOIN `show` ON show.id=film.showid LEFT JOIN `channel` ON channel.id=film.channelid"
2335
self.sql_query_filmcnt = "SELECT COUNT(*) FROM `film` LEFT JOIN `show` ON show.id=film.showid LEFT JOIN `channel` ON channel.id=film.channelid"
2436
self.sql_cond_recent = "( TIMESTAMPDIFF(SECOND,{},CURRENT_TIMESTAMP()) <= {} )".format( "aired" if settings.recentmode == 0 else "film.dtCreated", settings.maxage )
@@ -39,6 +51,7 @@ def Init( self, reset, convert ):
3951
cursor.execute( 'SELECT VERSION()' )
4052
( version, ) = cursor.fetchone()
4153
self.logger.info( 'Connected to server {} running {}', self.settings.host, version )
54+
# pylint: disable=broad-except
4255
except Exception:
4356
self.logger.info( 'Connected to server {}', self.settings.host )
4457
self.conn.database = self.settings.database
@@ -47,7 +60,7 @@ def Init( self, reset, convert ):
4760
self.logger.info( '=== DATABASE {} DOES NOT EXIST. TRYING TO CREATE IT ===', self.settings.database )
4861
return self._handle_database_initialization()
4962
self.conn = None
50-
self.logger.error( 'Database error: {}', err )
63+
self.logger.error( 'Database error: {}, {}', err.errno, err )
5164
self.notifier.ShowDatabaseError( err )
5265
return False
5366

@@ -57,6 +70,7 @@ def Init( self, reset, convert ):
5770
def Exit( self ):
5871
if self.conn is not None:
5972
self.conn.close()
73+
self.conn = None
6074

6175
def Search( self, search, filmui, extendedsearch ):
6276
searchmask = '%' + search.decode('utf-8') + '%'
@@ -113,7 +127,7 @@ def GetInitials( self, channelid, initialui ):
113127
initialui.End()
114128
cursor.close()
115129
except mysql.connector.Error as err:
116-
self.logger.error( 'Database error: {}', err )
130+
self.logger.error( 'Database error: {}, {}', err.errno, err )
117131
self.notifier.ShowDatabaseError( err )
118132

119133
def GetShows( self, channelid, initial, showui ):
@@ -177,7 +191,7 @@ def GetShows( self, channelid, initial, showui ):
177191
showui.End()
178192
cursor.close()
179193
except mysql.connector.Error as err:
180-
self.logger.error( 'Database error: {}', err )
194+
self.logger.error( 'Database error: {}, {}', err.errno, err )
181195
self.notifier.ShowDatabaseError( err )
182196

183197
def GetFilms( self, showid, filmui ):
@@ -210,7 +224,7 @@ def _Channels_Condition( self, condition, channelui):
210224
channelui.End()
211225
cursor.close()
212226
except mysql.connector.Error as err:
213-
self.logger.error( 'Database error: {}', err )
227+
self.logger.error( 'Database error: {}, {}', err.errno, err )
214228
self.notifier.ShowDatabaseError( err )
215229

216230
def _Search_Condition( self, condition, params, filmui, showshows, showchannels, maxresults, limiting = True ):
@@ -254,7 +268,7 @@ def _Search_Condition( self, condition, params, filmui, showshows, showchannels,
254268
cursor.close()
255269
return results
256270
except mysql.connector.Error as err:
257-
self.logger.error( 'Database error: {}', err )
271+
self.logger.error( 'Database error: {}, {}', err.errno, err )
258272
self.notifier.ShowDatabaseError( err )
259273
return 0
260274

@@ -280,11 +294,11 @@ def RetrieveFilmInfo( self, filmid ):
280294
return film
281295
cursor.close()
282296
except mysql.connector.Error as err:
283-
self.logger.error( 'Database error: {}', err )
297+
self.logger.error( 'Database error: {}, {}', err.errno, err )
284298
self.notifier.ShowDatabaseError( err )
285299
return None
286300

287-
def GetStatus( self ):
301+
def GetStatus( self, reconnect = True ):
288302
status = {
289303
'modified': int( time.time() ),
290304
'status': '',
@@ -329,7 +343,13 @@ def GetStatus( self ):
329343
status['tot_mov'] = r[0][13]
330344
return status
331345
except mysql.connector.Error as err:
332-
self.logger.error( 'Database error: {}', err )
346+
if err.errno == -1:
347+
# connection lost. Retry:
348+
self.logger.warn( 'Database connection lost. Trying to reconnect...' )
349+
if self.reinit():
350+
self.logger.info( 'Reconnection successful' )
351+
return self.GetStatus( False )
352+
self.logger.error( 'Database error: {}, {}', err.errno, err )
333353
self.notifier.ShowDatabaseError( err )
334354
status['status'] = "UNINIT"
335355
return status
@@ -461,13 +481,17 @@ def UpdateStatus( self, status = None, lastupdate = None, filmupdate = None, ful
461481
cursor.close()
462482
self.conn.commit()
463483
except mysql.connector.Error as err:
464-
self.logger.error( 'Database error: {}', err )
484+
self.logger.error( 'Database error: {}, {}', err.errno, err )
465485
self.notifier.ShowDatabaseError( err )
466486

467487
@staticmethod
468488
def SupportsUpdate():
469489
return True
470490

491+
def reinit( self ):
492+
self.Exit()
493+
return self.Init( False, False )
494+
471495
def ftInit( self ):
472496
# prevent concurrent updating
473497
cursor = self.conn.cursor()
@@ -507,7 +531,7 @@ def ftUpdateStart( self, full ):
507531
cursor.close()
508532
self.conn.commit()
509533
except mysql.connector.Error as err:
510-
self.logger.error( 'Database error: {}', err )
534+
self.logger.error( 'Database error: {}, {}', err.errno, err )
511535
self.notifier.ShowDatabaseError( err )
512536
return ( 0, 0, 0, )
513537

@@ -525,7 +549,7 @@ def ftUpdateEnd( self, delete ):
525549
cursor.close()
526550
self.conn.commit()
527551
except mysql.connector.Error as err:
528-
self.logger.error( 'Database error: {}', err )
552+
self.logger.error( 'Database error: {}, {}', err.errno, err )
529553
self.notifier.ShowDatabaseError( err )
530554
return ( 0, 0, 0, 0, 0, 0, )
531555

@@ -585,7 +609,7 @@ def ftInsertFilm( self, film, commit ):
585609
if commit:
586610
self.conn.commit()
587611
except mysql.connector.Error as err:
588-
self.logger.error( 'Database error: {}', err )
612+
self.logger.error( 'Database error: {}, {}', err.errno, err )
589613
self.notifier.ShowDatabaseError( err )
590614
return ( 0, 0, 0, 0, )
591615

@@ -602,7 +626,7 @@ def _insert_channel( self, channel ):
602626
cursor.close()
603627
self.conn.commit()
604628
except mysql.connector.Error as err:
605-
self.logger.error( 'Database error: {}', err )
629+
self.logger.error( 'Database error: {}, {}', err.errno, err )
606630
self.notifier.ShowDatabaseError( err )
607631
return ( 0, 0, )
608632

@@ -619,7 +643,7 @@ def _insert_show( self, channelid, show, search ):
619643
cursor.close()
620644
self.conn.commit()
621645
except mysql.connector.Error as err:
622-
self.logger.error( 'Database error: {}', err )
646+
self.logger.error( 'Database error: {}, {}', err.errno, err )
623647
self.notifier.ShowDatabaseError( err )
624648
return ( 0, 0, )
625649

@@ -634,8 +658,8 @@ def _get_schema_version( self ):
634658
return version
635659
except mysql.connector.errors.ProgrammingError:
636660
return 1
637-
except sqlite3.Error as err:
638-
self.logger.error( 'Database error: {}', err )
661+
except mysql.connector.Error as err:
662+
self.logger.error( 'Database error: {}, {}', err.errno, err )
639663
self.notifier.ShowDatabaseError( err )
640664
return 0
641665

0 commit comments

Comments
 (0)