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 ------------------------------------------------
611import time
1217
1318# -- Classes ------------------------------------------------
1419class 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