Changeset 163020 in webkit


Ignore:
Timestamp:
Jan 29, 2014 8:17:51 AM (10 years ago)
Author:
beidson@apple.com
Message:

IDB: Serialize IDBKeyDatas to disk, not IDBKeys
https://bugs.webkit.org/show_bug.cgi?id=127829

Reviewed by Tim Horton.

Source/WebCore:

Move encode/decode from IDBKey to IDBKeyData.

  • Modules/indexeddb/IDBKey.cpp:
  • Modules/indexeddb/IDBKey.h:
  • Modules/indexeddb/IDBKeyData.cpp:

(WebCore::IDBKeyData::IDBKeyData):
(WebCore::IDBKeyData::encode):
(WebCore::IDBKeyData::decode):

  • Modules/indexeddb/IDBKeyData.h:
  • WebCore.exp.in:

Source/WebKit2:

Serialize IDBKeyDatas, not IDBKeys.

  • DatabaseProcess/IndexedDB/IDBSerialization.cpp:

(WebKit::deserializeIDBKeyPath):
(WebKit::serializeIDBKeyData):

  • DatabaseProcess/IndexedDB/IDBSerialization.h:
  • DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.cpp:

(WebKit::UniqueIDBDatabaseBackingStoreSQLite::extractExistingMetadata):
(WebKit::UniqueIDBDatabaseBackingStoreSQLite::putRecord):
(WebKit::UniqueIDBDatabaseBackingStoreSQLite::getKeyRecordFromObjectStore):
(WebKit::UniqueIDBDatabaseBackingStoreSQLite::getKeyRangeRecordFromObjectStore):

