Fix overflow errors in LRFMetaFile when setting thumbnails

Fix #1
This commit is contained in:
Kovid Goyal 2006-12-22 01:08:30 +00:00
parent 9f4a2c9d72
commit 77eeb1fe7a
3 changed files with 36 additions and 14 deletions

View File

@ -126,20 +126,28 @@ class LibraryDatabase(object):
try:
data.seek(0)
data = data.read()
except AttributeError: pass
if ext: ext = ext.strip().lower()
except AttributeError: pass
size = len(data)
if ext:
ext = ext.strip().lower()
data = sqlite.Binary(compress(data))
cur = self.con.execute("select extension from books_data where id=? "+\
"and extension=?", (_id, ext))
present = True
try: cur.next()
except: present = False
try:
cur.next()
except:
present = False
if present:
self.con.execute("update books_data set data=? where id=? "+\
"and extension=?", (data, _id, ext))
else:
self.con.execute("insert into books_data (id, extension, data) "+\
"values (?, ?, ?)", (_id, ext, data))
oldsize = self.get_row_by_id(_id, ['size'])['size']
if size > oldsize:
self.con.execute("update books_meta set size=? where id=? ", \
(size, _id))
self.con.commit()
def get_meta_data(self, _id):
@ -201,7 +209,18 @@ class LibraryDatabase(object):
lrf = LRFMetaFile(c)
lrf.thumbnail = cover
self.add_format(_id, "lrf", c.getvalue())
self.update_max_size(_id)
self.commit()
def update_max_size(self, _id):
cur = self.con.execute("select length(data) from books_data where id=?", \
(_id,))
maxsize = 0
for row in cur:
maxsize = row[0] if row[0] > maxsize else maxsize
self.con.execute("update books_meta set size=? where id=? ", \
(maxsize, _id))
self.con.commit()

View File

@ -421,14 +421,17 @@ class LibraryBooksModel(QAbstractTableModel):
data = str(qb.data())
qb.close()
self.db.update_cover(_id, data)
self.refresh_row(index.row())
def add_formats(self, paths, index):
for path in paths:
f = open(path, "rb")
title = os.path.basename(path)
ext = title[title.rfind(".")+1:].lower() if "." in title > -1 else None
self.db.add_format(self.id_from_index(index), ext, f)
_id = self.id_from_index(index)
self.db.add_format(_id, ext, f)
f.close()
self.refresh_row(index.row())
self.emit(SIGNAL('formats_added'), index)
def rowCount(self, parent):
@ -519,11 +522,11 @@ class LibraryBooksModel(QAbstractTableModel):
def id_from_row(self, row): return self._data[row]["id"]
def refresh_row(self, row):
self._data[row] = self.db.get_row_by_id(self._data[row]["id"], \
self.FIELDS)
datum = self.db.get_row_by_id(self._data[row]["id"], self.FIELDS)
self._data[row:row+1] = [datum]
for i in range(len(self._orig_data)):
if self._orig_data[i]["id"] == self._data[row]["id"]:
self._orig_data[i:i+1] = self._data[row]
if self._orig_data[i]["id"] == datum["id"]:
self._orig_data[i:i+1] = [datum]
break
self.emit(SIGNAL("dataChanged(QModelIndex, QModelIndex)"), \
self.index(row, 0), self.index(row, self.columnCount(0)-1))

View File

@ -294,7 +294,11 @@ class LRFMetaFile(object):
offset = self.unpack(fmt=DWORD, start=pos)[0] + delta
except struct.error:
break
self.pack(offset, fmt=DWORD, start=pos)
if offset >= (2**8)**4:
# New offset is larger than a DWORD, so leave
# offset unchanged
offset -= delta
self.pack(offset, fmt=DWORD, start=pos)
try:
self._file.read(12)
except EOFError:
@ -397,7 +401,3 @@ def main():
print str(f[1]) + ":", lrf.__getattribute__(f[0])
if options.get_thumbnail:
print "Thumbnail:", td
# This turns overflow warnings into errors
import warnings
warnings.simplefilter("error", DeprecationWarning)