rc_t KMain(int argc, char *argv[]) { rc_t rc = 0; Args* args = NULL; const char* errmsg = NULL, *table_dir = NULL; char accn[1024]; if( (rc = ArgsMakeAndHandle(&args, argc, argv, 1, MainArgs, MainArgsQty)) == 0 ) { const char* blksz = NULL; uint32_t count, dump = 0, gzip = 0; if( (rc = ArgsParamCount(args, &count)) != 0 || count != 1 ) { rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, count > 1 ? rcExcessive : rcInsufficient); errmsg = "table"; } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_BlockSize].name, &count)) != 0 || count > 1 ) { rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, rcExcessive); errmsg = MainArgs[eopt_BlockSize].name; } else if( count > 0 && (rc = ArgsOptionValue(args, MainArgs[eopt_BlockSize].name, 0, (const void **)&blksz)) != 0 ) { errmsg = MainArgs[eopt_BlockSize].name; } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_Accession].name, &count)) != 0 || count > 1 ) { rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, rcExcessive); errmsg = MainArgs[eopt_Accession].name; } else if( count > 0 && (rc = ArgsOptionValue(args, MainArgs[eopt_Accession].name, 0, (const void **)&g_accession)) != 0 ) { errmsg = MainArgs[eopt_Accession].name; } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_DumpIndex].name, &dump)) != 0 ) { errmsg = MainArgs[eopt_DumpIndex].name; } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_noGzip].name, &gzip)) != 0 ) { errmsg = MainArgs[eopt_noGzip].name; } while( rc == 0 ) { long val = 0; char* end = NULL; if( blksz != NULL ) { errno = 0; val = strtol(blksz, &end, 10); if( errno != 0 || blksz == end || *end != '\0' || val <= 0 ) { rc = RC(rcExe, rcArgv, rcReading, rcParam, rcInvalid); errmsg = MainArgs[eopt_BlockSize].name; break; } else if( val <= 128 || val > (1024 * 1024 * 1024) ) { rc = RC(rcExe, rcArgv, rcValidating, rcParam, rcEmpty); errmsg = "block size invalid"; break; } g_file_block_sz = val; } if( (rc = ArgsParamValue(args, 0, (const void **)&table_dir)) != 0 ) { errmsg = "table"; break; } if( g_accession == NULL ) { const char* p = strchr(table_dir, '/'); size_t l = 0; g_accession = accn; if( p == NULL ) { p = strchr(table_dir, '\\'); } strncpy(accn, p == NULL ? table_dir : p + 1, sizeof(accn) - 1); if( accn[0] == '\0' ) { rc = RC(rcExe, rcArgv, rcValidating, rcParam, rcEmpty); errmsg = "accession"; } l = strlen(accn); if( accn[l - 1] == '/' || accn[l - 1] == '\\') { accn[--l] = '\0'; } if( strncmp(&accn[l - 9], ".lite.sra", 9) == 0 ) { accn[l - 9] = '\0'; } else if( strncmp(&accn[l - 4], ".sra", 4) == 0 ) { accn[l - 4] = '\0'; } } g_dump = dump > 0; g_ungzip = gzip > 0; break; } } if( rc == 0 ) { SRAMgr* smgr = NULL; KDBManager* kmgr = NULL; DEBUG_MSG(5, ("table %s, accession %s\n", table_dir, g_accession)); if( (rc = SRAMgrMakeUpdate(&smgr, NULL)) == 0 ) { if( (rc = KDBManagerMakeUpdate(&kmgr, NULL)) == 0 ) { bool relock = true; if( (rc = KDBManagerUnlock(kmgr, table_dir)) != 0 ) { relock = false; rc = GetRCState(rc) == rcUnlocked ? 0 : rc; } else { PLOGMSG(klogInfo, (klogInfo, "Table $(p) locked, unlocking", PLOG_S(p), table_dir)); } if( rc == 0 ) { KTable* ktbl = NULL; if( (rc = KDBManagerOpenTableUpdate(kmgr, &ktbl, table_dir)) == 0 ) { KMetadata* meta = NULL; if( (rc = KTableOpenMetadataUpdate(ktbl, &meta)) == 0 ) { const SRATable* stbl = NULL; if( (rc = SRAMgrOpenTableRead(smgr, &stbl, table_dir)) == 0 ) { rc = MakeIndexes(stbl, ktbl, meta); SRATableRelease(stbl); } } KMetadataRelease(meta); } KTableRelease(ktbl); } if( rc == 0 && relock ) { rc = KDBManagerLock(kmgr, table_dir); } KDBManagerRelease(kmgr); } SRAMgrRelease(smgr); } } if( rc != 0 && rc != KLogLastErrorCode() ) { if( errmsg ) { Usage(args); } LOGERR(klogErr, rc, errmsg ? errmsg : "stop"); } ArgsWhack(args); return rc; }
rc_t txt2kdb_kfs (void) { rc_t rc; G.dir = NULL; G.txt = NULL; G.mgr = NULL; G.col = NULL; /* ----- * Mount the native filesystem as root */ rc = KDirectoryNativeDir (&G.dir); if (rc != 0) { G.dir = NULL; LOGMSG (klogFatal, "Failed to open native KDirectory"); } else { rc = KDirectoryOpenFileRead (G.dir, &G.txt, "%s", G.txtpath); if (rc != 0) { G.txt = NULL; PLOGERR (klogFatal, (klogFatal, rc, "Unable to open file at $(F)", PLOG_S(F), G.txtpath)); } else { rc = KDBManagerMakeUpdate (&G.mgr, G.dir); if (rc) { G.mgr = NULL; LOGERR (klogFatal, rc, "Unable to create a KDBManager at the current directory"); } else { KCreateMode kcm; KPathType kpt; const char * err = ""; kpt = KDirectoryPathType (G.dir, "%s", G.colpath) & ~ kptAlias; kcm = kcmCreate; /* Force means replace if exists */ /* Append means open in append mode if it exists */ switch (kpt) { case kptNotFound: kcm = kcmCreate; break; default: err = "Unknown"; rc = RC (rcExe, rcNoTarg, rcAccessing, rcPath, rcInvalid); break; case kptBadPath: err = "Bad Path"; rc = RC (rcExe, rcNoTarg, rcAccessing, rcPath, rcInvalid); break; case kptFile: case kptCharDev: case kptBlockDev: case kptFIFO: err = "Must be a Directory"; rc = RC (rcExe, rcNoTarg, rcAccessing, rcPath, rcInvalid); break; case kptDir: kcm = kcmCreate; if (G.append) { kcm = kcmOpen; } else if (G.force) { kcm = kcmInit; } break; } if (rc == 0) { rc = KDBManagerCreateColumn (G.mgr, &G.col, kcm, kcsNone, 0, "%s", G.colpath); if (rc) err = "Manager can not open column"; } if (rc) { PLOGERR (klogFatal, (klogFatal, rc, "Cannot open KColumn $(P) because $(R)", PLOG_2(PLOG_S(P),PLOG_S(R)), G.colpath, err)); } } } } return rc; }