2 * Copyright (c) 2000-2001 Apple Computer, Inc. All Rights Reserved.
4 * The contents of this file constitute Original Code as defined in and are
5 * subject to the Apple Public Source License Version 1.2 (the 'License').
6 * You may not use this file except in compliance with the License. Please obtain
7 * a copy of the License at http://www.apple.com/publicsource and read it before
10 * This Original Code and all software distributed under the License are
11 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
12 * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
13 * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14 * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the
15 * specific language governing rights and limitations under the License.
22 #include <Security/Database.h>
24 #include <Security/cssmerr.h>
25 #include <Security/DbContext.h>
28 DatabaseManager::DatabaseManager ()
32 DatabaseManager::~DatabaseManager ()
37 DatabaseManager::get (const DbName
&inDbName
)
39 StLock
<Mutex
> _(mDatabaseMapLock
);
40 DatabaseMap::iterator anIterator
= mDatabaseMap
.find (inDbName
);
41 if (anIterator
== mDatabaseMap
.end())
43 auto_ptr
<Database
> aDatabase(make(inDbName
));
44 mDatabaseMap
.insert(DatabaseMap::value_type(aDatabase
->mDbName
, aDatabase
.get()));
45 return aDatabase
.release();
48 return anIterator
->second
;
52 DatabaseManager::removeIfUnused(Database
&inDatabase
)
54 StLock
<Mutex
> _(mDatabaseMapLock
);
55 if (!inDatabase
.hasDbContexts())
56 mDatabaseMap
.erase(inDatabase
.mDbName
);
60 DatabaseManager::dbOpen(DatabaseSession
&inDatabaseSession
,
61 const DbName
&inDbName
,
62 CSSM_DB_ACCESS_TYPE inAccessRequest
,
63 const AccessCredentials
*inAccessCred
,
64 const void *inOpenParameters
)
66 Database
&aDatabase
= *get(inDbName
);
69 return aDatabase
._dbOpen(inDatabaseSession
, inAccessRequest
, inAccessCred
, inOpenParameters
);
73 removeIfUnused(aDatabase
);
79 DatabaseManager::dbCreate(DatabaseSession
&inDatabaseSession
,
80 const DbName
&inDbName
,
81 const CSSM_DBINFO
&inDBInfo
,
82 CSSM_DB_ACCESS_TYPE inAccessRequest
,
83 const CSSM_RESOURCE_CONTROL_CONTEXT
*inCredAndAclEntry
,
84 const void *inOpenParameters
)
86 Database
&aDatabase
= *get(inDbName
);
89 return aDatabase
._dbCreate(inDatabaseSession
, inDBInfo
, inAccessRequest
,
90 inCredAndAclEntry
, inOpenParameters
);
94 removeIfUnused(aDatabase
);
99 // Delete a DbContext instance created by calling dbOpen or dbCreate.
101 DatabaseManager::dbClose(DbContext
&inDbContext
)
103 Database
&aDatabase
= inDbContext
.mDatabase
;
104 aDatabase
._dbClose(inDbContext
);
105 removeIfUnused(aDatabase
);
108 // Delete a database.
110 DatabaseManager::dbDelete(DatabaseSession
&inDatabaseSession
,
111 const DbName
&inDbName
,
112 const AccessCredentials
*inAccessCred
)
114 Database
&aDatabase
= *get(inDbName
);
117 aDatabase
.dbDelete(inDatabaseSession
, inAccessCred
);
121 removeIfUnused(aDatabase
);
125 removeIfUnused(aDatabase
);
128 // List all available databases.
130 DatabaseManager::getDbNames(DatabaseSession
&inDatabaseSession
)
132 CssmError::throwMe(CSSM_ERRCODE_FUNCTION_NOT_IMPLEMENTED
);
136 DatabaseManager::freeNameList(DatabaseSession
&inDatabaseSession
,
137 CSSM_NAME_LIST
&inNameList
)
139 CssmError::throwMe(CSSM_ERRCODE_FUNCTION_NOT_IMPLEMENTED
);
142 // Start of Database implementation.
144 Database::Database (const DbName
&inDbName
)
149 Database::~Database ()
154 Database::hasDbContexts()
156 StLock
<Mutex
> _(mDbContextSetLock
);
157 return !mDbContextSet
.empty();
161 Database::_dbOpen(DatabaseSession
&inDatabaseSession
,
162 CSSM_DB_ACCESS_TYPE inAccessRequest
,
163 const AccessCredentials
*inAccessCred
,
164 const void *inOpenParameters
)
166 auto_ptr
<DbContext
>aDbContext(makeDbContext(inDatabaseSession
,
171 StLock
<Mutex
> _(mDbContextSetLock
);
172 mDbContextSet
.insert(aDbContext
.get());
173 // Release the mDbContextSetLock
182 StLock
<Mutex
> _(mDbContextSetLock
);
183 mDbContextSet
.erase(aDbContext
.get());
187 return *aDbContext
.release();
191 Database::_dbCreate(DatabaseSession
&inDatabaseSession
,
192 const CSSM_DBINFO
&inDBInfo
,
193 CSSM_DB_ACCESS_TYPE inAccessRequest
,
194 const CSSM_RESOURCE_CONTROL_CONTEXT
*inCredAndAclEntry
,
195 const void *inOpenParameters
)
197 auto_ptr
<DbContext
>aDbContext(makeDbContext(inDatabaseSession
,
200 ? AccessCredentials::optional(inCredAndAclEntry
->AccessCred
)
204 StLock
<Mutex
> _(mDbContextSetLock
);
205 mDbContextSet
.insert(aDbContext
.get());
206 // Release the mDbContextSetLock
211 dbCreate(*aDbContext
, inDBInfo
,
212 inCredAndAclEntry
? &inCredAndAclEntry
->InitialAclEntry
: NULL
);
216 StLock
<Mutex
> _(mDbContextSetLock
);
217 mDbContextSet
.erase(aDbContext
.get());
221 return *aDbContext
.release();
225 Database::_dbClose(DbContext
&dbContext
)
227 StLock
<Mutex
> _(mDbContextSetLock
);
228 mDbContextSet
.erase(&dbContext
);
229 if (mDbContextSet
.empty())