Bug 449640 - Modify the places backend to use the temporary tables &

Bug 450705 - Optimize the query changes from the temp table rewrite
This changeset merges patches from two bugs to actually use the temporary tables
created for places.
Bug 449640 patch by Shawn Wilsher <sdwilsh@shawnwilsher.com>
r=dietrich, r=Mak77
Bug 450705 patch by Marco Bonardo <mak77@bonardo.net>
r=sdwilsh, r=dietrich, r=Mardak
This commit is contained in:
Marco Bonardo ext:(%2C%20Shawn%20Wilsher%20%3Csdwilsh%40shawnwilsher.com%3E) 2008-10-17 06:12:51 -04:00
Родитель 4e36cb2d33
Коммит ab683c2014
10 изменённых файлов: 1629 добавлений и 657 удалений

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

@ -109,7 +109,8 @@ nsAnnotationService::Init()
// mDBSetAnnotation
rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING(
"UPDATE moz_annos "
"SET mime_type = ?4, content = ?5, flags = ?6, expiration = ?7, type = ?8, lastModified = ?10 "
"SET mime_type = ?4, content = ?5, flags = ?6, expiration = ?7, "
"type = ?8, lastModified = ?10 "
"WHERE id = ?1"),
getter_AddRefs(mDBSetAnnotation));
NS_ENSURE_SUCCESS(rv, rv);
@ -117,7 +118,8 @@ nsAnnotationService::Init()
// mDBSetItemAnnotation
rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING(
"UPDATE moz_items_annos "
"SET mime_type = ?4, content = ?5, flags = ?6, expiration = ?7, type = ?8, lastModified = ?10 "
"SET mime_type = ?4, content = ?5, flags = ?6, expiration = ?7, "
"type = ?8, lastModified = ?10 "
"WHERE id = ?1"),
getter_AddRefs(mDBSetItemAnnotation));
NS_ENSURE_SUCCESS(rv, rv);
@ -127,7 +129,7 @@ nsAnnotationService::Init()
"SELECT * "
"FROM moz_annos "
"WHERE place_id = ?1 AND anno_attribute_id = "
"(SELECT id FROM moz_anno_attributes WHERE name = ?2)"),
"(SELECT id FROM moz_anno_attributes WHERE name = ?2)"),
getter_AddRefs(mDBGetAnnotation));
NS_ENSURE_SUCCESS(rv, rv);
@ -136,14 +138,15 @@ nsAnnotationService::Init()
"SELECT * "
"FROM moz_items_annos "
"WHERE item_id = ?1 AND anno_attribute_id = "
"(SELECT id FROM moz_anno_attributes WHERE name = ?2)"),
"(SELECT id FROM moz_anno_attributes WHERE name = ?2)"),
getter_AddRefs(mDBGetItemAnnotation));
NS_ENSURE_SUCCESS(rv, rv);
// mDBGetAnnotationNames
rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING(
"SELECT n.name "
"FROM moz_annos a LEFT JOIN moz_anno_attributes n ON a.anno_attribute_id = n.id "
"FROM moz_annos a "
"JOIN moz_anno_attributes n ON a.anno_attribute_id = n.id "
"WHERE a.place_id = ?1"),
getter_AddRefs(mDBGetAnnotationNames));
NS_ENSURE_SUCCESS(rv, rv);
@ -151,18 +154,29 @@ nsAnnotationService::Init()
// mDBGetItemAnnotationNames
rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING(
"SELECT n.name "
"FROM moz_items_annos a LEFT JOIN moz_anno_attributes n ON a.anno_attribute_id = n.id "
"FROM moz_items_annos a "
"JOIN moz_anno_attributes n ON a.anno_attribute_id = n.id "
"WHERE a.item_id = ?1"),
getter_AddRefs(mDBGetItemAnnotationNames));
NS_ENSURE_SUCCESS(rv, rv);
// mDBGetAnnotationFromURI
// We are not checking for duplicated ids into the unified table
// for perf reasons, LIMIT 1 will discard duplicates faster since we
// can only have one anno with a certain name for every place_id.
rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING(
"SELECT a.id, a.place_id, ?2, a.mime_type, a.content, a.flags, "
"a.expiration, a.type "
"FROM moz_places h JOIN moz_annos a ON h.id = a.place_id "
"WHERE h.url = ?1 AND a.anno_attribute_id = "
"(SELECT id FROM moz_anno_attributes WHERE name = ?2)"),
"FROM ( "
"SELECT id FROM moz_places_temp "
"WHERE url = ?1 "
"UNION ALL "
"SELECT id FROM moz_places "
"WHERE url = ?1 "
") AS h JOIN moz_annos a ON h.id = a.place_id "
"WHERE a.anno_attribute_id = "
"(SELECT id FROM moz_anno_attributes WHERE name = ?2) "
"LIMIT 1"),
getter_AddRefs(mDBGetAnnotationFromURI));
NS_ENSURE_SUCCESS(rv, rv);
@ -172,7 +186,7 @@ nsAnnotationService::Init()
"a.expiration, a.type "
"FROM moz_items_annos a "
"WHERE a.item_id = ?1 AND a.anno_attribute_id = "
"(SELECT id FROM moz_anno_attributes WHERE name = ?2)"),
"(SELECT id FROM moz_anno_attributes WHERE name = ?2)"),
getter_AddRefs(mDBGetAnnotationFromItemId));
NS_ENSURE_SUCCESS(rv, rv);
@ -192,7 +206,8 @@ nsAnnotationService::Init()
// Note: kAnnoIndex_Name here is a name ID and not a string like the getters
rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING(
"INSERT INTO moz_annos "
"(place_id, anno_attribute_id, mime_type, content, flags, expiration, type, dateAdded) "
"(place_id, anno_attribute_id, mime_type, content, flags, expiration, "
"type, dateAdded) "
"VALUES (?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)"),
getter_AddRefs(mDBAddAnnotation));
NS_ENSURE_SUCCESS(rv, rv);
@ -201,7 +216,8 @@ nsAnnotationService::Init()
// Note: kAnnoIndex_Name here is a name ID and not a string like the getters
rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING(
"INSERT INTO moz_items_annos "
"(item_id, anno_attribute_id, mime_type, content, flags, expiration, type, dateAdded) "
"(item_id, anno_attribute_id, mime_type, content, flags, expiration, "
"type, dateAdded) "
"VALUES (?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)"),
getter_AddRefs(mDBAddItemAnnotation));
NS_ENSURE_SUCCESS(rv, rv);
@ -209,21 +225,21 @@ nsAnnotationService::Init()
// mDBRemoveAnnotation
rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING(
"DELETE FROM moz_annos WHERE place_id = ?1 AND anno_attribute_id = "
"(SELECT id FROM moz_anno_attributes WHERE name = ?2)"),
"(SELECT id FROM moz_anno_attributes WHERE name = ?2)"),
getter_AddRefs(mDBRemoveAnnotation));
NS_ENSURE_SUCCESS(rv, rv);
// mDBRemoveItemAnnotation
rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING(
"DELETE FROM moz_items_annos WHERE item_id = ?1 AND anno_attribute_id = "
"(SELECT id FROM moz_anno_attributes WHERE name = ?2)"),
"(SELECT id FROM moz_anno_attributes WHERE name = ?2)"),
getter_AddRefs(mDBRemoveItemAnnotation));
NS_ENSURE_SUCCESS(rv, rv);
// mDBGetItemsWithAnnotation
rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING(
"SELECT a.item_id FROM moz_anno_attributes n "
"INNER JOIN moz_items_annos a ON n.id = a.anno_attribute_id "
"JOIN moz_items_annos a ON n.id = a.anno_attribute_id "
"WHERE n.name = ?1"),
getter_AddRefs(mDBGetItemsWithAnnotation));
NS_ENSURE_SUCCESS(rv, rv);
@ -253,7 +269,8 @@ nsAnnotationService::InitTables(mozIStorageConnection* aDBConn)
NS_ENSURE_SUCCESS(rv, rv);
rv = aDBConn->ExecuteSimpleSQL(NS_LITERAL_CSTRING(
"CREATE UNIQUE INDEX moz_annos_placeattributeindex ON moz_annos (place_id, anno_attribute_id)"));
"CREATE UNIQUE INDEX moz_annos_placeattributeindex "
"ON moz_annos (place_id, anno_attribute_id)"));
NS_ENSURE_SUCCESS(rv, rv);
}
@ -270,7 +287,8 @@ nsAnnotationService::InitTables(mozIStorageConnection* aDBConn)
rv = aDBConn->ExecuteSimpleSQL(CREATE_MOZ_ITEMS_ANNOS);
NS_ENSURE_SUCCESS(rv, rv);
rv = aDBConn->ExecuteSimpleSQL(NS_LITERAL_CSTRING(
"CREATE UNIQUE INDEX moz_items_annos_itemattributeindex ON moz_items_annos (item_id, anno_attribute_id)"));
"CREATE UNIQUE INDEX moz_items_annos_itemattributeindex "
"ON moz_items_annos (item_id, anno_attribute_id)"));
NS_ENSURE_SUCCESS(rv, rv);
}
@ -1210,10 +1228,18 @@ nsAnnotationService::GetPagesWithAnnotationCOMArray(
// statement. Perhaps this should change.
nsCOMPtr<mozIStorageStatement> statement;
nsresult rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING(
"SELECT h.url FROM moz_anno_attributes n "
"INNER JOIN moz_annos a ON n.id = a.anno_attribute_id "
"INNER JOIN moz_places h ON a.place_id = h.id "
"WHERE n.name = ?1"),
"SELECT h.url "
"FROM moz_places_temp h "
"JOIN moz_annos a ON h.id = a.place_id "
"JOIN moz_anno_attributes n ON n.id = a.anno_attribute_id "
"WHERE n.name = ?1 "
"UNION ALL "
"SELECT h.url "
"FROM moz_places h "
"JOIN moz_annos a ON h.id = a.place_id "
"JOIN moz_anno_attributes n ON n.id = a.anno_attribute_id "
"WHERE n.name = ?1 "
"AND h.id NOT IN (SELECT id FROM moz_places_temp)"),
getter_AddRefs(statement));
NS_ENSURE_SUCCESS(rv, rv);
@ -1628,10 +1654,12 @@ nsAnnotationService::CopyPageAnnotations(nsIURI* aSourceURI,
// source with the same values of the annotation on dest.
nsCOMPtr<mozIStorageStatement> statement;
rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING(
"INSERT INTO moz_annos (place_id, anno_attribute_id, mime_type, content, flags, expiration) "
"INSERT INTO moz_annos "
"(place_id, anno_attribute_id, mime_type, content, flags, expiration) "
"SELECT ?1, anno_attribute_id, mime_type, content, flags, expiration "
"FROM moz_annos WHERE place_id = ?2 AND anno_attribute_id = "
"(SELECT id FROM moz_anno_attributes WHERE name = ?3)"),
"FROM moz_annos "
"WHERE place_id = ?2 AND anno_attribute_id = "
"(SELECT id FROM moz_anno_attributes WHERE name = ?3)"),
getter_AddRefs(statement));
NS_ENSURE_SUCCESS(rv, rv);

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

