try to fix nstmp files appearing in pop3/local accounts after folder compaction, sr=mscott, a=asa, 88515

git-svn-id: svn://10.0.0.236/trunk@175544 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
bienvenu%nventure.com
2005-07-02 23:51:37 +00:00
parent eecdd652d5
commit 4dd240985a
2 changed files with 96 additions and 22 deletions

View File

@@ -117,10 +117,10 @@ void nsFolderCompactState::CleanupTempFilesAfterError()
nsresult nsFolderCompactState::BuildMessageURI(const char *baseURI, PRUint32 key, nsCString& uri)
{
uri.Append(baseURI);
uri.Append('#');
uri.AppendInt(key);
return NS_OK;
uri.Append(baseURI);
uri.Append('#');
uri.AppendInt(key);
return NS_OK;
}
@@ -411,26 +411,49 @@ nsFolderCompactState::FinishCompact()
// close down database of the original folder and remove the folder node
// and all it's message node from the tree
m_folder->ForceDBClosed();
PRBool folderRenameSucceeded = PR_FALSE;
PRBool msfRenameSucceeded = PR_FALSE;
// remove the old folder and database
fileSpec.Delete(PR_FALSE);
summarySpec.Delete(PR_FALSE);
// rename the copied folder and database to be the original folder and
// database
m_fileSpec.Rename(leafName.get());
newSummarySpec.Rename(dbName.get());
if (!fileSpec.Exists())
{
summarySpec.Delete(PR_FALSE);
if (!summarySpec.Exists())
{
// rename the copied folder and database to be the original folder and
// database
rv = m_fileSpec.Rename(leafName.get());
NS_ASSERTION(NS_SUCCEEDED(rv), "error renaming compacted folder");
if (NS_SUCCEEDED(rv))
{
folderRenameSucceeded = PR_TRUE;
rv = newSummarySpec.Rename(dbName.get());
NS_ASSERTION(NS_SUCCEEDED(rv), "error renaming compacted folder's db");
msfRenameSucceeded = NS_SUCCEEDED(rv);
}
}
}
NS_ASSERTION(msfRenameSucceeded && folderRenameSucceeded, "rename failed in compact");
if (!folderRenameSucceeded)
m_fileSpec.Delete(PR_FALSE);
if (!msfRenameSucceeded)
newSummarySpec.Delete(PR_FALSE);
rv = ReleaseFolderLock();
NS_ASSERTION(NS_SUCCEEDED(rv),"folder lock not released successfully");
m_folder->SetDBTransferInfo(transferInfo);
if (msfRenameSucceeded && folderRenameSucceeded)
{
m_folder->SetDBTransferInfo(transferInfo);
nsCOMPtr <nsIDBFolderInfo> dbFolderInfo;
nsCOMPtr <nsIDBFolderInfo> dbFolderInfo;
m_folder->GetDBFolderInfoAndDB(getter_AddRefs(dbFolderInfo), getter_AddRefs(m_db));
m_folder->GetDBFolderInfoAndDB(getter_AddRefs(dbFolderInfo), getter_AddRefs(m_db));
// since we're transferring info from the old db, we need to reset the expunged bytes,
// and set the summary valid again.
if(dbFolderInfo)
dbFolderInfo->SetExpungedBytes(0);
// since we're transferring info from the old db, we need to reset the expunged bytes,
// and set the summary valid again.
if(dbFolderInfo)
dbFolderInfo->SetExpungedBytes(0);
}
if (m_db)
m_db->Close(PR_TRUE);
m_db = nsnull;

View File

