[SCM] WebKit Debian packaging branch, webkit-1.3, updated. upstream/1.3.7-4207-g178b198

hans at chromium.org hans at chromium.org
Sun Feb 20 23:16:17 UTC 2011


The following commit has been merged in the webkit-1.3 branch:
commit 0b93da5f512c6c75d24328c41cc75c57356b6dfa
Author: hans at chromium.org <hans at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed Jan 19 16:24:05 2011 +0000

    2011-01-19  Hans Wennborg  <hans at chromium.org>
    
            Reviewed by Jeremy Orlow.
    
            IndexedDB: Support auto-increment keys
            https://bugs.webkit.org/show_bug.cgi?id=52576
    
            Add layout test for auto increment keys.
            Update previous test not to consider auto increment an error.
    
            * storage/indexeddb/create-object-store-options-expected.txt:
            * storage/indexeddb/create-object-store-options.html:
            * storage/indexeddb/objectstore-autoincrement-expected.txt: Added.
            * storage/indexeddb/objectstore-autoincrement.html: Added.
    2011-01-19  Hans Wennborg  <hans at chromium.org>
    
            Reviewed by Jeremy Orlow.
    
            IndexedDB: Support auto-increment keys
            https://bugs.webkit.org/show_bug.cgi?id=52576
    
            Add support for auto-increment keys.
    
            Test: storage/indexeddb/objectstore-autoincrement.html
    
            * storage/IDBDatabase.cpp:
            (WebCore::IDBDatabase::createObjectStore):
            * storage/IDBObjectStoreBackendImpl.cpp:
            (WebCore::genAutoIncrementKey):
            (WebCore::IDBObjectStoreBackendImpl::putInternal):
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@76126 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 5dca844..59d5bf4 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,18 @@
+2011-01-19  Hans Wennborg  <hans at chromium.org>
+
+        Reviewed by Jeremy Orlow.
+
+        IndexedDB: Support auto-increment keys
+        https://bugs.webkit.org/show_bug.cgi?id=52576
+
+        Add layout test for auto increment keys.
+        Update previous test not to consider auto increment an error.
+
+        * storage/indexeddb/create-object-store-options-expected.txt:
+        * storage/indexeddb/create-object-store-options.html:
+        * storage/indexeddb/objectstore-autoincrement-expected.txt: Added.
+        * storage/indexeddb/objectstore-autoincrement.html: Added.
+
 2011-01-19  Csaba Osztrogonác  <ossy at webkit.org>
 
         Unreviewed.
diff --git a/LayoutTests/storage/indexeddb/create-object-store-options-expected.txt b/LayoutTests/storage/indexeddb/create-object-store-options-expected.txt
index 83016d6..9e727a5 100644
--- a/LayoutTests/storage/indexeddb/create-object-store-options-expected.txt
+++ b/LayoutTests/storage/indexeddb/create-object-store-options-expected.txt
@@ -17,8 +17,6 @@ Deleted all object stores.
 db.createObjectStore('a', {keyPath: 'a'})
 db.createObjectStore('b')
 db.createObjectStore('c', {autoIncrement: true});
-PASS Exception thrown
-PASS code is webkitIDBDatabaseException.UNKNOWN_ERR
 trans = db.transaction({mode: webkitIDBTransaction.READ_WRITE})
 PASS trans.mode is webkitIDBTransaction.READ_WRITE
 trans.objectStore('a').put({'a': 0})
diff --git a/LayoutTests/storage/indexeddb/create-object-store-options.html b/LayoutTests/storage/indexeddb/create-object-store-options.html
index 4abb8f6..eacb09d 100644
--- a/LayoutTests/storage/indexeddb/create-object-store-options.html
+++ b/LayoutTests/storage/indexeddb/create-object-store-options.html
@@ -44,16 +44,8 @@ function cleaned()
     evalAndLog("db.createObjectStore('a', {keyPath: 'a'})");
     evalAndLog("db.createObjectStore('b')");
 