Location:
trunk/Source
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r163019 r163020  
     12014-01-29  Brady Eidson  <beidson@apple.com>
     2
     3        IDB: Serialize IDBKeyDatas to disk, not IDBKeys
     4        https://bugs.webkit.org/show_bug.cgi?id=127829
     5
     6        Reviewed by Tim Horton.
     7
     8        Move encode/decode from IDBKey to IDBKeyData.
     9
     10        * Modules/indexeddb/IDBKey.cpp:
     11        * Modules/indexeddb/IDBKey.h:
     12
     13        * Modules/indexeddb/IDBKeyData.cpp:
     14        (WebCore::IDBKeyData::IDBKeyData):
     15        (WebCore::IDBKeyData::encode):
     16        (WebCore::IDBKeyData::decode):
     17        * Modules/indexeddb/IDBKeyData.h:
     18
     19        * WebCore.exp.in:
     20
    1212014-01-29  Antti Koivisto  <antti@apple.com>
    222
  • trunk/Source/WebCore/Modules/indexeddb/IDBKey.cpp

    r162566 r163020  
    2929#if ENABLE(INDEXED_DATABASE)
    3030
    31 #include "KeyedCoding.h"
     31#include "IDBKeyData.h"
    3232
    3333namespace WebCore {
     
    9999}
    100100
    101 void IDBKey::encode(KeyedEncoder& encoder) const
    102 {
    103     encoder.encodeEnum("type", m_type);
    104 
    105     switch (m_type) {
    106     case InvalidType:
    107         return;
    108     case ArrayType:
    109         encoder.encodeObjects("array", m_array.begin(), m_array.end(), [](WebCore::KeyedEncoder& encoder, const RefPtr<IDBKey>& key) {
    110             encoder.encodeObject("idbKey", *key, [](KeyedEncoder& encoder, const IDBKey& key) {
    111                 key.encode(encoder);
    112             });
    113         });
    114         return;
    115     case StringType:
    116         encoder.encodeString("string", m_string);
    117         return;
    118     case DateType:
    119     case NumberType:
    120         encoder.encodeDouble("number", m_number);
    121         return;
    122     case MinType:
    123         ASSERT_NOT_REACHED();
    124         return;
    125     }
    126 
    127     ASSERT_NOT_REACHED();
    128 }
    129 
    130 bool IDBKey::decode(KeyedDecoder&, IDBKey&)
    131 {
    132     // FIXME: Implement when IDB Get support is implemented (<rdar://problem/15779644>)
    133     return false;
    134 }
    135 
    136101} // namespace WebCore
    137102
  • trunk/Source/WebCore/Modules/indexeddb/IDBKey.h

    r162566 r163020  
    3535
    3636namespace WebCore {
    37 
    38 class KeyedDecoder;
    39 class KeyedEncoder;
    4037
    4138class IDBKey : public RefCounted<IDBKey> {
     
    151148    using RefCounted<IDBKey>::deref;
    152149
    153     void encode(KeyedEncoder&) const;
    154     static bool decode(KeyedDecoder&, IDBKey&);
    155 
    156150private:
    157151    IDBKey() : m_type(InvalidType), m_number(0), m_sizeEstimate(OverheadSize) { }
  • trunk/Source/WebCore/Modules/indexeddb/IDBKeyData.cpp

    r162566 r163020  
    2929#if ENABLE(INDEXED_DATABASE)
    3030
     31#include "KeyedCoding.h"
     32
    3133namespace WebCore {
    3234
    33 IDBKeyData::IDBKeyData(IDBKey* key)
     35IDBKeyData::IDBKeyData(const IDBKey* key)
    3436    : type(IDBKey::InvalidType)
    3537    , numberValue(0)
     
    127129}
    128130
     131void IDBKeyData::encode(KeyedEncoder& encoder) const
     132{
     133    encoder.encodeBool("null", isNull);
     134    if (isNull)
     135        return;
     136
     137    encoder.encodeEnum("type", type);
     138
     139    switch (type) {
     140    case IDBKey::InvalidType:
     141        return;
     142    case IDBKey::ArrayType:
     143        encoder.encodeObjects("array", arrayValue.begin(), arrayValue.end(), [](KeyedEncoder& encoder, const IDBKeyData& key) {
     144            encoder.encodeObject("idbKeyData", key, [](KeyedEncoder& encoder, const IDBKeyData& key) {
     145                key.encode(encoder);
     146            });
     147        });
     148        return;
     149    case IDBKey::StringType:
     150        encoder.encodeString("string", stringValue);
     151        return;
     152    case IDBKey::DateType:
     153    case IDBKey::NumberType:
     154        encoder.encodeDouble("number", numberValue);
     155        return;
     156    case IDBKey::MinType:
     157        ASSERT_NOT_REACHED();
     158        return;
     159    }
     160
     161    ASSERT_NOT_REACHED();
     162}
     163
     164bool IDBKeyData::decode(KeyedDecoder&, IDBKeyData&)
     165{
     166    // FIXME: Implement when IDB Get support is implemented (<rdar://problem/15779644>)
     167    return false;
     168}
     169
    129170}
    130171
  • trunk/Source/WebCore/Modules/indexeddb/IDBKeyData.h

    r162566 r163020  
    3333namespace WebCore {
    3434
     35class KeyedDecoder;
     36class KeyedEncoder;
     37
    3538struct IDBKeyData {
    3639    IDBKeyData()
     
    4144    }
    4245
    43     IDBKeyData(IDBKey*);
     46    IDBKeyData(const IDBKey*);
    4447
    4548    PassRefPtr<IDBKey> maybeCreateIDBKey() const;
    4649
    4750    IDBKeyData isolatedCopy() const;
     51
     52    void encode(KeyedEncoder&) const;
     53    static bool decode(KeyedDecoder&, IDBKeyData&);
    4854
    4955    IDBKey::Type type;
  • trunk/Source/WebCore/WebCore.exp.in

    r162997 r163020  
    30773077#if ENABLE(INDEXED_DATABASE)
    30783078__ZNK7WebCore10IDBKeyData17maybeCreateIDBKeyEv
     3079__ZNK7WebCore10IDBKeyData6encodeERNS_12KeyedEncoderE
    30793080__ZNK7WebCore10IDBKeyPath6encodeERNS_12KeyedEncoderE
    30803081__ZNK7WebCore11IDBKeyRange9isOnlyKeyEv
    30813082__ZNK7WebCore15IDBKeyRangeData22maybeCreateIDBKeyRangeEv
    3082 __ZNK7WebCore6IDBKey6encodeERNS_12KeyedEncoderE
    30833083__ZNK7WebCore6IDBKey7isValidEv
    3084 __ZN7WebCore10IDBKeyDataC1EPNS_6IDBKeyE
     3084__ZN7WebCore10IDBKeyDataC1EPKNS_6IDBKeyE
    30853085__ZN7WebCore10IDBKeyPathC1ERKN3WTF6StringE
    30863086__ZN7WebCore10IDBKeyPathC1ERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowEEE
  • trunk/Source/WebKit2/ChangeLog

    r163011 r163020  
     12014-01-29  Brady Eidson  <beidson@apple.com>
     2
     3        IDB: Serialize IDBKeyDatas to disk, not IDBKeys
     4        https://bugs.webkit.org/show_bug.cgi?id=127829
     5
     6        Reviewed by Tim Horton.
     7
     8        Serialize IDBKeyDatas, not IDBKeys.
     9
     10        * DatabaseProcess/IndexedDB/IDBSerialization.cpp:
     11        (WebKit::deserializeIDBKeyPath):
     12        (WebKit::serializeIDBKeyData):
     13        * DatabaseProcess/IndexedDB/IDBSerialization.h:
     14
     15        * DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.cpp:
     16        (WebKit::UniqueIDBDatabaseBackingStoreSQLite::extractExistingMetadata):
     17        (WebKit::UniqueIDBDatabaseBackingStoreSQLite::putRecord):
     18        (WebKit::UniqueIDBDatabaseBackingStoreSQLite::getKeyRecordFromObjectStore):
     19        (WebKit::UniqueIDBDatabaseBackingStoreSQLite::getKeyRangeRecordFromObjectStore):
     20
    1212014-01-29  Carlos Garcia Campos  <cgarcia@igalia.com>
    222
  • trunk/Source/WebKit2/DatabaseProcess/IndexedDB/IDBSerialization.cpp

    r162566 r163020  
    3131#include "KeyedDecoder.h"
    3232#include "KeyedEncoder.h"
    33 #include <WebCore/IDBKey.h>
     33#include <WebCore/IDBKeyData.h>
    3434#include <WebCore/IDBKeyPath.h>
    3535
     
    4545}
    4646
    47 std::unique_ptr<WebCore::IDBKeyPath> deserializeIDBKeyPath(const uint8_t* data, size_t size)
     47bool deserializeIDBKeyPath(const uint8_t* data, size_t size, IDBKeyPath& result)
    4848{
    4949    KeyedDecoder decoder(data, size);
    50     std::unique_ptr<IDBKeyPath> result = std::make_unique<IDBKeyPath>();
    51     if (!IDBKeyPath::decode(decoder, *result))
    52         return nullptr;
    53 
    54     return result;
     50    return IDBKeyPath::decode(decoder, result);
    5551}
    5652
    57 RefPtr<WebCore::SharedBuffer> serializeIDBKey(const IDBKey& key)
     53RefPtr<WebCore::SharedBuffer> serializeIDBKeyData(const IDBKeyData& key)
    5854{
    5955    KeyedEncoder encoder;
  • trunk/Source/WebKit2/DatabaseProcess/IndexedDB/IDBSerialization.h

    r162566 r163020  
    3333
    3434namespace WebCore {
    35 class IDBKey;
    3635class IDBKeyPath;
     36
     37struct IDBKeyData;
    3738}
    3839
     
    4041
    4142RefPtr<WebCore::SharedBuffer> serializeIDBKeyPath(const WebCore::IDBKeyPath&);
    42 std::unique_ptr<WebCore::IDBKeyPath> deserializeIDBKeyPath(const uint8_t* buffer, size_t bufferSize);
     43bool deserializeIDBKeyPath(const uint8_t* buffer, size_t bufferSize, WebCore::IDBKeyPath&);
    4344
    44 RefPtr<WebCore::SharedBuffer> serializeIDBKey(const WebCore::IDBKey&);
    45 PassRefPtr<WebCore::IDBKey> deserializeIDBKey(const uint8_t* buffer, size_t bufferSize);
     45RefPtr<WebCore::SharedBuffer> serializeIDBKeyData(const WebCore::IDBKeyData&);
     46bool deserializeIDBKey(const uint8_t* buffer, size_t bufferSize, WebCore::IDBKeyData&);
    4647
    4748} // namespace WebKit
  • trunk/Source/WebKit2/DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.cpp

    r162948 r163020  
    199199            const uint8_t* keyPathBuffer = static_cast<const uint8_t*>(sql.getColumnBlob(2, keyPathSize));
    200200
    201             std::unique_ptr<IDBKeyPath> keyPath = deserializeIDBKeyPath(keyPathBuffer, keyPathSize);
    202 
    203             if (!keyPath) {
     201
     202            if (!deserializeIDBKeyPath(keyPathBuffer, keyPathSize, metadata.keyPath)) {
    204203                LOG_ERROR("Unable to extract key path metadata from database");
    205204                return nullptr;
    206205            }
    207206
    208             metadata.keyPath = *keyPath;
    209207            metadata.autoIncrement = sql.getColumnInt(3);
    210208            metadata.maxIndexId = sql.getColumnInt64(4);
     
    584582    }
    585583
    586     RefPtr<SharedBuffer> keyBuffer = serializeIDBKey(key);
     584    RefPtr<SharedBuffer> keyBuffer = serializeIDBKeyData(IDBKeyData(&key));
    587585    if (!keyBuffer) {
    588586        LOG_ERROR("Unable to serialize IDBKey to be stored in the database");
     
    622620    }
    623621
    624     RefPtr<SharedBuffer> keyBuffer = serializeIDBKey(key);
     622    RefPtr<SharedBuffer> keyBuffer = serializeIDBKeyData(IDBKeyData(&key));
    625623    if (!keyBuffer) {
    626624        LOG_ERROR("Unable to serialize IDBKey to be stored in the database");
     
    668666    }
    669667
    670     RefPtr<SharedBuffer> lowerBuffer = serializeIDBKey(*keyRange.lower());
     668    RefPtr<SharedBuffer> lowerBuffer = serializeIDBKeyData(IDBKeyData(keyRange.lower().get()));
    671669    if (!lowerBuffer) {
    672670        LOG_ERROR("Unable to serialize IDBKey to be stored in the database");
     
    674672    }
    675673
    676     RefPtr<SharedBuffer> upperBuffer = serializeIDBKey(*keyRange.upper());
     674    RefPtr<SharedBuffer> upperBuffer = serializeIDBKeyData(IDBKeyData(keyRange.upper().get()));
    677675    if (!upperBuffer) {
    678676        LOG_ERROR("Unable to serialize IDBKey to be stored in the database");
Note: See TracChangeset for help on using the changeset viewer.