From eb3eb615ec798932a8d2aa7119612fe00cc7fcbf Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 12 May 2016 10:26:52 +0530 Subject: [PATCH] Move ReadOnyFileBuffer into its own module --- src/calibre/srv/http_response.py | 3 ++- src/calibre/srv/utils.py | 36 ------------------------- src/calibre/srv/web_socket.py | 3 ++- src/calibre/utils/img.py | 2 +- src/calibre/utils/imghdr.py | 2 +- src/calibre/utils/speedups.py | 46 ++++++++++++++++++++++++++++++++ 6 files changed, 52 insertions(+), 40 deletions(-) create mode 100644 src/calibre/utils/speedups.py diff --git a/src/calibre/srv/http_response.py b/src/calibre/srv/http_response.py index dad2464260..a041b1f8c1 100644 --- a/src/calibre/srv/http_response.py +++ b/src/calibre/srv/http_response.py @@ -22,7 +22,8 @@ from calibre.srv.http_request import HTTPRequest, read_headers from calibre.srv.sendfile import file_metadata, sendfile_to_socket_async, CannotSendfile, SendfileInterrupted from calibre.srv.utils import ( MultiDict, http_date, HTTP1, HTTP11, socket_errors_socket_closed, - sort_q_values, get_translator_for_lang, Cookie, ReadOnlyFileBuffer) + sort_q_values, get_translator_for_lang, Cookie) +from calibre.utils.speedups import ReadOnlyFileBuffer from calibre.utils.monotonic import monotonic Range = namedtuple('Range', 'start stop size') diff --git a/src/calibre/srv/utils.py b/src/calibre/srv/utils.py index 9ad33cf848..725ef94907 100644 --- a/src/calibre/srv/utils.py +++ b/src/calibre/srv/utils.py @@ -434,42 +434,6 @@ class Accumulator(object): # {{{ return ans # }}} -class ReadOnlyFileBuffer(object): - - ''' A zero copy implementation of a file like object. Uses memoryviews for efficiency. ''' - - def __init__(self, raw): - self.sz, self.mv = len(raw), (raw if isinstance(raw, memoryview) else memoryview(raw)) - self.pos = 0 - - def tell(self): - return self.pos - - def read(self, n=None): - if n is None: - ans = self.mv[self.pos:] - self.pos = self.sz - return ans - ans = self.mv[self.pos:self.pos+n] - self.pos = min(self.pos + n, self.sz) - return ans - - def seek(self, pos, whence=os.SEEK_SET): - if whence == os.SEEK_SET: - self.pos = pos - elif whence == os.SEEK_END: - self.pos = self.sz + pos - else: - self.pos += pos - self.pos = max(0, min(self.pos, self.sz)) - return self.pos - - def getvalue(self): - return self.mv - - def close(self): - pass - def get_db(ctx, rd, library_id): db = ctx.get_library(rd, library_id) if db is None: diff --git a/src/calibre/srv/web_socket.py b/src/calibre/srv/web_socket.py index c12a1b482e..d92cb39349 100644 --- a/src/calibre/srv/web_socket.py +++ b/src/calibre/srv/web_socket.py @@ -17,7 +17,8 @@ from calibre import as_unicode from calibre.constants import plugins from calibre.srv.loop import ServerLoop, HandleInterrupt, WRITE, READ, RDWR, Connection from calibre.srv.http_response import HTTPConnection, create_http_handler -from calibre.srv.utils import DESIRED_SEND_BUFFER_SIZE, ReadOnlyFileBuffer +from calibre.srv.utils import DESIRED_SEND_BUFFER_SIZE +from calibre.utils.speedups import ReadOnlyFileBuffer speedup, err = plugins['speedup'] if not speedup: raise RuntimeError('Failed to load speedup module with error: ' + err) diff --git a/src/calibre/utils/img.py b/src/calibre/utils/img.py index 23c730e2e6..b3cdfcb8ee 100644 --- a/src/calibre/utils/img.py +++ b/src/calibre/utils/img.py @@ -437,7 +437,7 @@ def optimize_png(file_path): return run_optimizer(file_path, cmd) def encode_jpeg(file_path, quality=80): - from calibre.srv.utils import ReadOnlyFileBuffer + from calibre.utils.speedups import ReadOnlyFileBuffer quality = max(0, min(100, int(quality))) exe = get_exe_path('cjpeg') cmd = [exe] + '-optimize -progressive -maxmemory 100M -quality'.split() + [str(quality)] diff --git a/src/calibre/utils/imghdr.py b/src/calibre/utils/imghdr.py index 5bea1ae708..d8c827c021 100644 --- a/src/calibre/utils/imghdr.py +++ b/src/calibre/utils/imghdr.py @@ -6,7 +6,7 @@ from __future__ import (unicode_literals, division, absolute_import, print_function) from struct import unpack, error import os -from calibre.srv.utils import ReadOnlyFileBuffer +from calibre.utils.speedups import ReadOnlyFileBuffer """ Recognize image file formats and sizes based on their first few bytes.""" diff --git a/src/calibre/utils/speedups.py b/src/calibre/utils/speedups.py new file mode 100644 index 0000000000..179405a5eb --- /dev/null +++ b/src/calibre/utils/speedups.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python2 +# vim:fileencoding=utf-8 +# License: GPLv3 Copyright: 2016, Kovid Goyal + +from __future__ import (unicode_literals, division, absolute_import, + print_function) + +import os + +class ReadOnlyFileBuffer(object): + + ''' A zero copy implementation of a file like object. Uses memoryviews for efficiency. ''' + + def __init__(self, raw): + self.sz, self.mv = len(raw), (raw if isinstance(raw, memoryview) else memoryview(raw)) + self.pos = 0 + + def tell(self): + return self.pos + + def read(self, n=None): + if n is None: + ans = self.mv[self.pos:] + self.pos = self.sz + return ans + ans = self.mv[self.pos:self.pos+n] + self.pos = min(self.pos + n, self.sz) + return ans + + def seek(self, pos, whence=os.SEEK_SET): + if whence == os.SEEK_SET: + self.pos = pos + elif whence == os.SEEK_END: + self.pos = self.sz + pos + else: + self.pos += pos + self.pos = max(0, min(self.pos, self.sz)) + return self.pos + + def getvalue(self): + return self.mv + + def close(self): + pass + +