void gbReloadDelete(char *db, char *reloadList, struct dbLoadOptions* options, char* workDir) /* delete sequences that have been explictly requested for reloading */ { struct sqlConnection *conn = hAllocConn(db); char tmpDir[PATH_LEN]; struct sqlDeleter* deleter; safef(tmpDir, sizeof(tmpDir), "%s/reload", workDir); /* delete genbanks to reload */ deleter = buildReloadDeleter(reloadList, GB_GENBANK, tmpDir); if (deleter != NULL) { deleteFromTables(db, conn, deleter, GB_GENBANK, options); sqlDeleterFree(&deleter); } /* delete refseqs to reload */ deleter = buildReloadDeleter(reloadList, GB_REFSEQ, tmpDir); if (deleter != NULL) { deleteFromTables(db, conn, deleter, GB_REFSEQ, options); sqlDeleterFree(&deleter); } hFreeConn(&conn); }
void gbAlignDataDeleteOutdated(char *db, struct sqlConnection *conn, struct gbSelect* select, struct gbStatusTbl* statusTbl, struct dbLoadOptions* options, char *tmpDir) /* delete outdated alignment data */ { struct sqlDeleter* deleter = sqlDeleterNew(tmpDir, (gbVerbose >= 4)); struct gbStatus* status; /* delete seqChg, deleted, and orphans from alignments; clearing count of * number aligned. */ for (status = statusTbl->deleteList; status != NULL; status = status->next) { sqlDeleterAddAcc(deleter, status->acc); status->numAligns = 0; } for (status = statusTbl->seqChgList; status != NULL; status = status->next) { sqlDeleterAddAcc(deleter, status->acc); status->numAligns = 0; } for (status = statusTbl->orphanList; status != NULL; status = status->next) { sqlDeleterAddAcc(deleter, status->acc); status->numAligns = 0; } gbAlignDataDeleteFromTables(db, conn, select->release->srcDb, select->type, deleter, options); sqlDeleterFree(&deleter); }
static void refSeqPepClean(struct sqlConnection *conn) /* Delete all refseq peptides that are in gbSeq but no longer * referenced by refLink. */ { char query[1024]; struct sqlResult* sr; char **row; struct sqlDeleter* deleter; /* don't do anything if we don't have the refLink table. This can * happen if refSeq was enabled after the initial load */ if (!sqlTableExists(conn, "refLink")) return; deleter = sqlDeleterNew(gTmpDir, (gbVerbose >= 4)); /* Use a join to get list of acc, which proved reasonable fastly because * the the list is small */ sqlSafef(query, sizeof(query), "SELECT acc FROM gbSeq LEFT JOIN refLink ON (refLink.protAcc = gbSeq.acc) " "WHERE (acc LIKE 'NP_%%') AND (refLink.protAcc IS NULL)"); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) sqlDeleterAddAcc(deleter, row[0]); sqlFreeResult(&sr); sqlDeleterDel(deleter, conn, SEQ_TBL, "acc"); sqlDeleterFree(&deleter); }
struct sqlDeleter *gbBuildStateReloadDeleter(struct sqlConnection *conn, struct gbSelect* select, char *tmpDirPath) /* get deleter for list of accessions to reload for the selected categories. * Used when reloading. Returns null if none found */ { struct hash* seqTblAccs; struct slName *gbStatAccs, *acc; struct hashCookie cookie; struct hashEl *hel; struct sqlDeleter* deleter; unsigned cnt = 0; unsigned statTblSelect = select->release->srcDb | select->orgCats | select->type; /* ESTs not implemented, which gets rid of complexities of accPrefix */ if (select->type & GB_EST) errAbort("gbBuildStateReloadDeleter doesn't handle ESTs"); seqTblAccs = seqTblLoadAcc(conn, select); gbStatAccs = gbStatusTblLoadAcc(conn, statTblSelect, NULL); /* build up deleter combining the two */ deleter = sqlDeleterNew(tmpDirPath, (gbVerbose >= 4)); cookie = hashFirst(seqTblAccs); while ((hel = hashNext(&cookie)) != NULL) { sqlDeleterAddAcc(deleter, hel->name); cnt++; } for (acc = gbStatAccs; acc != NULL; acc = acc->next) { if (hashLookup(seqTblAccs, acc->name) == NULL) { sqlDeleterAddAcc(deleter, acc->name); cnt++; } } #ifdef DUMP_HASH_STATS hashPrintStats(seqTblAccs, "seqTblAccs", stderr); #endif hashFree(&seqTblAccs); slFreeList(&gbStatAccs); if (cnt == 0) sqlDeleterFree(&deleter); return deleter; }
static void deleteIgnoredRelease(char *db, struct gbRelease* release, boolean force, struct dbLoadOptions* options, char* workDir) /* deleted any sequences in the ignore table from the database that are * in the gbStatus table for a release. */ { struct sqlConnection *conn = hAllocConn(db); struct sqlDeleter* deleter = NULL; if (sqlTableExists(conn, GB_STATUS_TBL)) deleter = buildIgnoredDeleters(conn, release, force, workDir); /* drop what we found in the gbStatus table */ if (deleter != NULL) { deleteFromTables(db, conn, deleter, release->srcDb, options); sqlDeleterFree(&deleter); } hFreeConn(&conn); }
void removeForReload(struct gbSelect* select, struct sqlConnection* conn, char* tmpDir) /* delete all in selected categories. This is faster than deleting * individually */ { struct sqlDeleter * deleter; if (select->type & GB_EST) errAbort("-reload doesn't handle ESTs (it would be very, very slow)," " use -drop instead"); deleter = gbBuildStateReloadDeleter(conn, select, tmpDir); if (deleter != NULL) { gbAlignRemove(gDatabase, conn, &gOptions, select, deleter); gbMetaDataRemove(conn, &gOptions, select, deleter); sqlDeleterDel(deleter, conn, "gbStatus", "acc"); } sqlDeleterFree(&deleter); }
void gbMetaDataDeleteOutdated(struct sqlConnection *conn, struct gbSelect* select, struct gbStatusTbl* statusTbl, struct dbLoadOptions* options, char *tmpDir) /* Delete outdated metadata. Also delete genePred table entries for genes * where metadata changed but sequence has not. These will have the genePred * records reloaded.*/ { setGeneTblFlags(conn, options); struct sqlDeleter* deleter = sqlDeleterNew(tmpDir, (gbVerbose >= 4)); struct sqlDeleter* geneTblDeleter = NULL; struct sqlDeleter* derivedTblDeleter = NULL; if (partitionMayHaveGeneTbls(select)) geneTblDeleter = sqlDeleterNew(tmpDir, (gbVerbose >= 4)); if (select->type == GB_MRNA) derivedTblDeleter = sqlDeleterNew(tmpDir, (gbVerbose >= 4)); struct gbStatus* status; gSrcDb = select->release->srcDb; gOptions = options; strcpy(gTmpDir, tmpDir); /* Delete any meta modified from id tables */ for (status = statusTbl->seqChgList; status != NULL; status = status->next) { if (status->stateChg & GB_META_CHG) sqlDeleterAddAcc(deleter, status->acc); } for (status = statusTbl->metaChgList; status != NULL; status = status->next) { assert(!(status->stateChg&GB_SEQ_CHG)); if (status->stateChg&GB_META_CHG) sqlDeleterAddAcc(deleter, status->acc); else if (status->stateChg&GB_REBUILD_DERIVED) sqlDeleterAddAcc(derivedTblDeleter, status->acc); if (geneTblDeleter != NULL) { // need to just try, since we can set the status->isMgcFull // flag until we are reading the ra. sqlDeleterAddAcc(geneTblDeleter, status->acc); } } for (status = statusTbl->deleteList; status != NULL; status = status->next) sqlDeleterAddAcc(deleter, status->acc); for (status = statusTbl->orphanList; status != NULL; status = status->next) sqlDeleterAddAcc(deleter, status->acc); gbMetaDataDeleteFromIdTables(conn, options, deleter); sqlDeleterFree(&deleter); /* remove deleted and orphans from metadata. */ deleter = sqlDeleterNew(tmpDir, (gbVerbose >= 4)); for (status = statusTbl->deleteList; status != NULL; status = status->next) sqlDeleterAddAcc(deleter, status->acc); for (status = statusTbl->orphanList; status != NULL; status = status->next) sqlDeleterAddAcc(deleter, status->acc); // must do gene tbls before other tables if (geneTblDeleter != NULL) deleteFromGeneTbls(conn, select, geneTblDeleter); gbMetaDataDeleteFromTables(conn, options, select->release->srcDb, deleter); sqlDeleterFree(&deleter); sqlDeleterFree(&geneTblDeleter); sqlDeleterFree(&derivedTblDeleter); /* If we are cleaning up the ext table, we need to get rid of any * refseq peptides in gbSeq that are no longer referenced. We don't * do it other times as these are not reachable directly. */ if ((select->release->srcDb == GB_REFSEQ) && (gOptions->flags & DBLOAD_EXT_FILE_UPDATE)) refSeqPepClean(conn); }