Home | History | Annotate | Download | only in history
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_HISTORY_STARRED_URL_DATABASE_H_
      6 #define CHROME_BROWSER_HISTORY_STARRED_URL_DATABASE_H_
      7 #pragma once
      8 
      9 #include <set>
     10 
     11 #include "base/basictypes.h"
     12 #include "base/gtest_prod_util.h"
     13 #include "base/string16.h"
     14 #include "chrome/browser/history/history_types.h"
     15 #include "chrome/browser/history/url_database.h"
     16 #include "ui/base/models/tree_node_model.h"
     17 
     18 class FilePath;
     19 
     20 namespace sql {
     21 class Connection;
     22 }
     23 
     24 namespace history {
     25 
     26 // Bookmarks were originally part of the url database, they have since been
     27 // moved to a separate file. This file exists purely for historical reasons and
     28 // contains just enough to allow migration.
     29 class StarredURLDatabase : public URLDatabase {
     30  public:
     31   // Must call InitStarTable() AND any additional init functions provided by
     32   // URLDatabase before using this class' functions.
     33   StarredURLDatabase();
     34   virtual ~StarredURLDatabase();
     35 
     36  protected:
     37   // The unit tests poke our innards.
     38   friend class HistoryTest;
     39   friend class StarredURLDatabaseTest;
     40   FRIEND_TEST_ALL_PREFIXES(HistoryTest, CreateStarFolder);
     41 
     42   // Writes bookmarks to the specified file.
     43   bool MigrateBookmarksToFile(const FilePath& path);
     44 
     45   // Returns the database for the functions in this interface.
     46   virtual sql::Connection& GetDB() = 0;
     47 
     48  private:
     49   // Makes sure the starred table is in a sane state. This does the following:
     50   // . Makes sure there is a bookmark bar and other nodes. If no bookmark bar
     51   //   node is found, the table is dropped and recreated.
     52   // . Removes any bookmarks with no URL. This can happen if a URL is removed
     53   //   from the urls table without updating the starred table correctly.
     54   // . Makes sure the visual order of all nodes is correct.
     55   // . Moves all bookmarks and folders that are not descendants of the bookmark
     56   //   bar or other folders to the bookmark bar.
     57   // . Makes sure there isn't a cycle in the folders. A cycle means some folder
     58   //   has as its parent one of its children.
     59   //
     60   // This returns false if the starred table is in a bad state and couldn't
     61   // be fixed, true otherwise.
     62   //
     63   // This should be invoked after migration.
     64   bool EnsureStarredIntegrity();
     65 
     66   // Gets all the starred entries.
     67   bool GetAllStarredEntries(std::vector<StarredEntry>* entries);
     68 
     69   // Sets the title, parent_id, parent_folder_id, visual_order and date_modifed
     70   // of the specified star entry.
     71   //
     72   // WARNING: Does not update the visual order.
     73   bool UpdateStarredEntryRow(StarID star_id,
     74                              const string16& title,
     75                              UIStarID parent_folder_id,
     76                              int visual_order,
     77                              base::Time date_modified);
     78 
     79   // Adjusts the visual order of all children of parent_folder_id with a
     80   // visual_order >= start_visual_order by delta. For example,
     81   // AdjustStarredVisualOrder(10, 0, 1) increments the visual order all children
     82   // of folder 10 with a visual order >= 0 by 1.
     83   bool AdjustStarredVisualOrder(UIStarID parent_folder_id,
     84                                 int start_visual_order,
     85                                 int delta);
     86 
     87   // Creates a starred entry with the specified parameters in the database.
     88   // Returns the newly created id, or 0 on failure.
     89   //
     90   // WARNING: Does not update the visual order.
     91   StarID CreateStarredEntryRow(URLID url_id,
     92                                UIStarID folder_id,
     93                                UIStarID parent_folder_id,
     94                                const string16& title,
     95                                const base::Time& date_added,
     96                                int visual_order,
     97                                StarredEntry::Type type);
     98 
     99   // Deletes the entry from the starred database base on the starred id (NOT
    100   // the url id).
    101   //
    102   // WARNING: Does not update the visual order.
    103   bool DeleteStarredEntryRow(StarID star_id);
    104 
    105   // Gets the details for the specified star entry in entry.
    106   bool GetStarredEntry(StarID star_id, StarredEntry* entry);
    107 
    108   // Creates a starred entry with the requested information. The structure will
    109   // be updated with the ID of the newly created entry. The URL table will be
    110   // updated to point to the entry. The URL row will be created if it doesn't
    111   // exist.
    112   //
    113   // We currently only support one entry per URL. This URL should not already be
    114   // starred when calling this function or it will fail and will return 0.
    115   StarID CreateStarredEntry(StarredEntry* entry);
    116 
    117   // Used when checking integrity of starred table.
    118   typedef ui::TreeNodeWithValue<history::StarredEntry> StarredNode;
    119 
    120   // Returns the max folder id, or 0 if there is an error.
    121   UIStarID GetMaxFolderID();
    122 
    123   // Gets all the bookmarks and folders creating a StarredNode for each
    124   // bookmark and folder. On success all the root nodes (bookmark bar node,
    125   // other folder node, folders with no parent or folders with a parent that
    126   // would make a cycle) are added to roots.
    127   //
    128   // If a folder_id occurs more than once, all but the first ones id is added to
    129   // folders_with_duplicate_ids.
    130   //
    131   // All bookmarks not on the bookmark bar/other folder are added to
    132   // unparented_urls.
    133   //
    134   // It's up to the caller to delete the nodes returned in roots and
    135   // unparented_urls.
    136   //
    137   // This is used during integrity enforcing/checking of the starred table.
    138   bool BuildStarNodes(
    139       std::set<StarredNode*>* roots,
    140       std::set<StarID>* folders_with_duplicate_ids,
    141       std::set<StarredNode*>* unparented_urls,
    142       std::set<StarID>* empty_url_ids);
    143 
    144   // Sets the visual order of all of node's children match the order in |node|.
    145   // If the order differs, the database is updated. Returns false if the order
    146   // differed and the db couldn't be updated.
    147   bool EnsureVisualOrder(StarredNode* node);
    148 
    149   // Returns the first node in nodes with the specified type, or null if there
    150   // is not a node with the specified type.
    151   StarredNode* GetNodeByType(
    152       const std::set<StarredNode*>& nodes,
    153       StarredEntry::Type type);
    154 
    155   // Implementation for setting starred integrity. See description of
    156   // EnsureStarredIntegrity for the details of what this does.
    157   //
    158   // All entries in roots that are not the bookmark bar and other node are
    159   // moved to be children of the bookmark bar node. Similarly all nodes
    160   // in unparented_urls are moved to be children of the bookmark bar.
    161   //
    162   // Returns true on success, false if the starred table is in a bad state and
    163   // couldn't be repaired.
    164   bool EnsureStarredIntegrityImpl(
    165       std::set<StarredNode*>* roots,
    166       const std::set<StarID>& folders_with_duplicate_ids,
    167       std::set<StarredNode*>* unparented_urls,
    168       const std::set<StarID>& empty_url_ids);
    169 
    170   // Resets the visual order and parent_folder_id of source's StarredEntry
    171   // and adds it to the end of new_parent's children.
    172   //
    173   // This is used if the starred table is an unexpected state and an entry
    174   // needs to be moved.
    175   bool Move(StarredNode* source, StarredNode* new_parent);
    176 
    177   // Does the work of migrating bookmarks to a temporary file that
    178   // BookmarkStorage will read from.
    179   bool MigrateBookmarksToFileImpl(const FilePath& path);
    180 
    181   DISALLOW_COPY_AND_ASSIGN(StarredURLDatabase);
    182 };
    183 
    184 }  // namespace history
    185 
    186 #endif  // CHROME_BROWSER_HISTORY_STARRED_URL_DATABASE_H_
    187