BOOL RemoveOldEntries(bool checkIdleTime) { Log(StrF(_T("Beginning of RemoveOldEntries MaxEntries: %d - Keep days: %d"), CGetSetOptions::GetMaxEntries(), CGetSetOptions::GetExpiredEntries())); try { CppSQLite3DB db; CString csDbPath = CGetSetOptions::GetDBPath(); db.open(csDbPath); if(CGetSetOptions::GetCheckForMaxEntries()) { long lMax = CGetSetOptions::GetMaxEntries(); if(lMax >= 0) { CClipIDs IDs; int clipId; CppSQLite3Query q = db.execQueryEx(_T("SELECT lID, lShortCut, lParentID, lDontAutoDelete, stickyClipOrder, stickyClipGroupOrder FROM Main WHERE bIsGroup = 0 ORDER BY clipOrder DESC LIMIT -1 OFFSET %d"), lMax); while(q.eof() == false) { int shortcut = q.getIntField(_T("lShortCut")); int dontDelete = q.getIntField(_T("lDontAutoDelete")); int parentId = q.getIntField(_T("lParentID")); double stickyClipOrder = q.getFloatField(_T("stickyClipOrder")); double stickyClipGroupOrder = q.getFloatField(_T("stickyClipGroupOrder")); //Only delete entries that have no shortcut and don't have the flag set and aren't in groups and if(shortcut == 0 && dontDelete == 0 && parentId <= 0 && stickyClipOrder == 0.0 && stickyClipGroupOrder == 0.0) { clipId = q.getIntField(_T("lID")); IDs.Add(clipId); Log(StrF(_T("From MaxEntries - Deleting Id: %d"), clipId)); } q.nextRow(); } if(IDs.GetCount() > 0) { IDs.DeleteIDs(false, db); } } } if(CGetSetOptions::GetCheckForExpiredEntries()) { long lExpire = CGetSetOptions::GetExpiredEntries(); if(lExpire) { CTime now = CTime::GetCurrentTime(); now -= CTimeSpan(lExpire, 0, 0, 0); CClipIDs IDs; CppSQLite3Query q = db.execQueryEx(_T("SELECT lID FROM Main ") _T("WHERE lastPasteDate < %d AND ") _T("bIsGroup = 0 AND lShortCut = 0 AND lParentID <= 0 AND lDontAutoDelete = 0 AND stickyClipOrder = 0 AND stickyClipGroupOrder = 0"), (int)now.GetTime()); while(q.eof() == false) { IDs.Add(q.getIntField(_T("lID"))); Log(StrF(_T("From Clips Expire - Deleting Id: %d"), q.getIntField(_T("lID")))); q.nextRow(); } if(IDs.GetCount() > 0) { IDs.DeleteIDs(false, db); } } } int toDeleteCount = db.execScalar(_T("SELECT COUNT(clipID) FROM MainDeletes")); Log(StrF(_T("Before Deleting emptied out data, count: %d, Idle Seconds: %f"), toDeleteCount, IdleSeconds())); //Only delete 1 at a time, was finding that it was taking a long time to delete clips, locking the db and causing other queries //to lock up CppSQLite3Query q = db.execQueryEx(_T("SELECT * FROM MainDeletes LIMIT %d"), CGetSetOptions::GetMainDeletesDeleteCount()); int deleteCount = 0; while(q.eof() == false) { double idleSeconds = IdleSeconds(); if(checkIdleTime == false || idleSeconds > CGetSetOptions::GetIdleSecondsBeforeDelete()) { //delete any data items sitting out there that the main table data was deleted //this was done to speed up deleted from the main table deleteCount = db.execDMLEx(_T("DELETE FROM MainDeletes WHERE clipID=%d"), q.getIntField(_T("clipID"))); } else { Log(StrF(_T("Computer has not been idle long enough to delete clips, Min Idle: %d, current Idle: %d"), CGetSetOptions::GetIdleSecondsBeforeDelete(), idleSeconds)); break; } q.nextRow(); } toDeleteCount = db.execScalar(_T("SELECT COUNT(clipID) FROM MainDeletes")); Log(StrF(_T("After Deleting emptied out data rows, Count: %d, toDelete: %d"), deleteCount, toDeleteCount)); } CATCH_SQLITE_EXCEPTION Log(_T("End of RemoveOldEntries")); return TRUE; }