OSDN Git Service

fix encode for mobile function.(option 8,9,0)
[rec10/rec10-git.git] / rec10 / trunk / src / dbMySQL.py
index e027342..df5e7fb 100644 (file)
@@ -1,9 +1,11 @@
 #!/usr/bin/python
 # coding: UTF-8
 # Rec10 TS Recording Tools
-# Copyright (C) 2009 Yukikaze
+# Copyright (C) 2009-2010 Yukikaze
 import MySQLdb
 import recdblist
+import warnings
+
 from decimal import Decimal
 class DB_MySQL:
     dbname = ""
@@ -12,6 +14,7 @@ class DB_MySQL:
     dbpasswd = ""
     dbport = 0
     def __init__(self, dbname, user, passwd, host="localhost", port=3306):
+        warnings.filterwarnings('ignore', "Data truncated for column")
         self.dbname = dbname
         self.dbhost = host
         self.dbusr = user
@@ -39,6 +42,12 @@ class DB_MySQL:
             deltatime VARCHAR(5),\
             deltaday VARCHAR(5),\
             opt VARCHAR(20),\
+            epgtitle VARCHAR(100),\
+            epgbtime DATETIME,\
+            epgetime DATETIME,\
+            epgduplicate TINYINT DEFAULT 0,\
+            epgchange TINYINT DEFAULT 0\
+            counter TINYINT DEFAULT -1\
             UNIQUE uni (type,chtxt,title,btime,deltaday)\
             )')
         except:
@@ -49,9 +58,9 @@ class DB_MySQL:
         self.new_in_auto_bayes_key()
         self.new_in_auto_jbk_key()
         self.new_in_status()
+        self.new_in_settings()
         self.new_auto_timeline_bayes()
         self.new_auto_timeline_keyword()
