def mkstemp(self): """Contextmanager to make a temporary file.""" # Creating intermidiate directories and corresponding metadata. # For optimization, check if the subdirectory already exists, # if exists, then it means that it also has its metadata. # Not checking for container, since the container should already # exist for the call to come here. if not os_path.exists(self.datadir): path = self._container_path subdir_list = self._obj_path.split(os.path.sep) for i in range(len(subdir_list)): path = os.path.join(path, subdir_list[i]); if not os_path.exists(path): self._create_dir_object(path) tmpfile = '.' + self._obj + '.' + md5(self._obj + \ str(random.random())).hexdigest() self.tmppath = os.path.join(self.datadir, tmpfile) fd = do_open(self.tmppath, os.O_RDWR | os.O_CREAT | os.O_EXCL) try: yield fd finally: try: do_close(fd) except OSError: pass tmppath, self.tmppath = self.tmppath, None try: do_unlink(tmppath) except OSError as err: if err.errno != errno.ENOENT: raise
def __init__(self, path, drive, account, container, logger, uid=DEFAULT_UID, gid=DEFAULT_GID): self.root = path if container: self.container = container else: self.container = None if self.container: self.datadir = os.path.join(path, drive, self.container) else: self.datadir = os.path.join(path, drive) self.account = account assert logger is not None self.logger = logger self.metadata = {} self.container_info = None self.object_info = None self.uid = int(uid) self.gid = int(gid) # XXX Used to be a global _db_file, wrong. Tell Peter, do per-entity. self.db_file = self.datadir self.dir_exists = os_path.exists(self.datadir) if self.dir_exists: try: self.metadata = _read_metadata(self.datadir) except EOFError: pass else: return self._initialize()
def _create_dir_object(self, dir_path): #TODO: if object already exists??? if os_path.exists(dir_path) and not os_path.isdir(dir_path): self.logger.error("Deleting file %s", dir_path) do_unlink(dir_path) #If dir aleady exist just override metadata. mkdirs(dir_path) do_chown(dir_path, self.uid, self.gid) create_object_metadata(dir_path)
def __init__(self, path, drive, account, container, logger, uid=DEFAULT_UID, gid=DEFAULT_GID): self.root = path if container: self.container = container else: self.container = None if self.container: self.datadir = os.path.join(path, drive, self.container) else: self.datadir = os.path.join(path, drive) self.account = account assert logger is not None self.logger = logger self.metadata = {} self.container_info = None self.object_info = None self.uid = int(uid) self.gid = int(gid) self.db_file = _db_file self.dir_exists = os_path.exists(self.datadir) if self.dir_exists: try: self.metadata = _read_metadata(self.datadir) except EOFError: create_container_metadata(self.datadir) else: return if self.container: if not self.metadata: create_container_metadata(self.datadir) self.metadata = _read_metadata(self.datadir) else: if not validate_container(self.metadata): create_container_metadata(self.datadir) self.metadata = _read_metadata(self.datadir) else: if not self.metadata: create_account_metadata(self.datadir) self.metadata = _read_metadata(self.datadir) else: if not validate_account(self.metadata): create_account_metadata(self.datadir) self.metadata = _read_metadata(self.datadir)
def is_deleted(self): return not os_path.exists(self.datadir)
def update_put_timestamp(self, timestamp): """ Create the container if it doesn't exist and update the timestamp """ if not os_path.exists(self.datadir): self.put(self.metadata)
def initialize(self, timestamp): if not self.dir_exists: mkdirs(self.datadir) self.dir_exists = os_path.exists(self.datadir) self._initialize()
def __init__(self, path, device, partition, account, container, obj, logger, keep_data_fp=False, disk_chunk_size=DEFAULT_DISK_CHUNK_SIZE, uid=DEFAULT_UID, gid=DEFAULT_GID, iter_hook=None): self.disk_chunk_size = disk_chunk_size self.iter_hook = iter_hook # Don't support obj_name ending/begining with '/', like /a, a/, /a/b/, # etc. obj = obj.strip(os.path.sep) if os.path.sep in obj: self._obj_path, self._obj = os.path.split(obj) else: self._obj_path = '' self._obj = obj if self._obj_path: self.name = os.path.join(container, self._obj_path) else: self.name = container # Absolute path for object directory. self.datadir = os.path.join(path, device, self.name) self.device_path = os.path.join(path, device) self._container_path = os.path.join(path, device, container) self._is_dir = False self.tmppath = None self.logger = logger self.metadata = {} self.meta_file = None self.fp = None self.iter_etag = None self.started_at_0 = False self.read_to_eof = False self.quarantined_dir = None self.keep_cache = False self.uid = int(uid) self.gid = int(gid) # Don't store a value for data_file until we know it exists. self.data_file = None data_file = os.path.join(self.datadir, self._obj) if not os_path.exists(data_file): return self.data_file = os.path.join(data_file) self.metadata = read_metadata(data_file) if not self.metadata: create_object_metadata(data_file) self.metadata = read_metadata(data_file) if not validate_object(self.metadata): create_object_metadata(data_file) self.metadata = read_metadata(data_file) self.filter_metadata() if os_path.isdir(data_file): self._is_dir = True else: if keep_data_fp: # The caller has an assumption that the "fp" field of this # object is an file object if keep_data_fp is set. However, # this implementation of the DiskFile object does not need to # open the file for internal operations. So if the caller # requests it, we'll just open the file for them. self.fp = do_open(data_file, 'rb')