int main(int argc, char *argv[]) /* Process command line. */ { setlinebuf(stdout); setlinebuf(stderr); optionInit(&argc, argv, optionSpecs); boolean drop = optionExists("drop"); gbVerbInit(optionInt("verbose", 0)); if (gbVerbose >= 5) sqlMonitorEnable(JKSQL_TRACE); if (drop) { if (argc != 2) usage(); mgcDropTables(argv[1]); } else { if (argc != 3) usage(); workDir = optionVal("workdir", "work/load/mgc"); gbMakeDirs(workDir); allMgcTables = optionExists("allMgcTables"); mgcDbLoad(argv[1], argv[2]); } return 0; }
void gbMakeFileDirs(char* path) /* make all of the directories for a file */ { char* last = strrchr(path, '/'); if (last != NULL) { *last = '\0'; gbMakeDirs(path); *last = '/'; } }
struct sqlDeleter* sqlDeleterNew(char* tmpDir, boolean verbEnabled) /* create a new deleter object. If tmpdir is NULL, this will aways * do direct deletes, rather than falling back to the join/copy on a * large number of deleted. */ { struct sqlDeleter* sd; AllocVar(sd); sd->lm = lmInit(32*1024); sd->verbose = verbEnabled; if (tmpDir != NULL) { strcpy(sd->tmpDir, tmpDir); gbMakeDirs(tmpDir); } #ifdef COPY_TO_DELETE_HACK sd->directMax = DIRECT_MAX; #endif return sd; }
void databaseUpdate(struct gbSelect* select) /* update the database from genbank state on disk */ { struct sqlConnection *conn = hAllocConn(gDatabase); struct gbStatusTbl* statusTbl; boolean maxShrinkageExceeded; char typePrefix[32], tmpDir[PATH_LEN]; gbVerbEnter(3, "update %s", gbSelectDesc(select)); /* Setup tmp dir for load, must be unique for each update due to * initialLoad feature */ if (select->accPrefix != NULL) safef(typePrefix, sizeof(typePrefix), "%s.%s", gbFmtSelect(select->type), select->accPrefix); else safef(typePrefix, sizeof(typePrefix), "%s", gbFmtSelect(select->type)); safef(tmpDir, sizeof(tmpDir), "%s/%s/%s/%s", gWorkDir, select->release->name, select->release->genome->database, typePrefix); if (!(gOptions.flags & DBLOAD_DRY_RUN)) gbMakeDirs(tmpDir); /* Build list of entries that need processed. This also flags updates that * have the change and new entries so we can limit the per-update processing. */ statusTbl = gbBuildState(conn, select, &gOptions, gMaxShrinkage, tmpDir, gbVerbose, FALSE, &maxShrinkageExceeded); if (maxShrinkageExceeded) { fprintf(stderr, "Warning: switching to dryRun mode due to maxShrinkage being exceeded\n"); gMaxShrinkageError = TRUE; gOptions.flags |= DBLOAD_DRY_RUN; } if (gOptions.flags & DBLOAD_DRY_RUN) { gbVerbLeave(3, "dry run, skipping update %s", gbSelectDesc(select)); gbStatusTblFree(&statusTbl); hFreeConn(&conn); return; } checkForStop(); /* last safe place */ /* count global number of extFileChgs */ gExtFileChged += statusTbl->numExtChg; /* first clean out old and changed */ deleteOutdated(conn, select, statusTbl, tmpDir); /* meta data MUST be done first, it sets some gbStatus data */ processMetaData(conn, select, statusTbl, tmpDir); processAligns(conn, select, statusTbl, tmpDir); /* now it's safe to update the status table, delay commit for initialLoad */ if (gOptions.flags & DBLOAD_INITIAL) slSafeAddHead(&gPendingStatusUpdates, gbStatusTblUpdate(statusTbl, conn, FALSE)); else gbStatusTblUpdate(statusTbl, conn, TRUE); /* add this and partition to the loaded table, if not already there. * set the extFile updated flag updates were done or this is the initial load */ updateLoadedTbl(select); if (gOptions.flags & DBLOAD_INITIAL) gbLoadedTblSetExtFileUpdated(gLoadedTbl, select); if ((gOptions.flags & DBLOAD_INITIAL) == 0) gbLoadedTblCommit(gLoadedTbl); /* print before freeing memory */ gbVerbLeave(3, "update %s", gbSelectDesc(select)); gbStatusTblFree(&statusTbl); hFreeConn(&conn); }