def open(self, path, mode, options=None):

        flags, seek_to_end = {
            'r': (O_RDONLY, False),
            'r+': (O_RDWR, False),
            'w': (O_WRONLY | O_CREAT, False),
            'w+': (O_RDWR | O_CREAT, False),
            'a': (O_WRONLY | O_CREAT, True),
            'a+': (O_RDWR | O_CREAT, True),
        }[mode]
        # TODO: Use seek_to_end

        message_body = FileOpenRequest(
            objPath=path,
            createMode=0,
            openFlags=flags,
            offset=0,
            dataSize=-1,
            numThreads=0,
            oprType=0,
            KeyValPair_PI=StringStringMap(options),
        )
        message = iRODSMessage('RODS_API_REQ', msg=message_body,
                               int_info=api_number['DATA_OBJ_OPEN_AN'])

        conn = self.sess.pool.get_connection()
        conn.send(message)
        desc = conn.recv().int_info

        return BufferedRandom(iRODSDataObjectFileRaw(conn, desc, options))
Esempio n. 2
0
    def open(self, path, mode, create=True, finalize_on_close=True, **options):
        _raw_fd_holder = options.get('_raw_fd_holder', [])
        if kw.DEST_RESC_NAME_KW not in options:
            # Use client-side default resource if available
            try:
                options[kw.DEST_RESC_NAME_KW] = self.sess.default_resource
            except AttributeError:
                pass
        createFlag = self.O_CREAT if create else 0
        flags, seek_to_end = {
            'r': (self.O_RDONLY, False),
            'r+': (self.O_RDWR, False),
            'w': (self.O_WRONLY | createFlag | self.O_TRUNC, False),
            'w+': (self.O_RDWR | createFlag | self.O_TRUNC, False),
            'a': (self.O_WRONLY | createFlag, True),
            'a+': (self.O_RDWR | createFlag, True),
        }[mode]
        # TODO: Use seek_to_end

        try:
            oprType = options[kw.OPR_TYPE_KW]
        except KeyError:
            oprType = 0

        message_body = FileOpenRequest(
            objPath=path,
            createMode=0,
            openFlags=flags,
            offset=0,
            dataSize=-1,
            numThreads=self.sess.numThreads,
            oprType=oprType,
            KeyValPair_PI=StringStringMap(options),
        )
        message = iRODSMessage('RODS_API_REQ',
                               msg=message_body,
                               int_info=api_number['DATA_OBJ_OPEN_AN'])

        conn = self.sess.pool.get_connection()
        conn.send(message)
        desc = conn.recv().int_info

        raw = iRODSDataObjectFileRaw(conn,
                                     desc,
                                     finalize_on_close=finalize_on_close,
                                     **options)
        (_raw_fd_holder).append(raw)
        return io.BufferedRandom(raw)
Esempio n. 3
0
    def download(self, path, to):
        conn, desc = self.session.data_objects.open(path, O_RDONLY)
        raw = iRODSDataObjectFileRaw(conn, desc)
        br = BufferedRandom(raw)

        try:
            with open(to, 'w') as wf:
                while(True):
                    buf = _readLargeBlock(br)

                    if not buf:
                        break

                    wf.write(buf)
        finally:
            conn.release(True)
            br.close()

        return to
Esempio n. 4
0
    def read(self, path, offset, size):
        buf = None
        br = None
        conn = None
        try:
            conn, desc = self.session.data_objects.open(path, O_RDONLY)
            raw = iRODSDataObjectFileRaw(conn, desc)
            br = BufferedRandom(raw)
            new_offset = br.seek(offset)
            
            if new_offset == offset:
                buf = br.read(size)
        finally:
            if br:
                br.close()
            if conn:
                conn.release(True)

        return buf
    def open(self, path, mode, **options):
        if kw.DEST_RESC_NAME_KW not in options:
            # Use client-side default resource if available
            try:
                options[kw.DEST_RESC_NAME_KW] = self.sess.default_resource
            except AttributeError:
                pass

        flags, seek_to_end = {
            'r': (self.O_RDONLY, False),
            'r+': (self.O_RDWR, False),
            'w': (self.O_WRONLY | self.O_CREAT | self.O_TRUNC, False),
            'w+': (self.O_RDWR | self.O_CREAT | self.O_TRUNC, False),
            'a': (self.O_WRONLY | self.O_CREAT, True),
            'a+': (self.O_RDWR | self.O_CREAT, True),
        }[mode]
        # TODO: Use seek_to_end

        try:
            oprType = options[kw.OPR_TYPE_KW]
        except KeyError:
            oprType = 0

        message_body = FileOpenRequest(
            objPath=path,
            createMode=0,
            openFlags=flags,
            offset=0,
            dataSize=-1,
            numThreads=self.sess.numThreads,
            oprType=oprType,
            KeyValPair_PI=StringStringMap(options),
        )
        message = iRODSMessage('RODS_API_REQ', msg=message_body,
                               int_info=api_number['DATA_OBJ_OPEN_AN'])

        conn = self.sess.pool.get_connection()
        conn.send(message)
        desc = conn.recv().int_info

        return io.BufferedRandom(iRODSDataObjectFileRaw(conn, desc, **options))
Esempio n. 6
0
    def open(self, path, mode, options=None):
        if options is None:
            options = {}

        flags, seek_to_end = {
            'r': (O_RDONLY, False),
            'r+': (O_RDWR, False),
            'w': (O_WRONLY | O_CREAT, False),
            'w+': (O_RDWR | O_CREAT, False),
            'a': (O_WRONLY | O_CREAT, True),
            'a+': (O_RDWR | O_CREAT, True),
        }[mode]
        # TODO: Use seek_to_end

        try:
            oprType = options[kw.OPR_TYPE_KW]
        except KeyError:
            oprType = 0

        # sanitize options before packing
        options = {str(key): str(value) for key, value in options.items()}

        message_body = FileOpenRequest(
            objPath=path,
            createMode=0,
            openFlags=flags,
            offset=0,
            dataSize=-1,
            numThreads=self.sess.numThreads,
            oprType=oprType,
            KeyValPair_PI=StringStringMap(options),
        )
        message = iRODSMessage('RODS_API_REQ',
                               msg=message_body,
                               int_info=api_number['DATA_OBJ_OPEN_AN'])

        conn = self.sess.pool.get_connection()
        conn.send(message)
        desc = conn.recv().int_info

        return BufferedRandom(iRODSDataObjectFileRaw(conn, desc, options))
Esempio n. 7
0
    def get(self, request, path=''):
        path = _check_path(path)
        try:
            obj = self.irods_session.data_objects.get('/' + path)
        except DataObjectDoesNotExist:
            return HttpResponseNotFound()

        ext = splitext(obj.name)[1][1:]

        if ext in content_types:
            content_type = content_types[ext]
        else:
            content_type = 'application/octet-stream'

        if request.GET.get('preview') == 'true':
            conn, desc = obj.manager.open(obj.path, O_RDONLY)
            x = iRODSDataObjectFileRaw(conn, desc)
            f = x.conn.read_file(desc, 8000)
            return HttpResponse(f)

        f = obj.open('r')
        response = HttpResponse(f, content_type=content_type)
        response['Content-Length'] = obj.size
        return response