Source code for pacifica.archiveinterface.backends.oracle_hsm_sideband.extended_file_factory

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""Module that allows for the extension of the hsm sideband archive."""
import os
from io import FileIO, BufferedReader, BufferedWriter
from .status import HsmSidebandStatus
from .orm import SamInode, SamFile, SamPath


[docs]def extended_hsmsideband_factory(filepath, mode, sam_qfs_path): """Return appropiate binary io object with additional methods.""" if "r" in mode: file_obj_cls = BufferedReader else: file_obj_cls = BufferedWriter class ExtendedHsmSideband(file_obj_cls): """Extending default file stuct to support additional methods.""" def __init__(self, filepath, mode, sam_qfs_path): """Extended HSM Sideband Constructor.""" file_obj = FileIO(filepath, mode) super(ExtendedHsmSideband, self).__init__(file_obj) self._path = filepath self._sam_qfs_path = sam_qfs_path def status(self): """Return status of file.""" filename = os.path.basename(self._sam_qfs_path) # need to add a slash for sideband db directory = os.path.dirname(self._sam_qfs_path) + "/" stat_record = self._stat_ino_sql(filename, directory) if stat_record: mtime = stat_record["mtime"] ctime = stat_record["ctime"] # if the record is online then on disk, else say not on disk but on tape if stat_record["online"] == 1: bytes_per_level = (int(stat_record["size"]),) else: bytes_per_level = (int(0), int(stat_record["size"])) filesize = stat_record["size"] status = HsmSidebandStatus(mtime, ctime, bytes_per_level, filesize) status.set_filepath(self._path) return status return None def stage(self): """Stage a file. HSM stages a file when a read call is made.""" self.read(1024) def _stat_ino_sql(self, fname, directory): """Return the record for specified file and directory.""" SamInode.database_connect() # pylint: disable=no-member result = ( SamInode.select() .join(SamFile, on=(SamFile.ino == SamInode.ino)) .join(SamPath, on=(SamPath.ino == SamFile.p_ino)) .where(SamPath.path == str(directory), SamFile.name == str(fname)) .get() ) # pylint: enable=no-member SamInode.database_close() if result: return self._make_status_dictionary(result) return None @staticmethod def _make_status_dictionary(result): """Break the query results into a dictionary.""" status = { "ino": result.ino, "size": result.size, "ctime": result.create_time, "mtime": result.modify_time, "online": result.online, } return status return ExtendedHsmSideband(filepath, mode, sam_qfs_path)