Bug 572223 - too much cookies.sqlite io. Part 7: fix creationid logic. r=sdwilsh

This commit is contained in:
Dan Witte 2010-08-02 17:03:24 -07:00
Родитель 7966b54c9d
Коммит dcc2fb5235
3 изменённых файлов: 29 добавлений и 12 удалений

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

@ -83,6 +83,20 @@ StrBlockCopy(const nsACString &aSource1,
// check each id to enforce monotonicity.
static PRInt64 gLastCreationID;
PRInt64
nsCookie::GenerateCreationID(PRInt64 aCreationTime)
{
// Check if the creation time given to us is greater than the running maximum
// (it should always be monotonically increasing).
if (aCreationTime > gLastCreationID) {
gLastCreationID = aCreationTime;
return aCreationTime;
}
// Make up our own.
return ++gLastCreationID;
}
nsCookie *
nsCookie::Create(const nsACString &aName,
const nsACString &aValue,
@ -111,12 +125,9 @@ nsCookie::Create(const nsACString &aName,
StrBlockCopy(aName, aValue, aHost, aPath,
name, value, host, path, end);
// check if the creation id given to us is greater than the running maximum
// (it should always be monotonically increasing). if it's not, make up our own.
// If the creationID given to us is higher than the running maximum, update it.
if (aCreationID > gLastCreationID)
gLastCreationID = aCreationID;
else
aCreationID = ++gLastCreationID;
// construct the cookie. placement new, oh yeah!
return new (place) nsCookie(name, value, host, path, end,

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

@ -90,6 +90,11 @@ class nsCookie : public nsICookie2
}
public:
// Generate a unique creationID. This will usually be the same as the
// creation time, but with a guarantee of monotonicity such that it can
// be used as a sqlite rowid.
static PRInt64 GenerateCreationID(PRInt64 aCreationTime);
// public helper to create an nsCookie object. use |operator delete|
// to destroy an object created by this method.
static nsCookie * Create(const nsACString &aName,

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

@ -852,6 +852,7 @@ nsCookieService::TryInitDB(PRBool aDeleteExistingDB)
"host, "
"path, "
"expiry, "
"lastAccessed, "
"isSecure, "
"isHttpOnly "
"FROM moz_cookies"), getter_AddRefs(stmt));
@ -1337,7 +1338,7 @@ nsCookieService::Add(const nsACString &aHost,
nsCookie::Create(aName, aValue, host, aPath,
aExpiry,
currentTimeInUsec,
currentTimeInUsec,
nsCookie::GenerateCreationID(currentTimeInUsec),
aIsSession,
aIsSecure,
aIsHttpOnly);
@ -1454,7 +1455,8 @@ nsCookieService::GetCookieFromRow(T &aRow)
PRBool isSecure = 0 != aRow->AsInt32(7);
PRBool isHttpOnly = 0 != aRow->AsInt32(8);
// create a new nsCookie and assign the data.
// Create a new nsCookie and assign the data. We are guaranteed that the
// creationID is unique, since we're reading it from the db itself.
return nsCookie::Create(name, value, host, path,
expiry,
lastAccessed,
@ -1784,10 +1786,9 @@ nsCookieService::ImportCookies(nsIFile *aCookieFile)
if (NS_FAILED(rv))
continue;
// create a new nsCookie and assign the data.
// we don't know the cookie creation time, so just use the current time;
// this is okay, since nsCookie::Create() will make sure the creation id
// ends up monotonically increasing.
// Create a new nsCookie and assign the data.
// We don't know the cookie creation time, so just use the current time
// to generate a unique creationID.
nsRefPtr<nsCookie> newCookie =
nsCookie::Create(Substring(buffer, nameIndex, cookieIndex - nameIndex - 1),
Substring(buffer, cookieIndex, buffer.Length() - cookieIndex),
@ -1795,7 +1796,7 @@ nsCookieService::ImportCookies(nsIFile *aCookieFile)
Substring(buffer, pathIndex, secureIndex - pathIndex - 1),
expires,
lastAccessedCounter,
currentTimeInUsec,
nsCookie::GenerateCreationID(currentTimeInUsec),
PR_FALSE,
Substring(buffer, secureIndex, expiresIndex - secureIndex - 1).EqualsLiteral(kTrue),
isHttpOnly);
@ -2119,7 +2120,7 @@ nsCookieService::SetCookieInternal(nsIURI *aHostURI,
cookieAttributes.path,
cookieAttributes.expiryTime,
currentTimeInUsec,
currentTimeInUsec,
nsCookie::GenerateCreationID(currentTimeInUsec),
cookieAttributes.isSession,
cookieAttributes.isSecure,
cookieAttributes.isHttpOnly);