Changeset 280415 in webkit


Ignore:
Timestamp:
Jul 28, 2021 9:04:18 PM (12 months ago)
Author:
sihui_liu@apple.com
Message:

Implement IDBTransaction.durability
https://bugs.webkit.org/show_bug.cgi?id=228289

Reviewed by Darin Adler.

LayoutTests/imported/w3c:

  • web-platform-tests/IndexedDB/idlharness.any-expected.txt:
  • web-platform-tests/IndexedDB/idlharness.any.worker-expected.txt:
  • web-platform-tests/IndexedDB/transaction-relaxed-durability.tentative.any-expected.txt:
  • web-platform-tests/IndexedDB/transaction-relaxed-durability.tentative.any.worker-expected.txt:

Source/WebCore:

Spec: https://www.w3.org/TR/IndexedDB/#dom-idbtransaction-durability

https://www.w3.org/TR/IndexedDB/#dictdef-idbtransactionoptions

IDBTransaction.durability gives a hint about durability of a transaction. If it's strict, backend would try
syncing data to database file after transaction commit, which enforces durability. If it's relaxed, it means
data may stay in the OS buffer some time after transaction commit, which gives better performance. Firefox and
Chrome already implemented durability. They have different ways of setting durability, and we choose to use
TransactionOptions as spec.

Rebaselined existing tests.
New tests: storage/indexeddb/idbtransaction-durability-private.html

storage/indexeddb/idbtransaction-durability.html

  • CMakeLists.txt:
  • DerivedSources-input.xcfilelist:
  • DerivedSources-output.xcfilelist:
  • DerivedSources.make:
  • Headers.cmake:
  • Modules/indexeddb/IDBDatabase.cpp:

(WebCore::IDBDatabase::transaction):

  • Modules/indexeddb/IDBDatabase.h:
  • Modules/indexeddb/IDBDatabase.idl:
  • Modules/indexeddb/IDBTransaction.h:
  • Modules/indexeddb/IDBTransaction.idl:
  • Modules/indexeddb/IDBTransactionDurability.h: Added.
  • Modules/indexeddb/IDBTransactionDurability.idl: Added.
  • Modules/indexeddb/server/SQLiteIDBBackingStore.cpp:

(WebCore::IDBServer::SQLiteIDBBackingStore::commitTransaction):

  • Modules/indexeddb/server/SQLiteIDBTransaction.h:

(WebCore::IDBServer::SQLiteIDBTransaction::durability const):

  • Modules/indexeddb/shared/IDBTransactionInfo.cpp:

(WebCore::IDBTransactionInfo::clientTransaction):
(WebCore::IDBTransactionInfo::IDBTransactionInfo):
(WebCore::IDBTransactionInfo::isolatedCopy):

  • Modules/indexeddb/shared/IDBTransactionInfo.h:

(WebCore::IDBTransactionInfo::durability const):
(WebCore::IDBTransactionInfo::encode const):
(WebCore::IDBTransactionInfo::decode):

  • Sources.txt:
  • WebCore.xcodeproj/project.pbxproj:
  • platform/sql/SQLiteDatabase.cpp:

(WebCore::checkpointModeValue):
(WebCore::SQLiteDatabase::checkpoint):
(WebCore::SQLiteDatabase::useWALJournalMode):

  • platform/sql/SQLiteDatabase.h:

LayoutTests:

  • storage/indexeddb/idbtransaction-durability-expected.txt: Added.
  • storage/indexeddb/idbtransaction-durability-private-expected.txt: Added.
  • storage/indexeddb/idbtransaction-durability-private.html: Added.
  • storage/indexeddb/idbtransaction-durability.html: Added.
  • storage/indexeddb/resources/idbtransaction-durability.js: Added.

(onOpenUpgradeNeeded):
(onOpenSuccess):
(onTransactionComplete):