-        self.new_auto_proc_tmp()
     def connect_db(self):
         """
         dbへの接続
@@ -232,7 +241,8 @@ class DB_MySQL:
         db[1].execute("\
         UPDATE epg_ch \
         SET \
-        status=%s \
+        status=%s , \
+        updatetime=now() \
         WHERE bctype = %s", \
                       (status, bctype)\
                       )
@@ -276,9 +286,7 @@ class DB_MySQL:
     def update_auto_proc(self):
         db = self.connect_db()
         try:
-            db[1].execute('\
-            INSERT INTO auto_proc SELECT * FROM auto_proc_tmp\
-            )')
+            db[1].execute('INSERT INTO auto_proc SELECT * FROM auto_proc_tmp')
         except:
             ""
         self.close_db(db)
@@ -300,6 +308,55 @@ class DB_MySQL:
         except:
             ""
         self.close_db(db)
+    def add_auto_proc(self,type,title,chtxt):
+        db = self.connect_db()
+        db[1].execute('\
+        INSERT IGNORE into auto_proc \
+        (type,title,chtxt) \
+        values (%s,%s,%s)',(type,title,chtxt))
+        ##db.commit()
+        self.close_db(db)
+    def drop_in_settings(self):
+        db = self.connect_db()
+        try:
+            db[1].execute('drop table in_settings')
+        except:
+            ""
+        self.close_db(db)
+    def new_in_settings(self):
+        db = self.connect_db()
+        try:
+            db[1].execute('\
+            CREATE TABLE in_settings \
+            (\
+            auto_jbk TINYINT,\
+            auto_bayes TINYINT,\
+            auto_opt VARCHAR(20),\
+            auto_del_tmp TINYINT\
+            )')
+            db[1].execute("INSERT IGNORE into in_settings VALUE (0,0,\"H\",1)")
+        except:
+            ""
+        self.close_db(db)
+    def select_all_in_settings(self):
+        db = self.connect_db()
+        dbexe = db[1].execute("\
+        SELECT auto_jbk,auto_bayes,auto_del_tmp,auto_opt \
+        FROM in_settings \
+        ")
+        ret = []
+        dls = []
+        if dbexe > 0:
+            dls = db[1].fetchall()
+        self.close_db(db)
+        for dl in dls:
+            r = list(dl)
+            r[0]=str(r[0])
+            r[1]=str(r[1])
+            r[2]=str(r[2])
+            r[3]=r[3]
+            ret.append(r)
+        return ret
     def add_in_timeline_log(self , chtxt="", title="", btime="", etime="", opt="", exp="", longexp="", category=""):
         db = self.connect_db()
         db[1].execute('\
@@ -355,13 +412,40 @@ class DB_MySQL:
                 ret=retdb[0][0]
         self.close_db(db)
         return ret
-    def add_timeline(self, type="", chtxt="", title="", btime="", etime="", deltatime="", deltaday="", opt=""):
+    def add_timeline(self, type="", chtxt="", title="", btime="", etime="", deltatime="", deltaday="", opt="" ,counter=-1):
         db = self.connect_db()
         db[1].execute('\
         INSERT IGNORE into timeline \
-        (type,chtxt,title,btime,etime,deltatime,deltaday,opt) \
-        values (%s,%s,%s,%s,%s,%s,%s,%s)', \
-                      (type, chtxt, title, btime, etime, deltatime, deltaday, opt))
+        (type,chtxt,title,btime,etime,deltatime,deltaday,opt,counter) \
+        values (%s,%s,%s,%s,%s,%s,%s,%s,%s)', \
+                      (type, chtxt, title, btime, etime, deltatime, deltaday, opt ,counter))
+        ##db.commit()
+        self.close_db(db)
+    def update_epg_timeline(self,type,chtxt,title,btime,epgbtime,epgetime,epgtitle):
+        db = self.connect_db()
+        db[1].execute('\
+        UPDATE timeline \
+        SET epgbtime=%s,epgetime=%s,epgtitle=%s \
+        WHERE type=%s AND chtxt=%s AND title=%s AND btime=%s ', \
+                      (epgbtime,epgetime,epgtitle,type, chtxt, title, btime))
+        ##db.commit()
+        self.close_db(db)
+    def update_status_change_timeline(self,type,chtxt,title,btime,epgchange):
+        db = self.connect_db()
+        db[1].execute('\
+        UPDATE timeline \
+        SET epgchange =%s \
+        WHERE type=%s AND chtxt=%s AND title=%s AND btime=%s ', \
+                      (epgchange , type, chtxt, title, btime))
+        ##db.commit()
+        self.close_db(db)
+    def update_status_dup_timeline(self,type,chtxt,title,btime,epgduplicate):
+        db = self.connect_db()
+        db[1].execute('\
+        UPDATE timeline \
+        SET epgduplicate =%s \
+        WHERE type=%s AND chtxt=%s AND title=%s AND btime=%s ', \
+                      (epgduplicate , type, chtxt, title, btime))
         ##db.commit()
         self.close_db(db)
     def del_timeline(self, type="", title="", chtxt="", btime=""):
@@ -379,41 +463,19 @@ class DB_MySQL:
         db = self.connect_db()
         recdata = []
         dbr = db[1].execute("\
-        SELECT type, chtxt, title, btime, etime, deltatime ,deltaday ,opt \
+        SELECT type, chtxt, title, btime, etime, deltatime ,deltaday ,opt ,epgbtime ,epgetime ,epgtitle ,epgduplicate ,epgchange ,counter\
         FROM timeline")
         dbl = db[1].fetchall()
         self.close_db(db)
         if dbr > 0:
-            for typet, chtxt, title, btime, etime, deltatime, deltaday, opt in dbl:
-                ret = {}
-                ret['type'] = typet
-                ret['chtxt'] = chtxt
-                ret['title'] = title
-                btime = btime.strftime("%Y-%m-%d %H:%M:%S")
-                etime = etime.strftime("%Y-%m-%d %H:%M:%S")
-                ret['btime'] = btime
-                ret['etime'] = etime
-                ret['opt'] = opt
-                ret['deltatime'] = ""
-                ret['deltaday'] = ""
-                if deltatime == None:
-                    deltatime = "3"
-                if deltaday == None:
-                    deltaday = "7"
-                if typet == 'key':
-                    ret['deltatime'] = deltatime
-                elif typet == 'keyevery':
-                    ret['deltatime'] = deltatime
-                    ret['deltaday'] = deltaday
-                recdata.append(ret)
-        self.close_db(db)
+            recdata = self.getdic_timeline(dbl)
         return recdata
     def select_bytime_timeline(self, dminutes):
         db = self.connect_db()
         recdatum = []
         #dbr=db[1].execute("SELECT type, chtxt, title, btime, etime, deltatime ,deltaday ,opt FROM rectime WHERE btime < DATE_SUB(now(),INTERVAL "+dminutes+" MINUTE ) AND btime > DATE_ADD(now(),INTERVAL "+dminutes+" MINUTE )")
         dbr = db[1].execute("SELECT \
-        type, chtxt, title, btime, etime, deltatime ,deltaday ,opt \
+        type, chtxt, title, btime, etime, deltatime ,deltaday ,opt ,epgbtime ,epgetime ,epgtitle ,epgduplicate ,epgchange ,counter\
         FROM timeline \
         WHERE btime BETWEEN DATE_SUB(now(),INTERVAL " + dminutes + " MINUTE ) AND \
         DATE_ADD(now(),INTERVAL " + dminutes + " MINUTE )")
@@ -421,33 +483,150 @@ class DB_MySQL:
         self.close_db(db)
         #recdblist.printutf8(dbl)
         if dbr > 0:
-            for typet, chtxt, title, btime, etime, deltatime, deltaday, opt in dbl:
-                ret = {}
-                ret['type'] = typet
-                ret['chtxt'] = chtxt
-                ret['title'] = title
-                btime = btime.strftime("%Y-%m-%d %H:%M:%S")
-                etime = etime.strftime("%Y-%m-%d %H:%M:%S")
-                ret['btime'] = btime
-                ret['etime'] = etime
-                ret['opt'] = opt
-                if deltatime == None or deltatime == "":
-                    deltatime = "3"
-                if deltaday == None or deltaday == "":
-                    deltaday = "7"
-                if typet == recdblist.REC_KEYWORD:
-                    ret['deltatime'] = deltatime
-                elif typet == recdblist.REC_KEYWORD_EVERY_SOME_DAYS:
-                    ret['deltatime'] = deltatime
-                    ret['deltaday'] = deltaday
-                recdatum.append(ret)
+            recdatum = self.getdic_timeline(dbl)
+        return recdatum
+    def select_by_name_time_timeline(self,title,btime,btime2):
+        db = self.connect_db()
+        recdatum = []
+        #dbr=db[1].execute("SELECT type, chtxt, title, btime, etime, deltatime ,deltaday ,opt FROM rectime WHERE btime < DATE_SUB(now(),INTERVAL "+dminutes+" MINUTE ) AND btime > DATE_ADD(now(),INTERVAL "+dminutes+" MINUTE )")
+        dbr = db[1].execute("SELECT \
+        type, chtxt, title, btime, etime, deltatime ,deltaday ,opt ,epgbtime ,epgetime ,epgtitle ,epgduplicate ,epgchange ,counter\
+        FROM timeline \
+        WHERE btime > %s AND \
+        btime < %s AND title = %s",(btime,btime2,title))
+        dbl = db[1].fetchall()
+        self.close_db(db)
+        #recdblist.printutf8(dbl)
+        if dbr > 0:
+            recdatum = self.getdic_timeline(dbl)
+        return recdatum
+    def select_bytime_all_timeline(self,btime,etime):
+        db = self.connect_db()
+        recdatum = []
+        #dbr=db[1].execute("SELECT type, chtxt, title, btime, etime, deltatime ,deltaday ,opt FROM rectime WHERE btime < DATE_SUB(now(),INTERVAL "+dminutes+" MINUTE ) AND btime > DATE_ADD(now(),INTERVAL "+dminutes+" MINUTE )")
+        dbr = db[1].execute("SELECT \
+        type, chtxt, title, btime, etime, deltatime ,deltaday ,opt ,epgbtime ,epgetime ,epgtitle ,epgduplicate ,epgchange ,counter\
+        FROM timeline \
+        WHERE btime > %s AND \
+        etime < %s",(btime,etime))
+        dbl = db[1].fetchall()
+        self.close_db(db)
+        #recdblist.printutf8(dbl)
+        if dbr > 0:
+            recdatum = self.getdic_timeline(dbl)
+        return recdatum
+    def select_byepgtime_all_timeline(self,epgbtime,epgetime):
+        db = self.connect_db()
+        recdatum = []
+        #dbr=db[1].execute("SELECT type, chtxt, title, btime, etime, deltatime ,deltaday ,opt FROM rectime WHERE btime < DATE_SUB(now(),INTERVAL "+dminutes+" MINUTE ) AND btime > DATE_ADD(now(),INTERVAL "+dminutes+" MINUTE )")
+        dbr = db[1].execute("SELECT \
+        type, chtxt, title, btime, etime, deltatime ,deltaday ,opt ,epgbtime ,epgetime ,epgtitle ,epgduplicate ,epgchange ,counter\
+        FROM timeline \
+        WHERE epgbtime >= %s AND \
+        epgetime <= %s",(epgbtime,epgetime))
+        dbl = db[1].fetchall()
+        self.close_db(db)
+        #recdblist.printutf8(dbl)
+        if dbr > 0:
+            recdatum=self.getdic_timeline(dbl)
         return recdatum
-    def select_bytime_all_timeline(self,btime,etime,chtxt):
+    def select_byepgtime_over_timeline(self,epgbtime,epgetime):
+        db = self.connect_db()
+        recdatum = []
+        #dbr=db[1].execute("SELECT type, chtxt, title, btime, etime, deltatime ,deltaday ,opt FROM rectime WHERE btime < DATE_SUB(now(),INTERVAL "+dminutes+" MINUTE ) AND btime > DATE_ADD(now(),INTERVAL "+dminutes+" MINUTE )")
+        dbr = db[1].execute("SELECT \
+        type, chtxt, title, btime, etime, deltatime ,deltaday ,opt ,epgbtime ,epgetime ,epgtitle ,epgduplicate ,epgchange ,counter\
+        FROM timeline \
+        WHERE (NOT(( timeline.epgetime <= %s )OR( timeline.epgbtime >= %s )))"\
+        ,(epgbtime,epgetime))
+        dbl = db[1].fetchall()
+        self.close_db(db)
+        #recdblist.printutf8(dbl)
+        if dbr > 0:
+            recdatum=self.getdic_timeline(dbl)
+        return recdatum
+    def count_schedule_timeline(self, btime, etime):
+        """
+        count rectasknum
+        return [te num,bs/cs num]
+        """
+        db = self.connect_db()
+        dbexe = "SELECT type,epg_ch.bctype,timeline.chtxt,title FROM timeline INNER JOIN epg_ch ON timeline.chtxt=epg_ch.chtxt"
+        dbexe = dbexe + " WHERE ((NOT(( timeline.etime <= %s )OR( timeline.btime >= %s ))) OR ((timeline.btime = %s) AND (timeline.etime = %s) ) )"
+        Srec = 0
+        Trec = 0
+        db[1].execute(dbexe, (btime, etime,btime,etime))
+        dbl=db[1].fetchall()
+        for typet, bctypet, chtxtt, titlet in dbl:
+            if (typet == recdblist.REC_RESERVE) or (typet == recdblist.REC_FINAL_RESERVE) or (typet == recdblist.REC_KEYWORD) or (typet == recdblist.REC_KEYWORD_EVERY_SOME_DAYS):
+                if bctypet.find("cs") > -1:
+                    Srec = Srec + 1
+                elif bctypet.find("bs") > -1:
+                    Srec = Srec + 1
+                elif bctypet.find("te") > -1:
+                    Trec = Trec + 1
+        self.close_db(db)
+        return [Trec, Srec]
+    def search_schedule_timeline(self,btime,etime):
+        """
+        count rectasknum
+        return [(type,bctype,chtxt,title,btime,etime)]
+        """
+        db = self.connect_db()
+        dbexe = "SELECT type,epg_ch.bctype,timeline.chtxt,title,timeline.btime,timeline.etime FROM timeline INNER JOIN epg_ch ON timeline.chtxt=epg_ch.chtxt"
+        dbexe = dbexe + " WHERE ((NOT(( timeline.etime <= %s )OR( timeline.btime >= %s ))) OR ((timeline.btime = %s) AND (timeline.etime = %s) ) )"
+        ret=[]
+        db[1].execute(dbexe, (btime, etime,btime,etime))
+        dbl=db[1].fetchall()
+        for typet, bctypet, chtxtt, titlet , btimet, etimet in dbl:
+            if (typet == recdblist.REC_RESERVE) or (typet == recdblist.REC_FINAL_RESERVE) or (typet == recdblist.REC_KEYWORD) or (typet == recdblist.REC_KEYWORD_EVERY_SOME_DAYS):
+                ret.append([typet,bctypet,chtxtt,titlet,btimet,etimet])
+        self.close_db(db)
+        return ret
+    def count_epgschedule_timeline(self, epgbtime, epgetime):
+        """
+        count rectasknum
+        return [te num,bs/cs num]
+        """
+        db = self.connect_db()
+        dbexe = "SELECT type,epg_ch.bctype,timeline.chtxt,title FROM timeline INNER JOIN epg_ch ON timeline.chtxt=epg_ch.chtxt"
+        dbexe = dbexe + " WHERE (NOT(( timeline.epgetime <= %s )OR( timeline.epgbtime >= %s )))"
+        Srec = 0
+        Trec = 0
+        db[1].execute(dbexe, (epgbtime, epgetime))
+        dbl=db[1].fetchall()
+        for typet, bctypet, chtxtt, titlet in dbl:
+            if (typet == recdblist.REC_RESERVE) or (typet == recdblist.REC_FINAL_RESERVE) or (typet == recdblist.REC_KEYWORD) or (typet == recdblist.REC_KEYWORD_EVERY_SOME_DAYS):
+                if bctypet.find("cs") > -1:
+                    Srec = Srec + 1
+                elif bctypet.find("bs") > -1:
+                    Srec = Srec + 1
+                elif bctypet.find("te") > -1:
+                    Trec = Trec + 1
+        self.close_db(db)
+        return [Trec, Srec]
+    def search_epgschedule_timeline(self,epgbtime,epgetime):
+        """
+        count rectasknum
+        return [(type,bctype,chtxt,title,btime,etime)]
+        """
+        db = self.connect_db()
+        dbexe = "SELECT type,epg_ch.bctype,timeline.chtxt,title,timeline.btime,timeline.etime FROM timeline INNER JOIN epg_ch ON timeline.chtxt=epg_ch.chtxt"
+        dbexe = dbexe + " WHERE ((NOT(( timeline.epgetime <= %s )OR( timeline.epgbtime >= %s ))) OR ((timeline.epgbtime = %s) AND (timeline.epgetime = %s) ) )"
+        ret=[]
+        db[1].execute(dbexe, (epgbtime, epgetime,epgbtime,epgetime))
+        dbl=db[1].fetchall()
+        for typet, bctypet, chtxtt, titlet , btimet, etimet in dbl:
+            if (typet == recdblist.REC_RESERVE) or (typet == recdblist.REC_FINAL_RESERVE) or (typet == recdblist.REC_KEYWORD) or (typet == recdblist.REC_KEYWORD_EVERY_SOME_DAYS):
+                ret.append([typet,bctypet,chtxtt,titlet,btimet,etimet])
+        self.close_db(db)
+        return ret
+    def select_bytime_bychtxt_all_timeline(self,btime,etime,chtxt):
         db = self.connect_db()
         recdatum = []
         #dbr=db[1].execute("SELECT type, chtxt, title, btime, etime, deltatime ,deltaday ,opt FROM rectime WHERE btime < DATE_SUB(now(),INTERVAL "+dminutes+" MINUTE ) AND btime > DATE_ADD(now(),INTERVAL "+dminutes+" MINUTE )")
         dbr = db[1].execute("SELECT \
-        type, chtxt, title, btime, etime, deltatime ,deltaday ,opt \
+        type, chtxt, title, btime, etime, deltatime ,deltaday ,opt ,epgbtime ,epgetime ,epgtitle ,epgduplicate ,epgchange ,counter\
         FROM timeline \
         WHERE btime > %s AND \
         etime < %s\
@@ -456,26 +635,43 @@ class DB_MySQL:
         self.close_db(db)
         #recdblist.printutf8(dbl)
         if dbr > 0:
-            for typet, chtxt, title, btime, etime, deltatime, deltaday, opt in dbl:
-                ret = {}
-                ret['type'] = typet
-                ret['chtxt'] = chtxt
-                ret['title'] = title
-                btime = btime.strftime("%Y-%m-%d %H:%M:%S")
-                etime = etime.strftime("%Y-%m-%d %H:%M:%S")
-                ret['btime'] = btime
-                ret['etime'] = etime
-                ret['opt'] = opt
-                if deltatime == None or deltatime == "":
-                    deltatime = "3"
-                if deltaday == None or deltaday == "":
-                    deltaday = "7"
-                if typet == recdblist.REC_KEYWORD:
-                    ret['deltatime'] = deltatime
-                elif typet == recdblist.REC_KEYWORD_EVERY_SOME_DAYS:
-                    ret['deltatime'] = deltatime
-                    ret['deltaday'] = deltaday
-                recdatum.append(ret)
+            recdatum = self.getdic_timeline(dbl)
+        return recdatum
+    def getdic_timeline(self,timelinelists):
+        recdatum=[]
+        for typet, chtxt, title, btime, etime, deltatime, deltaday, opt ,epgbtimet , epgetimet ,epgtitlet ,epgduplicatet ,epgchanget ,countert in timelinelists:
+            ret = {}
+            ret['type'] = typet
+            ret['chtxt'] = chtxt
+            ret['title'] = title
+            btime = btime.strftime("%Y-%m-%d %H:%M:%S")
+            etime = etime.strftime("%Y-%m-%d %H:%M:%S")
+            ret['btime'] = btime
+            ret['etime'] = etime
+            ret['opt'] = opt
+            try:
+                ret['epgbtime'] = epgbtimet.strftime("%Y-%m-%d %H:%M:%S")
+                ret['epgetime'] = epgetimet.strftime("%Y-%m-%d %H:%M:%S")
+            except:
+                ret['epgbtime'] = "2010-01-01 00:00:00"
+                ret['epgetime'] = "2010-01-01 00:00:00"
+            ret['epgtitle'] = epgtitlet
+            ret['epgduplicate'] = epgduplicatet
+            ret['epgchange'] = epgchanget
+            if deltatime == None or deltatime == "":
+                deltatime = "3"
+            if deltaday == None or deltaday == "":
+                deltaday = "7"
+            if typet == recdblist.REC_KEYWORD:
+                ret['deltatime'] = deltatime
+            elif typet == recdblist.REC_KEYWORD_EVERY_SOME_DAYS:
+                ret['deltatime'] = deltatime
+                ret['deltaday'] = deltaday
+            try:
+                ret['counter'] = int(countert)
+            except:
+                ret['counter']=-1
+            recdatum.append(ret)
         return recdatum
     def delete_old_timeline(self, dhour):
         db = self.connect_db()
@@ -518,6 +714,13 @@ class DB_MySQL:
             ret = db[1].fetchall()
         self.close_db(db)
         return ret
+    def drop_in_status(self):
+        db = self.connect_db()
+        try:
+            db[1].execute('drop table in_status')
+        except:
+            ""
+        self.close_db(db)
     def new_in_status(self):
         db = self.connect_db()
         try:
@@ -528,7 +731,8 @@ class DB_MySQL:
             terec TINYINT DEFAULT 0,\
             bscsrec TINYINT DEFAULT 0,\
             b252ts TINYINT DEFAULT 0,\
-            installed TINYINT DEFAULT 0\
+            installed TINYINT DEFAULT 0,\
+            version TINYINT\
             )")
             db[1].execute("INSERT IGNORE into in_status VALUE (0,0,0,0,0)")
         except:
@@ -553,7 +757,28 @@ class DB_MySQL:
             r[3]=str(r[3])
             ret.append(r)
         return ret
-        
+    def select_version_in_status(self):
+        db = self.connect_db()
+        version=0
+        try:
+            dbexe = db[1].execute("\
+            SELECT version \
+            FROM in_status \
+            ")
+            if dbexe > 0:
+                dls = db[1].fetchall()
+            self.close_db(db)
+            for dl in dls:
+                r = list(dl)
+                version=int(str(r[0]))
+        except:
+            ""
+        return version
+    def change_version_in_status(self,version):
+        db = self.connect_db()
+        db[1].execute("\
+        UPDATE in_status SET version=%s",str(version))
+        self.close_db(db)
     def change_ts2avi_in_status(self,i):
         """
         statuをiだけ増減する
