""" Classes used by BlockStorage to map block ordinals to file names. Copyright (C) 2009 Darrell Karbott This library is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2.0 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Author: djk@isFiaD04zgAgnrEC5XJt1i4IE7AkNPqhBG5bONi6Yks """ # Grrrr... separate file to avoid circular dependency. import os BLOCK_SUFFIX = '.bin' class BlockNames: """ ABC to map ordinals to file names. """ def __init__(self, read_only): self.read_only = read_only def read_path(self, ordinal): """ Return a file name to read the block from. """ raise NotImplementedError() def write_path(self, ordinal): """ Return a file name to write the block to. This can raise a ValueError if the blocks are read only. """ if self.read_only: raise ValueError("Blocks are read only!") return self.read_path(ordinal) class ReadWriteNames(BlockNames): """ A naming policy for an updateable set of blocks. """ def __init__(self, block_dir, block_name, suffix): BlockNames.__init__(self, False) self.block_dir = block_dir self.block_name = block_name self.suffix = suffix def read_path(self, ordinal): """ Implement pure virtual. """ return os.path.join(self.block_dir, "%s_%s%s" % (self.block_name, str(ordinal), self.suffix)) # UNTESTED! # DESIGN INTENT: Adapter that allows you to load a BlockStorage from # a static cache of CHK blocks. class ReadOnlyNames(BlockNames): """ A naming policy for a read only set of blocks. """ def __init__(self, read_only_file_names): BlockNames.__init__(self, True) self.file_names = read_only_file_names def read_path(self, ordinal): """ Implement pure virtual. """ if ordinal < 0 or ordinal >= len(self.file_names): raise IndexError("No such file: %i" % ordinal) return self.file_names[ordinal]