1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "DatabaseInfo.h"
9 #include "nsDataHashtable.h"
10 #include "nsThreadUtils.h"
12 USING_INDEXEDDB_NAMESPACE
16 typedef nsDataHashtable
<nsCStringHashKey
, DatabaseInfo
*>
19 DatabaseHash
* gDatabaseHash
= nullptr;
22 EnumerateObjectStoreNames(const nsAString
& aKey
,
23 ObjectStoreInfo
* aData
,
26 nsTArray
<nsString
>* array
= static_cast<nsTArray
<nsString
>*>(aUserArg
);
27 if (!array
->InsertElementSorted(aData
->name
)) {
28 NS_ERROR("Out of memory?");
35 CloneObjectStoreInfo(const nsAString
& aKey
,
36 ObjectStoreInfo
* aData
,
39 ObjectStoreInfoHash
* hash
= static_cast<ObjectStoreInfoHash
*>(aUserArg
);
41 nsRefPtr
<ObjectStoreInfo
> newInfo(new ObjectStoreInfo(*aData
));
43 hash
->Put(aKey
, newInfo
);
50 DatabaseInfo::~DatabaseInfo()
52 // Clones are never in the hash.
54 DatabaseInfo::Remove(id
);
58 ObjectStoreInfo::ObjectStoreInfo(ObjectStoreInfo
& aOther
)
59 : nextAutoIncrementId(aOther
.nextAutoIncrementId
),
60 comittedAutoIncrementId(aOther
.comittedAutoIncrementId
)
62 *static_cast<ObjectStoreInfoGuts
*>(this) =
63 static_cast<ObjectStoreInfoGuts
&>(aOther
);
65 // Doesn't copy the refcount
66 MOZ_COUNT_CTOR(ObjectStoreInfo
);
69 #ifdef NS_BUILD_REFCNT_LOGGING
71 IndexInfo::IndexInfo()
77 MOZ_COUNT_CTOR(IndexInfo
);
80 IndexInfo::IndexInfo(const IndexInfo
& aOther
)
83 keyPath(aOther
.keyPath
),
84 unique(aOther
.unique
),
85 multiEntry(aOther
.multiEntry
)
87 MOZ_COUNT_CTOR(IndexInfo
);
90 IndexInfo::~IndexInfo()
92 MOZ_COUNT_DTOR(IndexInfo
);
95 ObjectStoreInfo::ObjectStoreInfo()
96 : nextAutoIncrementId(0),
97 comittedAutoIncrementId(0)
99 MOZ_COUNT_CTOR(ObjectStoreInfo
);
102 ObjectStoreInfo::~ObjectStoreInfo()
104 MOZ_COUNT_DTOR(ObjectStoreInfo
);
107 IndexUpdateInfo::IndexUpdateInfo()
111 MOZ_COUNT_CTOR(IndexUpdateInfo
);
114 IndexUpdateInfo::IndexUpdateInfo(const IndexUpdateInfo
& aOther
)
115 : indexId(aOther
.indexId
),
116 indexUnique(aOther
.indexUnique
),
119 MOZ_COUNT_CTOR(IndexUpdateInfo
);
122 IndexUpdateInfo::~IndexUpdateInfo()
124 MOZ_COUNT_DTOR(IndexUpdateInfo
);
127 #endif /* NS_BUILD_REFCNT_LOGGING */
131 DatabaseInfo::Get(const nsACString
& aId
,
132 DatabaseInfo
** aInfo
)
134 NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
135 NS_ASSERTION(!aId
.IsEmpty(), "Bad id!");
138 gDatabaseHash
->Get(aId
, aInfo
)) {
139 NS_IF_ADDREF(*aInfo
);
147 DatabaseInfo::Put(DatabaseInfo
* aInfo
)
149 NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
150 NS_ASSERTION(aInfo
, "Null pointer!");
152 if (!gDatabaseHash
) {
153 nsAutoPtr
<DatabaseHash
> databaseHash(new DatabaseHash());
154 gDatabaseHash
= databaseHash
.forget();
157 if (gDatabaseHash
->Get(aInfo
->id
, nullptr)) {
158 NS_ERROR("Already know about this database!");
162 gDatabaseHash
->Put(aInfo
->id
, aInfo
);
169 DatabaseInfo::Remove(const nsACString
& aId
)
171 NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
174 gDatabaseHash
->Remove(aId
);
176 if (!gDatabaseHash
->Count()) {
177 delete gDatabaseHash
;
178 gDatabaseHash
= nullptr;
184 DatabaseInfo::GetObjectStoreNames(nsTArray
<nsString
>& aNames
)
186 NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
189 if (objectStoreHash
) {
190 objectStoreHash
->EnumerateRead(EnumerateObjectStoreNames
, &aNames
);
196 DatabaseInfo::ContainsStoreName(const nsAString
& aName
)
198 NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
200 return objectStoreHash
&& objectStoreHash
->Get(aName
, nullptr);
204 DatabaseInfo::GetObjectStore(const nsAString
& aName
)
206 NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
208 if (objectStoreHash
) {
209 return objectStoreHash
->GetWeak(aName
);
216 DatabaseInfo::PutObjectStore(ObjectStoreInfo
* aInfo
)
218 NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
219 NS_ASSERTION(aInfo
, "Null pointer!");
221 if (!objectStoreHash
) {
222 nsAutoPtr
<ObjectStoreInfoHash
> hash(new ObjectStoreInfoHash());
223 objectStoreHash
= hash
.forget();
226 if (objectStoreHash
->Get(aInfo
->name
, nullptr)) {
227 NS_ERROR("Already have an entry for this objectstore!");
231 objectStoreHash
->Put(aInfo
->name
, aInfo
);
236 DatabaseInfo::RemoveObjectStore(const nsAString
& aName
)
238 NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
239 NS_ASSERTION(GetObjectStore(aName
), "Don't know about this one!");
241 if (objectStoreHash
) {
242 objectStoreHash
->Remove(aName
);
246 already_AddRefed
<DatabaseInfo
>
247 DatabaseInfo::Clone()
249 nsRefPtr
<DatabaseInfo
> dbInfo(new DatabaseInfo());
251 dbInfo
->cloned
= true;
253 dbInfo
->group
= group
;
254 dbInfo
->origin
= origin
;
255 dbInfo
->version
= version
;
256 dbInfo
->persistenceType
= persistenceType
;
258 dbInfo
->filePath
= filePath
;
259 dbInfo
->nextObjectStoreId
= nextObjectStoreId
;
260 dbInfo
->nextIndexId
= nextIndexId
;
262 if (objectStoreHash
) {
263 dbInfo
->objectStoreHash
= new ObjectStoreInfoHash();
264 objectStoreHash
->EnumerateRead(CloneObjectStoreInfo
,
265 dbInfo
->objectStoreHash
);
268 return dbInfo
.forget();