@ -154,10 +154,19 @@ nsFaviconService::Init()
getter_AddRefs(mDBGetIconInfo));
NS_ENSURE_SUCCESS(rv, rv);
// We can avoid checking for duplicates in the unified table since an uri
// can only have one favicon associated. LIMIT 1 will ensure that we get
// only one result.
rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING(
"SELECT f.id, f.url, length(f.data), f.expiration "
"FROM moz_places h JOIN moz_favicons f ON h.favicon_id = f.id "
"WHERE h.url = ?1"),
"FROM ( "
"SELECT * FROM moz_places_temp "
"WHERE url = ?1 "
"UNION ALL "
"SELECT * FROM moz_places "
"WHERE url = ?1 "
") AS h JOIN moz_favicons f ON h.favicon_id = f.id "
"LIMIT 1"),
getter_AddRefs(mDBGetURL));
NS_ENSURE_SUCCESS(rv, rv);
@ -179,7 +188,7 @@ nsFaviconService::Init()
NS_ENSURE_SUCCESS(rv, rv);
rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING(
"UPDATE moz_places SET favicon_id = ?2 WHERE id = ?1"),
"UPDATE moz_places_view SET favicon_id = ?2 WHERE id = ?1"),
getter_AddRefs(mDBSetPageFavicon));
NS_ENSURE_SUCCESS(rv, rv);

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

