// static nsresult IDBFactory::SetDatabaseMetadata(DatabaseInfo* aDatabaseInfo, PRUint64 aVersion, ObjectStoreInfoArray& aObjectStores) { NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); NS_ASSERTION(aDatabaseInfo, "Null pointer!"); ObjectStoreInfoArray objectStores; objectStores.SwapElements(aObjectStores); #ifdef DEBUG { nsTArray<nsString> existingNames; aDatabaseInfo->GetObjectStoreNames(existingNames); NS_ASSERTION(existingNames.IsEmpty(), "Should be an empty DatabaseInfo"); } #endif aDatabaseInfo->version = aVersion; for (PRUint32 index = 0; index < objectStores.Length(); index++) { nsRefPtr<ObjectStoreInfo>& info = objectStores[index]; if (!aDatabaseInfo->PutObjectStore(info)) { NS_WARNING("Out of memory!"); return NS_ERROR_OUT_OF_MEMORY; } } return NS_OK; }
// static nsresult IDBFactory::UpdateDatabaseMetadata(DatabaseInfo* aDatabaseInfo, PRUint64 aVersion, ObjectStoreInfoArray& aObjectStores) { NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); NS_ASSERTION(aDatabaseInfo, "Null pointer!"); ObjectStoreInfoArray objectStores; if (!objectStores.SwapElements(aObjectStores)) { NS_WARNING("Out of memory!"); return NS_ERROR_OUT_OF_MEMORY; } nsAutoTArray<nsString, 10> existingNames; if (!aDatabaseInfo->GetObjectStoreNames(existingNames)) { NS_WARNING("Out of memory!"); return NS_ERROR_OUT_OF_MEMORY; } // Remove all the old ones. for (PRUint32 index = 0; index < existingNames.Length(); index++) { aDatabaseInfo->RemoveObjectStore(existingNames[index]); } aDatabaseInfo->version = aVersion; for (PRUint32 index = 0; index < objectStores.Length(); index++) { nsAutoPtr<ObjectStoreInfo>& info = objectStores[index]; NS_ASSERTION(info->databaseId == aDatabaseInfo->id, "Huh?!"); if (!aDatabaseInfo->PutObjectStore(info)) { NS_WARNING("Out of memory!"); return NS_ERROR_OUT_OF_MEMORY; } info.forget(); } return NS_OK; }