Location:
trunk
Files:
7 added
25 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r280411 r280415  
     12021-07-28  Sihui Liu  <sihui_liu@apple.com>
     2
     3        Implement IDBTransaction.durability
     4        https://bugs.webkit.org/show_bug.cgi?id=228289
     5
     6        Reviewed by Darin Adler.
     7
     8        * storage/indexeddb/idbtransaction-durability-expected.txt: Added.
     9        * storage/indexeddb/idbtransaction-durability-private-expected.txt: Added.
     10        * storage/indexeddb/idbtransaction-durability-private.html: Added.
     11        * storage/indexeddb/idbtransaction-durability.html: Added.
     12        * storage/indexeddb/resources/idbtransaction-durability.js: Added.
     13        (onOpenUpgradeNeeded):
     14        (onOpenSuccess):
     15        (onTransactionComplete):
     16
    1172021-07-28  Ayumi Kojima  <ayumi_kojima@apple.com>
    218
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r280410 r280415  
     12021-07-28  Sihui Liu  <sihui_liu@apple.com>
     2
     3        Implement IDBTransaction.durability
     4        https://bugs.webkit.org/show_bug.cgi?id=228289
     5
     6        Reviewed by Darin Adler.
     7
     8        * web-platform-tests/IndexedDB/idlharness.any-expected.txt:
     9        * web-platform-tests/IndexedDB/idlharness.any.worker-expected.txt:
     10        * web-platform-tests/IndexedDB/transaction-relaxed-durability.tentative.any-expected.txt:
     11        * web-platform-tests/IndexedDB/transaction-relaxed-durability.tentative.any.worker-expected.txt:
     12
    1132021-07-28  Sihui Liu  <sihui_liu@apple.com>
    214
  • trunk/LayoutTests/imported/w3c/web-platform-tests/IndexedDB/idlharness.any-expected.txt

    r280053 r280415  
    186186PASS IDBTransaction interface: attribute objectStoreNames
    187187PASS IDBTransaction interface: attribute mode
    188 FAIL IDBTransaction interface: attribute durability assert_true: The prototype object must have a property "durability" expected true got false
     188PASS IDBTransaction interface: attribute durability
    189189PASS IDBTransaction interface: attribute db
    190190PASS IDBTransaction interface: attribute error
  • trunk/LayoutTests/imported/w3c/web-platform-tests/IndexedDB/idlharness.any.worker-expected.txt

    r280053 r280415  
    186186PASS IDBTransaction interface: attribute objectStoreNames
    187187PASS IDBTransaction interface: attribute mode
    188 FAIL IDBTransaction interface: attribute durability assert_true: The prototype object must have a property "durability" expected true got false
     188PASS IDBTransaction interface: attribute durability
    189189PASS IDBTransaction interface: attribute db
    190190PASS IDBTransaction interface: attribute error
  • trunk/LayoutTests/imported/w3c/web-platform-tests/IndexedDB/transaction-relaxed-durability.tentative.any-expected.txt

    r263437 r280415  
    11
    2 FAIL Committed data can be read back out: case 0 assert_equals: expected (string) "default" but got (undefined) undefined
    3 FAIL Committed data can be read back out: case 1 assert_equals: expected (string) "default" but got (undefined) undefined
    4 FAIL Committed data can be read back out: case 2 assert_equals: expected (string) "default" but got (undefined) undefined
    5 FAIL Committed data can be read back out: case 3 assert_equals: expected (string) "relaxed" but got (undefined) undefined
    6 FAIL Committed data can be read back out: case 4 assert_equals: expected (string) "strict" but got (undefined) undefined
    7 FAIL Invalid durability option throws a TypeError assert_throws_js: function "function () {
    8       db.transaction(['books'], 'readwrite', { durability: 'invalid' });
    9   }" did not throw
     2PASS Committed data can be read back out: case 0
     3PASS Committed data can be read back out: case 1
     4PASS Committed data can be read back out: case 2
     5PASS Committed data can be read back out: case 3
     6PASS Committed data can be read back out: case 4
     7PASS Invalid durability option throws a TypeError
    108
  • trunk/LayoutTests/imported/w3c/web-platform-tests/IndexedDB/transaction-relaxed-durability.tentative.any.worker-expected.txt

    r263437 r280415  
    11
    2 FAIL Committed data can be read back out: case 0 assert_equals: expected (string) "default" but got (undefined) undefined
    3 FAIL Committed data can be read back out: case 1 assert_equals: expected (string) "default" but got (undefined) undefined
    4 FAIL Committed data can be read back out: case 2 assert_equals: expected (string) "default" but got (undefined) undefined
    5 FAIL Committed data can be read back out: case 3 assert_equals: expected (string) "relaxed" but got (undefined) undefined
    6 FAIL Committed data can be read back out: case 4 assert_equals: expected (string) "strict" but got (undefined) undefined
    7 FAIL Invalid durability option throws a TypeError assert_throws_js: function "function () {
    8       db.transaction(['books'], 'readwrite', { durability: 'invalid' });
    9   }" did not throw
     2PASS Committed data can be read back out: case 0
     3PASS Committed data can be read back out: case 1
     4PASS Committed data can be read back out: case 2
     5PASS Committed data can be read back out: case 3
     6PASS Committed data can be read back out: case 4
     7PASS Invalid durability option throws a TypeError
    108
  • trunk/Source/WebCore/CMakeLists.txt

    r280310 r280415  
    304304    Modules/indexeddb/IDBRequest.idl
    305305    Modules/indexeddb/IDBTransaction.idl
     306    Modules/indexeddb/IDBTransactionDurability.idl
    306307    Modules/indexeddb/IDBTransactionMode.idl
    307308    Modules/indexeddb/IDBVersionChangeEvent.idl
  • trunk/Source/WebCore/ChangeLog

    r280410 r280415  
     12021-07-28  Sihui Liu  <sihui_liu@apple.com>
     2
     3        Implement IDBTransaction.durability
     4        https://bugs.webkit.org/show_bug.cgi?id=228289
     5
     6        Reviewed by Darin Adler.
     7
     8        Spec: https://www.w3.org/TR/IndexedDB/#dom-idbtransaction-durability
     9              https://www.w3.org/TR/IndexedDB/#dictdef-idbtransactionoptions
     10
     11        IDBTransaction.durability gives a hint about durability of a transaction. If it's strict, backend would try
     12        syncing data to database file after transaction commit, which enforces durability. If it's relaxed, it means
     13        data may stay in the OS buffer some time after transaction commit, which gives better performance. Firefox and
     14        Chrome already implemented durability. They have different ways of setting durability, and we choose to use
     15        TransactionOptions as spec.
     16
     17        Rebaselined existing tests.
     18        New tests: storage/indexeddb/idbtransaction-durability-private.html
     19                   storage/indexeddb/idbtransaction-durability.html
     20
     21        * CMakeLists.txt:
     22        * DerivedSources-input.xcfilelist:
     23        * DerivedSources-output.xcfilelist:
     24        * DerivedSources.make:
     25        * Headers.cmake:
     26        * Modules/indexeddb/IDBDatabase.cpp:
     27        (WebCore::IDBDatabase::transaction):
     28        * Modules/indexeddb/IDBDatabase.h:
     29        * Modules/indexeddb/IDBDatabase.idl:
     30        * Modules/indexeddb/IDBTransaction.h:
     31        * Modules/indexeddb/IDBTransaction.idl:
     32        * Modules/indexeddb/IDBTransactionDurability.h: Added.
     33        * Modules/indexeddb/IDBTransactionDurability.idl: Added.
     34        * Modules/indexeddb/server/SQLiteIDBBackingStore.cpp:
     35        (WebCore::IDBServer::SQLiteIDBBackingStore::commitTransaction):
     36        * Modules/indexeddb/server/SQLiteIDBTransaction.h:
     37        (WebCore::IDBServer::SQLiteIDBTransaction::durability const):
     38        * Modules/indexeddb/shared/IDBTransactionInfo.cpp:
     39        (WebCore::IDBTransactionInfo::clientTransaction):
     40        (WebCore::IDBTransactionInfo::IDBTransactionInfo):
     41        (WebCore::IDBTransactionInfo::isolatedCopy):
     42        * Modules/indexeddb/shared/IDBTransactionInfo.h:
     43        (WebCore::IDBTransactionInfo::durability const):
     44        (WebCore::IDBTransactionInfo::encode const):
     45        (WebCore::IDBTransactionInfo::decode):
     46        * Sources.txt:
     47        * WebCore.xcodeproj/project.pbxproj:
     48        * platform/sql/SQLiteDatabase.cpp:
     49        (WebCore::checkpointModeValue):
     50        (WebCore::SQLiteDatabase::checkpoint):
     51        (WebCore::SQLiteDatabase::useWALJournalMode):
     52        * platform/sql/SQLiteDatabase.h:
     53
    1542021-07-28  Sihui Liu  <sihui_liu@apple.com>
    255
  • trunk/Source/WebCore/DerivedSources-input.xcfilelist

    r280310 r280415  
    152152$(PROJECT_DIR)/Modules/indexeddb/IDBRequest.idl
    153153$(PROJECT_DIR)/Modules/indexeddb/IDBTransaction.idl
     154$(PROJECT_DIR)/Modules/indexeddb/IDBTransactionDurability.idl
    154155$(PROJECT_DIR)/Modules/indexeddb/IDBTransactionMode.idl
    155156$(PROJECT_DIR)/Modules/indexeddb/IDBVersionChangeEvent.idl
  • trunk/Source/WebCore/DerivedSources-output.xcfilelist

    r280310 r280415  
    11681168$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSIDBTransaction.cpp
    11691169$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSIDBTransaction.h
     1170$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSIDBTransactionDurability.cpp
     1171$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSIDBTransactionDurability.h
    11701172$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSIDBTransactionMode.cpp
    11711173$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSIDBTransactionMode.h
  • trunk/Source/WebCore/DerivedSources.make

    r280310 r280415  
    178178    $(WebCore)/Modules/indexeddb/IDBRequest.idl \
    179179    $(WebCore)/Modules/indexeddb/IDBTransaction.idl \
     180        $(WebCore)/Modules/indexeddb/IDBTransactionDurability.idl \
    180181    $(WebCore)/Modules/indexeddb/IDBTransactionMode.idl \
    181182    $(WebCore)/Modules/indexeddb/IDBVersionChangeEvent.idl \
  • trunk/Source/WebCore/Headers.cmake

    r279971 r280415  
    6767    Modules/indexeddb/IDBRequest.h
    6868    Modules/indexeddb/IDBTransaction.h
     69    Modules/indexeddb/IDBTransactionDurability.h
    6970    Modules/indexeddb/IDBTransactionMode.h
    7071    Modules/indexeddb/IDBValue.h
  • trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.cpp

    r280053 r280415  
    163163}
    164164
    165 ExceptionOr<Ref<IDBTransaction>> IDBDatabase::transaction(StringOrVectorOfStrings&& storeNames, IDBTransactionMode mode)
     165ExceptionOr<Ref<IDBTransaction>> IDBDatabase::transaction(StringOrVectorOfStrings&& storeNames, IDBTransactionMode mode, TransactionOptions options)
    166166{
    167167    LOG(IndexedDB, "IDBDatabase::transaction");
     
    201201        return Exception { TypeError };
    202202
    203     auto info = IDBTransactionInfo::clientTransaction(m_connectionProxy.get(), objectStores, mode);
     203    auto info = IDBTransactionInfo::clientTransaction(m_connectionProxy.get(), objectStores, mode, options.durability);
    204204
    205205    LOG(IndexedDBOperations, "IDB creating transaction: %s", info.loggingString().utf8().data());
  • trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.h

    r278253 r280415  
    6464
    6565    using StringOrVectorOfStrings = WTF::Variant<String, Vector<String>>;
    66     ExceptionOr<Ref<IDBTransaction>> transaction(StringOrVectorOfStrings&& storeNames, IDBTransactionMode);
     66    struct TransactionOptions {
     67        std::optional<IDBTransactionDurability> durability;
     68    };
     69    ExceptionOr<Ref<IDBTransaction>> transaction(StringOrVectorOfStrings&& storeNames, IDBTransactionMode, TransactionOptions = { });
    6770    ExceptionOr<void> deleteObjectStore(const String& name);
    6871    void close();
  • trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.idl

    r275151 r280415  
    3434    readonly attribute DOMStringList objectStoreNames;
    3535
    36     // FIXME: 'transaction' should also take an optional 'IDBTransactionOptions' argument.
    37     [NewObject] IDBTransaction transaction((DOMString or sequence<DOMString>) storeNames, optional IDBTransactionMode mode = "readonly");
     36    [NewObject] IDBTransaction transaction((DOMString or sequence<DOMString>) storeNames, optional IDBTransactionMode mode = "readonly", optional IDBTransactionOptions options);
    3837    undefined close();
    3938
     
    5655    boolean autoIncrement = false;
    5756};
     57
     58dictionary IDBTransactionOptions {
     59    IDBTransactionDurability durability = "default";
     60};
  • trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.h

    r280053 r280415  
    7878    Ref<DOMStringList> objectStoreNames() const;
    7979    IDBTransactionMode mode() const { return m_info.mode(); }
     80    IDBTransactionDurability durability() const { return m_info.durability(); }
    8081    IDBDatabase* db();
    8182    DOMException* error() const;
  • trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.idl

    r280053 r280415  
    3333    readonly attribute DOMStringList objectStoreNames;
    3434    readonly attribute IDBTransactionMode mode;
    35     // Implement 'durability'.
    36     // readonly attribute IDBTransactionDurability durability;
     35    readonly attribute IDBTransactionDurability durability;
    3736    [SameObject] readonly attribute IDBDatabase db;
    3837    readonly attribute DOMException? error;
  • trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp

    r279237 r280415  
    11501150            m_databaseInfo = WTFMove(m_originalDatabaseInfoBeforeVersionChange);
    11511151        }
    1152     } else
     1152    } else {
    11531153        m_originalDatabaseInfoBeforeVersionChange = nullptr;
     1154        if (transaction->durability() == IDBTransactionDurability::Strict)
     1155            m_sqliteDB->checkpoint(SQLiteDatabase::CheckpointMode::Full);
     1156    }
    11541157
    11551158    return error;
  • trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBTransaction.h

    r275151 r280415  
    6666
    6767    IDBTransactionMode mode() const { return m_info.mode(); }
     68    IDBTransactionDurability durability() const { return m_info.durability(); }
    6869    bool inProgress() const;
    6970
  • trunk/Source/WebCore/Modules/indexeddb/shared/IDBTransactionInfo.cpp

    r275151 r280415  
    4040}
    4141
    42 IDBTransactionInfo IDBTransactionInfo::clientTransaction(const IDBClient::IDBConnectionProxy& connectionProxy, const Vector<String>& objectStores, IDBTransactionMode mode)
     42IDBTransactionInfo IDBTransactionInfo::clientTransaction(const IDBClient::IDBConnectionProxy& connectionProxy, const Vector<String>& objectStores, IDBTransactionMode mode, std::optional<IDBTransactionDurability> durability)
    4343{
    4444    IDBTransactionInfo result((IDBResourceIdentifier(connectionProxy)));
     45    result.m_objectStores = objectStores;
    4546    result.m_mode = mode;
    46     result.m_objectStores = objectStores;
     47    if (durability)
     48        result.m_durability = *durability;
    4749
    4850    return result;
     
    6264    : m_identifier(info.identifier())
    6365    , m_mode(info.m_mode)
     66    , m_durability(info.m_durability)
    6467    , m_newVersion(info.m_newVersion)
    6568    , m_objectStores(info.m_objectStores)
     
    8386    destination.m_identifier = source.m_identifier.isolatedCopy();
    8487    destination.m_mode = source.m_mode;
     88    destination.m_durability = source.m_durability;
    8589    destination.m_newVersion = source.m_newVersion;
    8690
  • trunk/Source/WebCore/Modules/indexeddb/shared/IDBTransactionInfo.h

    r275151 r280415  
    2828#include "IDBDatabaseInfo.h"
    2929#include "IDBResourceIdentifier.h"
     30#include "IDBTransactionDurability.h"
    3031#include "IDBTransactionMode.h"
    3132#include "IndexedDB.h"
     
    4546    WTF_MAKE_FAST_ALLOCATED;
    4647public:
    47     static IDBTransactionInfo clientTransaction(const IDBClient::IDBConnectionProxy&, const Vector<String>& objectStores, IDBTransactionMode);
     48    static IDBTransactionInfo clientTransaction(const IDBClient::IDBConnectionProxy&, const Vector<String>& objectStores, IDBTransactionMode, std::optional<IDBTransactionDurability>);
    4849    static IDBTransactionInfo versionChange(const IDBServer::IDBConnectionToClient&, const IDBDatabaseInfo& originalDatabaseInfo, uint64_t newVersion);
    4950
     
    6061
    6162    IDBTransactionMode mode() const { return m_mode; }
     63    IDBTransactionDurability durability() const { return m_durability; }
    6264    uint64_t newVersion() const { return m_newVersion; }
    6365
     
    8284
    8385    IDBTransactionMode m_mode { IDBTransactionMode::Readonly };
     86    IDBTransactionDurability m_durability { IDBTransactionDurability::Default };
    8487    uint64_t m_newVersion { 0 };
    8588    Vector<String> m_objectStores;
     
    9194{
    9295    encoder << m_identifier << m_newVersion << m_objectStores;
    93     encoder << m_mode;
     96    encoder << m_mode << m_durability;
    9497
    9598    encoder << !!m_originalDatabaseInfo;
     
    113116        return false;
    114117
     118    if (!decoder.decode(info.m_durability))
     119        return false;
     120
    115121    bool hasObject;
    116122    if (!decoder.decode(hasObject))
  • trunk/Source/WebCore/Sources.txt

    r280310 r280415  
    32113211JSIDBRequest.cpp
    32123212JSIDBTransaction.cpp
     3213JSIDBTransactionDurability.cpp
    32133214JSIDBTransactionMode.cpp
    32143215JSIDBVersionChangeEvent.cpp
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r280310 r280415  
    28502850                935FBC4509BA00B900E230B1 /* EventListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 935FBC4409BA00B900E230B1 /* EventListener.h */; settings = {ATTRIBUTES = (Private, ); }; };
    28512851                935FBCF209BA143B00E230B1 /* ExceptionCode.h in Headers */ = {isa = PBXBuildFile; fileRef = 935FBCF109BA143B00E230B1 /* ExceptionCode.h */; settings = {ATTRIBUTES = (Private, ); }; };
     2852                936583B726AB92B5004E61F4 /* IDBTransactionDurability.h in Headers */ = {isa = PBXBuildFile; fileRef = 936583B626AB9174004E61F4 /* IDBTransactionDurability.h */; settings = {ATTRIBUTES = (Private, ); }; };
    28522853                9370918D1416D86B00477333 /* textAreaResizeCorner@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9370918C1416D86B00477333 /* textAreaResizeCorner@2x.png */; };
    28532854                9377ABA015DEFEEF0031FD04 /* Pagination.h in Headers */ = {isa = PBXBuildFile; fileRef = 9377AB9F15DEFEEF0031FD04 /* Pagination.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    1170711708                935FBC4409BA00B900E230B1 /* EventListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EventListener.h; sourceTree = "<group>"; };
    1170811709                935FBCF109BA143B00E230B1 /* ExceptionCode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExceptionCode.h; sourceTree = "<group>"; };
     11710                936583B426AB8CB4004E61F4 /* IDBTransactionDurability.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = IDBTransactionDurability.idl; sourceTree = "<group>"; };
     11711                936583B626AB9174004E61F4 /* IDBTransactionDurability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDBTransactionDurability.h; sourceTree = "<group>"; };
    1170911712                936B21F41DBBF8300052E117 /* CanvasPath.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = CanvasPath.idl; sourceTree = "<group>"; };
    1171011713                936DD03A09CEAC270056AE8C /* Range.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Range.idl; sourceTree = "<group>"; };
     
    2443324436                                51645B511B9F889B00F789CE /* IDBTransaction.h */,
    2443424437                                51D719A6181106E00016DC51 /* IDBTransaction.idl */,
     24438                                936583B626AB9174004E61F4 /* IDBTransactionDurability.h */,
     24439                                936583B426AB8CB4004E61F4 /* IDBTransactionDurability.idl */,
    2443524440                                838EF5361DC149DA008F0C39 /* IDBTransactionMode.h */,
    2443624441                                838EF5371DC149DA008F0C39 /* IDBTransactionMode.idl */,
     
    3312833133                                5185FCBB1BB4CBF80012898F /* IDBServer.h in Headers */,
    3312933134                                5185FCAD1BB4C4E80012898F /* IDBTransaction.h in Headers */,
     33135                                936583B726AB92B5004E61F4 /* IDBTransactionDurability.h in Headers */,
    3313033136                                5198F7AD1BBDD3EB00E2CC5F /* IDBTransactionInfo.h in Headers */,
    3313133137                                838EF5381DC149E2008F0C39 /* IDBTransactionMode.h in Headers */,
  • trunk/Source/WebCore/platform/sql/SQLiteDatabase.cpp

    r278150 r280415  
    193193}
    194194
     195static int checkpointModeValue(SQLiteDatabase::CheckpointMode mode)
     196{
     197    switch (mode) {
     198    case SQLiteDatabase::CheckpointMode::Full:
     199        return SQLITE_CHECKPOINT_FULL;
     200    case SQLiteDatabase::CheckpointMode::Truncate:
     201        return SQLITE_CHECKPOINT_TRUNCATE;
     202    }
     203}
     204
     205void SQLiteDatabase::checkpoint(CheckpointMode mode)
     206{
     207    SQLiteTransactionInProgressAutoCounter transactionCounter;
     208    int result = sqlite3_wal_checkpoint_v2(m_db, nullptr, checkpointModeValue(mode), nullptr, nullptr);
     209    if (result == SQLITE_OK)
     210        return;
     211
     212    if (result == SQLITE_BUSY) {
     213        LOG(SQLDatabase, "SQLite database checkpoint is blocked");
     214        return;
     215    }
     216
     217    LOG_ERROR("SQLite database failed to checkpoint: %s", lastErrorMsg());
     218}
     219
    195220void SQLiteDatabase::useWALJournalMode()
    196221{
     
    208233    }
    209234
    210     {
    211         SQLiteTransactionInProgressAutoCounter transactionCounter;
    212         auto checkpointStatement = prepareStatement("PRAGMA wal_checkpoint(TRUNCATE)"_s);
    213         if (checkpointStatement && checkpointStatement->step() == SQLITE_ROW) {
    214             if (checkpointStatement->columnInt(0))
    215                 LOG(SQLDatabase, "SQLite database checkpoint is blocked");
    216         } else
    217             LOG_ERROR("SQLite database failed to checkpoint: %s", lastErrorMsg());
    218     }
     235    checkpoint(CheckpointMode::Truncate);
    219236}
    220237
  • trunk/Source/WebCore/platform/sql/SQLiteDatabase.h

    r278651 r280415  
    9898    // locks, which can lead to unintended delays.
    9999    void enableAutomaticWALTruncation();
     100    enum class CheckpointMode : uint8_t { Full, Truncate };
     101    void checkpoint(CheckpointMode);
    100102
    101103    // Gets/sets the maximum size in bytes
Note: See TracChangeset for help on using the changeset viewer.