@ -113,8 +113,9 @@ nsNavBookmarks::Init()
{
nsCOMPtr<mozIStorageStatement> statement;
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING("SELECT id FROM moz_bookmarks WHERE type = ?1 AND parent IS NULL"),
getter_AddRefs(statement));
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING(
"SELECT id FROM moz_bookmarks WHERE type = ?1 AND parent IS NULL"),
getter_AddRefs(statement));
NS_ENSURE_SUCCESS(rv, rv);
rv = statement->BindInt32Parameter(0, TYPE_FOLDER);
NS_ENSURE_SUCCESS(rv, rv);
@ -132,19 +133,26 @@ nsNavBookmarks::Init()
nsCOMPtr<nsIStringBundleService> bundleService =
do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv, rv);
rv = bundleService->CreateBundle(
"chrome://places/locale/places.properties",
getter_AddRefs(mBundle));
rv = bundleService->CreateBundle("chrome://places/locale/places.properties",
getter_AddRefs(mBundle));
NS_ENSURE_SUCCESS(rv, rv);
// mDBFindURIBookmarks
// NOTE: Do not modify the ORDER BY segment of the query, as certain
// features depend on it. See bug 398914 for an example.
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING(
"SELECT a.id "
"FROM moz_bookmarks a, moz_places h "
"WHERE h.url = ?1 AND a.fk = h.id and a.type = ?2 "
"ORDER BY MAX(COALESCE(a.lastModified, 0), a.dateAdded) DESC, a.id DESC"),
"SELECT b.id "
"FROM moz_bookmarks b "
"JOIN ( "
"SELECT id FROM moz_places_temp "
"WHERE url = ?1 "
"UNION ALL "
"SELECT id FROM moz_places "
"WHERE url = ?1 "
"AND +id NOT IN (SELECT id FROM moz_places_temp) "
") AS h ON b.fk = h.id "
"WHERE b.type = ?2 "
"ORDER BY MAX(IFNULL(b.lastModified, 0), b.dateAdded) DESC, b.id DESC"),
getter_AddRefs(mDBFindURIBookmarks));
NS_ENSURE_SUCCESS(rv, rv);
@ -157,36 +165,59 @@ nsNavBookmarks::Init()
// This is a LEFT OUTER JOIN with moz_places since folders does not have
// a reference into that table.
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING(
"SELECT h.id, h.url, COALESCE(b.title, h.title), "
"h.rev_host, h.visit_count, "
SQL_STR_FRAGMENT_MAX_VISIT_DATE( "h.id" )
", f.url, null, b.id, "
"b.dateAdded, b.lastModified, "
"b.position, b.type, b.fk "
"FROM moz_bookmarks b "
"LEFT OUTER JOIN moz_places h ON b.fk = h.id "
"LEFT OUTER JOIN moz_favicons f ON h.favicon_id = f.id "
"WHERE b.parent = ?1 "
"ORDER BY b.position"),
"SELECT * FROM ( "
"SELECT h.id, h.url, COALESCE(b.title, h.title), "
"h.rev_host, h.visit_count, "
SQL_STR_FRAGMENT_MAX_VISIT_DATE( "h.id" )
", f.url, null, b.id, b.dateAdded, b.lastModified, "
"b.position, b.type, b.fk "
"FROM moz_bookmarks b "
"JOIN moz_places_temp h ON b.fk = h.id "
"LEFT JOIN moz_favicons f ON h.favicon_id = f.id "
"WHERE b.parent = ?1 "
"UNION ALL "
"SELECT h.id, h.url, COALESCE(b.title, h.title), "
"h.rev_host, h.visit_count, "
SQL_STR_FRAGMENT_MAX_VISIT_DATE( "h.id" )
", f.url, null, b.id, b.dateAdded, b.lastModified, "
"b.position, b.type, b.fk "
"FROM moz_bookmarks b "
"LEFT JOIN moz_places h ON b.fk = h.id "
"LEFT JOIN moz_favicons f ON h.favicon_id = f.id "
"WHERE b.parent = ?1 "
"AND (b.fk ISNULL OR b.fk NOT IN (select id FROM moz_places_temp)) "
") "
"ORDER BY 12 ASC"), /* position */
getter_AddRefs(mDBGetChildren));
NS_ENSURE_SUCCESS(rv, rv);
// mDBFolderCount: count all of the children of a given folder
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING("SELECT COUNT(*) FROM moz_bookmarks WHERE parent = ?1"),
getter_AddRefs(mDBFolderCount));
NS_ENSURE_SUCCESS(rv, rv);
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING("SELECT position FROM moz_bookmarks WHERE id = ?1"),
getter_AddRefs(mDBGetItemIndex));
NS_ENSURE_SUCCESS(rv, rv);
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING("SELECT id, fk, type FROM moz_bookmarks WHERE parent = ?1 AND position = ?2"),
getter_AddRefs(mDBGetChildAt));
NS_ENSURE_SUCCESS(rv, rv);
// get bookmark/folder/separator properties
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING(
"SELECT b.id, (SELECT url from moz_places WHERE id = b.fk), b.title, b.position, b.fk, b.parent, b.type, b.folder_type, b.dateAdded, b.lastModified "
"SELECT COUNT(*) FROM moz_bookmarks WHERE parent = ?1"),
getter_AddRefs(mDBFolderCount));
NS_ENSURE_SUCCESS(rv, rv);
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING(
"SELECT position FROM moz_bookmarks WHERE id = ?1"),
getter_AddRefs(mDBGetItemIndex));
NS_ENSURE_SUCCESS(rv, rv);
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING(
"SELECT id, fk, type FROM moz_bookmarks WHERE parent = ?1 AND position = ?2"),
getter_AddRefs(mDBGetChildAt));
NS_ENSURE_SUCCESS(rv, rv);
// get bookmark/folder/separator properties
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING(
"SELECT b.id, "
"IFNULL( "
"(SELECT url FROM moz_places_temp "
"WHERE id = (SELECT fk FROM moz_bookmarks WHERE id = ?1)) "
", "
"(SELECT url FROM moz_places "
"WHERE id = (SELECT fk FROM moz_bookmarks WHERE id = ?1)) "
"), b.title, b.position, b.fk, b.parent, b.type, b.folder_type, "
"b.dateAdded, b.lastModified "
"FROM moz_bookmarks b "
"WHERE b.id = ?1"),
getter_AddRefs(mDBGetItemProperties));
@ -202,52 +233,93 @@ nsNavBookmarks::Init()
// mDBGetRedirectDestinations
// input = page ID, time threshold; output = unique ID input has redirected to
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING(
"SELECT dest_v.place_id "
"FROM moz_historyvisits source_v "
"LEFT JOIN moz_historyvisits dest_v ON dest_v.from_visit = source_v.id "
"SELECT DISTINCT dest_v.place_id "
"FROM moz_historyvisits_temp source_v "
"JOIN moz_historyvisits_temp dest_v ON dest_v.from_visit = source_v.id "
"WHERE source_v.place_id = ?1 "
"AND source_v.visit_date >= ?2 "
"AND (dest_v.visit_type = 5 OR dest_v.visit_type = 6) "
"GROUP BY dest_v.place_id"),
"AND source_v.visit_date >= ?2 "
"AND dest_v.visit_type IN (") +
nsPrintfCString("%d,%d",
nsINavHistoryService::TRANSITION_REDIRECT_PERMANENT,
nsINavHistoryService::TRANSITION_REDIRECT_TEMPORARY) +
NS_LITERAL_CSTRING(") "
"UNION "
"SELECT DISTINCT dest_v.place_id "
"FROM moz_historyvisits_temp source_v "
"JOIN moz_historyvisits dest_v ON dest_v.from_visit = source_v.id "
"WHERE source_v.place_id = ?1 "
"AND source_v.visit_date >= ?2 "
"AND dest_v.visit_type IN (") +
nsPrintfCString("%d,%d",
nsINavHistoryService::TRANSITION_REDIRECT_PERMANENT,
nsINavHistoryService::TRANSITION_REDIRECT_TEMPORARY) +
NS_LITERAL_CSTRING(") "
"UNION "
"SELECT DISTINCT dest_v.place_id "
"FROM moz_historyvisits source_v "
"JOIN moz_historyvisits_temp dest_v ON dest_v.from_visit = source_v.id "
"WHERE source_v.place_id = ?1 "
"AND source_v.visit_date >= ?2 "
"AND dest_v.visit_type IN (") +
nsPrintfCString("%d,%d",
nsINavHistoryService::TRANSITION_REDIRECT_PERMANENT,
nsINavHistoryService::TRANSITION_REDIRECT_TEMPORARY) +
NS_LITERAL_CSTRING(") "
"UNION "
"SELECT DISTINCT dest_v.place_id "
"FROM moz_historyvisits source_v "
"JOIN moz_historyvisits dest_v ON dest_v.from_visit = source_v.id "
"WHERE source_v.place_id = ?1 "
"AND source_v.visit_date >= ?2 "
"AND dest_v.visit_type IN (") +
nsPrintfCString("%d,%d",
nsINavHistoryService::TRANSITION_REDIRECT_PERMANENT,
nsINavHistoryService::TRANSITION_REDIRECT_TEMPORARY) +
NS_LITERAL_CSTRING(") "),
getter_AddRefs(mDBGetRedirectDestinations));
NS_ENSURE_SUCCESS(rv, rv);
// mDBInsertBookmark
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING("INSERT INTO moz_bookmarks "
"(fk, type, parent, position, title, dateAdded) "
"VALUES (?1, ?2, ?3, ?4, ?5, ?6)"),
getter_AddRefs(mDBInsertBookmark));
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING(
"INSERT INTO moz_bookmarks "
"(fk, type, parent, position, title, dateAdded) "
"VALUES (?1, ?2, ?3, ?4, ?5, ?6)"),
getter_AddRefs(mDBInsertBookmark));
NS_ENSURE_SUCCESS(rv, rv);
// mDBIsBookmarkedInDatabase
// Just select position since it's just an int32 and may be faster.
// We don't actually care about the data, just whether there is any.
rv = DBConn()->CreateStatement(NS_LITERAL_CSTRING(
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING(
"SELECT position FROM moz_bookmarks WHERE fk = ?1 AND type = ?2"),
getter_AddRefs(mDBIsBookmarkedInDatabase));
NS_ENSURE_SUCCESS(rv, rv);
// mDBGetLastBookmarkID
rv = DBConn()->CreateStatement(NS_LITERAL_CSTRING(
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING(
"SELECT id "
"FROM moz_bookmarks "
"ORDER BY ROWID DESC "
"LIMIT 1"),
getter_AddRefs(mDBGetLastBookmarkID));
NS_ENSURE_SUCCESS(rv, rv);
// mDBSetItemDateAdded
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING("UPDATE moz_bookmarks SET dateAdded = ?1 WHERE id = ?2"),
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING(
"UPDATE moz_bookmarks SET dateAdded = ?1 WHERE id = ?2"),
getter_AddRefs(mDBSetItemDateAdded));
NS_ENSURE_SUCCESS(rv, rv);
// mDBSetItemLastModified
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING("UPDATE moz_bookmarks SET lastModified = ?1 WHERE id = ?2"),
getter_AddRefs(mDBSetItemLastModified));
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING(
"UPDATE moz_bookmarks SET lastModified = ?1 WHERE id = ?2"),
getter_AddRefs(mDBSetItemLastModified));
NS_ENSURE_SUCCESS(rv, rv);
// mDBSetItemIndex
rv = DBConn()->CreateStatement(NS_LITERAL_CSTRING("UPDATE moz_bookmarks SET position = ?2 WHERE id = ?1"),
getter_AddRefs(mDBSetItemIndex));
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING(
"UPDATE moz_bookmarks SET position = ?2 WHERE id = ?1"),
getter_AddRefs(mDBSetItemIndex));
NS_ENSURE_SUCCESS(rv, rv);
FillBookmarksHash();
@ -264,19 +336,31 @@ nsNavBookmarks::Init()
NS_ENSURE_SUCCESS(rv, rv);
// get keyword text for URI (must be a bookmarked URI)
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING(
"SELECT k.keyword "
"FROM moz_places p "
"JOIN moz_bookmarks b ON b.fk = p.id "
"JOIN moz_keywords k ON k.id = b.keyword_id "
"WHERE p.url = ?1"),
"SELECT k.keyword "
"FROM ( "
"SELECT id FROM moz_places_temp "
"WHERE url = ?1 "
"UNION ALL "
"SELECT id FROM moz_places "
"WHERE +id NOT IN (SELECT id FROM moz_places_temp) "
"AND url = ?1 "
") AS h "
"JOIN moz_bookmarks b ON b.fk = h.id "
"JOIN moz_keywords k ON k.id = b.keyword_id"),
getter_AddRefs(mDBGetKeywordForURI));
NS_ENSURE_SUCCESS(rv, rv);
// get URI for keyword
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING(
"SELECT p.url FROM moz_keywords k "
"SELECT url FROM moz_keywords k "
"JOIN moz_bookmarks b ON b.keyword_id = k.id "
"JOIN moz_places p ON b.fk = p.id "
"WHERE k.keyword = ?1"),
"JOIN moz_places_temp h ON b.fk = h.id "
"WHERE k.keyword = ?1 "
"UNION ALL "
"SELECT url FROM moz_keywords k "
"JOIN moz_bookmarks b ON b.keyword_id = k.id "
"JOIN moz_places h ON b.fk = h.id "
"WHERE k.keyword = ?1 "
"AND h.id NOT IN (SELECT id FROM moz_places_temp)"),
getter_AddRefs(mDBGetURIForKeyword));
NS_ENSURE_SUCCESS(rv, rv);
@ -298,8 +382,9 @@ nsNavBookmarks::Init()
// Temporary migration code for bug 396300
nsCOMPtr<mozIStorageStatement> moveUnfiledBookmarks;
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING("UPDATE moz_bookmarks SET parent = ?1 WHERE type = ?2 AND parent=?3"),
getter_AddRefs(moveUnfiledBookmarks));
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING(
"UPDATE moz_bookmarks SET parent = ?1 WHERE type = ?2 AND parent=?3"),
getter_AddRefs(moveUnfiledBookmarks));
rv = moveUnfiledBookmarks->BindInt64Parameter(0, mUnfiledRoot);
NS_ENSURE_SUCCESS(rv, rv);
rv = moveUnfiledBookmarks->BindInt32Parameter(1, TYPE_BOOKMARK);
@ -410,8 +495,9 @@ nsresult
nsNavBookmarks::InitRoots()
{
nsCOMPtr<mozIStorageStatement> getRootStatement;
nsresult rv = DBConn()->CreateStatement(NS_LITERAL_CSTRING("SELECT folder_id FROM moz_bookmarks_roots WHERE root_name = ?1"),
getter_AddRefs(getRootStatement));
nsresult rv = DBConn()->CreateStatement(NS_LITERAL_CSTRING(
"SELECT folder_id FROM moz_bookmarks_roots WHERE root_name = ?1"),
getter_AddRefs(getRootStatement));
NS_ENSURE_SUCCESS(rv, rv);
PRBool createdPlacesRoot = PR_FALSE;
@ -438,8 +524,9 @@ nsNavBookmarks::InitRoots()
&folders);
if (folders.Length() > 0) {
nsCOMPtr<mozIStorageStatement> moveItems;
rv = DBConn()->CreateStatement(NS_LITERAL_CSTRING("UPDATE moz_bookmarks SET parent = ?1 WHERE parent=?2"),
getter_AddRefs(moveItems));
rv = DBConn()->CreateStatement(NS_LITERAL_CSTRING(
"UPDATE moz_bookmarks SET parent = ?1 WHERE parent=?2"),
getter_AddRefs(moveItems));
rv = moveItems->BindInt64Parameter(0, mToolbarFolder);
NS_ENSURE_SUCCESS(rv, rv);
rv = moveItems->BindInt64Parameter(1, folders[0]);
@ -560,8 +647,9 @@ nsNavBookmarks::CreateRoot(mozIStorageStatement* aGetRootStatement,
NS_ENSURE_SUCCESS(rv, rv);
// save root ID
rv = DBConn()->CreateStatement(NS_LITERAL_CSTRING("INSERT INTO moz_bookmarks_roots (root_name, folder_id) VALUES (?1, ?2)"),
getter_AddRefs(insertStatement));
rv = DBConn()->CreateStatement(NS_LITERAL_CSTRING(
"INSERT INTO moz_bookmarks_roots (root_name, folder_id) VALUES (?1, ?2)"),
getter_AddRefs(insertStatement));
NS_ENSURE_SUCCESS(rv, rv);
rv = insertStatement->BindUTF8StringParameter(0, name);
NS_ENSURE_SUCCESS(rv, rv);
@ -616,12 +704,48 @@ nsNavBookmarks::FillBookmarksHash()
// redirection will be handled separately.
rv = DBConn()->CreateStatement(NS_LITERAL_CSTRING(
"SELECT v1.place_id, v2.place_id "
"FROM moz_bookmarks b "
"LEFT JOIN moz_historyvisits v1 on b.fk = v1.place_id "
"LEFT JOIN moz_historyvisits v2 on v2.from_visit = v1.id "
"WHERE b.fk IS NOT NULL AND b.type = ?1 "
"AND v2.visit_type = 5 OR v2.visit_type = 6 " // perm. or temp. RDRs
"GROUP BY v2.place_id"),
"FROM moz_bookmarks b "
"LEFT JOIN moz_historyvisits_temp v1 on b.fk = v1.place_id "
"LEFT JOIN moz_historyvisits v2 on v2.from_visit = v1.id "
"WHERE b.fk IS NOT NULL AND b.type = ?1 "
"AND v2.visit_type IN (") +
nsPrintfCString("%d,%d",
nsINavHistoryService::TRANSITION_REDIRECT_PERMANENT,
nsINavHistoryService::TRANSITION_REDIRECT_TEMPORARY) +
NS_LITERAL_CSTRING(") GROUP BY v2.place_id "
"UNION "
"SELECT v1.place_id, v2.place_id "
"FROM moz_bookmarks b "
"LEFT JOIN moz_historyvisits v1 on b.fk = v1.place_id "
"LEFT JOIN moz_historyvisits_temp v2 on v2.from_visit = v1.id "
"WHERE b.fk IS NOT NULL AND b.type = ?1 "
"AND v2.visit_type IN (") +
nsPrintfCString("%d,%d",
nsINavHistoryService::TRANSITION_REDIRECT_PERMANENT,
nsINavHistoryService::TRANSITION_REDIRECT_TEMPORARY) +
NS_LITERAL_CSTRING(") GROUP BY v2.place_id "
"UNION "
"SELECT v1.place_id, v2.place_id "
"FROM moz_bookmarks b "
"LEFT JOIN moz_historyvisits v1 on b.fk = v1.place_id "
"LEFT JOIN moz_historyvisits v2 on v2.from_visit = v1.id "
"WHERE b.fk IS NOT NULL AND b.type = ?1 "
"AND v2.visit_type IN (") +
nsPrintfCString("%d,%d",
nsINavHistoryService::TRANSITION_REDIRECT_PERMANENT,
nsINavHistoryService::TRANSITION_REDIRECT_TEMPORARY) +
NS_LITERAL_CSTRING(") GROUP BY v2.place_id "
"UNION "
"SELECT v1.place_id, v2.place_id "
"FROM moz_bookmarks b "
"LEFT JOIN moz_historyvisits_temp v1 on b.fk = v1.place_id "
"LEFT JOIN moz_historyvisits_temp v2 on v2.from_visit = v1.id "
"WHERE b.fk IS NOT NULL AND b.type = ?1 "
"AND v2.visit_type IN (") +
nsPrintfCString("%d,%d",
nsINavHistoryService::TRANSITION_REDIRECT_PERMANENT,
nsINavHistoryService::TRANSITION_REDIRECT_TEMPORARY) +
NS_LITERAL_CSTRING(") GROUP BY v2.place_id "),
getter_AddRefs(statement));
NS_ENSURE_SUCCESS(rv, rv);
rv = statement->BindInt64Parameter(0, TYPE_BOOKMARK);
@ -1176,13 +1300,19 @@ nsNavBookmarks::CreateContainerWithID(PRInt64 aItemId, PRInt64 aParent,
nsCOMPtr<mozIStorageStatement> statement;
if (aItemId == -1) {
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING("INSERT INTO moz_bookmarks (title, type, parent, position, folder_type, dateAdded) VALUES (?1, ?2, ?3, ?4, ?5, ?6)"),
getter_AddRefs(statement));
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING(
"INSERT INTO moz_bookmarks "
"(title, type, parent, position, folder_type, dateAdded) "
"VALUES (?1, ?2, ?3, ?4, ?5, ?6)"),
getter_AddRefs(statement));
NS_ENSURE_SUCCESS(rv, rv);
}
else {
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING("INSERT INTO moz_bookmarks (id, title, type, parent, position, folder_type, dateAdded) VALUES (?7, ?1, ?2, ?3, ?4, ?5, ?6)"),
getter_AddRefs(statement));
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING(
"INSERT INTO moz_bookmarks "
"(id, title, type, parent, position, folder_type, dateAdded) "
"VALUES (?7, ?1, ?2, ?3, ?4, ?5, ?6)"),
getter_AddRefs(statement));
NS_ENSURE_SUCCESS(rv, rv);
rv = statement->BindInt64Parameter(6, aItemId);
@ -1260,9 +1390,10 @@ nsNavBookmarks::InsertSeparator(PRInt64 aParent, PRInt32 aIndex,
}
nsCOMPtr<mozIStorageStatement> statement;
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING("INSERT INTO moz_bookmarks "
"(type, parent, position, dateAdded) VALUES (?1, ?2, ?3, ?4)"),
getter_AddRefs(statement));
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING(
"INSERT INTO moz_bookmarks "
"(type, parent, position, dateAdded) VALUES (?1, ?2, ?3, ?4)"),
getter_AddRefs(statement));
NS_ENSURE_SUCCESS(rv, rv);
rv = statement->BindInt64Parameter(0, TYPE_SEPARATOR);
@ -2241,8 +2372,9 @@ nsNavBookmarks::ChangeBookmarkURI(PRInt64 aBookmarkId, nsIURI *aNewURI)
return NS_ERROR_INVALID_ARG;
nsCOMPtr<mozIStorageStatement> statement;
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING("UPDATE moz_bookmarks SET fk = ?1 WHERE id = ?2"),
getter_AddRefs(statement));
rv = dbConn->CreateStatement(NS_LITERAL_CSTRING(
"UPDATE moz_bookmarks SET fk = ?1 WHERE id = ?2"),
getter_AddRefs(statement));
statement->BindInt64Parameter(0, placeId);
statement->BindInt64Parameter(1, aBookmarkId);
@ -2425,7 +2557,7 @@ nsNavBookmarks::SetKeywordForBookmark(PRInt64 aBookmarkId, const nsAString& aKey
// Attempt to find pre-existing keyword record
nsCOMPtr<mozIStorageStatement> getKeywordStmnt;
rv = DBConn()->CreateStatement(NS_LITERAL_CSTRING(
"SELECT id from moz_keywords WHERE keyword = ?1"),
"SELECT id from moz_keywords WHERE keyword = ?1"),
getter_AddRefs(getKeywordStmnt));
NS_ENSURE_SUCCESS(rv, rv);
rv = getKeywordStmnt->BindStringParameter(0, kwd);

