/* ResolveTablePath * takes either an accession or path * substitutes any arguments * resolves via SRAPath mgr if present */ rc_t ResolveTablePath ( const SRAMgr *mgr, char *path, size_t psize, const char *spec, va_list args ) { int len; char tblpath [ 4096 ]; const SRAPath *pmgr = mgr -> pmgr; /* if no path manager or if the spec string has embedded path separators, then this can't be an accession - just print it out */ if ( mgr -> pmgr == NULL || strchr( spec, '/' ) != NULL ) { len = vsnprintf ( path, psize, spec, args ); if ( len < 0 || ( size_t ) len >= psize ) return RC ( rcSRA, rcTable, rcOpening, rcPath, rcExcessive ); return 0; } /* create a copy - not likely to be too large */ len = vsnprintf ( tblpath, sizeof tblpath, spec, args ); if ( len < 0 || ( size_t ) len >= sizeof tblpath ) return RC ( rcSRA, rcTable, rcOpening, rcPath, rcExcessive ); /* test if the path exists in current directory, i.e. with assumed dot */ if ( ! SRAPathTest ( pmgr, tblpath ) ) { rc_t rc = SRAPathFind ( pmgr, tblpath, path, psize ); if ( rc == 0 ) return 0; } /* use the path given */ if ( ( size_t ) len >= psize ) return RC ( rcSRA, rcTable, rcOpening, rcBuffer, rcInsufficient ); strcpy ( path, tblpath ); return 0; }
static rc_t resolve_accession( const KDirectory *my_dir, char ** path ) { SRAPath *my_sra_path; rc_t rc = 0; if ( strchr ( *path, '/' ) != NULL ) return 0; rc = SRAPathMake( &my_sra_path, my_dir ); if ( rc != 0 ) { if ( GetRCState ( rc ) != rcNotFound || GetRCTarget ( rc ) != rcDylib ) { if ( rc != 0 ) { LOGERR( klogInt, rc, "SRAPathMake() failed" ); } } else rc = 0; } else { if ( !SRAPathTest( my_sra_path, *path ) ) { char *buf = translate_accession( my_sra_path, *path, 64 ); if ( buf != NULL ) { free( (char*)(*path) ); *path = buf; } } SRAPathRelease( my_sra_path ); } return rc; }
rc_t CC KMain ( int argc, char *argv [] ) { Args *args; rc_t rc = ArgsMakeAndHandle ( & args, argc, argv, 0 ); if ( rc != 0 ) LogErr ( klogErr, rc, "failed to parse arguments" ); else { uint32_t paramc; rc = ArgsParamCount ( args, & paramc ); if ( rc != 0 ) LogErr ( klogInt, rc, "failed to obtain param count" ); else { if ( paramc == 0 ) { rc = RC ( rcExe, rcArgv, rcParsing, rcParam, rcInsufficient ); LogErr ( klogErr, rc, "missing target object" ); MiniUsage ( args ); } else if ( paramc > 1 ) { rc = RC ( rcExe, rcArgv, rcParsing, rcParam, rcExcessive ); LogErr ( klogErr, rc, "expected single target object" ); MiniUsage ( args ); } else { const char *target; rc = ArgsParamValue ( args, 0, & target ); if ( rc != 0 ) LogErr ( klogInt, rc, "failed to obtain param value" ); else { VDBManager *mgr; #if TOOLS_USE_SRAPATH != 0 char full [ 4096 ]; SRAPath *sra_path; rc = SRAPathMake ( & sra_path, NULL ); if ( rc == 0 ) { if ( ! SRAPathTest ( sra_path, target ) ) { rc = SRAPathFind ( sra_path, target, full, sizeof full ); if ( rc == 0 ) target = full; } SRAPathRelease ( sra_path ); } #endif rc = VDBManagerMakeUpdate ( & mgr, NULL ); if ( rc != 0 ) LogErr ( klogInt, rc, "failed to open VDB manager" ); else { rc = VDBManagerLock ( mgr, target ); if ( rc == 0 ) pLogMsg ( klogInfo, "locked '$(target)'", "target=%s", target ); else switch ( GetRCState ( rc ) ) { case rcLocked: pLogMsg ( klogInfo, "'$(target)' was already locked", "target=%s", target ); break; default: pLogErr ( klogErr, rc, "failed to lock '$(target)'", "target=%s", target ); } VDBManagerRelease ( mgr ); } } } } ArgsWhack ( args ); } return rc; }
/* Test * returns true if path appears to be accession * the test is a heuristic, and may return false positives * * "path" [ IN ] - NUL terminated path to run */ inline bool Test ( const char *path ) const throw() { return SRAPathTest ( this, path ); }
/* ResolveTablePath * takes either an accession or path * substitutes any arguments * resolves via SRAPath mgr if present */ rc_t ResolveTablePath ( const SRAMgr *mgr, char *path, size_t psize, const char *spec, va_list args ) { #if OLD_SRAPATH_MGR int len; char tblpath [ 4096 ]; const SRAPath *pmgr = mgr -> _pmgr; /* if no path manager or if the spec string has embedded path separators, then this can't be an accession - just print it out */ if ( mgr -> _pmgr == NULL || strchr( spec, '/' ) != NULL ) { len = vsnprintf ( path, psize, spec, args ); if ( len < 0 || ( size_t ) len >= psize ) return RC ( rcSRA, rcTable, rcOpening, rcPath, rcExcessive ); return 0; } /* create a copy - not likely to be too large */ len = vsnprintf ( tblpath, sizeof tblpath, spec, args ); if ( len < 0 || ( size_t ) len >= sizeof tblpath ) return RC ( rcSRA, rcTable, rcOpening, rcPath, rcExcessive ); /* test if the path exists in current directory, i.e. with assumed dot */ if ( ! SRAPathTest ( pmgr, tblpath ) ) { rc_t rc = SRAPathFind ( pmgr, tblpath, path, psize ); if ( rc == 0 ) return 0; } /* use the path given */ if ( ( size_t ) len >= psize ) return RC ( rcSRA, rcTable, rcOpening, rcBuffer, rcInsufficient ); strcpy ( path, tblpath ); return 0; #else VFSManager *vfs; rc_t rc = VFSManagerMake ( & vfs ); if ( rc == 0 ) { VPath *accession; const VPath *tblpath = NULL; rc = VFSManagerVMakePath ( vfs, & accession, spec, args ); if ( rc == 0 ) { rc = VResolverLocal ( ( const VResolver* ) mgr -> _pmgr, accession, & tblpath ); if ( rc == 0 ) { size_t size; rc = VPathReadPath ( tblpath, path, psize, & size ); VPathRelease ( tblpath ); } VPathRelease ( accession ); } VFSManagerRelease ( vfs ); } return rc; #endif }