imms.py
author fabien
Sun, 08 Feb 2004 17:27:21 -0500
branchimmsview
changeset 32 85c8f5280d48
parent 31 13f56bb29b96
child 33 ad808d18c693
permissions -rw-r--r--
[svn] Conversion of bestofimms to imms.py.

import os
import sqlite

def quote_sql(str):
    return str.replace("'", "''")
    
class IMMSDb:
    def __init__(self, dbname = None):
        if not dbname:
            dbname = os.environ['HOME'] + '/.imms/imms.db'
        # autocommit = 1 disable autocommit!
        self.cx = sqlite.connect(dbname, autocommit = 1,
                                 timeout = 2, encoding = ('utf-8', 'replace'))
        self.cu = self.cx.cursor()
    def get_library_entry(self):
        qry = "SELECT path, uid, sid FROM Library";
        first = 1
        for key in kw.keys():
            if first:
                qry += " WHERE "
                first = 0
            else:
                qry += " AND "
            if key in ['uid', 'sid']:
                qry += "%s = %d" % (key, kw[key])
            else:
                qry += "%s = '%s'" % (key, quote_sql(kw[key]))
        qry += ";"
        self.cu.execute(qry)
        return self.cu.fetchall()
    def update_filename(self, oldname, newname):
        self.cu.execute("""UPDATE Library
            SET path = '%s'
            WHERE path = '%s';""" % (quote_sql(newname),
                                     quote_sql(oldname)))
    def erase_filename(self, name):
        self.cu.execute("""DELETE FROM Library
            WHERE path = '%s';""" % quote_sql(name))
    def erase_uid(self, uid):
        self.cu.execute("""BEGIN TRANSACTION;
             DELETE FROM Library WHERE uid = %d;
             DELETE FROM Rating WHERE uid = %d;
             DELETE FROM Acoustic WHERE uid = %d;
             COMMIT;""" % (uid, uid, uid))
    def erase_sid(self, sid):
        self.cu.execute("""BEGIN TRANSACTION;
              DELETE FROM Library WHERE sid = %d;
              DELETE FROM Info WHERE sid = %d;
              DELETE FROM Last WHERE sid = %d;
              COMMIT;""")
    def erase_path(self, path):
        self.cu.execute("DELETE FROM Library WHERE path = '%s';" \
                        % quote_sql(path))
    def get_paths(self, uids = None, sids = None):
        qry = "SELECT uid, sid, path FROM Library"
        first = 1
        for uid in uids:
            if first:
                qry += ' WHERE'
                first = 0
            else:
                qry += ' OR'
            qry += " uid = %d" % uid
        for uid in uids:
            if first:
                qry += ' WHERE'
                first = 0
            else:
                qry += ' OR'
            qry += " sid = %d" % uid
        qry += ';'
        self.cu.execute(qry)
        return self.cu.fetchall()        
    def get_ratings(self, min = 0, max = 150):
        self.cu.execute('''SELECT Rating.uid, Rating.rating 
                   FROM Rating
                   WHERE Rating.rating >= %d
                   AND Rating.rating <= %d
                   ORDER BY Rating.rating;''' % (min, max))
        return self.cu.fetchall()
    def get_acoustics(self, uids = None):
        qry = "SELECT uid, bpm. spectrum FROM Acoustic"
        first = 1
        for uid in uids:
            if first:
                qry += ' WHERE'
                first = 0
            else:
                qry += ' OR'
            qry += " uid = %d" % uid
        qry += ';'
        self.cu.execute(qry)
        return self.cu.fetchall()
    def get_infos(self, sids = None):
        qry = "SELECT sid, artist, title FROM Infos"
        first = 1
        for sid in sids:
            if first:
                qry += ' WHERE'
                first = 0
            else:
                qry += ' OR'
            qry += " sid = %d" % id
        qry += ';'
        self.cu.execute(qry)
        return self.cu.fetchall()
    def get_last(self, sids = None):
        qry = "SELECT sid, last FROM Last"
        first = 1
        for sid in sids:
            if first:
                qry += ' WHERE'
                first = 0
            else:
                qry += ' OR'
            qry += " sid = %d" % id
        qry += ';'
        self.cu.execute(qry)
        return self.cu.fetchall()
    def get_uid_by_path(self, path):
        entries = self.get_library_entries(path = path)
        return map(lambda x: x[1], entries)
    def get_ratings_and_info(self, uids = None):
        qry = '''SELECT l.uid, r.rating, l.path, ls.last
               FROM Library l, Rating r, Last ls
               WHERE l.uid = r.uid AND l.sid = ls.sid'''
        if uids:
            qry += ' AND (l.uid = %d' % (uids.pop())
            for uid in uids:
                qry += ' OR l.uid = %d' % uid
            qry += ')'
        qry += ';'
        self.cu.execute(qry)
        # Better to fetch everything since locking can really mess
        # things in imms plugin.
	results = {}
	tune = self.cu.fetchone()
        while tune:
            try:
                uid = int(tune[0])
                if results.has_key(uid):
                    results[uid]['path'].append(
                        tune[2].decode('utf-8', 'replace'))
                else:
                    results[uid] = {
                        'rating' : int(tune[1]),
                        'path' : [ tune[2].decode('utf-8', 'replace') ],
                        'last' : int(tune[3])}
            except UnicodeDecodeError:
                print tune[2]
	    tune = self.cu.fetchone()
        return results