# -*- coding: utf-8 -*- import os import time import pickle import threading import zipfile import xbmc import xbmcvfs import xbmcgui import Localization from net import HTTP try: from sqlite3 import dbapi2 as sqlite except: from pysqlite2 import dbapi2 as sqlite rtrCache_lock = threading.RLock() class Cache: def __init__(self, name, version, expire=0, size=0, step=100): self.name = name self.version = version self._connect() if expire: self.expire(expire) if size: self.size(size, step) def get(self, token, callback, *param): cur = self.db.cursor() cur.execute('select expire,data from cache where id=? limit 1', (token,)) row = cur.fetchone() cur.close() if row: if row[0] and row[0] < int(time.time()): pass else: try: obj = pickle.loads(row[1]) except: pass else: return obj response = callback(*param) if response[0]: obj = sqlite.Binary(pickle.dumps(response[1])) curtime = int(time.time()) cur = self.db.cursor() if isinstance(response[0], bool): cur.execute('replace into cache(id,addtime,expire,data) values(?,?,?,?)', (token, curtime, None, obj)) else: cur.execute('replace into cache(id,addtime,expire,data) values(?,?,?,?)', (token, curtime, curtime + response[0], obj)) self.db.commit() cur.close() return response[1] def expire(self, expire): # with rtrCache_lock: cur = self.db.cursor() cur.execute('delete from cache where addtime