-    try {
-        // FIXME: This should work in the future.
-        debug("db.createObjectStore('c', {autoIncrement: true});");
-        db.createObjectStore('c', {autoIncrement: true});
-        testFailed('createObjectStore with autoIncrement = true should throw');
-    } catch (err) {
-        testPassed("Exception thrown");
-        code = err.code;
-        shouldBe("code", "webkitIDBDatabaseException.UNKNOWN_ERR");
-    }
+    debug("db.createObjectStore('c', {autoIncrement: true});");
+    db.createObjectStore('c', {autoIncrement: true});
 
     trans = evalAndLog("trans = db.transaction({mode: webkitIDBTransaction.READ_WRITE})");
     shouldBe("trans.mode", "webkitIDBTransaction.READ_WRITE");
diff --git a/LayoutTests/storage/indexeddb/objectstore-autoincrement-expected.txt b/LayoutTests/storage/indexeddb/objectstore-autoincrement-expected.txt
new file mode 100644
index 0000000..8e36c96
--- /dev/null
+++ b/LayoutTests/storage/indexeddb/objectstore-autoincrement-expected.txt
@@ -0,0 +1,183 @@
+Test IndexedDB's IDBObjectStore auto-increment feature.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+webkitIndexedDB.open('Address Book')
+PASS 'onsuccess' in result is true
+PASS 'onerror' in result is true
+PASS 'readyState' in result is true
+An event should fire shortly...
+
+openSuccess():
+Success event fired:
+PASS 'result' in event is true
+PASS 'code' in event is false
+PASS 'message' in event is false
+PASS 'source' in event is true
+PASS event.source != null is true
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS 'readyState' in event.target is true
+PASS event.target.readyState is event.target.DONE
+
+db = event.result
+db.setVersion('new version')
+PASS 'onsuccess' in result is true
+PASS 'onerror' in result is true
+PASS 'readyState' in result is true
+An event should fire shortly...
+
+setVersionSuccess():
+Success event fired:
+PASS 'result' in event is true
+PASS 'code' in event is false
+PASS 'message' in event is false
+PASS 'source' in event is true
+PASS event.source != null is true
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS 'readyState' in event.target is true
+PASS event.target.readyState is event.target.DONE
+
+trans = event.result
+PASS trans !== null is true
+Deleted all object stores.
+createObjectStore():
+store = db.createObjectStore('StoreWithKeyPath', {keyPath: 'id', autoIncrement: true})
+db.createObjectStore('StoreWithAutoIncrement', {autoIncrement: true})
+db.createObjectStore('PlainOldStore', {autoIncrement: false})
+storeNames = db.objectStoreNames
+PASS store.name is "StoreWithKeyPath"
+PASS store.keyPath is 'id'
+PASS storeNames.contains('StoreWithKeyPath') is true
+PASS storeNames.contains('StoreWithAutoIncrement') is true
+PASS storeNames.contains('PlainOldStore') is true
+PASS storeNames.length is 3
+setVersionCompleted():
+trans = db.transaction({mode: webkitIDBTransaction.READ_WRITE})
+store = trans.objectStore('StoreWithKeyPath')
+Insert in object store with key gen and key path
+store.add({name: 'Lincoln', number: '7012'})
+addLincolnError():
+Error event fired:
+PASS 'result' in event is false
+PASS 'code' in event is true
+PASS 'message' in event is true
+PASS 'source' in event is true
+PASS event.source != null is true
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS 'readyState' in event.target is true
+PASS event.target.readyState is event.target.DONE
+
+PASS event.code is webkitIDBDatabaseException.UNKNOWN_ERR
+store = trans.objectStore('StoreWithAutoIncrement')
+Insert into object store with key gen using explicit key
+store.add({name: 'Lincoln'}, 1)
+addWithExplicitKeyError():
+Error event fired:
+PASS 'result' in event is false
+PASS 'code' in event is true
+PASS 'message' in event is true
+PASS 'source' in event is true
+PASS event.source != null is true
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS 'readyState' in event.target is true
+PASS event.target.readyState is event.target.DONE
+
+PASS event.code is webkitIDBDatabaseException.DATA_ERR
+Insert into object store with key gen and no key path
+store.add({name: 'Lincoln', number: '7012'})
+addLincolnSuccess():
+Success event fired:
+PASS 'result' in event is true
+PASS 'code' in event is false
+PASS 'message' in event is false
+PASS 'source' in event is true
+PASS event.source != null is true
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS 'readyState' in event.target is true
+PASS event.target.readyState is event.target.DONE
+
+PASS event.result is 1
+store.get(1)
+getLincolnSuccess():
+Success event fired:
+PASS 'result' in event is true
+PASS 'code' in event is false
+PASS 'message' in event is false
+PASS 'source' in event is true
+PASS event.source != null is true
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS 'readyState' in event.target is true
+PASS event.target.readyState is event.target.DONE
+
+PASS event.result.name is "Lincoln"
+PASS event.result.number is "7012"
+store.put({name: 'Abraham', number: '2107'})
+putAbrahamSuccess():
+Success event fired:
+PASS 'result' in event is true
+PASS 'code' in event is false
+PASS 'message' in event is false
+PASS 'source' in event is true
+PASS event.source != null is true
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS 'readyState' in event.target is true
+PASS event.target.readyState is event.target.DONE
+
+PASS event.result is 2
+store.get(2)
+getAbrahamSuccess():
+Success event fired:
+PASS 'result' in event is true
+PASS 'code' in event is false
+PASS 'message' in event is false
+PASS 'source' in event is true
+PASS event.source != null is true
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS 'readyState' in event.target is true
+PASS event.target.readyState is event.target.DONE
+
+PASS event.result.name is "Abraham"
+PASS event.result.number is "2107"
+store = trans.objectStore('PlainOldStore')
+Try adding with no key to object store without auto increment.
+store.add({name: 'Adam'})
+addAdamError():
+Error event fired:
+PASS 'result' in event is false
+PASS 'code' in event is true
+PASS 'message' in event is true
+PASS 'source' in event is true
+PASS event.source != null is true
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS 'readyState' in event.target is true
+PASS event.target.readyState is event.target.DONE
+
+PASS event.code is webkitIDBDatabaseException.DATA_ERR
+store.add({name: 'Adam'}, 1)
+addAdamSuccess():
+Success event fired:
+PASS 'result' in event is true
+PASS 'code' in event is false
+PASS 'message' in event is false
+PASS 'source' in event is true
+PASS event.source != null is true
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS 'readyState' in event.target is true
+PASS event.target.readyState is event.target.DONE
+
+PASS event.result is 1
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/storage/indexeddb/objectstore-autoincrement.html b/LayoutTests/storage/indexeddb/objectstore-autoincrement.html
new file mode 100644
index 0000000..2b44a7a
--- /dev/null
+++ b/LayoutTests/storage/indexeddb/objectstore-autoincrement.html
@@ -0,0 +1,181 @@
+<html>
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+<script src="../../fast/js/resources/js-test-post-function.js"></script>
+<script src="resources/shared.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script>
+
+description("Test IndexedDB's IDBObjectStore auto-increment feature.");
+if (window.layoutTestController)
+    layoutTestController.waitUntilDone();
+
+function test()
+{
+    result = evalAndLog("webkitIndexedDB.open('Address Book')");
+    verifyResult(result);
+    result.onsuccess = openSuccess;
+    result.onerror = unexpectedErrorCallback;
+}
+
+function openSuccess()
+{
+    debug("openSuccess():");
+    verifySuccessEvent(event);
+    window.db = evalAndLog("db = event.result");
+
+    result = evalAndLog("db.setVersion('new version')");
+    verifyResult(result);
+    result.onsuccess = setVersionSuccess;
+    result.onerror = unexpectedErrorCallback;
+}
+
+function setVersionSuccess()
+{
+    debug("setVersionSuccess():");
+    verifySuccessEvent(event);
+    window.trans = evalAndLog("trans = event.result");
+    shouldBeTrue("trans !== null");
+    trans.onabort = unexpectedAbortCallback;
+    trans.oncomplete = setVersionCompleted;
+
+    deleteAllObjectStores(db, createObjectStore);
+}
+
+function createObjectStore()
+{
+    debug("createObjectStore():");
+    window.store = evalAndLog("store = db.createObjectStore('StoreWithKeyPath', {keyPath: 'id', autoIncrement: true})");
+    evalAndLog("db.createObjectStore('StoreWithAutoIncrement', {autoIncrement: true})");
+    evalAndLog("db.createObjectStore('PlainOldStore', {autoIncrement: false})");
+    var storeNames = evalAndLog("storeNames = db.objectStoreNames");
+
+    shouldBeEqualToString("store.name", "StoreWithKeyPath");
+    shouldBe("store.keyPath", "'id'");
+    shouldBe("storeNames.contains('StoreWithKeyPath')", "true");
+    shouldBe("storeNames.contains('StoreWithAutoIncrement')", "true");
+    shouldBe("storeNames.contains('PlainOldStore')", "true");
+    shouldBe("storeNames.length", "3");
+
+    // Let the setVersion transaction complete.
+}
+
+function setVersionCompleted()
+{
+    debug("setVersionCompleted():");
+
+    window.trans = evalAndLog("trans = db.transaction({mode: webkitIDBTransaction.READ_WRITE})");
+    trans.onabort = unexpectedAbortCallback;
+    trans.oncomplete = done;
+
+    window.store = evalAndLog("store = trans.objectStore('StoreWithKeyPath')");
+
+    debug("Insert in object store with key gen and key path");
+    result = evalAndLog("store.add({name: 'Lincoln', number: '7012'})");
+    result.onsuccess = unexpectedSuccessCallback;
+    result.onerror = addLincolnError;
+}
+
+function addLincolnError()
+{
+    debug("addLincolnError():");
+    verifyErrorEvent(event);
+    // FIXME: This should be implemented, but we make it an error for now.
+    shouldBe("event.code", "webkitIDBDatabaseException.UNKNOWN_ERR");
+
+    window.store = evalAndLog("store = trans.objectStore('StoreWithAutoIncrement')");
+    debug("Insert into object store with key gen using explicit key");
+    result = evalAndLog("store.add({name: 'Lincoln'}, 1)");
+    result.onsuccess = unexpectedSuccessCallback;
+    result.onerror = addWithExplicitKeyError;
+}
+
+function addWithExplicitKeyError()
+{
+    debug("addWithExplicitKeyError():");
+    verifyErrorEvent(event);
+    shouldBe("event.code", "webkitIDBDatabaseException.DATA_ERR");
+
+    debug("Insert into object store with key gen and no key path");
+    result = evalAndLog("store.add({name: 'Lincoln', number: '7012'})");
+    result.onsuccess = addLincolnSuccess;
+    result.onerror = unexpectedErrorCallback;
+}
+
+function addLincolnSuccess()
+{
+    debug("addLincolnSuccess():");
+    verifySuccessEvent(event);
+    shouldBe("event.result", "1");
+
+    result = evalAndLog("store.get(1)");
+    result.onsuccess = getLincolnSuccess;
+    result.onerror = unexpectedErrorCallback;
+}
+
+function getLincolnSuccess()
+{
+    debug("getLincolnSuccess():");
+    verifySuccessEvent(event);
+    shouldBeEqualToString("event.result.name", "Lincoln");
+    shouldBeEqualToString("event.result.number", "7012");
+
+    result = evalAndLog("store.put({name: 'Abraham', number: '2107'})");
+    result.onsuccess = putAbrahamSuccess;
+    result.onerror = unexpectedErrorCallback;
+}
+
+function putAbrahamSuccess()
+{
+    debug("putAbrahamSuccess():");
+    verifySuccessEvent(event);
+    shouldBe("event.result", "2");
+
+    result = evalAndLog("store.get(2)");
+    result.onsuccess = getAbrahamSuccess;
+    result.onerror = unexpectedErrorCallback;
+}
+
+function getAbrahamSuccess()
+{
+    debug("getAbrahamSuccess():");
+    verifySuccessEvent(event);
+    shouldBeEqualToString("event.result.name", "Abraham");
+    shouldBeEqualToString("event.result.number", "2107");
+
+    window.store = evalAndLog("store = trans.objectStore('PlainOldStore')");
+    debug("Try adding with no key to object store without auto increment.");
+    result = evalAndLog("store.add({name: 'Adam'})");
+    result.onsuccess = unexpectedSuccessCallback;
+    result.onerror = addAdamError;
+}
+
+function addAdamError()
+{
+    debug("addAdamError():");
+    verifyErrorEvent(event);
+    shouldBe("event.code", "webkitIDBDatabaseException.DATA_ERR");
+
+    result = evalAndLog("store.add({name: 'Adam'}, 1)");
+    result.onsuccess = addAdamSuccess;
+    result.onerror = unexpectedErrorCallback;
+}
+
+function addAdamSuccess()
+{
+    debug("addAdamSuccess():");
+    verifySuccessEvent(event);
+    shouldBe("event.result", "1");
+}
+
+test();
+
+var successfullyParsed = true;
+
+</script>
+</body>
+</html>
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 7748f83..0b2b6ff 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,20 @@
+2011-01-19  Hans Wennborg  <hans at chromium.org>
+
+        Reviewed by Jeremy Orlow.
+
+        IndexedDB: Support auto-increment keys
+        https://bugs.webkit.org/show_bug.cgi?id=52576
+
+        Add support for auto-increment keys.
+
+        Test: storage/indexeddb/objectstore-autoincrement.html
+
+        * storage/IDBDatabase.cpp:
+        (WebCore::IDBDatabase::createObjectStore):
+        * storage/IDBObjectStoreBackendImpl.cpp:
+        (WebCore::genAutoIncrementKey):
+        (WebCore::IDBObjectStoreBackendImpl::putInternal):
+
 2011-01-19  Csaba Osztrogonác  <ossy at webkit.org>
 
         Reviewed by Laszlo Gombos and Tor Arne Vestbø.