@@ -773,10 +998,13 @@ class DB_MySQL:
         db = self.connect_db()
         for i,j in list.items():
             retl=(i,chtxt,"0",str(Decimal(j)/beforenumf),beforenum,str(j),beforenum)
-            db[1].execute("INSERT INTO in_auto_bayes_key (keychar,chtxt,ratio_rec,ratio_all) \
-            VALUES (%s,%s,%s,%s)\
-            ON DUPLICATE KEY UPDATE \
-            ratio_all=CONVERT((ratio_all*%s+%s)/%s,DECIMAL(32,14))",retl)
+            try:
+                db[1].execute("INSERT INTO in_auto_bayes_key (keychar,chtxt,ratio_rec,ratio_all) \
+                VALUES (%s,%s,%s,%s)\
+                ON DUPLICATE KEY UPDATE \
+                ratio_all=CONVERT((ratio_all*%s+%s)/%s,DECIMAL(32,14))",retl)
+            except:
+                ""
         self.close_db(db)
     def change_ratio_rec_reduce_in_auto_bayes_key(self,chtxt,beforenum,newnum):
         beforenum=str(beforenum)
@@ -801,10 +1029,13 @@ class DB_MySQL:
         db = self.connect_db()
         for i,j in list.items():
             retl=(i,chtxt,str(Decimal(j)/beforenumf),"0",beforenum,str(j),beforenum)
