big 'ol global history cleanup:

- remove lots of string assertions by avoiding using string classes on null strings
- clean up all known leaks
bug 112058, r=pchen, sr=blake
This commit is contained in:
alecf%netscape.com 2001-11-29 00:02:16 +00:00
parent 523be41c46
commit d7b67a31f3
2 changed files with 49 additions and 16 deletions

View File

@ -149,7 +149,8 @@ public:
tokenPair(const char *aName, PRUint32 aNameLen, tokenPair(const char *aName, PRUint32 aNameLen,
const char *aValue, PRUint32 aValueLen) : const char *aValue, PRUint32 aValueLen) :
tokenName(aName), tokenNameLength(aNameLen), tokenName(aName), tokenNameLength(aNameLen),
tokenValue(aValue), tokenValueLength(aValueLen) {} tokenValue(aValue), tokenValueLength(aValueLen) { MOZ_COUNT_CTOR(tokenPair); }
~tokenPair() { MOZ_COUNT_DTOR(tokenPair); }
const char* tokenName; const char* tokenName;
PRUint32 tokenNameLength; PRUint32 tokenNameLength;
const char* tokenValue; const char* tokenValue;
@ -167,10 +168,14 @@ public:
property(aProperty, aProperty+aPropertyLen), property(aProperty, aProperty+aPropertyLen),
method(aMethod, aMethod+aMethodLen) method(aMethod, aMethod+aMethodLen)
{ {
MOZ_COUNT_CTOR(searchTerm);
// need to do UTF8-conversion/unescaping here, using // need to do UTF8-conversion/unescaping here, using
// nsITextToSubURI // nsITextToSubURI
text.AssignWithConversion(aText, aTextLen); text.AssignWithConversion(aText, aTextLen);
} }
~searchTerm() {
MOZ_COUNT_DTOR(searchTerm);
}
nsDependentSingleFragmentCSubstring datasource; // should always be "history" ? nsDependentSingleFragmentCSubstring datasource; // should always be "history" ?
nsDependentSingleFragmentCSubstring property; // AgeInDays, Hostname, etc nsDependentSingleFragmentCSubstring property; // AgeInDays, Hostname, etc
@ -505,6 +510,9 @@ nsGlobalHistory::~nsGlobalHistory()
nsresult rv; nsresult rv;
rv = CloseDB(); rv = CloseDB();
NS_IF_RELEASE(mTable);
NS_IF_RELEASE(mStore);
if (--gRefCnt == 0) { if (--gRefCnt == 0) {
if (gRDFService) { if (gRDFService) {
nsServiceManager::ReleaseService(kRDFServiceCID, gRDFService); nsServiceManager::ReleaseService(kRDFServiceCID, gRDFService);
@ -528,6 +536,7 @@ nsGlobalHistory::~nsGlobalHistory()
NS_IF_RELEASE(gMdbFactory); NS_IF_RELEASE(gMdbFactory);
} }
NS_IF_RELEASE(mEnv);
if (mSyncTimer) if (mSyncTimer)
mSyncTimer->Cancel(); mSyncTimer->Cancel();
@ -865,7 +874,10 @@ nsGlobalHistory::GetRowValue(nsIMdbRow *aRow, mdb_column aCol,
if (err != 0) return NS_ERROR_FAILURE; if (err != 0) return NS_ERROR_FAILURE;
const char* startPtr = (const char*)yarn.mYarn_Buf; const char* startPtr = (const char*)yarn.mYarn_Buf;
aResult.Assign(Substring(startPtr, startPtr + yarn.mYarn_Fill)); if (startPtr)
aResult.Assign(Substring(startPtr, startPtr + yarn.mYarn_Fill));
else
aResult.Truncate();
return NS_OK; return NS_OK;
} }
@ -1842,6 +1854,7 @@ nsGlobalHistory::HasAssertion(nsIRDFResource* aSource,
} }
*aHasAssertion = RowMatches(row, &query); *aHasAssertion = RowMatches(row, &query);
FreeSearchQuery(query);
return NS_OK; return NS_OK;
} }
@ -2850,6 +2863,18 @@ nsGlobalHistory::FreeTokenList(nsVoidArray& tokens)
tokens.Clear(); tokens.Clear();
} }
void nsGlobalHistory::FreeSearchQuery(searchQuery& aQuery)
{
// free up the token pairs
PRInt32 i;
for (i=0; i<aQuery.terms.Count(); i++) {
searchTerm *term = (searchTerm*)aQuery.terms.ElementAt(i);
delete term;
}
// clean out the array, just for good measure
aQuery.terms.Clear();
}
// //
// helper function to figure out if something starts with "find" // helper function to figure out if something starts with "find"
// //
@ -3111,10 +3136,6 @@ nsGlobalHistory::NotifyFindUnassertions(nsIRDFResource *aSource,
query.terms.AppendElement((void *)&hostterm); query.terms.AppendElement((void *)&hostterm);
GetFindUriPrefix(query, PR_FALSE, findUri); GetFindUriPrefix(query, PR_FALSE, findUri);
// XXX |sourceStr| unused ... why are we doing this?
const char* sourceStr;
aSource->GetValueConst(&sourceStr);
gRDFService->GetResource(findUri.get(), getter_AddRefs(findResource)); gRDFService->GetResource(findUri.get(), getter_AddRefs(findResource));
NotifyUnassert(findResource, kNC_child, aSource); NotifyUnassert(findResource, kNC_child, aSource);
@ -3149,9 +3170,9 @@ nsGlobalHistory::GetFindUriName(const char *aURL, nsIRDFNode **aResult)
if (query.terms.Count() < 1) if (query.terms.Count() < 1)
return NS_OK; return NS_OK;
// now build up a string from the query // now build up a string from the query (using only the last term)
searchTerm *term = (searchTerm*)query.terms[query.terms.Count()-1]; searchTerm *term = (searchTerm*)query.terms[query.terms.Count()-1];
// automatically build up string in the form // automatically build up string in the form
// findurl-<property>-<method>[-<text>] // findurl-<property>-<method>[-<text>]
// such as "finduri-AgeInDays-is" or "find-uri-AgeInDays-is-0" // such as "finduri-AgeInDays-is" or "find-uri-AgeInDays-is-0"
@ -3198,6 +3219,8 @@ nsGlobalHistory::GetFindUriName(const char *aURL, nsIRDFNode **aResult)
rv = gRDFService->GetLiteral(term->text.get(), rv = gRDFService->GetLiteral(term->text.get(),
getter_AddRefs(literal)); getter_AddRefs(literal));
} }
FreeSearchQuery(query);
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
*aResult = literal; *aResult = literal;
@ -3311,8 +3334,8 @@ nsGlobalHistory::URLEnumerator::ConvertToISupports(nsIMdbRow* aRow, nsISupports*
nsGlobalHistory::SearchEnumerator::~SearchEnumerator() nsGlobalHistory::SearchEnumerator::~SearchEnumerator()
{ {
// free up the query nsGlobalHistory::FreeSearchQuery(*mQuery);
delete mQuery;
} }
@ -3414,6 +3437,7 @@ nsGlobalHistory::SearchEnumerator::IsResult(nsIMdbRow *aRow)
err = aRow->AliasCellYarn(mEnv, mQuery->groupBy, &groupColumnValue); err = aRow->AliasCellYarn(mEnv, mQuery->groupBy, &groupColumnValue);
if (err!=0) return PR_FALSE; if (err!=0) return PR_FALSE;
if (!groupColumnValue.mYarn_Buf) return PR_FALSE;
nsCStringKey key(nsCAutoString((const char*)groupColumnValue.mYarn_Buf, nsCStringKey key(nsCAutoString((const char*)groupColumnValue.mYarn_Buf,
groupColumnValue.mYarn_Fill)); groupColumnValue.mYarn_Fill));
@ -3482,11 +3506,20 @@ nsGlobalHistory::RowMatches(nsIMdbRow *aRow,
// match the term directly against the column? // match the term directly against the column?
mdbYarn yarn; mdbYarn yarn;
aRow->AliasCellYarn(mEnv, property_column, &yarn); err = aRow->AliasCellYarn(mEnv, property_column, &yarn);
if (err != 0 || !yarn.mYarn_Buf) return PR_FALSE;
const char* startPtr = (const char *)yarn.mYarn_Buf; const char* startPtr;
PRInt32 yarnLength = yarn.mYarn_Fill;
// account for null strings
if (yarn.mYarn_Buf)
startPtr = (const char *)yarn.mYarn_Buf;
else
startPtr = "";
const nsASingleFragmentCString& rowVal = const nsASingleFragmentCString& rowVal =
Substring(startPtr, startPtr + yarn.mYarn_Fill); Substring(startPtr, startPtr + yarnLength);
// set up some iterators // set up some iterators
nsASingleFragmentCString::const_iterator start, end; nsASingleFragmentCString::const_iterator start, end;
@ -3646,7 +3679,7 @@ nsGlobalHistory::AutoCompleteEnumerator::ConvertToISupports(nsIMdbRow* aRow, nsI
nsCOMPtr<nsIAutoCompleteItem> newItem(do_CreateInstance(NS_AUTOCOMPLETEITEM_CONTRACTID)); nsCOMPtr<nsIAutoCompleteItem> newItem(do_CreateInstance(NS_AUTOCOMPLETEITEM_CONTRACTID));
NS_ENSURE_TRUE(newItem, NS_ERROR_FAILURE); NS_ENSURE_TRUE(newItem, NS_ERROR_FAILURE);
newItem->SetValue(NS_ConvertASCIItoUCS2(url.get())); newItem->SetValue(NS_ConvertUTF8toUCS2(url.get()));
newItem->SetComment(comments.get()); newItem->SetComment(comments.get());
@ -3954,12 +3987,11 @@ AutoCompleteSortComparison(const void *v1, const void *v2, void *unused)
{ {
nsIAutoCompleteItem *item1 = *(nsIAutoCompleteItem**) v1; nsIAutoCompleteItem *item1 = *(nsIAutoCompleteItem**) v1;
nsIAutoCompleteItem *item2 = *(nsIAutoCompleteItem**) v2; nsIAutoCompleteItem *item2 = *(nsIAutoCompleteItem**) v2;
nsAutoString s1; nsAutoString s1;
item1->GetValue(s1); item1->GetValue(s1);
nsAutoString s2; nsAutoString s2;
item2->GetValue(s2); item2->GetValue(s2);
return nsCRT::strcmp(s1.get(), s2.get()); return nsCRT::strcmp(s1.get(), s2.get());
} }

View File

@ -184,6 +184,7 @@ protected:
static nsresult FindUrlToTokenList(const char *aURL, nsVoidArray& aResult); static nsresult FindUrlToTokenList(const char *aURL, nsVoidArray& aResult);
static void FreeTokenList(nsVoidArray& tokens); static void FreeTokenList(nsVoidArray& tokens);
static void FreeSearchQuery(searchQuery& aQuery);
static PRBool IsFindResource(nsIRDFResource *aResource); static PRBool IsFindResource(nsIRDFResource *aResource);
void GetFindUriPrefix(const searchQuery& aQuery, void GetFindUriPrefix(const searchQuery& aQuery,
const PRBool aDoGroupBy, const PRBool aDoGroupBy,