diff options
Diffstat (limited to 'figcode/awdb/file.py')
| -rw-r--r-- | figcode/awdb/file.py | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/figcode/awdb/file.py b/figcode/awdb/file.py new file mode 100644 index 0000000..6d654f2 --- /dev/null +++ b/figcode/awdb/file.py @@ -0,0 +1,45 @@ +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) |
