#!/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)