diff --git a/Source/WebCore/storage/IDBDatabase.cpp b/Source/WebCore/storage/IDBDatabase.cpp
index 7a9141a..33f004b 100644
--- a/Source/WebCore/storage/IDBDatabase.cpp
+++ b/Source/WebCore/storage/IDBDatabase.cpp
@@ -73,12 +73,6 @@ PassRefPtr<IDBObjectStore> IDBDatabase::createObjectStore(const String& name, co
     options.getKeyBool("autoIncrement", autoIncrement);
     // FIXME: Look up evictable and pass that on as well.
 
-    if (autoIncrement) {
-        // FIXME: Implement support for auto increment.
-        ec = IDBDatabaseException::UNKNOWN_ERR;
-        return 0;
-    }
-
     RefPtr<IDBObjectStoreBackendInterface> objectStore = m_backend->createObjectStore(name, keyPath, autoIncrement, m_setVersionTransaction.get(), ec);
     if (!objectStore) {
         ASSERT(ec);
diff --git a/Source/WebCore/storage/IDBObjectStoreBackendImpl.cpp b/Source/WebCore/storage/IDBObjectStoreBackendImpl.cpp
index 396f544..240ea8a 100644
--- a/Source/WebCore/storage/IDBObjectStoreBackendImpl.cpp
+++ b/Source/WebCore/storage/IDBObjectStoreBackendImpl.cpp
@@ -59,6 +59,7 @@ IDBObjectStoreBackendImpl::IDBObjectStoreBackendImpl(IDBSQLiteDatabase* database
     , m_name(name)
     , m_keyPath(keyPath)
     , m_autoIncrement(autoIncrement)
+    , m_autoIncrementNumber(-1)
 {
     loadIndexes();
 }
@@ -69,6 +70,7 @@ IDBObjectStoreBackendImpl::IDBObjectStoreBackendImpl(IDBSQLiteDatabase* database
     , m_name(name)
     , m_keyPath(keyPath)
     , m_autoIncrement(autoIncrement)
+    , m_autoIncrementNumber(-1)
 {
 }
 
@@ -113,7 +115,7 @@ void IDBObjectStoreBackendImpl::getInternal(ScriptExecutionContext*, PassRefPtr<
     }
 
     ASSERT((key->type() == IDBKey::StringType) != query.isColumnNull(0));
-    // FIXME: Implement date.
+    ASSERT((key->type() == IDBKey::DateType) != query.isColumnNull(1));
     ASSERT((key->type() == IDBKey::NumberType) != query.isColumnNull(2));
 
     callbacks->onSuccess(SerializedScriptValue::createFromWire(query.getColumnText(3)));
@@ -200,22 +202,36 @@ void IDBObjectStoreBackendImpl::putInternal(ScriptExecutionContext*, PassRefPtr<
     RefPtr<SerializedScriptValue> value = prpValue;
     RefPtr<IDBKey> key = prpKey;
 
-    // FIXME: Support auto-increment.
+    if (!objectStore->m_keyPath.isNull() && key) {
+        callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::DATA_ERR, "A key was supplied for an objectStore that has a keyPath."));
+        return;
+    }
+
+    if (objectStore->autoIncrement() && key) {
+        callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::DATA_ERR, "A key was supplied for an objectStore that is using auto increment."));
+        return;
+    }
 
-    if (!objectStore->m_keyPath.isNull()) {
-        if (key) {
-            callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UNKNOWN_ERR, "A key was supplied for an objectStore that has a keyPath."));
+    if (objectStore->autoIncrement()) {
+        key = objectStore->genAutoIncrementKey();
+
+        if (!objectStore->m_keyPath.isNull()) {
+            // FIXME: Inject the generated key into the object.
+            callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UNKNOWN_ERR, "Adding data to object stores with auto increment and in-line keys not yet supported."));
             return;
         }
