def create(self, path, resource=None, options=None): if options is None: options = {} kvp = {kw.DATA_TYPE_KW: 'generic'} if resource: kvp[kw.DEST_RESC_NAME_KW] = resource kvp.update(options) message_body = FileOpenRequest( objPath=path, createMode=0644, openFlags=0, offset=0, dataSize=-1, numThreads=0, oprType=0, KeyValPair_PI=StringStringMap(kvp), ) message = iRODSMessage('RODS_API_REQ', msg=message_body, int_info=api_number['DATA_OBJ_CREATE_AN']) with self.sess.pool.get_connection() as conn: conn.send(message) response = conn.recv() desc = response.int_info conn.close_file(desc) return self.get(path)
def unlink(self, path, force=False, **options): if force: options[kw.FORCE_FLAG_KW] = '' try: oprType = options[kw.OPR_TYPE_KW] except KeyError: oprType = 0 message_body = FileOpenRequest( objPath=path, createMode=0, openFlags=0, 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_UNLINK_AN']) with self.sess.pool.get_connection() as conn: conn.send(message) response = conn.recv()
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 create(self, path, resource=None, **options): options[kw.DATA_TYPE_KW] = 'generic' if resource: options[kw.DEST_RESC_NAME_KW] = resource else: # Use client-side default resource if available try: options[kw.DEST_RESC_NAME_KW] = self.sess.default_resource except AttributeError: pass message_body = FileOpenRequest( objPath=path, createMode=0o644, openFlags=0, offset=0, dataSize=-1, numThreads=self.sess.numThreads, oprType=0, KeyValPair_PI=StringStringMap(options), ) message = iRODSMessage('RODS_API_REQ', msg=message_body, int_info=api_number['DATA_OBJ_CREATE_AN']) with self.sess.pool.get_connection() as conn: conn.send(message) response = conn.recv() desc = response.int_info conn.close_file(desc) return self.get(path)
def copy(self, src_path, dest_path, options=None): if options is None: options = {} # check if dest is a collection # if so append filename to it if self.sess.collections.exists(dest_path): filename = src_path.rsplit('/', 1)[1] target_path = dest_path + '/' + filename else: target_path = dest_path src = FileOpenRequest( objPath=src_path, createMode=0, openFlags=0, offset=0, dataSize=0, numThreads=self.sess.numThreads, oprType=10, # COPY_SRC KeyValPair_PI=StringStringMap(), ) dest = FileOpenRequest( objPath=target_path, createMode=0, openFlags=0, offset=0, dataSize=0, numThreads=self.sess.numThreads, oprType=9, # COPY_DEST KeyValPair_PI=StringStringMap(options), ) message_body = ObjCopyRequest(srcDataObjInp_PI=src, destDataObjInp_PI=dest) message = iRODSMessage('RODS_API_REQ', msg=message_body, int_info=api_number['DATA_OBJ_COPY_AN']) with self.sess.pool.get_connection() as conn: conn.send(message) response = conn.recv()
def move(self, src_path, dest_path): # check if dest is an existing collection # if so append collection name to it if self.sess.collections.exists(dest_path): coll_name = src_path.rsplit('/', 1)[1] target_path = dest_path + '/' + coll_name else: target_path = dest_path src = FileOpenRequest( objPath=src_path, createMode=0, openFlags=0, offset=0, dataSize=0, numThreads=0, oprType=12, # RENAME_COLL KeyValPair_PI=StringStringMap(), ) dest = FileOpenRequest( objPath=target_path, createMode=0, openFlags=0, offset=0, dataSize=0, numThreads=0, oprType=12, # RENAME_COLL KeyValPair_PI=StringStringMap(), ) message_body = ObjCopyRequest(srcDataObjInp_PI=src, destDataObjInp_PI=dest) message = iRODSMessage('RODS_API_REQ', msg=message_body, int_info=api_number['DATA_OBJ_RENAME_AN']) with self.sess.pool.get_connection() as conn: conn.send(message) response = conn.recv()
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 truncate(self, path, size, **options): message_body = FileOpenRequest( objPath=path, createMode=0, openFlags=0, offset=0, dataSize=size, numThreads=self.sess.numThreads, oprType=0, KeyValPair_PI=StringStringMap(options), ) message = iRODSMessage('RODS_API_REQ', msg=message_body, int_info=api_number['DATA_OBJ_TRUNCATE_AN']) with self.sess.pool.get_connection() as conn: conn.send(message) response = conn.recv()
def unlink(self, path): message_body = FileOpenRequest( objPath=path, createMode=0, openFlags=0, offset=0, dataSize=-1, numThreads=0, oprType=0, KeyValPair_PI=StringStringMap(), ) message = iRODSMessage('RODS_API_REQ', msg=message_body, int_info=api_number['DATA_OBJ_UNLINK_AN']) with self.sess.pool.get_connection() as conn: conn.send(message) response = conn.recv()
def open(self, path, mode): message_body = FileOpenRequest( objPath=path, createMode=0, openFlags=mode, offset=0, dataSize=-1, numThreads=0, oprType=0, KeyValPair_PI=StringStringMap(), ) 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) response = conn.recv() return (conn, response.int_info)
def register(self, file_path, obj_path, **options): options[kw.FILE_PATH_KW] = file_path message_body = FileOpenRequest( objPath=obj_path, createMode=0, openFlags=0, offset=0, dataSize=0, numThreads=self.sess.numThreads, oprType=0, KeyValPair_PI=StringStringMap(options), ) message = iRODSMessage('RODS_API_REQ', msg=message_body, int_info=api_number['PHY_PATH_REG_AN']) with self.sess.pool.get_connection() as conn: conn.send(message) response = conn.recv()
def replicate(self, path, options=None): if options is None: options = {} message_body = FileOpenRequest( objPath=path, createMode=0, openFlags=0, offset=0, dataSize=-1, numThreads=0, oprType=6, KeyValPair_PI=StringStringMap(options), ) message = iRODSMessage('RODS_API_REQ', msg=message_body, int_info=api_number['DATA_OBJ_REPL_AN']) with self.sess.pool.get_connection() as conn: conn.send(message) response = conn.recv()
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 create(self, path): message_body = FileOpenRequest( objPath=path, createMode=0644, openFlags=0, offset=0, dataSize=-1, numThreads=0, oprType=0, KeyValPair_PI=StringStringMap({'dataType': 'generic'}), ) message = iRODSMessage('RODS_API_REQ', msg=message_body, int_info=api_number['DATA_OBJ_CREATE_AN']) with self.sess.pool.get_connection() as conn: conn.send(message) response = conn.recv() desc = response.int_info conn.close_file(desc) return self.get(path)