Basic iRODS samples
For iRODS C API usage there are numerous examples provided with the installation. However, basic samples for a quick introduction are hidden among the complex ones. Also, some effort is required to find which libraries have to be linked. Few simplified examples are provided here, each on the top with the commands required to compile.
To put a file into iRODS the rcDataObjPut
() is used:
/* gcc -c -I /usr/local/irods-3.2/lib/api/include/ -I /usr/local/irods-3.2/lib/core/include/ -I /usr/local/irods-3.2/lib/md5/include/ -I /usr/local/irods-3.2/server/core/include/ -I /usr/local/irods-3.2/server/icat/include/ -I /usr/local/irods-3.2/server/drivers/include/ -I /usr/local/irods-3.2/server/re/include/ putfile.c gcc -L /usr/local/irods-3.2/lib/core/obj/ -oputfile putfile.o -lm -lpthread -lRodsAPIs */ #include <strings.h> #include "dataObjGet.h" #include "rodsClient.h" int main(int argc, char* argv[]) { rcComm_t* conn; rodsEnv myRodsEnv; dataObjInp_t dataObjOpenInp; ruleExecDelInp_t ruleExecDelInp; rErrMsg_t errMsg; memset(&errMsg, 0, sizeof(rErrMsg_t)); int status = getRodsEnv(&myRodsEnv); if (status < 0) { fprintf (stderr, "getRodsEnv error, status = %d\n", status); exit(1); } conn = rcConnect(myRodsEnv.rodsHost, myRodsEnv.rodsPort, "rods", "tempZone", 0, &errMsg); if (conn == NULL) { fprintf(stderr, "rcConnect error\n"); exit(1); } status = clientLogin(conn); if (status != 0) { rcDisconnect(conn); exit(1); } dataObjInp_t dataObjInp; bzero(&dataObjInp, sizeof (dataObjInp)); strncpy(dataObjInp.objPath, "/tempZone/home/rods/hello.txt", MAX_NAME_LEN); char locFilePath[MAX_NAME_LEN]; strncpy(locFilePath, "./hello.txt", MAX_NAME_LEN); dataObjInp.dataSize = 13; status = rcDataObjPut(conn, &dataObjInp, locFilePath); if (status < 0) { fprintf(stderr, "put error, status = %d\n", status); } return 0; }
To get a file from iRODS the rcDataObjGet
() is used
/* gcc -c -I /usr/local/irods-3.2/lib/api/include/ -I /usr/local/irods-3.2/lib/core/include/ -I /usr/local/irods-3.2/lib/md5/include/ -I /usr/local/irods-3.2/server/core/include/ -I /usr/local/irods-3.2/server/icat/include/ -I /usr/local/irods-3.2/server/drivers/include/ -I /usr/local/irods-3.2/server/re/include/ getfile.c gcc -L /usr/local/irods-3.2/lib/core/obj/ -ogetfile getfile.o -lm -lpthread -lRodsAPIs */ #include <strings.h> #include "dataObjGet.h" #include "rodsClient.h" int main(int argc, char* argv[]) { rcComm_t* conn; rodsEnv myRodsEnv; dataObjInp_t dataObjOpenInp; ruleExecDelInp_t ruleExecDelInp; rErrMsg_t errMsg; memset(&errMsg, 0, sizeof(rErrMsg_t)); int status = getRodsEnv(&myRodsEnv); if (status < 0) { fprintf(stderr, "getRodsEnv() error, status = %d\n", status); exit(1); } conn = rcConnect(myRodsEnv.rodsHost, myRodsEnv.rodsPort, "rods", "tempZone", 0, &errMsg); if (conn == NULL) { fprintf(stderr, "rcConnect() error\n"); exit(1); } status = clientLogin(conn); if (status != 0) { rcDisconnect(conn); exit(1); } dataObjInp_t dataObjInp; bzero(&dataObjInp, sizeof (dataObjInp)); strncpy(dataObjInp.objPath, "/tempZone/home/rods/hello.txt", MAX_NAME_LEN); char locFilePath[MAX_NAME_LEN]; strncpy(locFilePath, "./hello.txt", MAX_NAME_LEN); dataObjInp.dataSize = 0; status = rcDataObjGet(conn, &dataObjInp, locFilePath); if (status < 0) { fprintf(stderr, "error status = %d\n", status); } return 0; }
To get all files for the given AVU, the rcGenQuery
() with appropriate conditions is used:
/* gcc -c -I /usr/local/irods-3.2/lib/api/include/ -I /usr/local/irods-3.2/lib/core/include/ -I /usr/local/irods-3.2/lib/md5/include/ -I /usr/local/irods-3.2/server/core/include/ -I /usr/local/irods-3.2/server/icat/include/ -I /usr/local/irods-3.2/server/drivers/include/ -I /usr/local/irods-3.2/server/re/include/ avuquery.c gcc -L /usr/local/irods-3.2/lib/core/obj/ -oavuquery avuquery.o -lm -lpthread -lRodsAPIs */ #include "rods.h" #include "rodsClient.h" int printGenQueryResults(rcComm_t* conn, int status, genQueryOut_t* genQueryOut, char* description) { int printCount = 0; if (status != 0 && status != CAT_NO_ROWS_FOUND) fprintf(stderr, "No rows found\n"); else if (status != CAT_NO_ROWS_FOUND) { int i; for (i = 0; i < genQueryOut->attriCnt; i++) { int j; for (j = 0;j < genQueryOut->rowCnt; j++) { char* result; result = genQueryOut->sqlResult[i].value; result += j * genQueryOut->sqlResult[i].len; printf("%s %s\n", description, result); printCount++; } } } return printCount; } int doLs(rcComm_t* conn) { genQueryInp_t genQueryInp; genQueryOut_t* genQueryOut; int i1a[10]; int i1b[10]; int i2a[10]; char* condVal[3]; char v1[10]; char v2[10]; char v3[10]; int printCount = 0; memset(&genQueryInp, 0, sizeof(genQueryInp_t)); i1a[0] = COL_DATA_NAME; i1b[0] = 0; genQueryInp.selectInp.inx = i1a; genQueryInp.selectInp.value = i1b; genQueryInp.selectInp.len = 1; i2a[0] = COL_META_DATA_ATTR_NAME; sprintf(v1,"='%s'", "hello"); condVal[0] = v1; i2a[1] = COL_META_DATA_ATTR_VALUE; sprintf(v2, "%s '%s'", "=", "world"); condVal[1] = v2; i2a[2] = COL_META_DATA_ATTR_UNITS; sprintf(v3, "='%s'", "yeah"); condVal[2] = v3; genQueryInp.sqlCondInp.inx = i2a; genQueryInp.sqlCondInp.value = condVal; genQueryInp.sqlCondInp.len = 3; genQueryInp.maxRows = 10; int status = rcGenQuery(conn, &genQueryInp, &genQueryOut); printCount += printGenQueryResults(conn, status, genQueryOut, "file:"); if (printCount == 0) printf("no subcollections or files found\n"); return 0; } main(int argc, char** argv) { int status; rodsEnv myEnv; rcComm_t* conn; rErrMsg_t errMsg; status = getRodsEnv(&myEnv); if (status < 0) { fprintf(stderr, "getRodsEnv(), status=%d\n", status); exit(1); } conn = rcConnect(myEnv.rodsHost, myEnv.rodsPort, myEnv.rodsUserName, myEnv.rodsZone, 0, &errMsg); if (conn == NULL) { fprintf(stderr, "Connect failure\n"); exit(1); } status = clientLogin(conn); if (status != 0) { rcDisconnect(conn); exit(1); } doLs(conn); }
To get all AVUs for the given file, the rcGenQuery
() with appropriate conditions is used:
/* gcc -c -I /usr/local/irods-3.2/lib/api/include/ -I /usr/local/irods-3.2/lib/core/include/ -I /usr/local/irods-3.2/lib/md5/include/ -I /usr/local/irods-3.2/server/core/include/ -I /usr/local/irods-3.2/server/icat/include/ -I /usr/local/irods-3.2/server/drivers/include/ -I /usr/local/irods-3.2/server/re/include/ avufile.c gcc -L /usr/local/irods-3.2/lib/core/obj/ -oavufile avufile.o -lm -lpthread -lRodsAPIs */ #include "rods.h" #include "rodsClient.h" int printGenQueryResults(rcComm_t* conn, int status, genQueryOut_t* genQueryOut, char* description) { int printCount = 0; if (status != 0 && status != CAT_NO_ROWS_FOUND) fprintf(stderr, "No rows found\n"); else if (status != CAT_NO_ROWS_FOUND) { int i; for (i = 0; i < genQueryOut->attriCnt; i++) { int j; for (j = 0;j < genQueryOut->rowCnt; j++) { char* result; result = genQueryOut->sqlResult[i].value; result += j * genQueryOut->sqlResult[i].len; printf("%s %s\n", description, result); printCount++; } } } return printCount; } int doLs(rcComm_t* conn) { genQueryInp_t genQueryInp; genQueryOut_t* genQueryOut; int i1a[10]; int i1b[10]; int i2a[10]; int i2b[10]; char* condVal[1]; char v1[10]; int printCount = 0; memset(&genQueryInp, 0, sizeof(genQueryInp_t)); i1a[0] = COL_META_DATA_ATTR_NAME; i1a[1] = COL_META_DATA_ATTR_VALUE; i1a[2] = COL_META_DATA_ATTR_UNITS; genQueryInp.selectInp.inx = i1a; genQueryInp.selectInp.value = i1b; genQueryInp.selectInp.len = 3; i2a[0] = COL_DATA_NAME; i2b[0] = 0; sprintf(v1,"='%s'", "hello.txt"); condVal[0] = v1; genQueryInp.sqlCondInp.inx = i2a; genQueryInp.sqlCondInp.value = condVal; genQueryInp.sqlCondInp.len = 1; genQueryInp.maxRows = 10; int status = rcGenQuery(conn, &genQueryInp, &genQueryOut); printCount += printGenQueryResults(conn, status, genQueryOut, "AVU:"); if (printCount == 0) printf("no subcollections or files found\n"); return 0; } main(int argc, char** argv) { int status; rodsEnv myEnv; rcComm_t* conn; rErrMsg_t errMsg; status = getRodsEnv(&myEnv); if (status < 0) { fprintf(stderr, "getRodsEnv(), status=%d\n", status); exit(1); } conn = rcConnect(myEnv.rodsHost, myEnv.rodsPort, myEnv.rodsUserName, myEnv.rodsZone, 0, &errMsg); if (conn == NULL) { fprintf(stderr, "Connect failure\n"); exit(1); } status = clientLogin(conn); if (status != 0) { rcDisconnect(conn); exit(1); } doLs(conn); }
Samples are tested under Linux and iRODS 3.2.