-            db[1].execute("INSERT INTO in_auto_bayes_key (keychar,chtxt,ratio_rec,ratio_all) \
-            VALUES (%s,%s,%s,%s)\
-            ON DUPLICATE KEY UPDATE \
-            ratio_rec=CONVERT((ratio_rec*%s+%s)/%s,DECIMAL(32,14))",retl)
+            try:
+                db[1].execute("INSERT INTO in_auto_bayes_key (keychar,chtxt,ratio_rec,ratio_all) \
+                VALUES (%s,%s,%s,%s)\
+                ON DUPLICATE KEY UPDATE \
+                ratio_rec=CONVERT((ratio_rec*%s+%s)/%s,DECIMAL(32,14))",retl)
+            except:
+                ""
         self.close_db(db)
     def select_by_key_in_auto_bayes_key(self,key,chtxt):
         db = self.connect_db()
@@ -821,7 +1052,6 @@ class DB_MySQL:
             return dls[0]
         else:
             return dls
-
     def new_auto_timeline_keyword(self):
         db = self.connect_db()
         try:
@@ -884,3 +1114,25 @@ class DB_MySQL:
         WHERE \
         btime < DATE_SUB(now(),INTERVAL " + dhour + " HOUR )")
         self.close_db(db)
+    def update_db_to93(self):
+        db = self.connect_db()
+        self.drop_in_settings()
+        self.new_in_settings()
+        db[1].execute("\
+        ALTER TABLE timeline ADD epgtitle VARCHAR(100),\
+        ADD epgbtime DATETIME,\
+        ADD epgetime DATETIME,\
+        ADD epgduplicate TINYINT DEFAULT 0,\
+        ADD epgchange TINYINT DEFAULT 0")
+        db[1].execute("\
+        ALTER TABLE in_status ADD version TINYINT")
+        self.close_db(db)
+        self.change_version_in_status("93")
+    def update_db_93to94(self):
+        db = self.connect_db()
+        self.drop_in_settings()
+        self.new_in_settings()
+        db[1].execute("\
+        ALTER TABLE timeline ADD counter TINYINT DEFAULT -1")
+        self.close_db(db)
+        self.change_version_in_status("94")
\ No newline at end of file