bug 234695 make nsGlobalHistory use PRTime instead of PRInt64 where appropriate

r=biesi sr=neil patch by Son Le <lesx99@lycos.com>
This commit is contained in:
cbiesinger%web.de 2004-11-12 22:03:11 +00:00
Родитель 4fc5e6f6dd
Коммит 4679f5ffc2
2 изменённых файлов: 40 добавлений и 84 удалений

Просмотреть файл

@ -129,7 +129,7 @@ static NS_DEFINE_CID(kStringBundleServiceCID, NS_STRINGBUNDLESERVICE_CID);
// closure structures for RemoveMatchingRows // closure structures for RemoveMatchingRows
struct matchExpiration_t { struct matchExpiration_t {
PRInt64 *expirationDate; PRTime *expirationDate;
nsGlobalHistory *history; nsGlobalHistory *history;
}; };
@ -202,30 +202,6 @@ struct searchQuery {
mdb_column groupBy; // column to group by mdb_column groupBy; // column to group by
}; };
static nsresult
PRInt64ToChars(const PRInt64& aValue, nsACString& aResult)
{
// Convert an unsigned 64-bit value to a string of up to aSize
// decimal digits, placed in aBuf.
nsInt64 value(aValue);
aResult.Truncate(0);
if (value == nsInt64(0)) {
aResult.Append('0');
}
while (value != nsInt64(0)) {
PRInt32 ones = PRInt32(value % nsInt64(10));
value /= nsInt64(10);
if (ones <=9)
aResult.Insert(char('0' + ones), 0);
}
return NS_OK;
}
static PRBool HasCell(nsIMdbEnv *aEnv, nsIMdbRow* aRow, mdb_column aCol) static PRBool HasCell(nsIMdbEnv *aEnv, nsIMdbRow* aRow, mdb_column aCol)
{ {
mdbYarn yarn; mdbYarn yarn;
@ -239,54 +215,33 @@ static PRBool HasCell(nsIMdbEnv *aEnv, nsIMdbRow* aRow, mdb_column aCol)
return (yarn.mYarn_Fill != 0); return (yarn.mYarn_Fill != 0);
} }
//----------------------------------------------------------------------
static nsresult
CharsToPRInt64(const char* aBuf, PRUint32 aCount, PRInt64* aResult)
{
// Convert aBuf of exactly aCount decimal characters to a 64-bit
// unsigned integer value.
nsInt64 result(0);
while (aCount-- > 0) {
PRInt32 digit = (*aBuf++) - '0';
result *= nsInt64(10);
result += nsInt64(digit);
}
*aResult = result;
return NS_OK;
}
PRTime PRTime
nsGlobalHistory::NormalizeTime(PRInt64 aTime) nsGlobalHistory::NormalizeTime(PRTime aTime)
{ {
// we can optimize this by converting the time to local time, rounding // we can optimize this by converting the time to local time, rounding
// down to the previous day boundary, and then converting back to UTC. // down to the previous day boundary, and then converting back to UTC.
// This avoids two costly calls to localtime() // This avoids two costly calls to localtime()
// we calculate (gmtTime - (gmtTime % MSECS_PER_DAY)) - mCachedGMTOffset // we calculate (gmtTime - (gmtTime % MSECS_PER_DAY)) - mCachedGMTOffset
PRInt64 gmtTime; PRTime gmtTime;
LL_ADD(gmtTime, aTime, mCachedGMTOffset); LL_ADD(gmtTime, aTime, mCachedGMTOffset);
PRInt64 curDayUSec; PRInt64 curDayUSec;
LL_MOD(curDayUSec, gmtTime, MSECS_PER_DAY); LL_MOD(curDayUSec, gmtTime, MSECS_PER_DAY);
PRInt64 gmtMidnight; PRTime gmtMidnight;
LL_SUB(gmtMidnight, gmtTime, curDayUSec); LL_SUB(gmtMidnight, gmtTime, curDayUSec);
PRInt64 localMidnight; PRTime localMidnight;
LL_SUB(localMidnight, gmtMidnight, mCachedGMTOffset); LL_SUB(localMidnight, gmtMidnight, mCachedGMTOffset);
return localMidnight; return localMidnight;
} }
PRInt32 PRInt32
nsGlobalHistory::GetAgeInDays(PRInt64 aDate) nsGlobalHistory::GetAgeInDays(PRTime aDate)
{ {
PRInt64 timeNow = GetNow(); PRTime timeNow = GetNow();
PRInt64 dateMidnight = NormalizeTime(aDate); PRTime dateMidnight = NormalizeTime(aDate);
PRInt64 diff; PRTime diff;
LL_SUB(diff, timeNow, dateMidnight); LL_SUB(diff, timeNow, dateMidnight);
PRInt64 ageInDays; PRInt64 ageInDays;
LL_DIV(ageInDays, diff, MSECS_PER_DAY); LL_DIV(ageInDays, diff, MSECS_PER_DAY);
@ -297,7 +252,7 @@ nsGlobalHistory::GetAgeInDays(PRInt64 aDate)
} }
PRBool PRBool
nsGlobalHistory::MatchExpiration(nsIMdbRow *row, PRInt64* expirationDate) nsGlobalHistory::MatchExpiration(nsIMdbRow *row, PRTime* expirationDate)
{ {
nsresult rv; nsresult rv;
@ -307,7 +262,7 @@ nsGlobalHistory::MatchExpiration(nsIMdbRow *row, PRInt64* expirationDate)
if (HasCell(mEnv, row, kToken_HiddenColumn) && HasCell(mEnv, row, kToken_TypedColumn)) if (HasCell(mEnv, row, kToken_HiddenColumn) && HasCell(mEnv, row, kToken_TypedColumn))
return PR_TRUE; return PR_TRUE;
PRInt64 lastVisitedTime; PRTime lastVisitedTime;
rv = GetRowValue(row, kToken_LastVisitDateColumn, &lastVisitedTime); rv = GetRowValue(row, kToken_LastVisitDateColumn, &lastVisitedTime);
if (NS_FAILED(rv)) if (NS_FAILED(rv))
@ -336,7 +291,6 @@ matchAgeInDaysCallback(nsIMdbRow *row, void *aClosure)
// XXX convert the property to a column, get the column value // XXX convert the property to a column, get the column value
PRInt64 rowDate;
mdb_column column; mdb_column column;
mdb_err err = store->StringToToken(env, "LastVisitDate", &column); mdb_err err = store->StringToToken(env, "LastVisitDate", &column);
if (err != 0) return PR_FALSE; if (err != 0) return PR_FALSE;
@ -345,7 +299,8 @@ matchAgeInDaysCallback(nsIMdbRow *row, void *aClosure)
err = row->AliasCellYarn(env, column, &yarn); err = row->AliasCellYarn(env, column, &yarn);
if (err != 0) return PR_FALSE; if (err != 0) return PR_FALSE;
CharsToPRInt64((const char*)yarn.mYarn_Buf, yarn.mYarn_Fill, &rowDate); PRTime rowDate;
PR_sscanf((const char*)yarn.mYarn_Buf, "%lld", &rowDate);
PRInt32 days = matchSearchTerm->globalHist->GetAgeInDays(rowDate); PRInt32 days = matchSearchTerm->globalHist->GetAgeInDays(rowDate);
@ -638,7 +593,7 @@ nsGlobalHistory::AddURI(nsIURI *aURI, PRBool aRedirect, PRBool aTopLevel, nsIURI
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
} }
PRInt64 now = GetNow(); PRTime now = GetNow();
// For notifying observers, later... // For notifying observers, later...
nsCOMPtr<nsIRDFResource> url; nsCOMPtr<nsIRDFResource> url;
@ -655,7 +610,7 @@ nsGlobalHistory::AddURI(nsIURI *aURI, PRBool aRedirect, PRBool aTopLevel, nsIURI
if (NS_SUCCEEDED(rv)) { if (NS_SUCCEEDED(rv)) {
// update the database, and get the old info back // update the database, and get the old info back
PRInt64 oldDate; PRTime oldDate;
PRInt32 oldCount; PRInt32 oldCount;
rv = AddExistingPageToDatabase(row, now, referrerSpec.get(), &oldDate, &oldCount); rv = AddExistingPageToDatabase(row, now, referrerSpec.get(), &oldDate, &oldCount);
NS_ASSERTION(NS_SUCCEEDED(rv), "AddExistingPageToDatabase failed; see bug 88961"); NS_ASSERTION(NS_SUCCEEDED(rv), "AddExistingPageToDatabase failed; see bug 88961");
@ -741,9 +696,9 @@ nsGlobalHistory::AddURI(nsIURI *aURI, PRBool aRedirect, PRBool aTopLevel, nsIURI
nsresult nsresult
nsGlobalHistory::AddExistingPageToDatabase(nsIMdbRow *row, nsGlobalHistory::AddExistingPageToDatabase(nsIMdbRow *row,
PRInt64 aDate, PRTime aDate,
const char *aReferrer, const char *aReferrer,
PRInt64 *aOldDate, PRTime *aOldDate,
PRInt32 *aOldCount) PRInt32 *aOldCount)
{ {
nsresult rv; nsresult rv;
@ -780,7 +735,7 @@ nsGlobalHistory::AddExistingPageToDatabase(nsIMdbRow *row,
nsresult nsresult
nsGlobalHistory::AddNewPageToDatabase(const char *aURL, nsGlobalHistory::AddNewPageToDatabase(const char *aURL,
PRInt64 aDate, PRTime aDate,
const char *aReferrer, const char *aReferrer,
nsIMdbRow **aResult) nsIMdbRow **aResult)
{ {
@ -855,11 +810,11 @@ nsGlobalHistory::RemovePageInternal(const char *aSpec)
} }
nsresult nsresult
nsGlobalHistory::SetRowValue(nsIMdbRow *aRow, mdb_column aCol, const PRInt64& aValue) nsGlobalHistory::SetRowValue(nsIMdbRow *aRow, mdb_column aCol, const PRTime& aValue)
{ {
mdb_err err; mdb_err err;
nsCAutoString val; nsCAutoString val;
PRInt64ToChars(aValue, val); val.AppendInt(aValue);
mdbYarn yarn = { (void *)val.get(), val.Length(), val.Length(), 0, 0, nsnull }; mdbYarn yarn = { (void *)val.get(), val.Length(), val.Length(), 0, 0, nsnull };
@ -998,7 +953,7 @@ nsGlobalHistory::SwapBytes(const PRUnichar *source, PRUnichar *dest,
nsresult nsresult
nsGlobalHistory::GetRowValue(nsIMdbRow *aRow, mdb_column aCol, nsGlobalHistory::GetRowValue(nsIMdbRow *aRow, mdb_column aCol,
PRInt64 *aResult) PRTime *aResult)
{ {
mdb_err err; mdb_err err;
@ -1011,7 +966,9 @@ nsGlobalHistory::GetRowValue(nsIMdbRow *aRow, mdb_column aCol,
if (!yarn.mYarn_Fill || !yarn.mYarn_Buf) if (!yarn.mYarn_Fill || !yarn.mYarn_Buf)
return NS_OK; return NS_OK;
return CharsToPRInt64((char *)yarn.mYarn_Buf, yarn.mYarn_Fill, aResult); PR_sscanf((const char*)yarn.mYarn_Buf, "%lld", aResult);
return NS_OK;
} }
nsresult nsresult
@ -1531,8 +1488,7 @@ nsGlobalHistory::GetSources(nsIRDFResource* aProperty,
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
nsCAutoString valueStr; nsCAutoString valueStr;
rv = PRInt64ToChars(n, valueStr); valueStr.AppendInt(n);
if (NS_FAILED(rv)) return rv;
value = (void *)ToNewCString(valueStr); value = (void *)ToNewCString(valueStr);
if (aProperty == kNC_Date) if (aProperty == kNC_Date)
@ -1717,7 +1673,7 @@ nsGlobalHistory::GetTarget(nsIRDFResource* aSource,
if (aProperty == kNC_Date || if (aProperty == kNC_Date ||
aProperty == kNC_FirstVisitDate) { aProperty == kNC_FirstVisitDate) {
// Last visit date // Last visit date
PRInt64 i; PRTime i;
if (aProperty == kNC_Date) if (aProperty == kNC_Date)
rv = GetRowValue(row, kToken_LastVisitDateColumn, &i); rv = GetRowValue(row, kToken_LastVisitDateColumn, &i);
else else
@ -1749,7 +1705,7 @@ nsGlobalHistory::GetTarget(nsIRDFResource* aSource,
return CallQueryInterface(visitCountLiteral, aTarget); return CallQueryInterface(visitCountLiteral, aTarget);
} }
else if (aProperty == kNC_AgeInDays) { else if (aProperty == kNC_AgeInDays) {
PRInt64 lastVisitDate; PRTime lastVisitDate;
rv = GetRowValue(row, kToken_LastVisitDateColumn, &lastVisitDate); rv = GetRowValue(row, kToken_LastVisitDateColumn, &lastVisitDate);
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
@ -1871,7 +1827,7 @@ nsGlobalHistory::SetDirty()
// hack to avoid calling PR_Now() too often, as is the case when // hack to avoid calling PR_Now() too often, as is the case when
// we're asked the ageindays of many history entries in a row // we're asked the ageindays of many history entries in a row
PRInt64 PRTime
nsGlobalHistory::GetNow() nsGlobalHistory::GetNow()
{ {
if (!mNowValid) { // not dirty, mLastNow is crufty if (!mNowValid) { // not dirty, mLastNow is crufty
@ -3412,7 +3368,7 @@ nsGlobalHistory::NotifyFindAssertions(nsIRDFResource *aSource,
// appropriate assertions // appropriate assertions
// first pull out the appropriate values // first pull out the appropriate values
PRInt64 lastVisited; PRTime lastVisited;
GetRowValue(aRow, kToken_LastVisitDateColumn, &lastVisited); GetRowValue(aRow, kToken_LastVisitDateColumn, &lastVisited);
PRInt32 ageInDays = GetAgeInDays(lastVisited); PRInt32 ageInDays = GetAgeInDays(lastVisited);
@ -3505,7 +3461,7 @@ nsGlobalHistory::NotifyFindUnassertions(nsIRDFResource *aSource,
NotifyUnassert(kNC_HistoryRoot, kNC_child, aSource); NotifyUnassert(kNC_HistoryRoot, kNC_child, aSource);
// first get age in days // first get age in days
PRInt64 lastVisited; PRTime lastVisited;
GetRowValue(aRow, kToken_LastVisitDateColumn, &lastVisited); GetRowValue(aRow, kToken_LastVisitDateColumn, &lastVisited);
PRInt32 ageInDays = GetAgeInDays(lastVisited); PRInt32 ageInDays = GetAgeInDays(lastVisited);
nsCAutoString ageString; ageString.AppendInt(ageInDays); nsCAutoString ageString; ageString.AppendInt(ageInDays);

Просмотреть файл

@ -147,13 +147,13 @@ public:
virtual ~nsGlobalHistory(); virtual ~nsGlobalHistory();
// these must be public so that the callbacks can call them // these must be public so that the callbacks can call them
PRBool MatchExpiration(nsIMdbRow *row, PRInt64* expirationDate); PRBool MatchExpiration(nsIMdbRow *row, PRTime* expirationDate);
PRBool MatchHost(nsIMdbRow *row, matchHost_t *hostInfo); PRBool MatchHost(nsIMdbRow *row, matchHost_t *hostInfo);
PRBool RowMatches(nsIMdbRow* aRow, searchQuery *aQuery); PRBool RowMatches(nsIMdbRow* aRow, searchQuery *aQuery);
PRInt64 GetNow(); PRTime GetNow();
PRTime NormalizeTime(PRInt64 aTime); PRTime NormalizeTime(PRTime aTime);
PRInt32 GetAgeInDays(PRInt64 aDate); PRInt32 GetAgeInDays(PRTime aDate);
protected: protected:
@ -237,7 +237,7 @@ protected:
// caching of PR_Now() so we don't call it every time we do // caching of PR_Now() so we don't call it every time we do
// a history query // a history query
PRInt64 mLastNow; // cache the last PR_Now() PRTime mLastNow; // cache the last PR_Now()
PRInt64 mCachedGMTOffset; // cached offset from GMT PRInt64 mCachedGMTOffset; // cached offset from GMT
PRInt32 mBatchesInProgress; PRInt32 mBatchesInProgress;
@ -304,12 +304,12 @@ protected:
// AddPage-oriented stuff // AddPage-oriented stuff
// //
nsresult AddExistingPageToDatabase(nsIMdbRow *row, nsresult AddExistingPageToDatabase(nsIMdbRow *row,
PRInt64 aDate, PRTime aDate,
const char *aReferrer, const char *aReferrer,
PRInt64 *aOldDate, PRTime *aOldDate,
PRInt32 *aOldCount); PRInt32 *aOldCount);
nsresult AddNewPageToDatabase(const char *aURL, nsresult AddNewPageToDatabase(const char *aURL,
PRInt64 aDate, PRTime aDate,
const char *aReferrer, const char *aReferrer,
nsIMdbRow **aResult); nsIMdbRow **aResult);
@ -318,14 +318,14 @@ protected:
// //
// generic routines for setting/retrieving various datatypes // generic routines for setting/retrieving various datatypes
// //
nsresult SetRowValue(nsIMdbRow *aRow, mdb_column aCol, const PRInt64& aValue); nsresult SetRowValue(nsIMdbRow *aRow, mdb_column aCol, const PRTime& aValue);
nsresult SetRowValue(nsIMdbRow *aRow, mdb_column aCol, const PRInt32 aValue); nsresult SetRowValue(nsIMdbRow *aRow, mdb_column aCol, const PRInt32 aValue);
nsresult SetRowValue(nsIMdbRow *aRow, mdb_column aCol, const char *aValue); nsresult SetRowValue(nsIMdbRow *aRow, mdb_column aCol, const char *aValue);
nsresult SetRowValue(nsIMdbRow *aRow, mdb_column aCol, const PRUnichar *aValue); nsresult SetRowValue(nsIMdbRow *aRow, mdb_column aCol, const PRUnichar *aValue);
nsresult GetRowValue(nsIMdbRow *aRow, mdb_column aCol, nsAString& aResult); nsresult GetRowValue(nsIMdbRow *aRow, mdb_column aCol, nsAString& aResult);
nsresult GetRowValue(nsIMdbRow *aRow, mdb_column aCol, nsACString& aResult); nsresult GetRowValue(nsIMdbRow *aRow, mdb_column aCol, nsACString& aResult);
nsresult GetRowValue(nsIMdbRow *aRow, mdb_column aCol, PRInt64* aResult); nsresult GetRowValue(nsIMdbRow *aRow, mdb_column aCol, PRTime* aResult);
nsresult GetRowValue(nsIMdbRow *aRow, mdb_column aCol, PRInt32* aResult); nsresult GetRowValue(nsIMdbRow *aRow, mdb_column aCol, PRInt32* aResult);
nsresult FindRow(mdb_column aCol, const char *aURL, nsIMdbRow **aResult); nsresult FindRow(mdb_column aCol, const char *aURL, nsIMdbRow **aResult);