[mythtv] Python: collecting searchRecorded into list() has side effects

Jan mythtv at jd67.de
Thu Jul 25 11:22:26 UTC 2013


Hi,

I try to get a list of Recorded via searchRecorded and print it in given 
order.

As far as I understand searchRecored don't support order by query (ORDER 
BY).

So I collect all Recorded into a list and sort the list ...

*** pseudo code 
**************************************************************

# get the
rs = list( db.searchRecoreded(recgroup='Default')

# do some sorting
rs.sort(key=operator.itemgetter('starttime'), reverse=reverse)

for r in rs:
     print r.title

******************************************************************************
at this point everything work as expected.

But if I try to get to get the cutpoints from each recorded, if will 
fail after
round about 40 recorded

*** more pseudo 
**************************************************************
for i,r in enumerate(rs):
     # get cutlist also
     print i, r.title, r.markup.getuncutlist()

---
0 Cold Creek Manor []
1 Good Will Hunting []
2 Hairspray []
... snip ...
39 Bad Boys []
40 Bad Boys 
II---------------------------------------------------------------------------
MythDBError                               Traceback (most recent call last)
<ipython-input-12-301408f356a5> in <module>()
       1 for i,r in enumerate(rs):
----> 2     print i, r.title, r.markup.getuncutlist()
       3

/usr/lib/python2.7/dist-packages/MythTV/dataheap.pyc in getuncutlist(self)
     274             return self._buildlist(self.MARK_CUT_START, 
self.MARK_CUT_END)
     275         def getuncutlist(self):
--> 276             return self._buildlist(self.MARK_CUT_END, 
self.MARK_CUT_START)
     277
     278     class _Rating( DBDataRef ):

/usr/lib/python2.7/dist-packages/MythTV/utility/other.pyc in 
_buildlist(self, ms, me)
     401         start = []
     402         stop = []
--> 403         for mark in sorted(self, key=lambda m: m.mark):
     404             if mark.type == ms:
     405                 if len(start) == len(stop):

/usr/lib/python2.7/dist-packages/MythTV/database.pyc in __iter__(self)
     483
     484     def __iter__(self):
--> 485         self._populate()
     486         return list.__iter__(self)
     487

/usr/lib/python2.7/dist-packages/MythTV/database.pyc in _populate(self, 
force, data)
     554                 list.append(self, 
self.SubData(zip(self._datfields, row)))
     555         self._populated = True
--> 556         self._origdata = self.deepcopy()
     557
     558     @classmethod

/usr/lib/python2.7/dist-packages/MythTV/database.pyc in deepcopy(self)
     576     def deepcopy(self):
     577         if not self._populated: return []
--> 578         return self.fromCopy([dat.copy() for dat in self])
     579
     580     def revert(self):

/usr/lib/python2.7/dist-packages/MythTV/database.pyc in fromCopy(cls, data)
     566     @classmethod
     567     def fromCopy(cls, data):
--> 568         c = cls('', bypass=True)
     569         c._populated = True
     570         for dat in data: list.append(c, dat)

/usr/lib/python2.7/dist-packages/MythTV/database.pyc in __init__(self, 
where, db, bypass)
     526     def __init__(self, where, db=None, bypass=False):
     527         list.__init__(self)
--> 528         self._db = DBCache(db)
     529         self._setClassDefs(self._db)
     530         if bypass: return

/usr/lib/python2.7/dist-packages/MythTV/database.pyc in __init__(self, 
db, args, **dbconn)
    1261                     break
    1262             else:
-> 1263                 raise MythDBError(MythError.DB_CREDENTIALS)
    1264
    1265         # write configuration back into file, ignored if not 
old format

MythDBError: Could not find database login credentials

******************************************************************************

If I iterate over searchRecorded (without sorting) everything works be fine:

*** more pseudo 
**************************************************************

for r in DB.searchRecorded(recgroup='Default'):
     print r.title, r.markup.getuncutlist()

---

Cold Creek Manor []
... snip ~ 350 other recorded
Tetsuo - The Bullet Man []
******************************************************************************

It looks like, if I store the Recorded into a list, a connection will hold
for each Recorded and after ~40 Recorded it will run out of connections.

QUESTIONS:
Is it in general, a bad idea to store many (>40) Recorded objects into a 
list()?

Is there any way to iterate a lot of Recorded in a sorted manner?

Help is welcome
Jan











More information about the mythtv-dev mailing list