X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fdatabase.c;h=3bab5776d90ebe522eefb34b1c751f631de98ca1;hb=66f09fdd7c3f58e13ed01431dd5148302327ca6e;hp=0da1f0f19ab72ee86b75f13e90a78fdd9bdc2719;hpb=96550b1cc37f3d78294a2bb6d860be7e5867872f;p=citadel.git diff --git a/citadel/database.c b/citadel/database.c index 0da1f0f19..3bab5776d 100644 --- a/citadel/database.c +++ b/citadel/database.c @@ -89,6 +89,7 @@ void cdb_verbose_log(const DB_ENV *dbenv, const char *msg) { if (!IsEmptyStr(msg)) { syslog(LOG_DEBUG, "DB: %s", msg); + cit_backtrace(); } } @@ -97,6 +98,7 @@ void cdb_verbose_log(const DB_ENV *dbenv, const char *msg) void cdb_verbose_err(const DB_ENV *dbenv, const char *errpfx, const char *msg) { syslog(LOG_ALERT, "DB: %s", msg); + cit_backtrace(); } @@ -142,6 +144,7 @@ static void txbegin(DB_TXN ** tid) static void dbpanic(DB_ENV * env, int errval) { syslog(LOG_EMERG, "bdb(): PANIC: %s", db_strerror(errval)); + cit_backtrace(); } static void cclose(DBC * cursor) @@ -725,12 +728,15 @@ struct cdbdata *cdb_fetch(int cdb, const void *key, int keylen) if (tempcdb == NULL) { syslog(LOG_EMERG, "cdb_fetch: Cannot allocate memory for tempcdb\n"); cdb_abort(); + return NULL; /* make it easier for static analysis... */ + } + else + { + tempcdb->len = dret.size; + tempcdb->ptr = dret.data; + cdb_decompress_if_necessary(tempcdb); + return (tempcdb); } - - tempcdb->len = dret.size; - tempcdb->ptr = dret.data; - cdb_decompress_if_necessary(tempcdb); - return (tempcdb); } @@ -770,7 +776,7 @@ void cdb_rewind(int cdb) if (TSD->cursors[cdb] != NULL) { syslog(LOG_EMERG, - "cdb_rewind: must close cursor on database %d before reopening.\n", cdb); + "cdb_rewind: must close cursor on database %d before reopening.\n", cdb); cdb_abort(); /* cclose(TSD->cursors[cdb]); */ } @@ -900,3 +906,84 @@ void cdb_trunc(int cdb) } } } + +int SeentDebugEnabled = 0; + +#define DBGLOG(LEVEL) if ((LEVEL != LOG_DEBUG) || (SeentDebugEnabled != 0)) +#define SEENM_syslog(LEVEL, FORMAT) \ + DBGLOG(LEVEL) syslog(LEVEL, \ + "IO[%ld]CC[%ld] SEEN[%s][%d] " FORMAT, \ + ioid, ccid, Facility, cType) + +time_t CheckIfAlreadySeen(const char *Facility, + StrBuf *guid, + time_t now, + time_t antiexpire, + eCheckType cType, + long ccid, + long ioid) +{ + struct UseTable ut; + struct cdbdata *cdbut; + + if (cType != eWrite) + { + time_t InDBTimeStamp = 0; + SEENM_syslog(LOG_DEBUG, "Loading"); + cdbut = cdb_fetch(CDB_USETABLE, SKEY(guid)); + if (cdbut != NULL) { + memcpy(&ut, cdbut->ptr, + ((cdbut->len > sizeof(struct UseTable)) ? + sizeof(struct UseTable) : cdbut->len)); + + if (ut.ut_timestamp > antiexpire) + { + SEENM_syslog(LOG_DEBUG, "Found - Not expired."); + cdb_free(cdbut); + return ut.ut_timestamp; + } + else + { + SEENM_syslog(LOG_DEBUG, "Found - Expired."); + InDBTimeStamp = ut.ut_timestamp; + cdb_free(cdbut); + } + } + else + { + SEENM_syslog(LOG_DEBUG, "not Found"); + } + + if (cType == eCheckExist) + return InDBTimeStamp; + } + + memcpy(ut.ut_msgid, SKEY(guid)); + ut.ut_timestamp = now; + + SEENM_syslog(LOG_DEBUG, "Saving"); + /* rewrite the record anyway, to update the timestamp */ + cdb_store(CDB_USETABLE, + SKEY(guid), + &ut, sizeof(struct UseTable) ); + + SEENM_syslog(LOG_DEBUG, "Done Saving"); + return 0; +} + + +void LogDebugEnableSeenEnable(const int n) +{ + SeentDebugEnabled = n; +} + +CTDL_MODULE_INIT(database) +{ + if (!threading) + { + CtdlRegisterDebugFlagHook(HKEY("SeenDebug"), LogDebugEnableSeenEnable, &SeentDebugEnabled); + } + + /* return our module id for the log */ + return "database"; +}