/*-----------------------------------------------------------------------*/ int nx_linkexternal(void *handle, char *name, char *nxclass, char *url){ int status; NXhandle hfil; hfil = (NXhandle)handle; status = NXlinkexternal(hfil,name, nxclass,url); if(status == NX_OK){ return 1; } else { return 0; } }
/*---------------------------------------------------------------------*/ static int testExternal(char *progName){ char nxfile[255], ext[5], testFile[80], time[132], filename[256]; int create; NXhandle hfil; int dummylen = 1; float dummyfloat = 1; float temperature; if(strstr(progName,"hdf4") != NULL){ strcpy(ext,"hdf"); create = NXACC_CREATE; } else if(strstr(progName,"hdf5") != NULL){ strcpy(ext,"h5"); create = NXACC_CREATE5; } else if(strstr(progName,"xml") != NULL){ strcpy(ext,"xml"); create = NXACC_CREATEXML; } else { printf("Failed to recognise napi_test program in testExternal\n"); return 1; } sprintf(testFile,"nxext.%s", ext); /* create the test file */ if(NXopen(testFile,create,&hfil) != NX_OK){ return 1; } /*if(NXmakegroup(hfil,"entry1","NXentry") != NX_OK){ return 1; }*/ sprintf(nxfile,"nxfile://data/dmc01.%s#/entry1",ext); if(NXlinkexternal(hfil,"entry1","NXentry",nxfile) != NX_OK){ return 1; } /*if(NXmakegroup(hfil,"entry2","NXentry") != NX_OK){ return 1; }*/ sprintf(nxfile,"nxfile://data/dmc02.%s#/entry1",ext); if(NXlinkexternal(hfil,"entry2","NXentry",nxfile) != NX_OK){ return 1; } if(NXmakegroup(hfil,"entry3","NXentry") != NX_OK){ return 1; } if(NXopengroup(hfil,"entry3","NXentry") != NX_OK){ return 1; } /* force create old style external link */ if (NXmakedata (hfil, "extlinkdata", NX_FLOAT32, 1, &dummylen) != NX_OK) return 1; if (NXopendata (hfil, "extlinkdata") != NX_OK) return 1; if (NXputdata (hfil, &dummyfloat) != NX_OK) return 1; sprintf(nxfile,"nxfile://data/dmc01.%s#/entry1/sample/temperature_mean",ext); if(NXputattr(hfil,"napimount",nxfile,strlen(nxfile), NX_CHAR) != NX_OK) return 1; /* this would segfault because we are tricking the napi stack if(NXclosedata(&hfil) != NX_OK){ return 1; } */ if(NXopenpath(hfil,"/entry3") != NX_OK){ return 1; } /* create new style external link on hdf5 , equivalent to the above on other backends */ if (NXlinkexternaldataset(hfil, "extlinknative", nxfile) != NX_OK) return 1; if(NXclose(&hfil) != NX_OK){ return 1; } /* actually test linking */ if(NXopen(testFile,NXACC_RDWR,&hfil) != NX_OK){ return 1; } if(NXopenpath(hfil,"/entry1/start_time") != NX_OK){ return 1; } memset(time,0,132); if(NXgetdata(hfil,time) != NX_OK){ return 1; } printf("First file time: %s\n", time); if(NXinquirefile(hfil,filename,256) != NX_OK){ return 1; } printf("NXinquirefile found: %s\n", relativePathOf(filename)); if(NXopenpath(hfil,"/entry2/sample/sample_name") != NX_OK){ return 1; } memset(time,0,132); if(NXgetdata(hfil,time) != NX_OK){ return 1; } printf("Second file sample: %s\n", time); if(NXinquirefile(hfil,filename,256) != NX_OK){ return 1; } printf("NXinquirefile found: %s\n", relativePathOf(filename)); if(NXopenpath(hfil,"/entry2/start_time") != NX_OK){ return 1; } memset(time,0,132); if(NXgetdata(hfil,time) != NX_OK){ return 1; } printf("Second file time: %s\n", time); NXopenpath(hfil,"/"); if(NXisexternalgroup(hfil,"entry1","NXentry",filename,255) != NX_OK){ return 1; } else { printf("entry1 external URL = %s\n", filename); } printf("testing link to external data set\n"); if(NXopenpath(hfil,"/entry3") != NX_OK){ return 1; } if(NXisexternaldataset(hfil,"extlinkdata",filename,255) != NX_OK){ printf("extlinkdata should be external link\n"); return 1; } else { printf("extlinkdata external URL = %s\n", filename); } if (NXopendata (hfil, "extlinkdata") != NX_OK) return 1; memset(&temperature,0,4); if(NXgetdata(hfil,&temperature) != NX_OK){ return 1; } printf("value retrieved: %4.2f\n", temperature); if(NXopenpath(hfil,"/entry3") != NX_OK){ return 1; } if(NXisexternaldataset(hfil,"extlinknative",filename,255) != NX_OK){ printf("extlinknative should be external link\n"); return 1; } else { printf("extlinknative external URL = %s\n", filename); } if (NXopendata (hfil, "extlinknative") != NX_OK) return 1; memset(&temperature,0,4); if(NXgetdata(hfil,&temperature) != NX_OK){ return 1; } printf("value retrieved: %4.2f\n", temperature); NXclose(&hfil); printf("External File Linking tested OK\n"); return 0; }