diff --git a/irods/data_object.py b/irods/data_object.py index fdb86b1..47949d0 100644 --- a/irods/data_object.py +++ b/irods/data_object.py @@ -38,6 +38,9 @@ def open(self, mode='r'): conn, desc = self.manager.open(self.path, flag) return BufferedRandom(iRODSDataObjectFileRaw(conn, desc)) + def rename(self, new_name): + self.manager.rename(self.path, new_name) + def unlink(self): self.manager.unlink(self.path) diff --git a/irods/message/__init__.py b/irods/message/__init__.py index 9484f2d..4a20cb8 100644 --- a/irods/message/__init__.py +++ b/irods/message/__init__.py @@ -181,6 +181,11 @@ class FileOpenRequest(Message): oprType = IntegerProperty() KeyValPair_PI = SubmessageProperty(StringStringMap) +#define DataObjCopyInp_PI "struct DataObjInp_PI; struct DataObjInp_PI;" +class FileCopyRequest(Message): + _name = 'DataObjCopyInp_PI' + dataObjects = ArrayProperty(SubmessageProperty(FileOpenRequest)) + #define dataObjReadInp_PI "int l1descInx; int len;" class FileReadRequest(Message): _name = 'dataObjReadInp_PI' diff --git a/irods/resource_manager/data_object_manager.py b/irods/resource_manager/data_object_manager.py index 9802974..a8cd933 100644 --- a/irods/resource_manager/data_object_manager.py +++ b/irods/resource_manager/data_object_manager.py @@ -4,7 +4,7 @@ from irods.resource_manager import ResourceManager from irods.message import (iRODSMessage, FileReadRequest, FileWriteRequest, FileSeekRequest, FileSeekResponse, FileOpenRequest, FileCloseRequest, - StringStringMap) + StringStringMap, FileCopyRequest) from irods.exception import (DataObjectDoesNotExist, CollectionDoesNotExist, NoResultFound) from irods.api_number import api_number @@ -14,6 +14,9 @@ SEEK_CUR = 1 SEEK_END = 2 +RENAME_DATA_OBJ = 11 +RENAME_COLL = 12 + class DataObjectManager(ResourceManager): def get(self, path): try: @@ -91,3 +94,30 @@ def unlink(self, path): def move(self, path): pass + + def rename(self, path, new_name): + src_file = FileOpenRequest( + objPath=path, + createMode=0, + openFlags=0, + offset=0, + dataSize=0, + numThreads=0, + oprType=RENAME_DATA_OBJ + ) + dest_file = FileOpenRequest( + objPath=new_name, + createMode=0, + openFlags=0, + offset=0, + dataSize=0, + numThreads=0, + oprType=RENAME_DATA_OBJ + ) + message_body = FileCopyRequest(dataObjects=[src_file, dest_file]) + 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()