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