Разница между файлами не показана из-за своего большого размера Загрузить разницу

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

@ -104,10 +104,15 @@
// this is a work-around for a problem with the optimizer of sqlite
// A sub-select on MAX(visit_date) is slower than this query with our indexes
// see Bug #392399 for more details
#define SQL_STR_FRAGMENT_MAX_VISIT_DATE( place_relation ) \
"(SELECT visit_date FROM moz_historyvisits WHERE place_id = " place_relation \
#define SQL_STR_FRAGMENT_MAX_VISIT_DATE_BASE( __place_relation, __table_name ) \
"(SELECT visit_date FROM " __table_name \
" WHERE place_id = " __place_relation \
" AND visit_type NOT IN (0,4,7) ORDER BY visit_date DESC LIMIT 1)"
#define SQL_STR_FRAGMENT_MAX_VISIT_DATE( __place_relation ) \
"IFNULL( " SQL_STR_FRAGMENT_MAX_VISIT_DATE_BASE( __place_relation, "moz_historyvisits_temp") \
", " SQL_STR_FRAGMENT_MAX_VISIT_DATE_BASE( __place_relation, "moz_historyvisits") ")"
struct AutoCompleteIntermediateResult;
class AutoCompleteResultComparator;
class mozIAnnotationService;
@ -471,6 +476,7 @@ protected:
nsresult MigrateV3Up(mozIStorageConnection *aDBConn);
nsresult MigrateV6Up(mozIStorageConnection *aDBConn);
nsresult MigrateV7Up(mozIStorageConnection *aDBConn);
nsresult MigrateV8Up(mozIStorageConnection *aDBConn);
nsresult EnsureCurrentSchema(mozIStorageConnection* aDBConn, PRBool *aMadeChanges);
nsresult CleanUpOnQuit();

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

