Skip to content
Snippets Groups Projects
Commit 31f9bf77 authored by Felix A. Croes's avatar Felix A. Croes
Browse files

Let msiArchiveExtract also restore attributes.

parent 21db28c2
Branches
Tags
No related merge requests found
......@@ -9,6 +9,7 @@
#include "irods_includes.hh"
#include "Archive.hh"
#include "rsModDataObjMeta.hpp"
#include "rsModAVUMetadata.hpp"
#include <string>
#include <fstream>
......@@ -16,6 +17,53 @@
#include <sstream>
#include <iomanip>
static void modify(rsComm_t *rsComm, std::string file, json_t *json)
{
modDataObjMeta_t modDataObj;
dataObjInfo_t dataObjInfo;
keyValPair_t regParam;
char tmpStr[MAX_NAME_LEN];
json_int_t modified;
memset(&modDataObj, '\0', sizeof(modDataObjMeta_t));
memset(&dataObjInfo, '\0', sizeof(dataObjInfo_t));
memset(&regParam, '\0', sizeof(keyValPair_t));
rstrcpy(dataObjInfo.objPath, file.c_str(), MAX_NAME_LEN);
modDataObj.dataObjInfo = &dataObjInfo;
modified = json_integer_value(json_object_get(json, "modified"));
snprintf(tmpStr, MAX_NAME_LEN, "%lld", modified);
addKeyVal(&regParam, DATA_MODIFY_KW, tmpStr);
modDataObj.regParam = &regParam;
rsModDataObjMeta(rsComm, &modDataObj);
}
static void attributes(rsComm_t *rsComm, std::string file, const char *type,
json_t *list)
{
modAVUMetadataInp_t modAVUInp;
size_t sz, i;
const char *name;
json_t *json;
memset(&modAVUInp, '\0', sizeof(modAVUMetadataInp_t));
modAVUInp.arg1 = (char *) type;
modAVUInp.arg2 = (char *) file.c_str();
name = NULL;
sz = json_array_size(list);
for (i = 0; i < sz; i++) {
json = json_array_get(list, i);
name = json_string_value(json_object_get(json, "name"));
modAVUInp.arg3 = (char *) json_string_value(json_object_get(json, "name"));
modAVUInp.arg4 = (char *) json_string_value(json_object_get(json, "value"));
modAVUInp.arg5 = (char *) json_string_value(json_object_get(json, "unit"));
modAVUInp.arg0 = (strcmp(modAVUInp.arg3, name) == 0) ?
(char *) "add" : (char *) "set";
name = modAVUInp.arg3;
rsModAVUMetadata(rsComm, &modAVUInp);
}
}
extern "C" {
int msiArchiveExtract(msParam_t* archiveIn,
......@@ -44,27 +92,21 @@ extern "C" {
Archive *a = Archive::open(rei->rsComm, archive);
while ((json=a->nextItem()) != NULL) {
std::string file;
json_t *list;
file = path + "/" + json_string_value(json_object_get(json, "name"));
a->extractItem(file);
list = json_object_get(json, "attributes");
if (strcmp(json_string_value(json_object_get(json, "type")), "dataObj") == 0) {
modDataObjMeta_t modDataObj;
dataObjInfo_t dataObjInfo;
keyValPair_t regParam;
char tmpStr[MAX_NAME_LEN];
json_int_t modified;
memset(&modDataObj, '\0', sizeof(modDataObjMeta_t));
memset(&dataObjInfo, '\0', sizeof(dataObjInfo_t));
memset(&regParam, '\0', sizeof(keyValPair_t));
rstrcpy(dataObjInfo.objPath, file.c_str(), MAX_NAME_LEN);
modDataObj.dataObjInfo = &dataObjInfo;
modified = json_integer_value(json_object_get(json, "modified"));
snprintf(tmpStr, MAX_NAME_LEN, "%lld", modified);
addKeyVal(&regParam, DATA_MODIFY_KW, tmpStr);
modDataObj.regParam = &regParam;
rsModDataObjMeta(rei->rsComm, &modDataObj);
if (strcmp(json_string_value(json_object_get(json, "type")), "coll") == 0) {
if (list != NULL) {
attributes(rei->rsComm, file, "-C", list);
}
} else {
modify(rei->rsComm, file, json);
if (list != NULL) {
attributes(rei->rsComm, file, "-d", list);
}
}
}
delete a;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment