diff --git a/src/calibre/library/sqlite.py b/src/calibre/library/sqlite.py index 938e5e665c..cc30f6dd5c 100644 --- a/src/calibre/library/sqlite.py +++ b/src/calibre/library/sqlite.py @@ -12,11 +12,50 @@ from sqlite3 import IntegrityError from threading import Thread from Queue import Queue from threading import RLock +from datetime import tzinfo, datetime, timedelta from calibre.library import title_sort global_lock = RLock() +def convert_timestamp(val): + datepart, timepart = val.split(' ') + tz, mult = None, 1 + x = timepart.split('+') + if len(x) > 1: + timepart, tz = x + else: + x = timepart.split('-') + if len(x) > 1: + timepart, tz = x + mult = -1 + + year, month, day = map(int, datepart.split("-")) + timepart_full = timepart.split(".") + hours, minutes, seconds = map(int, timepart_full[0].split(":")) + if len(timepart_full) == 2: + microseconds = int(timepart_full[1]) + else: + microseconds = 0 + if tz is not None: + h, m = map(int, tz.split(':')) + delta = timedelta(minutes=mult*(60*h + m)) + tz = type('CustomTZ', (tzinfo,), {'utcoffset':lambda self, dt:delta, + 'dst':lambda self,dt:timedelta(0)})() + + val = datetime(year, month, day, hours, minutes, seconds, microseconds, + tzinfo=tz) + if tz is not None: + val = datetime(*(val.utctimetuple()[:6])) + return val + +def adapt_datetime(dt): + dt = datetime(*(dt.utctimetuple()[:6])) + return dt.isoformat(' ') + +sqlite.register_adapter(datetime, adapt_datetime) +sqlite.register_converter('timestamp', convert_timestamp) + class Concatenate(object): '''String concatenation aggregator for sqlite''' def __init__(self, sep=','):