Modern IDB: IDBObjectStore.deleteIndex() support.
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / shared / IDBObjectStoreInfo.cpp
index 07933b0..ff120d1 100644 (file)
@@ -42,10 +42,91 @@ IDBObjectStoreInfo::IDBObjectStoreInfo(uint64_t identifier, const String& name,
 {
 }
 
+IDBIndexInfo IDBObjectStoreInfo::createNewIndex(const String& name, const IDBKeyPath& keyPath, bool unique, bool multiEntry)
+{
+    IDBIndexInfo info(++m_maxIndexID, m_identifier, name, keyPath, unique, multiEntry);
+    m_indexMap.set(info.identifier(), info);
+    return info;
+}
+
+void IDBObjectStoreInfo::addExistingIndex(const IDBIndexInfo& info)
+{
+    ASSERT(!m_indexMap.contains(info.identifier()));
+
+    if (info.identifier() > m_maxIndexID)
+        m_maxIndexID = info.identifier();
+
+    m_indexMap.set(info.identifier(), info);
+}
+
+bool IDBObjectStoreInfo::hasIndex(const String& name) const
+{
+    for (auto& index : m_indexMap.values()) {
+        if (index.name() == name)
+            return true;
+    }
+
+    return false;
+}
+
+bool IDBObjectStoreInfo::hasIndex(uint64_t indexIdentifier) const
+{
+    return m_indexMap.contains(indexIdentifier);
+}
+
+IDBIndexInfo* IDBObjectStoreInfo::infoForExistingIndex(const String& name)
+{
+    for (auto& index : m_indexMap.values()) {
+        if (index.name() == name)
+            return &index;
+    }
+
+    return nullptr;
+}
+
 IDBObjectStoreInfo IDBObjectStoreInfo::isolatedCopy() const
 {
-    return { m_identifier, m_name.isolatedCopy(), m_keyPath.isolatedCopy(), m_autoIncrement };
+    IDBObjectStoreInfo result = { m_identifier, m_name.isolatedCopy(), m_keyPath.isolatedCopy(), m_autoIncrement };
+
+    for (auto& iterator : m_indexMap)
+        result.m_indexMap.set(iterator.key, iterator.value.isolatedCopy());
+
+    return result;
+}
+
+Vector<String> IDBObjectStoreInfo::indexNames() const
+{
+    Vector<String> names;
+    names.reserveCapacity(m_indexMap.size());
+    for (auto& index : m_indexMap.values())
+        names.uncheckedAppend(index.name());
+
+    return names;
+}
+
+void IDBObjectStoreInfo::deleteIndex(const String& indexName)
+{
+    auto* info = infoForExistingIndex(indexName);
+    if (!info)
+        return;
+
+    m_indexMap.remove(info->identifier());
+}
+
+#ifndef NDEBUG
+String IDBObjectStoreInfo::loggingString(int indent) const
+{
+    String indentString;
+    for (int i = 0; i < indent; ++i)
+        indentString.append(" ");
+
+    String top = makeString(indentString, "Object store: ", m_name, String::format(" (%" PRIu64 ") \n", m_identifier));
+    for (auto index : m_indexMap.values())
+        top.append(makeString(index.loggingString(indent + 1), "\n"));
+
+    return top; 
 }
+#endif
 
 } // namespace WebCore