From d608d4fc3af6bfc144d9fcdaf31c38d5627216d7 Mon Sep 17 00:00:00 2001 From: Nick Eddy Date: Tue, 7 Jan 2014 15:59:48 -0700 Subject: [PATCH 1/4] trying to get renaming working for data objects/collections --- irods/data_object.py | 3 +++ irods/message/__init__.py | 24 +++++++++++++++++++ irods/resource_manager/data_object_manager.py | 10 +++++++- 3 files changed, 36 insertions(+), 1 deletion(-) 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..61a5f17 100644 --- a/irods/message/__init__.py +++ b/irods/message/__init__.py @@ -142,6 +142,22 @@ def __init__(self, data=None): keyWord = ArrayProperty(StringProperty()) svalue = ArrayProperty(StringProperty()) +#define RHostAddr_PI "str hostAddr[LONG_NAME_LEN]; str rodsZone[NAME_LEN]; int port; int dummyInt;" +class StringStringIntegerIntegerMap(Message): + _name = 'RHostAddr_PI' + def __init__(self, irods_host, client_user, irods_port): + super(StringStringIntegerIntegerMap, self).__init__() + if irods_host and client_user and irods_port: + self.hostAddr = irods_host + self.rodsZone = client_user + self.port = irods_port + self.dummyInt = 0 + + hostAddr = StringProperty() + rodsZone = StringProperty() + port = IntegerProperty() + dummyInt = IntegerProperty() + #define GenQueryInp_PI "int maxRows; int continueInx; int partialStartIndex; int options; struct KeyValPair_PI; struct InxIvalPair_PI; struct InxValPair_PI;" class GenQueryRequest(Message): _name = 'GenQueryInp_PI' @@ -211,6 +227,14 @@ class FileCloseRequest(Message): l1descInx = IntegerProperty() bytesWritten = LongProperty() +#define fileRenameInp_PI "int fileType; struct RHostAddr_PI; str oldFileName[MAX_NAME_LEN]; str newFileName[MAX_NAME_LEN];" +class FileRenameRequest(Message): + _name = 'fileRenameInp_PI' + fileType = IntegerProperty() + RHostAddr_PI = SubmessageProperty(StringStringIntegerIntegerMap) + oldFileName = StringProperty() + newFileName = StringProperty() + #define ModAVUMetadataInp_PI "str *arg0; str *arg1; str *arg2; str *arg3; str *arg4; str *arg5; str *arg6; str *arg7; str *arg8; str *arg9;" class MetadataRequest(Message): _name = 'ModAVUMetadataInp_PI' diff --git a/irods/resource_manager/data_object_manager.py b/irods/resource_manager/data_object_manager.py index 9802974..e8c7f36 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, FileRenameRequest, StringStringIntegerIntegerMap) from irods.exception import (DataObjectDoesNotExist, CollectionDoesNotExist, NoResultFound) from irods.api_number import api_number @@ -91,3 +91,11 @@ def unlink(self, path): def move(self, path): pass + + def rename(self, path, new_name): + message_body = FileRenameRequest( + fileType=0, + RHostAddr_PI=StringStringIntegerIntegerMap('data.iplantc.org', 'iplant', 1247), # TODO need some way to get connection information here... + oldFileName=basename(path), + newFileName=basename(new_name) + ) From 7c822ea1a929e607727aa45f1a6cc4f3f4eb5f40 Mon Sep 17 00:00:00 2001 From: Nick Eddy Date: Tue, 7 Jan 2014 16:07:34 -0700 Subject: [PATCH 2/4] finishing up data_object_manager.rename() --- irods/resource_manager/data_object_manager.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/irods/resource_manager/data_object_manager.py b/irods/resource_manager/data_object_manager.py index e8c7f36..79c824f 100644 --- a/irods/resource_manager/data_object_manager.py +++ b/irods/resource_manager/data_object_manager.py @@ -99,3 +99,9 @@ def rename(self, path, new_name): oldFileName=basename(path), newFileName=basename(new_name) ) + 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() From 7d10cd672b83cea67e57dfcc11041cd910c3a4f2 Mon Sep 17 00:00:00 2001 From: Chris LaRose Date: Tue, 7 Jan 2014 17:44:25 -0700 Subject: [PATCH 3/4] Switched to using DataObjCopyInp_PI for file renaming --- irods/message/__init__.py | 29 ++++--------------- irods/resource_manager/data_object_manager.py | 18 ++++++++---- 2 files changed, 17 insertions(+), 30 deletions(-) diff --git a/irods/message/__init__.py b/irods/message/__init__.py index 61a5f17..4a20cb8 100644 --- a/irods/message/__init__.py +++ b/irods/message/__init__.py @@ -142,22 +142,6 @@ def __init__(self, data=None): keyWord = ArrayProperty(StringProperty()) svalue = ArrayProperty(StringProperty()) -#define RHostAddr_PI "str hostAddr[LONG_NAME_LEN]; str rodsZone[NAME_LEN]; int port; int dummyInt;" -class StringStringIntegerIntegerMap(Message): - _name = 'RHostAddr_PI' - def __init__(self, irods_host, client_user, irods_port): - super(StringStringIntegerIntegerMap, self).__init__() - if irods_host and client_user and irods_port: - self.hostAddr = irods_host - self.rodsZone = client_user - self.port = irods_port - self.dummyInt = 0 - - hostAddr = StringProperty() - rodsZone = StringProperty() - port = IntegerProperty() - dummyInt = IntegerProperty() - #define GenQueryInp_PI "int maxRows; int continueInx; int partialStartIndex; int options; struct KeyValPair_PI; struct InxIvalPair_PI; struct InxValPair_PI;" class GenQueryRequest(Message): _name = 'GenQueryInp_PI' @@ -197,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' @@ -227,14 +216,6 @@ class FileCloseRequest(Message): l1descInx = IntegerProperty() bytesWritten = LongProperty() -#define fileRenameInp_PI "int fileType; struct RHostAddr_PI; str oldFileName[MAX_NAME_LEN]; str newFileName[MAX_NAME_LEN];" -class FileRenameRequest(Message): - _name = 'fileRenameInp_PI' - fileType = IntegerProperty() - RHostAddr_PI = SubmessageProperty(StringStringIntegerIntegerMap) - oldFileName = StringProperty() - newFileName = StringProperty() - #define ModAVUMetadataInp_PI "str *arg0; str *arg1; str *arg2; str *arg3; str *arg4; str *arg5; str *arg6; str *arg7; str *arg8; str *arg9;" class MetadataRequest(Message): _name = 'ModAVUMetadataInp_PI' diff --git a/irods/resource_manager/data_object_manager.py b/irods/resource_manager/data_object_manager.py index 79c824f..586c424 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, FileRenameRequest, StringStringIntegerIntegerMap) + 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: @@ -93,12 +96,15 @@ def move(self, path): pass def rename(self, path, new_name): - message_body = FileRenameRequest( - fileType=0, - RHostAddr_PI=StringStringIntegerIntegerMap('data.iplantc.org', 'iplant', 1247), # TODO need some way to get connection information here... - oldFileName=basename(path), - newFileName=basename(new_name) + src_file = FileOpenRequest( + objPath=path, + oprType=RENAME_DATA_OBJ + ) + dest_file = FileOpenRequest( + objPath=new_name, + 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']) From bb24e5dbe5a612606ba2da7bce899044153cb529 Mon Sep 17 00:00:00 2001 From: Chris LaRose Date: Tue, 7 Jan 2014 19:45:23 -0700 Subject: [PATCH 4/4] Zeroed out file open requests in file copy requests --- irods/resource_manager/data_object_manager.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/irods/resource_manager/data_object_manager.py b/irods/resource_manager/data_object_manager.py index 586c424..a8cd933 100644 --- a/irods/resource_manager/data_object_manager.py +++ b/irods/resource_manager/data_object_manager.py @@ -98,10 +98,20 @@ def move(self, path): 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])