# Copyright 2020 Huawei Technologies Co., Ltd # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================ """File handler for lineage summary log.""" import os class FileHandler: """ Summary log file handler. Summary log file handler provides Python APIs to manage file IO, including read, seek. It is not suitable for very large files. Args: file_path (str): File path. """ def __init__(self, file_path): self._size = os.path.getsize(file_path) self._cache = self._read_cache(file_path) self._offset = 0 @property def size(self): """ The size of file. Returns: int, the size of file. """ return self._size def _read_cache(self, file_path): """ Read file in cache. Args: file_path (str): File path. Returns: bytes, the file content. """ with open(file_path, 'rb') as log_file: return log_file.read() def seek(self, offset): """ Set the new offset of file. Args: pos (int): The new offset. """ self._offset = offset def tell(self): """ Tell the current offset. Returns: int, the offset. """ return self._offset def read(self, size=-1, offset=None): """ Read bytes from buffer by size. Args: size (int): Number of bytes to read. If set -1, read the whole file. Default: -1. offset (int): The start offset to read bytes from. Default: None. Returns: bytes, the content. """ if offset is None: offset = self._offset new_offset = offset + size result = self._cache[offset:new_offset] self._offset = new_offset return result