Changeset 236085 in webkit


Ignore:
Timestamp:
Sep 17, 2018 2:41:13 PM (6 years ago)
Author:
chris.reid@sony.com
Message:

[Curl] Add schema version and enable auto vacuum for cookie database.
https://bugs.webkit.org/show_bug.cgi?id=189669

Reviewed by Alex Christensen.

Turning on auto incremental vacuuming and adding versioning to the database. Right now we
reset tables if there's an unknown schema or if the none is set. There is placeholder logic
in place to upgrade databases as the schema changes in the future.

Tested by checking the database manually after launching MiniBrowser.

  • platform/network/curl/CookieJarDB.cpp:

(WebCore::CookieJarDB::openDatabase):
(WebCore::CookieJarDB::verifySchemaVersion):
(WebCore::CookieJarDB::deleteAllTables):
(WebCore::CookieJarDB::createPrepareStatement):
(WebCore::CookieJarDB::getPrepareStatement):
(WebCore::CookieJarDB::executeSimpleSql):

  • platform/network/curl/CookieJarDB.h:
  • platform/network/curl/NetworkStorageSessionCurl.cpp:

(WebCore::defaultSession):

  • platform/sql/SQLiteDatabase.cpp:

(WebCore::SQLiteDatabase::turnOnIncrementalAutoVacuum): fixed a bug.

Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r236083 r236085  
     12018-09-17  Christopher Reid  <chris.reid@sony.com>
     2
     3        [Curl] Add schema version and enable auto vacuum for cookie database.
     4        https://bugs.webkit.org/show_bug.cgi?id=189669
     5
     6        Reviewed by Alex Christensen.
     7
     8        Turning on auto incremental vacuuming and adding versioning to the database. Right now we
     9        reset tables if there's an unknown schema or if the none is set. There is placeholder logic
     10        in place to upgrade databases as the schema changes in the future.
     11
     12        Tested by checking the database manually after launching MiniBrowser.
     13
     14        * platform/network/curl/CookieJarDB.cpp:
     15        (WebCore::CookieJarDB::openDatabase):
     16        (WebCore::CookieJarDB::verifySchemaVersion):
     17        (WebCore::CookieJarDB::deleteAllTables):
     18        (WebCore::CookieJarDB::createPrepareStatement):
     19        (WebCore::CookieJarDB::getPrepareStatement):
     20        (WebCore::CookieJarDB::executeSimpleSql):
     21        * platform/network/curl/CookieJarDB.h:
     22        * platform/network/curl/NetworkStorageSessionCurl.cpp:
     23        (WebCore::defaultSession):
     24        * platform/sql/SQLiteDatabase.cpp:
     25        (WebCore::SQLiteDatabase::turnOnIncrementalAutoVacuum): fixed a bug.
     26
    1272018-09-14  Ryosuke Niwa  <rniwa@webkit.org>
    228
  • trunk/Source/WebCore/platform/network/curl/CookieJarDB.cpp

    r234973 r236085  
    7272    "DELETE FROM Cookie;"
    7373
     74
     75// If the database schema is updated:
     76// - Increment schemaVersion
     77// - Add upgrade logic in verifySchemaVersion to migrate databases from the previous schema version
     78static constexpr int schemaVersion = 1;
     79
     80
    7481void CookieJarDB::setEnabled(bool enable)
    7582{
     
    126133            LOG_ERROR("Unable to create the Cookie Database path %s", m_databasePath.utf8().data());
    127134
    128         if (m_database.open(m_databasePath, false)) {
    129             bool databaseValidity = true;
    130             databaseValidity &= (executeSimpleSql(CREATE_COOKIE_TABLE_SQL) == SQLITE_DONE);
    131             databaseValidity &= (executeSimpleSql(CREATE_DOMAIN_INDEX_SQL) == SQLITE_DONE);
    132             databaseValidity &= (executeSimpleSql(CREATE_PATH_INDEX_SQL) == SQLITE_DONE);
    133             if (!databaseValidity) {
    134                 // give up create database at this time (all cookies on request/response are ignored)
    135                 m_database.close();
    136                 deleteAllDatabaseFiles();
    137             }
    138         }
     135        m_database.open(m_databasePath, false);
    139136    }
    140137
    141138    if (!m_database.isOpen())
    142139        return false;
     140
     141    if (!isOnMemory() && !m_database.turnOnIncrementalAutoVacuum())
     142        LOG_ERROR("Unable to turn on incremental auto-vacuum (%d %s)", m_database.lastError(), m_database.lastErrorMsg());
     143
     144    verifySchemaVersion();
     145
     146    bool databaseValidity = true;
     147    if (!existsDatabaseFile || !m_database.tableExists("Cookie")) {
     148        databaseValidity &= (executeSimpleSql(CREATE_COOKIE_TABLE_SQL) == SQLITE_DONE);
     149        databaseValidity &= (executeSimpleSql(CREATE_DOMAIN_INDEX_SQL) == SQLITE_DONE);
     150        databaseValidity &= (executeSimpleSql(CREATE_PATH_INDEX_SQL) == SQLITE_DONE);
     151    }
     152
     153    if (!databaseValidity) {
     154        // give up create database at this time (all cookies on request/response are ignored)
     155        m_database.close();
     156        deleteAllDatabaseFiles();
     157        return false;
     158    }
    143159
    144160    m_database.setSynchronous(SQLiteDatabase::SyncNormal);
     
    161177        m_database.close();
    162178    }
     179}
     180
     181void CookieJarDB::verifySchemaVersion()
     182{
     183    if (isOnMemory())
     184        return;
     185
     186    int version = SQLiteStatement(m_database, "PRAGMA user_version").getColumnInt(0);
     187    if (version == schemaVersion)
     188        return;
     189
     190    switch (version) {
     191        // Placeholder for schema version upgrade logic
     192        // Ensure cases fall through to the next version's upgrade logic
     193
     194    case 0:
     195        deleteAllTables();
     196        break;
     197    default:
     198        // This case can be reached when downgrading versions
     199        LOG_ERROR("Unknown cookie database version: %d", version);
     200        deleteAllTables();
     201        break;
     202    }
     203
     204    // Update version
     205    executeSimpleSql(String::format("PRAGMA user_version=%d", schemaVersion));
     206}
     207
     208void CookieJarDB::deleteAllTables()
     209{
     210    if (!m_database.isOpen())
     211        return;
     212
     213    m_database.clearAllTables();
    163214}
    164215
     
    485536}
    486537
    487 void CookieJarDB::createPrepareStatement(const char* sql)
     538void CookieJarDB::createPrepareStatement(const String& sql)
    488539{
    489540    auto statement = std::make_unique<SQLiteStatement>(m_database, sql);
    490541    int ret = statement->prepare();
    491542    ASSERT(ret == SQLITE_OK);
    492     m_statements.add(String(sql), WTFMove(statement));
    493 }
    494 
    495 SQLiteStatement* CookieJarDB::getPrepareStatement(const char* sql)
    496 {
    497     const auto& statement = m_statements.get(String(sql));
     543    m_statements.add(sql, WTFMove(statement));
     544}
     545
     546SQLiteStatement* CookieJarDB::getPrepareStatement(const String& sql)
     547{
     548    const auto& statement = m_statements.get(sql);
    498549    ASSERT(statement);
    499550    statement->reset();
     
    501552}
    502553
    503 int CookieJarDB::executeSimpleSql(const char* sql, bool ignoreError)
     554int CookieJarDB::executeSimpleSql(const String& sql, bool ignoreError)
    504555{
    505556    SQLiteStatement statement(m_database, sql);
     
    509560    checkSQLiteReturnCode(ret);
    510561    if (ret != SQLITE_OK && ret != SQLITE_DONE && ret != SQLITE_ROW && !ignoreError)
    511         LOG_ERROR("Failed to execute %s error: %s", sql, m_database.lastErrorMsg());
     562        LOG_ERROR("Failed to execute %s error: %s", sql.ascii().data(), m_database.lastErrorMsg());
    512563
    513564    return ret;
  • trunk/Source/WebCore/platform/network/curl/CookieJarDB.h

    r234938 r236085  
    7676    void deleteAllDatabaseFiles();
    7777
    78     void createPrepareStatement(const char* sql);
    79     SQLiteStatement* getPrepareStatement(const char* sql);
    80     int executeSimpleSql(const char* sql, bool ignoreError = false);
     78    void verifySchemaVersion();
     79    void deleteAllTables();
     80
     81    void createPrepareStatement(const String& sql);
     82    SQLiteStatement* getPrepareStatement(const String& sql);
     83    int executeSimpleSql(const String& sql, bool ignoreError = false);
    8184
    8285    int deleteCookieInternal(const String& name, const String& domain, const String& path);
  • trunk/Source/WebCore/platform/network/curl/NetworkStorageSessionCurl.cpp

    r234376 r236085  
    8686{
    8787    ASSERT(isMainThread());
    88     static NeverDestroyed<std::unique_ptr<NetworkStorageSession>> session;
     88    static std::unique_ptr<NetworkStorageSession> session;
    8989    return session;
    9090}
  • trunk/Source/WebCore/platform/sql/SQLiteDatabase.cpp

    r234501 r236085  
    489489    int autoVacuumMode = statement.getColumnInt(0);
    490490    int error = lastError();
     491    statement.finalize();
    491492
    492493    // Check if we got an error while trying to get the value of the auto_vacuum flag.
Note: See TracChangeset for help on using the changeset viewer.