+    } else if (!objectStore->m_keyPath.isNull()) {
         key = fetchKeyFromKeyPath(value.get(), objectStore->m_keyPath);
+
         if (!key) {
-            callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UNKNOWN_ERR, "The key could not be fetched from the keyPath."));
+            callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::DATA_ERR, "The key could not be fetched from the keyPath."));
             return;
         }
     } else if (!key) {
         callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::DATA_ERR, "No key supplied."));
         return;
     }
+
     if (key->type() == IDBKey::NullType) {
         callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::DATA_ERR, "NULL key is not allowed."));
         return;
@@ -511,6 +527,27 @@ void IDBObjectStoreBackendImpl::addIndexToMap(ScriptExecutionContext*, PassRefPt
     objectStore->m_indexes.set(indexPtr->name(), indexPtr);
 }
 
+PassRefPtr<IDBKey> IDBObjectStoreBackendImpl::genAutoIncrementKey()
+{
+    if (m_autoIncrementNumber > 0)
+        return IDBKey::createNumber(m_autoIncrementNumber++);
+
+    String sql = "SELECT max(keyNumber) + 1 FROM ObjectStoreData WHERE objectStoreId = ? AND keyString IS NULL AND keyDate IS NULL";
+
+    SQLiteStatement query(sqliteDatabase(), sql);
+    bool ok = query.prepare() == SQLResultOk;
+    ASSERT_UNUSED(ok, ok);
+
+    query.bindInt64(1, id());
+
+    if (query.step() != SQLResultRow || query.isColumnNull(0))
+        m_autoIncrementNumber = 1;
+    else
+        m_autoIncrementNumber = static_cast<int>(query.getColumnDouble(0));
+
+    return IDBKey::createNumber(m_autoIncrementNumber++);
+}
+
 
 } // namespace WebCore
 
