I've redone my previous work using two sql statements instead of an
iteration; i've also implemented a removeDuplicate for use when a scheduled
recording is removed.

On 12/31/06, Justin Wetherell <[EMAIL PROTECTED]> wrote:

I was torn between doing this (sudo code):

query=('SELECT * FROM tv WHERE title = \'%s\'' % (prog.title))
results=db.runQuery(query)
for row in results:
     if row['title'] == prog.title and row['sub_title'] == prog.sub_title:
        duplicateProgram=True
     if row['title'] == prog.title and row['desc'] == prog.desc:
        duplicateProgram=True

or doing this:

query1=('SELECT * FROM tv WHERE title = \'%s\' AND sub_title = \'%s\'' % (
prog.title, prog.sub_title))
results1=db.runQuery(query1)
query2=('SELECT * FROM tv WHERE title = \'%s\' AND desc = \'%s\'' % (
prog.title, prog.sub_title))
results2=db.runQuery(query2)
if results1 or results2:
   duplicateProgram=True

I'm not sure if 2 sql statements are better than one sql statement and an
iteration over a set. I'm guessing that the two sql statements would be
better but that's just a hunch.
Index: src/helpers/recordserver.py
===================================================================
--- src/helpers/recordserver.py (revision 8873)
+++ src/helpers/recordserver.py (working copy)
@@ -27,10 +27,16 @@
 # -----------------------------------------------------------------------
 
 
-import sys, string, random, time, os, re, pwd, stat, threading
+import sys, string, random, time, os, re, pwd, stat, threading, pickle
 import config
 from util import vfs
 
+##sql database util
+try:
+       from util.dbutil import *
+except ImportError:
+       pass
+
 appname = os.path.splitext(os.path.basename(sys.argv[0]))[0]
 appconf = appname.upper()
 
@@ -253,7 +259,74 @@
 
         return TRUE
 
- 
+    def removeDuplicate(self, prog=None):
+       # Geta sql object
+       db = MetaDatabase()
+       _debug_('Database is available')
+       if db.checkTable('tv'):
+               query=('SELECT * FROM tv WHERE title LIKE \'%s\' AND sub_title 
LIKE \'%s\'' % \
+               (util.escape(prog.title), util.escape(prog.sub_title)))
+               _debug_('%s' % (query))
+               results=db.runQuery(query)
+               if results:
+                       row=results[0]
+                       query=('DELETE FROM tv WHERE id=\'%s\'' % (row['id']))
+               query=('SELECT * FROM tv WHERE title LIKE \'%s\' AND desc LIKE 
\'%s\'' % \
+                (util.escape(prog.title), util.escape(prog.desc)))
+                _debug_('%s' % (query))
+                results=db.runQuery(query)
+                if results:
+                       row=results[0]
+                       query=('DELETE FROM tv WHERE id=\'%s\'' % (row['id']))
+               _debug_('%s' % (query))
+               db.runQuery(query)
+               db.close()
+    
+    def duplicate(self, prog=None):
+
+       # Geta sql object
+       db = MetaDatabase()
+       _debug_('Database is available')
+
+       # Create initial table, if needed
+       dbschema = """CREATE TABLE tv (id INTEGER PRIMARY KEY, \
+       title VARCHAR(255), \
+       sub_title VARCHAR(255), \
+       desc VARCHAR(255), \
+       categories VARCHAR(255), \
+       ratings VARCHAR(255))"""
+       if not db.checkTable('tv'):
+               _debug_('Create TV table')
+               db.runQuery(dbschema)
+       _debug_('Databse is available and TV table exists')
+
+       # Check for duplicates
+       query1=('SELECT * FROM tv WHERE title LIKE \'%s\' AND sub_title LIKE 
\'%s\'' % \
+       (util.escape(prog.title), util.escape(prog.sub_title)))
+       _debug_('%s' % (query1))
+       results1=db.runQuery(query1)
+       query2=('SELECT * FROM tv WHERE title LIKE \'%s\' AND desc LIKE \'%s\'' 
% \
+       (util.escape(prog.title), util.escape(prog.desc)))
+       _debug_('%s' % (query2))
+       results2=db.runQuery(query2)
+       if results1 or results2:
+               _debug_('Found Duplicate')
+               db.close()
+               return TRUE
+       else:
+               _debug_('Not Duplicate')
+               values = "(null,\'%s\',\'%s\',\'%s\',\'%s\',\'%s\')" % \
+               (util.escape(prog.title), \
+               util.escape(prog.sub_title), \
+               util.escape(prog.desc), \
+               util.escape(pickle.dumps(prog.categories)), \
+               util.escape(pickle.dumps(prog.ratings)))
+               sql = 'INSERT OR IGNORE INTO tv VALUES '+values
+               _debug_(sql)
+               db.runQuery(sql)
+               db.close()
+               return FALSE
+               
     def scheduleRecording(self, prog=None):
         global guide
 
@@ -271,9 +344,12 @@
                 _debug_('scheduleRecording: "%s"' % (prog))
                 prog.tunerid = chan.tunerid
     
-        scheduledRecordings = self.getScheduledRecordings()
-        scheduledRecordings.addProgram(prog, tv_util.getKey(prog))
-        self.saveScheduledRecordings(scheduledRecordings)
+       if not self.duplicate(prog):
+               scheduledRecordings = self.getScheduledRecordings()
+               scheduledRecordings.addProgram(prog, tv_util.getKey(prog))
+               self.saveScheduledRecordings(scheduledRecordings)
+       else:
+               return (FALSE, 'duplicate recording')
 
         # check, maybe we need to start right now
         self.checkToRecord()
@@ -301,6 +377,7 @@
             print 'prog.isRecording:', e
             recording = FALSE
 
+       self.removeDuplicate(prog)
         scheduledRecordings = self.getScheduledRecordings()
         scheduledRecordings.removeProgram(prog, tv_util.getKey(prog))
         self.saveScheduledRecordings(scheduledRecordings)
Index: src/tv/epg_types.py
===================================================================
--- src/tv/epg_types.py (revision 8873)
+++ src/tv/epg_types.py (working copy)
@@ -63,8 +63,9 @@
     categories = None
     date       = None
     scheduled  = None
+    previouslyRecorded = None
+    allowDuplicates = None
 
-
     def __init__(self):
         self.channel_id = ''
         self.title      = ''
@@ -77,6 +78,8 @@
         self.advisories = []
         self.categories = []
         self.date       = None
+       self.previouslyRecorded = 0
+       self.allowDuplicates = 0
 
         # Due to problems with Twisted's marmalade this should not be changed
         # to a boolean type. 
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Freevo-devel mailing list
Freevo-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/freevo-devel

Reply via email to