46 lines
1.2 KiB
Python
46 lines
1.2 KiB
Python
import os
|
|
|
|
try:
|
|
from multiprocessing import Lock
|
|
except ImportError:
|
|
from threading import Lock
|
|
|
|
|
|
class FileBuffer(object):
|
|
def __init__(self, database):
|
|
self._handle = open(database, 'rb')
|
|
self._size = os.fstat(self._handle.fileno()).st_size
|
|
if not hasattr(os, 'pread'):
|
|
self._lock = Lock()
|
|
|
|
def __getitem__(self, key):
|
|
if isinstance(key, slice):
|
|
return self._read(key.stop - key.start, key.start)
|
|
if isinstance(key, int):
|
|
return self._read(1, key)[0]
|
|
raise TypeError("Invalid argument type.")
|
|
|
|
def rfind(self, needle, start):
|
|
pos = self._read(self._size - start - 1, start).rfind(needle)
|
|
if pos == -1:
|
|
return pos
|
|
return start + pos
|
|
|
|
def size(self):
|
|
return self._size
|
|
|
|
def close(self):
|
|
self._handle.close()
|
|
|
|
if hasattr(os, 'pread'):
|
|
|
|
def _read(self, buffersize, offset):
|
|
return os.pread(self._handle.fileno(), buffersize, offset)
|
|
|
|
else:
|
|
|
|
def _read(self, buffersize, offset):
|
|
with self._lock:
|
|
self._handle.seek(offset)
|
|
return self._handle.read(buffersize)
|