@@ -2747,7 +2747,7 @@ NS_IMETHODIMP nsMsgDatabase::ListAllKeys(nsMsgKeyArray &outputKeys)
return err;
}
class nsMsgDBThreadEnumerator : public nsISimpleEnumerator
class nsMsgDBThreadEnumerator : public nsISimpleEnumerator, public nsIDBChangeListener
{
public:
NS_DECL_ISUPPORTS
@@ -2755,6 +2755,8 @@ public:
// nsISimpleEnumerator methods:
NS_DECL_NSISIMPLEENUMERATOR
NS_DECL_NSIDBCHANGELISTENER
// nsMsgDBEnumerator methods:
typedef nsresult (*nsMsgDBThreadEnumeratorFilter)(nsIMsgThread* thread);
@@ -2778,17 +2780,63 @@ nsMsgDBThreadEnumerator::nsMsgDBThreadEnumerator(nsMsgDatabase* db,
mFilter(filter)
{
NS_ADDREF(mDB);
mDB->AddListener(this);
mNextPrefetched = PR_FALSE;
}
nsMsgDBThreadEnumerator::~nsMsgDBThreadEnumerator()
{
mTableCursor->Release();
NS_IF_RELEASE(mResultThread);
NS_RELEASE(mDB);
NS_IF_RELEASE(mResultThread);
NS_IF_RELEASE(mDB);
}
NS_IMPL_ISUPPORTS1(nsMsgDBThreadEnumerator, nsISimpleEnumerator)
NS_IMPL_ISUPPORTS2(nsMsgDBThreadEnumerator, nsISimpleEnumerator, nsIDBChangeListener)
/* void onHdrChange (in nsIMsgDBHdr aHdrChanged, in unsigned long aOldFlags, in unsigned long aNewFlags, in nsIDBChangeListener aInstigator); */
NS_IMETHODIMP nsMsgDBThreadEnumerator::OnHdrChange(nsIMsgDBHdr *aHdrChanged, PRUint32 aOldFlags, PRUint32 aNewFlags, nsIDBChangeListener *aInstigator)
{
return NS_OK;
}
/* void onHdrDeleted (in nsIMsgDBHdr aHdrChanged, in nsMsgKey aParentKey, in long aFlags, in nsIDBChangeListener aInstigator); */
NS_IMETHODIMP nsMsgDBThreadEnumerator::OnHdrDeleted(nsIMsgDBHdr *aHdrChanged, nsMsgKey aParentKey, PRInt32 aFlags, nsIDBChangeListener *aInstigator)
{
return NS_OK;
}
/* void onHdrAdded (in nsIMsgDBHdr aHdrChanged, in nsMsgKey aParentKey, in long aFlags, in nsIDBChangeListener aInstigator); */
NS_IMETHODIMP nsMsgDBThreadEnumerator::OnHdrAdded(nsIMsgDBHdr *aHdrChanged, nsMsgKey aParentKey, PRInt32 aFlags, nsIDBChangeListener *aInstigator)
{
return NS_OK;
}
/* void onParentChanged (in nsMsgKey aKeyChanged, in nsMsgKey oldParent, in nsMsgKey newParent, in nsIDBChangeListener aInstigator); */
NS_IMETHODIMP nsMsgDBThreadEnumerator::OnParentChanged(nsMsgKey aKeyChanged, nsMsgKey oldParent, nsMsgKey newParent, nsIDBChangeListener *aInstigator)
{
return NS_OK;
}
/* void onAnnouncerGoingAway (in nsIDBChangeAnnouncer instigator); */
NS_IMETHODIMP nsMsgDBThreadEnumerator::OnAnnouncerGoingAway(nsIDBChangeAnnouncer *instigator)
{
mDB->RemoveListener(this);
mDB = nsnull;
return NS_OK;
}
/* void onReadChanged (in nsIDBChangeListener aInstigator); */
NS_IMETHODIMP nsMsgDBThreadEnumerator::OnReadChanged(nsIDBChangeListener *aInstigator)
{
return NS_OK;
}
/* void onJunkScoreChanged (in nsIDBChangeListener aInstigator); */
NS_IMETHODIMP nsMsgDBThreadEnumerator::OnJunkScoreChanged(nsIDBChangeListener *aInstigator)
{
return NS_OK;
}
nsresult nsMsgDBThreadEnumerator::GetTableCursor(void)
{
@@ -2830,7 +2878,10 @@ nsresult nsMsgDBThreadEnumerator::PrefetchNext()
{
nsresult rv;
nsIMdbTable *table = nsnull;
if (!mDB)
return NS_ERROR_NULL_POINTER;
if (!mTableCursor)
{
rv = GetTableCursor();