optional<unique_ref<Block>> InMemoryBlockStore::load(const Key &key) { //Return a pointer to the stored InMemoryBlock try { return optional<unique_ref<Block>>(make_unique_ref<InMemoryBlock>(_blocks.at(key.ToString()))); } catch (const std::out_of_range &e) { return none; } }
optional<unique_ref<Block>> InMemoryBlockStore::tryCreate(const Key &key, Data data) { auto insert_result = _blocks.emplace(piecewise_construct, make_tuple(key.ToString()), make_tuple(key, std::move(data))); if (!insert_result.second) { return none; } //Return a pointer to the stored InMemoryBlock return optional<unique_ref<Block>>(make_unique_ref<InMemoryBlock>(insert_result.first->second)); }
void InMemoryBlockStore::remove(unique_ref<Block> block) { Key key = block->key(); cpputils::destruct(std::move(block)); int numRemoved = _blocks.erase(key.ToString()); ASSERT(1==numRemoved, "Didn't find block to remove"); }
nsresult GetAllKeysHelper::DoDatabaseWork(mozIStorageConnection* aConnection) { NS_ASSERTION(aConnection, "Passed a null connection!"); if (!mKeys.SetCapacity(50)) { NS_ERROR("Out of memory!"); return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR; } nsCString keyColumn; nsCString tableName; if (mIndex->IsAutoIncrement()) { keyColumn.AssignLiteral("ai_object_data_id"); if (mIndex->IsUnique()) { tableName.AssignLiteral("ai_unique_index_data"); } else { tableName.AssignLiteral("ai_index_data"); } } else { keyColumn.AssignLiteral("object_data_key"); if (mIndex->IsUnique()) { tableName.AssignLiteral("unique_index_data"); } else { tableName.AssignLiteral("index_data"); } } NS_NAMED_LITERAL_CSTRING(indexId, "index_id"); NS_NAMED_LITERAL_CSTRING(value, "value"); nsCString keyClause; if (!mKey.IsUnset()) { keyClause = NS_LITERAL_CSTRING(" AND ") + value + NS_LITERAL_CSTRING(" = :") + value; } nsCString limitClause; if (mLimit != PR_UINT32_MAX) { limitClause = NS_LITERAL_CSTRING(" LIMIT "); limitClause.AppendInt(mLimit); } nsCString query = NS_LITERAL_CSTRING("SELECT ") + keyColumn + NS_LITERAL_CSTRING(" FROM ") + tableName + NS_LITERAL_CSTRING(" WHERE ") + indexId + NS_LITERAL_CSTRING(" = :") + indexId + keyClause + limitClause; nsCOMPtr<mozIStorageStatement> stmt = mTransaction->GetCachedStatement(query); NS_ENSURE_TRUE(stmt, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); mozStorageStatementScoper scoper(stmt); nsresult rv = stmt->BindInt64ByName(indexId, mIndex->Id()); NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); if (!mKey.IsUnset()) { if (mKey.IsInt()) { rv = stmt->BindInt64ByName(value, mKey.IntValue()); } else if (mKey.IsString()) { rv = stmt->BindStringByName(value, mKey.StringValue()); } else { NS_NOTREACHED("Bad key type!"); } NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); } PRBool hasResult; while(NS_SUCCEEDED((rv = stmt->ExecuteStep(&hasResult))) && hasResult) { if (mKeys.Capacity() == mKeys.Length()) { if (!mKeys.SetCapacity(mKeys.Capacity() * 2)) { NS_ERROR("Out of memory!"); return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR; } } Key* key = mKeys.AppendElement(); NS_ASSERTION(key, "This shouldn't fail!"); PRInt32 keyType; rv = stmt->GetTypeOfIndex(0, &keyType); NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); NS_ASSERTION(keyType == mozIStorageStatement::VALUE_TYPE_INTEGER || keyType == mozIStorageStatement::VALUE_TYPE_TEXT, "Bad key type!"); if (keyType == mozIStorageStatement::VALUE_TYPE_INTEGER) { *key = stmt->AsInt64(0); } else if (keyType == mozIStorageStatement::VALUE_TYPE_TEXT) { rv = stmt->GetString(0, key->ToString()); NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); } else { NS_NOTREACHED("Bad SQLite type!"); } } NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR); return NS_OK; }