diff --git a/Source/WebCore/storage/IDBObjectStoreBackendImpl.h b/Source/WebCore/storage/IDBObjectStoreBackendImpl.h
index 2ab42f2..9fb1b7c 100644
--- a/Source/WebCore/storage/IDBObjectStoreBackendImpl.h
+++ b/Source/WebCore/storage/IDBObjectStoreBackendImpl.h
@@ -82,6 +82,7 @@ private:
 
     void loadIndexes();
     SQLiteDatabase& sqliteDatabase() const;
+    PassRefPtr<IDBKey> genAutoIncrementKey();
 
     static void getInternal(ScriptExecutionContext*, PassRefPtr<IDBObjectStoreBackendImpl>, PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks>);
     static void putInternal(ScriptExecutionContext*, PassRefPtr<IDBObjectStoreBackendImpl>, PassRefPtr<SerializedScriptValue> value, PassRefPtr<IDBKey> key, bool addOnly, PassRefPtr<IDBCallbacks>, PassRefPtr<IDBTransactionBackendInterface>);
@@ -103,6 +104,7 @@ private:
 
     typedef HashMap<String, RefPtr<IDBIndexBackendImpl> > IndexMap;
     IndexMap m_indexes;
+    int m_autoIncrementNumber;
 };
 
 } // namespace WebCore

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list