@ -92,7 +92,7 @@
NS_LITERAL_CSTRING(" AND b.fk = h.id") + \
(getMostRecent ? NS_LITERAL_CSTRING(" " \
"ORDER BY b.lastModified DESC LIMIT 1") : EmptyCString()) + \
NS_LITERAL_CSTRING(") " name)
NS_LITERAL_CSTRING(") AS " name)
// Get three named columns from the bookmarks and tags table
#define BOOK_TAG_SQL (\
@ -107,6 +107,15 @@
const PRUnichar kTitleTagsSeparatorChars[] = { ' ', 0x2013, ' ', 0 };
#define TITLE_TAGS_SEPARATOR nsAutoString(kTitleTagsSeparatorChars)
// This fragment is used to get best favicon for a rev_host
#define BEST_FAVICON_FOR_REVHOST( __table_name ) \
"(SELECT f.url FROM " __table_name " " \
"JOIN moz_favicons f ON f.id = favicon_id " \
"WHERE rev_host = IFNULL( " \
"(SELECT rev_host FROM moz_places_temp WHERE id = b.fk), " \
"(SELECT rev_host FROM moz_places WHERE id = b.fk)) " \
"ORDER BY frecency DESC LIMIT 1) "
////////////////////////////////////////////////////////////////////////////////
//// nsNavHistoryAutoComplete Helper Functions
@ -263,81 +272,123 @@ nsresult
nsNavHistory::CreateAutoCompleteQueries()
{
// Define common pieces of various queries
nsCString sqlHead = NS_LITERAL_CSTRING(
"SELECT h.url, h.title, f.url") + BOOK_TAG_SQL + NS_LITERAL_CSTRING(", "
"h.visit_count "
"FROM moz_places h "
"LEFT OUTER JOIN moz_favicons f ON f.id = h.favicon_id "
"WHERE h.frecency <> 0 ");
// NOTE:
// after migration or clear all private data, we might end up with
// a lot of places with frecency < 0 (until idle)
//
// XXX bug 412736
// in the case of a frecency tie, break it with h.typed and h.visit_count
// which is better than nothing. but this is slow, so not doing it yet.
nsCString sqlTail = NS_LITERAL_CSTRING(
"ORDER BY h.frecency DESC LIMIT ?2 OFFSET ?3");
nsresult rv = mDBConn->CreateStatement(sqlHead + (mAutoCompleteOnlyTyped ?
NS_LITERAL_CSTRING("AND h.typed = 1 ") : EmptyCString()) + sqlTail,
getter_AddRefs(mDBAutoCompleteQuery));
NS_ENSURE_SUCCESS(rv, rv);
// Try to reduce size of compound table since with partitioning this became
// slower. Limiting moz_places with OFFSET+LIMIT will mostly help speed
// of first chunks, that are usually most wanted.
// Can do this only if there aren't additional conditions on final resultset.
rv = mDBConn->CreateStatement(sqlHead +
NS_LITERAL_CSTRING("AND h.visit_count > 0 ") + sqlTail,
getter_AddRefs(mDBAutoCompleteHistoryQuery));
NS_ENSURE_SUCCESS(rv, rv);
// Note: h.frecency is selected because we need it for ordering, but will
// not be read later and we don't have an associated kAutoCompleteIndex_
rv = mDBConn->CreateStatement(sqlHead +
NS_LITERAL_CSTRING("AND bookmark IS NOT NULL ") + sqlTail,
getter_AddRefs(mDBAutoCompleteStarQuery));
NS_ENSURE_SUCCESS(rv, rv);
rv = mDBConn->CreateStatement(sqlHead +
NS_LITERAL_CSTRING("AND tags IS NOT NULL ") + sqlTail,
getter_AddRefs(mDBAutoCompleteTagsQuery));
NS_ENSURE_SUCCESS(rv, rv);
nsCString sql = NS_LITERAL_CSTRING(
nsCString sqlBase = NS_LITERAL_CSTRING(
"SELECT h.url, h.title, f.url") + BOOK_TAG_SQL + NS_LITERAL_CSTRING(", "
"h.visit_count, "
"ROUND(MAX(((i.input = ?2) + (SUBSTR(i.input, 1, LENGTH(?2)) = ?2)) * "
"i.use_count), 1) rank "
"FROM moz_inputhistory i "
"JOIN moz_places h ON h.id = i.place_id "
"h.visit_count, h.frecency "
"FROM moz_places_temp h "
"LEFT OUTER JOIN moz_favicons f ON f.id = h.favicon_id "
"GROUP BY i.place_id HAVING rank > 0 "
"ORDER BY rank DESC, h.frecency DESC");
"WHERE h.frecency <> 0 "
"{ADDITIONAL_CONDITIONS} "
"UNION ALL "
"SELECT * FROM ( "
"SELECT h.url, h.title, f.url") + BOOK_TAG_SQL + NS_LITERAL_CSTRING(", "
"h.visit_count, h.frecency "
"FROM moz_places h "
"LEFT OUTER JOIN moz_favicons f ON f.id = h.favicon_id "
"WHERE h.id NOT IN (SELECT id FROM moz_places_temp) "
"AND h.frecency <> 0 "
"{ADDITIONAL_CONDITIONS} "
"ORDER BY h.frecency DESC LIMIT (?2 + ?3) "
") "
"ORDER BY 8 DESC LIMIT ?2 OFFSET ?3"); // ORDER BY frecency
nsCString AutoCompleteQuery = sqlBase;
AutoCompleteQuery.ReplaceSubstring("{ADDITIONAL_CONDITIONS}",
(mAutoCompleteOnlyTyped ?
"AND h.typed = 1" : ""));
nsresult rv = mDBConn->CreateStatement(AutoCompleteQuery,
getter_AddRefs(mDBAutoCompleteQuery));
NS_ENSURE_SUCCESS(rv, rv);
nsCString AutoCompleteHistoryQuery = sqlBase;
AutoCompleteHistoryQuery.ReplaceSubstring("{ADDITIONAL_CONDITIONS}",
"AND h.visit_count > 0");
rv = mDBConn->CreateStatement(AutoCompleteHistoryQuery,
getter_AddRefs(mDBAutoCompleteHistoryQuery));
NS_ENSURE_SUCCESS(rv, rv);
nsCString AutoCompleteStarQuery = sqlBase;
AutoCompleteStarQuery.ReplaceSubstring("{ADDITIONAL_CONDITIONS}",
"AND bookmark IS NOT NULL");
rv = mDBConn->CreateStatement(AutoCompleteStarQuery,
getter_AddRefs(mDBAutoCompleteStarQuery));
NS_ENSURE_SUCCESS(rv, rv);
nsCString AutoCompleteTagsQuery = sqlBase;
AutoCompleteTagsQuery.ReplaceSubstring("{ADDITIONAL_CONDITIONS}",
"AND tags IS NOT NULL");
rv = mDBConn->CreateStatement(AutoCompleteTagsQuery,
getter_AddRefs(mDBAutoCompleteTagsQuery));
NS_ENSURE_SUCCESS(rv, rv);
// In this query we are taking BOOK_TAG_SQL only for h.id because it
// uses data from moz_bookmarks table and we sync tables on bookmark insert.
// So, most likely, h.id will always be populated when we have any bookmark.
// We still need to join on moz_places_temp for other data (eg. title).
nsCString sql = NS_LITERAL_CSTRING(
"SELECT IFNULL(h_t.url, h.url), IFNULL(h_t.title, h.title), f.url ") +
BOOK_TAG_SQL + NS_LITERAL_CSTRING(", "
"IFNULL(h_t.visit_count, h.visit_count), rank "
"FROM ( "
"SELECT ROUND(MAX(((i.input = ?2) + (SUBSTR(i.input, 1, LENGTH(?2)) = ?2)) * "
"i.use_count), 1) AS rank, place_id "
"FROM moz_inputhistory i "
"GROUP BY i.place_id HAVING rank > 0 "
") AS i "
"LEFT JOIN moz_places h ON h.id = i.place_id "
"LEFT JOIN moz_places_temp h_t ON h_t.id = i.place_id "
"LEFT JOIN moz_favicons f ON f.id = IFNULL(h_t.favicon_id, h.favicon_id) "
"WHERE IFNULL(h_t.url, h.url) NOTNULL "
"ORDER BY rank DESC, IFNULL(h_t.frecency, h.frecency) DESC");
rv = mDBConn->CreateStatement(sql, getter_AddRefs(mDBAdaptiveQuery));
NS_ENSURE_SUCCESS(rv, rv);
sql = NS_LITERAL_CSTRING(
"SELECT REPLACE(s.url, '%s', ?2) search_url, h.title, IFNULL(f.url, "
"(SELECT f.url "
"FROM moz_places r "
"JOIN moz_favicons f ON f.id = r.favicon_id "
"WHERE r.rev_host = s.rev_host "
"ORDER BY r.frecency DESC LIMIT 1)), "
"b.parent, b.title, NULL, h.visit_count "
"SELECT IFNULL( "
"(SELECT REPLACE(url, '%s', ?2) FROM moz_places_temp WHERE id = b.fk), "
"(SELECT REPLACE(url, '%s', ?2) FROM moz_places WHERE id = b.fk) "
") AS search_url, IFNULL(h_t.title, h.title), "
"COALESCE(f.url, "
BEST_FAVICON_FOR_REVHOST("moz_places_temp") ", "
BEST_FAVICON_FOR_REVHOST("moz_places")
"), "
"b.parent, b.title, NULL, IFNULL(h_t.visit_count, h.visit_count) "
"FROM moz_keywords k "
"JOIN moz_bookmarks b ON b.keyword_id = k.id "
"JOIN moz_places s ON s.id = b.fk "
"LEFT OUTER JOIN moz_places h ON h.url = search_url "
"LEFT OUTER JOIN moz_favicons f ON f.id = h.favicon_id "
"LEFT JOIN moz_places AS h ON h.url = search_url "
"LEFT JOIN moz_places_temp AS h_t ON h_t.url = search_url "
"LEFT JOIN moz_favicons f ON f.id = IFNULL(h_t.favicon_id, h.favicon_id) "
"WHERE LOWER(k.keyword) = LOWER(?1) "
"ORDER BY h.frecency DESC");
"ORDER BY IFNULL(h_t.frecency, h.frecency) DESC");
rv = mDBConn->CreateStatement(sql, getter_AddRefs(mDBKeywordQuery));
NS_ENSURE_SUCCESS(rv, rv);
sql = NS_LITERAL_CSTRING(
// Leverage the PRIMARY KEY (place_id, input) to insert/update entries
"INSERT OR REPLACE INTO moz_inputhistory "
// use_count will asymptotically approach the max of 10
"SELECT h.id, IFNULL(i.input, ?1), IFNULL(i.use_count, 0) * .9 + 1 "
"FROM moz_places h "
"LEFT OUTER JOIN moz_inputhistory i ON i.place_id = h.id AND i.input = ?1 "
"WHERE h.url = ?2");
// use_count will asymptotically approach the max of 10
"SELECT h.id, IFNULL(i.input, ?1), IFNULL(i.use_count, 0) * .9 + 1 "
"FROM moz_places_temp h "
"LEFT JOIN moz_inputhistory i ON i.place_id = h.id AND i.input = ?1 "
"WHERE url = ?2 "
"UNION ALL "
"SELECT h.id, IFNULL(i.input, ?1), IFNULL(i.use_count, 0) * .9 + 1 "
"FROM moz_places h "
"LEFT JOIN moz_inputhistory i ON i.place_id = h.id AND i.input = ?1 "
"WHERE url = ?2 "
"AND h.id NOT IN (SELECT id FROM moz_places_temp)");
rv = mDBConn->CreateStatement(sql, getter_AddRefs(mDBFeedbackIncrease));
NS_ENSURE_SUCCESS(rv, rv);
@ -537,23 +588,30 @@ nsNavHistory::StartSearch(const nsAString & aSearchString,
// has more than 0 results. We can continue from where the previous
// search left off, but first we want to create an optimized query that
// only searches through the urls that were previously found
// We have to do the bindings for both tables, so we build a temporary
// string
nsCString bindings;
for (PRUint32 i = 0; i < prevMatchCount; i++) {
if (i)
bindings += NS_LITERAL_CSTRING(",");
// +2 to skip over the ?1 for the tag root parameter
bindings += nsPrintfCString("?%d", i + 2);
}
nsCString sql = NS_LITERAL_CSTRING(
"SELECT h.url, h.title, f.url") + BOOK_TAG_SQL + NS_LITERAL_CSTRING(", "
"h.visit_count "
"FROM moz_places h "
"FROM ( "
"SELECT * FROM moz_places_temp "
"WHERE url IN (") + bindings + NS_LITERAL_CSTRING(") "
"UNION ALL "
"SELECT * FROM moz_places "
"WHERE id NOT IN (SELECT id FROM moz_places_temp) "
"AND url IN (") + bindings + NS_LITERAL_CSTRING(") "
") AS h "
"LEFT OUTER JOIN moz_favicons f ON f.id = h.favicon_id "
"WHERE h.url IN (");
// Put in bind spots for the urls
for (PRUint32 i = 0; i < prevMatchCount; i++) {
if (i)
sql += NS_LITERAL_CSTRING(",");
// +2 to skip over the ?1 for the tag root parameter
sql += nsPrintfCString("?%d", i + 2);
}
sql += NS_LITERAL_CSTRING(") "
"ORDER BY h.frecency DESC");
rv = mDBConn->CreateStatement(sql, getter_AddRefs(mDBPreviousQuery));

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

@ -252,20 +252,29 @@ nsNavHistoryExpire::ClearHistory()
// idle query to figure out which places to recalcuate frecency first.
// We must do this before deleting visits
nsresult rv = connection->ExecuteSimpleSQL(NS_LITERAL_CSTRING(
"UPDATE moz_places SET frecency = -MAX(visit_count, 1) "
"UPDATE moz_places_view SET frecency = -MAX(visit_count, 1) "
"WHERE id IN("
"SELECT h.id FROM moz_places h WHERE "
"SELECT h.id FROM moz_places_temp h "
"WHERE "
"EXISTS (SELECT id FROM moz_bookmarks WHERE fk = h.id) "
"OR EXISTS "
"(SELECT id FROM moz_annos WHERE place_id = h.id AND expiration = ") +
nsPrintfCString("%d", nsIAnnotationService::EXPIRE_NEVER) +
NS_LITERAL_CSTRING(")"));
if (NS_FAILED(rv))
NS_WARNING("failed to recent frecency");
"(SELECT id FROM moz_annos WHERE place_id = h.id AND expiration = ") +
nsPrintfCString("%d", nsIAnnotationService::EXPIRE_NEVER) +
NS_LITERAL_CSTRING(") "
"UNION ALL "
"SELECT h.id FROM moz_places h "
"WHERE "
"EXISTS (SELECT id FROM moz_bookmarks WHERE fk = h.id) "
"OR EXISTS "
"(SELECT id FROM moz_annos WHERE place_id = h.id AND expiration = ") +
nsPrintfCString("%d", nsIAnnotationService::EXPIRE_NEVER) +
NS_LITERAL_CSTRING(") "
")"));
NS_ENSURE_SUCCESS(rv, rv);
// expire visits, then let the paranoid functions do the cleanup for us
rv = connection->ExecuteSimpleSQL(NS_LITERAL_CSTRING(
"DELETE FROM moz_historyvisits"));
"DELETE FROM moz_historyvisits_view"));
NS_ENSURE_SUCCESS(rv, rv);
rv = ExpireHistoryParanoid(connection, -1);
@ -471,11 +480,38 @@ nsNavHistoryExpire::FindVisits(PRTime aExpireThreshold, PRUint32 aNumToExpire,
// Select a limited number of visits older than a time
nsCOMPtr<mozIStorageStatement> selectStatement;
nsresult rv = aConnection->CreateStatement(NS_LITERAL_CSTRING(
"SELECT v.id, v.place_id, v.visit_date, h.url, h.favicon_id, h.hidden, "
"(SELECT fk FROM moz_bookmarks WHERE fk = h.id) "
"FROM moz_places h JOIN moz_historyvisits v ON h.id = v.place_id "
"WHERE v.visit_date < ?1 "
"ORDER BY v.visit_date ASC LIMIT ?2"),
"SELECT * FROM ( "
"SELECT v.id, v.place_id, v.visit_date, h.url, h.favicon_id, h.hidden, "
"(SELECT fk FROM moz_bookmarks WHERE fk = h.id) "
"FROM moz_places h "
"JOIN moz_historyvisits AS v ON h.id = v.place_id "
"WHERE visit_date < ?1 "
"ORDER BY v.visit_date ASC LIMIT ?2 "
") UNION ALL "
"SELECT * FROM ( "
"SELECT v.id, v.place_id, v.visit_date, h.url, h.favicon_id, h.hidden, "
"(SELECT fk FROM moz_bookmarks WHERE fk = h.id)"
"FROM moz_places_temp h "
"JOIN moz_historyvisits AS v ON h.id = v.place_id "
"WHERE visit_date < ?1 "
"ORDER BY v.visit_date ASC LIMIT ?2 "
") UNION ALL "
"SELECT * FROM ( "
"SELECT v.id, v.place_id, v.visit_date, h.url, h.favicon_id, h.hidden, "
"(SELECT fk FROM moz_bookmarks WHERE fk = h.id) "
"FROM moz_places h "
"JOIN moz_historyvisits_temp AS v ON h.id = v.place_id "
"WHERE visit_date < ?1 "
"ORDER BY v.visit_date ASC LIMIT ?2 "
") UNION ALL "
"SELECT * FROM ( "
"SELECT v.id, v.place_id, v.visit_date, h.url, h.favicon_id, h.hidden, "
"(SELECT fk FROM moz_bookmarks WHERE fk = h.id) "
"FROM moz_places_temp h "
"JOIN moz_historyvisits_temp AS v ON h.id = v.place_id "
"WHERE visit_date < ?1 "
"ORDER BY v.visit_date ASC LIMIT ?2 "
") GROUP BY 1 ORDER BY 3 ASC LIMIT ?2"),
getter_AddRefs(selectStatement));
NS_ENSURE_SUCCESS(rv, rv);
@ -501,7 +537,11 @@ nsNavHistoryExpire::FindVisits(PRTime aExpireThreshold, PRUint32 aNumToExpire,
// check the number of visited unique urls in the db.
nsCOMPtr<mozIStorageStatement> countStatement;
rv = aConnection->CreateStatement(NS_LITERAL_CSTRING(
"SELECT count(*) FROM moz_places WHERE visit_count > 0"),
"SELECT "
"(SELECT count(*) FROM moz_places_temp WHERE visit_count > 0) + "
"(SELECT count(*) FROM moz_places WHERE visit_count > 0) - "
"(SELECT count(*) FROM moz_places WHERE id IN "
"(SELECT id FROM moz_places_temp))"),
getter_AddRefs(countStatement));
NS_ENSURE_SUCCESS(rv, rv);
@ -576,23 +616,44 @@ nsNavHistoryExpire::EraseVisits(mozIStorageConnection* aConnection,
// keep the old frecencies when possible as an estimate for the new frecency
// unless we know it has to be invalidated.
// We must do this before deleting visits
nsresult rv = aConnection->ExecuteSimpleSQL(
NS_LITERAL_CSTRING(
"UPDATE moz_places "
"SET frecency = -MAX(visit_count, 1) "
"WHERE id IN ("
"SELECT h.id FROM moz_places h "
"WHERE NOT EXISTS (SELECT b.id FROM moz_bookmarks b WHERE b.fk = h.id) "
"AND NOT EXISTS "
"(SELECT v.id FROM moz_historyvisits v WHERE v.place_id = h.id AND "
"v.id NOT IN (") + deletedVisitIds +
NS_LITERAL_CSTRING(")) AND "
"h.id IN (") + placeIds +
NS_LITERAL_CSTRING("))"));
nsresult rv = aConnection->ExecuteSimpleSQL(NS_LITERAL_CSTRING(
"UPDATE moz_places_view "
"SET frecency = -MAX(visit_count, 1) "
"WHERE id IN ( "
"SELECT h.id FROM moz_places_temp h "
"WHERE "
"NOT EXISTS (SELECT id FROM moz_bookmarks WHERE fk = h.id) AND "
"NOT EXISTS ( "
"SELECT v.id FROM moz_historyvisits_temp v "
"WHERE v.place_id = h.id "
"AND v.id NOT IN (") + deletedVisitIds + NS_LITERAL_CSTRING(") "
") AND "
"NOT EXISTS ( "
"SELECT v.id FROM moz_historyvisits v "
"WHERE v.place_id = h.id "
"AND v.id NOT IN (") + deletedVisitIds + NS_LITERAL_CSTRING(") "
") AND "
"h.id IN (") + placeIds + NS_LITERAL_CSTRING(") "
"UNION ALL "
"SELECT h.id FROM moz_places h "
"WHERE "
"NOT EXISTS (SELECT id FROM moz_bookmarks WHERE fk = h.id) AND "
"NOT EXISTS ( "
"SELECT v.id FROM moz_historyvisits_temp v "
"WHERE v.place_id = h.id "
"AND v.id NOT IN (") + deletedVisitIds + NS_LITERAL_CSTRING(") "
") AND "
"NOT EXISTS ( "
"SELECT v.id FROM moz_historyvisits v "
"WHERE v.place_id = h.id "
"AND v.id NOT IN (") + deletedVisitIds + NS_LITERAL_CSTRING(") "
") AND "
"h.id IN (") + placeIds + NS_LITERAL_CSTRING(") "
")"));
NS_ENSURE_SUCCESS(rv, rv);
rv = aConnection->ExecuteSimpleSQL(
NS_LITERAL_CSTRING("DELETE FROM moz_historyvisits WHERE id IN (") +
NS_LITERAL_CSTRING("DELETE FROM moz_historyvisits_view WHERE id IN (") +
deletedVisitIds +
NS_LITERAL_CSTRING(")"));
NS_ENSURE_SUCCESS(rv, rv);
@ -636,17 +697,33 @@ nsNavHistoryExpire::EraseHistory(mozIStorageConnection* aConnection,
if (deletedPlaceIds.IsEmpty())
return NS_OK;
return aConnection->ExecuteSimpleSQL(
NS_LITERAL_CSTRING("DELETE FROM moz_places WHERE id IN( "
"SELECT h.id "
"FROM moz_places h "
"WHERE h.id IN(") +
deletedPlaceIds +
NS_LITERAL_CSTRING(") AND NOT EXISTS "
"(SELECT id FROM moz_historyvisits WHERE place_id = h.id LIMIT 1) "
nsresult rv = aConnection->ExecuteSimpleSQL(NS_LITERAL_CSTRING(
"DELETE FROM moz_places_view WHERE id IN( "
"SELECT h.id "
"FROM moz_places h "
"WHERE h.id IN(") + deletedPlaceIds + NS_LITERAL_CSTRING(") "
"AND NOT EXISTS "
"(SELECT id FROM moz_bookmarks WHERE fk = h.id LIMIT 1) "
"AND SUBSTR(h.url,0,6) <> 'place:')"));
"(SELECT id FROM moz_historyvisits WHERE place_id = h.id LIMIT 1) "
"AND NOT EXISTS "
"(SELECT id FROM moz_historyvisits_temp WHERE place_id = h.id LIMIT 1) "
"AND NOT EXISTS "
"(SELECT id FROM moz_bookmarks WHERE fk = h.id LIMIT 1) "
"AND SUBSTR(h.url,0,6) <> 'place:' "
"UNION ALL "
"SELECT h.id "
"FROM moz_places_temp h "
"WHERE h.id IN(") + deletedPlaceIds + NS_LITERAL_CSTRING(") "
"AND NOT EXISTS "
"(SELECT id FROM moz_historyvisits WHERE place_id = h.id LIMIT 1) "
"AND NOT EXISTS "
"(SELECT id FROM moz_historyvisits_temp WHERE place_id = h.id LIMIT 1) "
"AND NOT EXISTS "
"(SELECT id FROM moz_bookmarks WHERE fk = h.id LIMIT 1) "
"AND SUBSTR(h.url,0,6) <> 'place:' "
")"));
NS_ENSURE_SUCCESS(rv, rv);
return NS_OK;
}
@ -676,13 +753,19 @@ nsNavHistoryExpire::EraseFavicons(mozIStorageConnection* aConnection,
if (deletedFaviconIds.IsEmpty())
return NS_OK;
// delete only if id is not referenced in moz_places
return aConnection->ExecuteSimpleSQL(
NS_LITERAL_CSTRING("DELETE FROM moz_favicons WHERE id IN ( "
"SELECT f.id FROM moz_favicons f "
"LEFT OUTER JOIN moz_places h ON f.id = h.favicon_id "
"WHERE f.id IN (") + deletedFaviconIds +
NS_LITERAL_CSTRING(") AND h.favicon_id IS NULL)"));
// delete only if favicon id is not referenced
nsresult rv = aConnection->ExecuteSimpleSQL(NS_LITERAL_CSTRING(
"DELETE FROM moz_favicons WHERE id IN ( "
"SELECT f.id FROM moz_favicons f "
"LEFT JOIN moz_places h ON f.id = h.favicon_id "
"LEFT JOIN moz_places_temp h_t ON f.id = h_t.favicon_id "
"WHERE f.id IN (") + deletedFaviconIds + NS_LITERAL_CSTRING(") "
"AND h.favicon_id IS NULL "
"AND h_t.favicon_id IS NULL "
")"));
NS_ENSURE_SUCCESS(rv, rv);
return NS_OK;
}
@ -735,12 +818,16 @@ nsNavHistoryExpire::ExpireAnnotations(mozIStorageConnection* aConnection)
PRTime now = PR_Now();
nsCOMPtr<mozIStorageStatement> expirePagesStatement;
nsresult rv = aConnection->CreateStatement(NS_LITERAL_CSTRING(
"DELETE FROM moz_annos WHERE expiration = ?1 AND (?2 > MAX(COALESCE(lastModified, 0), dateAdded))"),
"DELETE FROM moz_annos "
"WHERE expiration = ?1 AND "
"(?2 > MAX(COALESCE(lastModified, 0), dateAdded))"),
getter_AddRefs(expirePagesStatement));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<mozIStorageStatement> expireItemsStatement;
rv = aConnection->CreateStatement(NS_LITERAL_CSTRING(
"DELETE FROM moz_items_annos WHERE expiration = ?1 AND (?2 > MAX(COALESCE(lastModified, 0), dateAdded))"),
"DELETE FROM moz_items_annos "
"WHERE expiration = ?1 AND "
"(?2 > MAX(COALESCE(lastModified, 0), dateAdded))"),
getter_AddRefs(expireItemsStatement));
NS_ENSURE_SUCCESS(rv, rv);
@ -797,6 +884,9 @@ nsNavHistoryExpire::ExpireAnnotations(mozIStorageConnection* aConnection)
"DELETE FROM moz_annos WHERE expiration = ") +
nsPrintfCString("%d", nsIAnnotationService::EXPIRE_WITH_HISTORY) +
NS_LITERAL_CSTRING(" AND NOT EXISTS "
"(SELECT id FROM moz_historyvisits_temp "
"WHERE place_id = moz_annos.place_id LIMIT 1) "
"AND NOT EXISTS "
"(SELECT id FROM moz_historyvisits "
"WHERE place_id = moz_annos.place_id LIMIT 1)"));
NS_ENSURE_SUCCESS(rv, rv);
@ -817,16 +907,31 @@ nsNavHistoryExpire::ExpireEmbeddedLinks(mozIStorageConnection* aConnection)
nsCOMPtr<mozIStorageStatement> expireEmbeddedLinksStatement;
// Note: This query also removes visit_type = 0 entries, for bug #375777.
nsresult rv = aConnection->CreateStatement(NS_LITERAL_CSTRING(
"DELETE FROM moz_historyvisits WHERE id IN ("
"SELECT id FROM moz_historyvisits WHERE visit_date < ?1 "
"AND (visit_type = ?2 OR visit_type = 0) LIMIT ?3)"),
"DELETE FROM moz_historyvisits_view WHERE id IN ("
"SELECT * FROM ( "
"SELECT id FROM moz_historyvisits_temp "
"WHERE visit_date < ?1 "
"AND visit_type IN (") +
nsPrintfCString("%d", nsINavHistoryService::TRANSITION_EMBED) +
NS_LITERAL_CSTRING(", 0) "
"LIMIT ?2 "
") "
"UNION ALL "
"SELECT * FROM ( "
"SELECT id FROM moz_historyvisits "
"WHERE visit_date < ?1 "
"AND visit_type IN (") +
nsPrintfCString("%d", nsINavHistoryService::TRANSITION_EMBED) +
NS_LITERAL_CSTRING(", 0) "
"LIMIT ?2 "
") "
"LIMIT ?2 "
")"),
getter_AddRefs(expireEmbeddedLinksStatement));
NS_ENSURE_SUCCESS(rv, rv);
rv = expireEmbeddedLinksStatement->BindInt64Parameter(0, maxEmbeddedAge);
NS_ENSURE_SUCCESS(rv, rv);
rv = expireEmbeddedLinksStatement->BindInt32Parameter(1, nsINavHistoryService::TRANSITION_EMBED);
NS_ENSURE_SUCCESS(rv, rv);
rv = expireEmbeddedLinksStatement->BindInt32Parameter(2, EXPIRATION_CAP_EMBEDDED);
rv = expireEmbeddedLinksStatement->BindInt32Parameter(1, EXPIRATION_CAP_EMBEDDED);
NS_ENSURE_SUCCESS(rv, rv);
rv = expireEmbeddedLinksStatement->Execute();
NS_ENSURE_SUCCESS(rv, rv);
@ -847,11 +952,24 @@ nsNavHistoryExpire::ExpireHistoryParanoid(mozIStorageConnection* aConnection,
PRInt32 aMaxRecords)
{
nsCAutoString query(
"DELETE FROM moz_places WHERE id IN ("
"DELETE FROM moz_places_view WHERE id IN ("
"SELECT h.id FROM moz_places h "
"LEFT OUTER JOIN moz_historyvisits v ON h.id = v.place_id "
"LEFT OUTER JOIN moz_bookmarks b ON h.id = b.fk "
"WHERE v.id IS NULL AND b.id IS NULL AND SUBSTR(h.url,0,6) <> 'place:'");
"LEFT JOIN moz_historyvisits v ON h.id = v.place_id "
"LEFT JOIN moz_historyvisits_temp v_t ON h.id = v_t.place_id "
"LEFT JOIN moz_bookmarks b ON h.id = b.fk "
"WHERE v.id IS NULL "
"AND v_t.id IS NULL "
"AND b.id IS NULL "
"AND SUBSTR(h.url,0,6) <> 'place:' "
"UNION ALL "
"SELECT h.id FROM moz_places_temp h "
"LEFT JOIN moz_historyvisits v ON h.id = v.place_id "
"LEFT JOIN moz_historyvisits_temp v_t ON h.id = v_t.place_id "
"LEFT JOIN moz_bookmarks b ON h.id = b.fk "
"WHERE v.id IS NULL "
"AND v_t.id IS NULL "
"AND b.id IS NULL "
"AND SUBSTR(h.url,0,6) <> 'place:'");
if (aMaxRecords != -1) {
query.AppendLiteral(" LIMIT ");
query.AppendInt(aMaxRecords);
@ -871,10 +989,13 @@ nsresult
nsNavHistoryExpire::ExpireFaviconsParanoid(mozIStorageConnection* aConnection)
{
nsresult rv = aConnection->ExecuteSimpleSQL(NS_LITERAL_CSTRING(
"DELETE FROM moz_favicons WHERE id IN "
"(SELECT f.id FROM moz_favicons f "
"LEFT OUTER JOIN moz_places h ON f.id = h.favicon_id "
"WHERE h.favicon_id IS NULL)"));
"DELETE FROM moz_favicons WHERE id IN ("
"SELECT f.id FROM moz_favicons f "
"LEFT JOIN moz_places h ON f.id = h.favicon_id "
"LEFT JOIN moz_places_temp h_t ON f.id = h_t.favicon_id "
"WHERE h.favicon_id IS NULL "
"AND h_t.favicon_id IS NULL "
")"));
NS_ENSURE_SUCCESS(rv, rv);
return rv;
}
@ -898,14 +1019,17 @@ nsNavHistoryExpire::ExpireAnnotationsParanoid(mozIStorageConnection* aConnection
// delete all uri annos w/o a corresponding place id
// or without any visits *and* not EXPIRE_NEVER.
rv = aConnection->ExecuteSimpleSQL(NS_LITERAL_CSTRING(
"DELETE FROM moz_annos WHERE id IN "
"(SELECT a.id FROM moz_annos a "
"LEFT OUTER JOIN moz_places p ON a.place_id = p.id "
"LEFT OUTER JOIN moz_historyvisits v ON a.place_id = v.place_id "
"WHERE p.id IS NULL "
"OR (v.id IS NULL AND a.expiration != ") +
nsPrintfCString("%d", nsIAnnotationService::EXPIRE_NEVER) +
NS_LITERAL_CSTRING("))"));
"DELETE FROM moz_annos WHERE id IN ("
"SELECT a.id FROM moz_annos a "
"LEFT JOIN moz_places h ON a.place_id = h.id "
"LEFT JOIN moz_places_temp h_t ON a.place_id = h_t.id "
"LEFT JOIN moz_historyvisits v ON a.place_id = v.place_id "
"LEFT JOIN moz_historyvisits_temp v_t ON a.place_id = v_t.place_id "
"WHERE (h.id IS NULL AND h_t.id IS NULL) "
"OR (v.id IS NULL AND v_t.id IS NULL AND a.expiration != ") +
nsPrintfCString("%d", nsIAnnotationService::EXPIRE_NEVER) +
NS_LITERAL_CSTRING(")"
")"));
NS_ENSURE_SUCCESS(rv, rv);
// delete item annos w/o a corresponding item id
@ -916,16 +1040,15 @@ nsNavHistoryExpire::ExpireAnnotationsParanoid(mozIStorageConnection* aConnection
"WHERE b.id IS NULL)"));
NS_ENSURE_SUCCESS(rv, rv);
// delete all anno names w/o a corresponding uri or item entry
// delete all anno names w/o a corresponding anno
rv = aConnection->ExecuteSimpleSQL(NS_LITERAL_CSTRING(
"DELETE FROM moz_anno_attributes WHERE "
"id NOT IN (SELECT DISTINCT a.id FROM moz_anno_attributes a "
"JOIN moz_annos b ON b.anno_attribute_id = a.id "
"JOIN moz_places p ON b.place_id = p.id) "
"AND "
"id NOT IN (SELECT DISTINCT a.id FROM moz_anno_attributes a "
"JOIN moz_items_annos c ON c.anno_attribute_id = a.id "
"JOIN moz_bookmarks p ON c.item_id = p.id)"));
"DELETE FROM moz_anno_attributes WHERE id IN ("
"SELECT n.id FROM moz_anno_attributes n "
"LEFT JOIN moz_annos a ON n.id = a.anno_attribute_id "
"LEFT JOIN moz_items_annos t ON n.id = t.anno_attribute_id "
"WHERE a.anno_attribute_id IS NULL "
"AND t.anno_attribute_id IS NULL "
")"));
NS_ENSURE_SUCCESS(rv, rv);
return NS_OK;
}
@ -940,17 +1063,20 @@ nsNavHistoryExpire::ExpireInputHistoryParanoid(mozIStorageConnection* aConnectio
{
// Delete dangling input history that have no associated pages
nsresult rv = aConnection->ExecuteSimpleSQL(NS_LITERAL_CSTRING(
"DELETE FROM moz_inputhistory WHERE place_id IN "
"(SELECT i.place_id FROM moz_inputhistory i "
"LEFT OUTER JOIN moz_places h ON i.place_id = h.id "
"WHERE h.id IS NULL)"));
"DELETE FROM moz_inputhistory WHERE place_id IN ( "
"SELECT place_id FROM moz_inputhistory "
"LEFT JOIN moz_places h ON h.id = place_id "
"LEFT JOIN moz_places_temp h_t ON h_t.id = place_id "
"WHERE h.id IS NULL "
"AND h_t.id IS NULL "
")"));
NS_ENSURE_SUCCESS(rv, rv);
// Decay potentially unused entries (e.g. those that are at 1) to allow
// better chances for new entries that will start at 1
rv = aConnection->ExecuteSimpleSQL(NS_LITERAL_CSTRING(
"UPDATE moz_inputhistory "
"SET use_count = use_count * .9"));
"UPDATE moz_inputhistory "
"SET use_count = use_count * .9"));
NS_ENSURE_SUCCESS(rv, rv);
return NS_OK;

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

