This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
handingkang-ohmybs/figcode/awdb/file.py
2024-05-27 10:39:10 +08:00

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)