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.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
31
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
     1
import os
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
     2
import sqlite
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
     3
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
     4
def quote_sql(str):
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
     5
    return str.replace("'", "''")
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
     6
    
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
     7
class IMMSDb:
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
     8
    def __init__(self, dbname = None):
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
     9
        if not dbname:
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    10
            dbname = os.environ['HOME'] + '/.imms/imms.db'
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    11
        # autocommit = 1 disable autocommit!
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    12
        self.cx = sqlite.connect(dbname, autocommit = 1,
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    13
                                 timeout = 2, encoding = ('utf-8', 'replace'))
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    14
        self.cu = self.cx.cursor()
32
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
    15
    def get_library_entry(self):
31
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    16
        qry = "SELECT path, uid, sid FROM Library";
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    17
        first = 1
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    18
        for key in kw.keys():
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    19
            if first:
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    20
                qry += " WHERE "
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    21
                first = 0
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    22
            else:
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    23
                qry += " AND "
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    24
            if key in ['uid', 'sid']:
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    25
                qry += "%s = %d" % (key, kw[key])
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    26
            else:
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    27
                qry += "%s = '%s'" % (key, quote_sql(kw[key]))
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    28
        qry += ";"
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    29
        self.cu.execute(qry)
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    30
        return self.cu.fetchall()
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    31
    def update_filename(self, oldname, newname):
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    32
        self.cu.execute("""UPDATE Library
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    33
            SET path = '%s'
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    34
            WHERE path = '%s';""" % (quote_sql(newname),
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    35
                                     quote_sql(oldname)))
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    36
    def erase_filename(self, name):
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    37
        self.cu.execute("""DELETE FROM Library
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    38
            WHERE path = '%s';""" % quote_sql(name))
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    39
    def erase_uid(self, uid):
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    40
        self.cu.execute("""BEGIN TRANSACTION;
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    41
             DELETE FROM Library WHERE uid = %d;
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    42
             DELETE FROM Rating WHERE uid = %d;
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    43
             DELETE FROM Acoustic WHERE uid = %d;
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    44
             COMMIT;""" % (uid, uid, uid))
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    45
    def erase_sid(self, sid):
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    46
        self.cu.execute("""BEGIN TRANSACTION;
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    47
              DELETE FROM Library WHERE sid = %d;
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    48
              DELETE FROM Info WHERE sid = %d;
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    49
              DELETE FROM Last WHERE sid = %d;
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    50
              COMMIT;""")
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    51
    def erase_path(self, path):
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    52
        self.cu.execute("DELETE FROM Library WHERE path = '%s';" \
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    53
                        % quote_sql(path))
32
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
    54
    def get_paths(self, uids = None, sids = None):
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
    55
        qry = "SELECT uid, sid, path FROM Library"
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
    56
        first = 1
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
    57
        for uid in uids:
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
    58
            if first:
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
    59
                qry += ' WHERE'
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
    60
                first = 0
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
    61
            else:
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
    62
                qry += ' OR'
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
    63
            qry += " uid = %d" % uid
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
    64
        for uid in uids:
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
    65
            if first:
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
    66
                qry += ' WHERE'
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
    67
                first = 0
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
    68
            else:
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
    69
                qry += ' OR'
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
    70
            qry += " sid = %d" % uid
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
    71
        qry += ';'
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
    72
        self.cu.execute(qry)
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
    73
        return self.cu.fetchall()        
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
    74
    def get_ratings(self, min = 0, max = 150):
31
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    75
        self.cu.execute('''SELECT Rating.uid, Rating.rating 
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    76
                   FROM Rating
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    77
                   WHERE Rating.rating >= %d
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    78
                   AND Rating.rating <= %d
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    79
                   ORDER BY Rating.rating;''' % (min, max))
32
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
    80
        return self.cu.fetchall()
31
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    81
    def get_acoustics(self, uids = None):
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    82
        qry = "SELECT uid, bpm. spectrum FROM Acoustic"
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    83
        first = 1
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    84
        for uid in uids:
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    85
            if first:
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    86
                qry += ' WHERE'
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    87
                first = 0
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    88
            else:
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    89
                qry += ' OR'
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    90
            qry += " uid = %d" % uid
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    91
        qry += ';'
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    92
        self.cu.execute(qry)
32
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
    93
        return self.cu.fetchall()
31
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    94
    def get_infos(self, sids = None):
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    95
        qry = "SELECT sid, artist, title FROM Infos"
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    96
        first = 1
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    97
        for sid in sids:
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    98
            if first:
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
    99
                qry += ' WHERE'
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   100
                first = 0
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   101
            else:
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   102
                qry += ' OR'
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   103
            qry += " sid = %d" % id
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   104
        qry += ';'
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   105
        self.cu.execute(qry)
32
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
   106
        return self.cu.fetchall()
31
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   107
    def get_last(self, sids = None):
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   108
        qry = "SELECT sid, last FROM Last"
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   109
        first = 1
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   110
        for sid in sids:
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   111
            if first:
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   112
                qry += ' WHERE'
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   113
                first = 0
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   114
            else:
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   115
                qry += ' OR'
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   116
            qry += " sid = %d" % id
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   117
        qry += ';'
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   118
        self.cu.execute(qry)
32
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
   119
        return self.cu.fetchall()
31
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   120
    def get_uid_by_path(self, path):
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   121
        entries = self.get_library_entries(path = path)
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   122
        return map(lambda x: x[1], entries)
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   123
    def get_ratings_and_info(self, uids = None):
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   124
        qry = '''SELECT l.uid, r.rating, l.path, ls.last
32
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
   125
               FROM Library l, Rating r, Last ls
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
   126
               WHERE l.uid = r.uid AND l.sid = ls.sid'''
31
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   127
        if uids:
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   128
            qry += ' AND (l.uid = %d' % (uids.pop())
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   129
            for uid in uids:
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   130
                qry += ' OR l.uid = %d' % uid
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   131
            qry += ')'
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   132
        qry += ';'
32
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
   133
        self.cu.execute(qry)
31
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   134
        # Better to fetch everything since locking can really mess
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   135
        # things in imms plugin.
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   136
	results = {}
32
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
   137
	tune = self.cu.fetchone()
31
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   138
        while tune:
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   139
            try:
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   140
                uid = int(tune[0])
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   141
                if results.has_key(uid):
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   142
                    results[uid]['path'].append(
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   143
                        tune[2].decode('utf-8', 'replace'))
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   144
                else:
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   145
                    results[uid] = {
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   146
                        'rating' : int(tune[1]),
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   147
                        'path' : [ tune[2].decode('utf-8', 'replace') ],
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   148
                        'last' : int(tune[3])}
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   149
            except UnicodeDecodeError:
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   150
                print tune[2]
32
85c8f5280d48 [svn] Conversion of bestofimms to imms.py.
fabien
parents: 31
diff changeset
   151
	    tune = self.cu.fetchone()
31
13f56bb29b96 [svn] New bestofimms, cleanimms, imms.py and utils.py.
fabien
parents:
diff changeset
   152
        return results