summaryrefslogtreecommitdiff
path: root/figcode/awdb/file.py
diff options
context:
space:
mode:
Diffstat (limited to 'figcode/awdb/file.py')
-rw-r--r--figcode/awdb/file.py45
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)