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))
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)
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
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))
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))
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