@ -39,38 +39,6 @@
#ifndef __nsPlacesTriggers_h__
#define __nsPlacesTriggers_h__
/**
* Trigger increments the visit count by one for each inserted visit that isn't
* an invalid transition, embedded transition, or a download transition.
*/
#define CREATE_VISIT_COUNT_INSERT_TRIGGER NS_LITERAL_CSTRING( \
"CREATE TRIGGER moz_historyvisits_afterinsert_v1_trigger " \
"AFTER INSERT ON moz_historyvisits FOR EACH ROW " \
"WHEN NEW.visit_type NOT IN (0, 4, 7) " /* invalid, EMBED, DOWNLOAD */ \
"BEGIN " \
"UPDATE moz_places " \
"SET visit_count = visit_count + 1 " \
"WHERE moz_places.id = NEW.place_id; " \
"END" \
)
/**
* Trigger decrements the visit count by one for each removed visit that isn't
* an invalid transition, embeded transition, or a download transition. To be
* safe, we ensure that the visit count will not fall below zero.
*/
#define CREATE_VISIT_COUNT_DELETE_TRIGGER NS_LITERAL_CSTRING( \
"CREATE TRIGGER moz_historyvisits_afterdelete_v1_trigger " \
"AFTER DELETE ON moz_historyvisits FOR EACH ROW " \
"WHEN OLD.visit_type NOT IN (0, 4, 7) " /* invalid, EMBED, DOWNLOAD */ \
"BEGIN " \
"UPDATE moz_places " \
"SET visit_count = visit_count - 1 " \
"WHERE moz_places.id = OLD.place_id " \
"AND visit_count > 0; " \
"END" \
)
/**
* Trigger checks to ensure that at least one bookmark is still using a keyword
* when any bookmark is deleted. If there are no more bookmarks using it, the

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

@ -164,11 +164,11 @@ function checkDBOnTimeout() {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
// Get all pages visited from the original typed one
var sql = "SELECT url FROM moz_historyvisits " +
"JOIN moz_places h ON h.id = place_id " +
var sql = "SELECT url FROM moz_historyvisits_view " +
"JOIN moz_places_view h ON h.id = place_id " +
"WHERE from_visit IN " +
"(SELECT v.id FROM moz_historyvisits v " +
"JOIN moz_places p ON p.id = v.place_id " +
"(SELECT v.id FROM moz_historyvisits_view v " +
"JOIN moz_places_view p ON p.id = v.place_id " +
"WHERE p.url = ?1)";
var stmt = mDBConn.createStatement(sql);
stmt.bindUTF8StringParameter(0, typedURI.spec);

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

@ -41,6 +41,8 @@
// Get history service
try {
var histsvc = Cc["@mozilla.org/browser/nav-history-service;1"].getService(Ci.nsINavHistoryService);
var gh = Cc["@mozilla.org/browser/global-history;2"].
getService(Ci.nsIGlobalHistory2);
} catch(ex) {
do_throw("Could not get history service\n");
}
@ -61,7 +63,9 @@ function add_visit(aURI, aReferrer) {
histsvc.TRANSITION_TYPED, // user typed in URL bar
false, // not redirect
0);
dump("### Added visit with id of " + placeID + "\n");
do_check_true(placeID > 0);
do_check_true(gh.isVisited(aURI));
return placeID;
}