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.
20 // DatabaseSession.cpp - DL Session.
23 #define _CPP_DATABASESESSION
25 #include <Security/DatabaseSession.h>
27 #include <Security/Database.h>
28 #include <Security/DbContext.h>
34 // Session constructor
36 DatabaseSession::DatabaseSession(DatabaseManager
&inDatabaseManager
)
37 : mDatabaseManager(inDatabaseManager
)
41 DatabaseSession::~DatabaseSession()
48 DatabaseSession::GetDbNames(CSSM_NAME_LIST_PTR
&outNameList
)
50 outNameList
= mDatabaseManager
.getDbNames (*this);
55 DatabaseSession::FreeNameList(CSSM_NAME_LIST
&inNameList
)
57 mDatabaseManager
.freeNameList (*this, inNameList
);
62 DatabaseSession::DbDelete(const char *inDbName
,
63 const CSSM_NET_ADDRESS
*inDbLocation
,
64 const AccessCredentials
*inAccessCred
)
66 // The databaseManager will notify all its DbContext instances
67 // that the database is question is being deleted.
68 mDatabaseManager
.dbDelete(*this, DbName(inDbName
, CssmNetAddress::optional(inDbLocation
)), inAccessCred
);
71 // DbContext creation and destruction.
73 DatabaseSession::DbCreate(const char *inDbName
,
74 const CSSM_NET_ADDRESS
*inDbLocation
,
75 const CSSM_DBINFO
&inDBInfo
,
76 CSSM_DB_ACCESS_TYPE inAccessRequest
,
77 const CSSM_RESOURCE_CONTROL_CONTEXT
*inCredAndAclEntry
,
78 const void *inOpenParameters
,
79 CSSM_DB_HANDLE
&outDbHandle
)
81 outDbHandle
= CSSM_INVALID_HANDLE
; // CDSA 2.0 says to set this if we fail
82 outDbHandle
= insertDbContext(mDatabaseManager
.dbCreate(*this,
83 DbName(inDbName
, CssmNetAddress::optional(inDbLocation
)),
92 DatabaseSession::DbOpen(const char *inDbName
,
93 const CSSM_NET_ADDRESS
*inDbLocation
,
94 CSSM_DB_ACCESS_TYPE inAccessRequest
,
95 const AccessCredentials
*inAccessCred
,
96 const void *inOpenParameters
,
97 CSSM_DB_HANDLE
&outDbHandle
)
99 outDbHandle
= CSSM_INVALID_HANDLE
; // CDSA 2.0 says to set this if we fail
100 outDbHandle
= insertDbContext(mDatabaseManager
.dbOpen(*this,
101 DbName(inDbName
, CssmNetAddress::optional(inDbLocation
)),
108 DatabaseSession::insertDbContext(DbContext
&inDbContext
)
110 CSSM_DB_HANDLE aDbHandle
;
113 aDbHandle
= inDbContext
.handle ();
114 StLock
<Mutex
> _(mDbContextMapLock
);
115 mDbContextMap
.insert(DbContextMap::value_type(aDbHandle
, &inDbContext
));
120 mDatabaseManager
.dbClose(inDbContext
);
128 DatabaseSession::findDbContext(CSSM_DB_HANDLE inDbHandle
)
130 StLock
<Mutex
> _(mDbContextMapLock
);
131 DbContextMap::iterator it
= mDbContextMap
.find(inDbHandle
);
132 if (it
== mDbContextMap
.end())
133 CssmError::throwMe(CSSM_ERRCODE_INVALID_DB_HANDLE
);
138 DatabaseSession::closeAll()
140 StLock
<Mutex
> _(mDbContextMapLock
);
141 for (DbContextMap::iterator it
= mDbContextMap
.begin();
142 it
!= mDbContextMap
.end();
145 DbContext
*aDbContext
= it
->second
;
148 mDatabaseManager
.dbClose(*aDbContext
);
149 // This is done by the database itself which owns the context.
154 // Ignore exceptions since we want to close as many DBs as possible.
155 // XXX @@@ log an error or something.
159 mDbContextMap
.clear();
162 // Operations using DbContext instances.
164 DatabaseSession::DbClose(CSSM_DB_HANDLE inDbHandle
)
166 StLock
<Mutex
> _(mDbContextMapLock
);
167 DbContextMap::iterator it
= mDbContextMap
.find(inDbHandle
);
168 if (it
== mDbContextMap
.end())
169 CssmError::throwMe(CSSM_ERRCODE_INVALID_DB_HANDLE
);
170 auto_ptr
<DbContext
> aDbContext(it
->second
);
171 mDbContextMap
.erase(it
);
172 mDatabaseManager
.dbClose(*aDbContext
);
176 DatabaseSession::CreateRelation(CSSM_DB_HANDLE inDbHandle
,
177 CSSM_DB_RECORDTYPE inRelationID
,
178 const char *inRelationName
,
179 uint32 inNumberOfAttributes
,
180 const CSSM_DB_SCHEMA_ATTRIBUTE_INFO
&inAttributeInfo
,
181 uint32 inNumberOfIndexes
,
182 const CSSM_DB_SCHEMA_INDEX_INFO
&inIndexInfo
)
184 DbContext
&aDbContext
= findDbContext(inDbHandle
);
185 return aDbContext
.mDatabase
.createRelation(aDbContext
, inRelationID
, inRelationName
,
186 inNumberOfAttributes
, inAttributeInfo
,
187 inNumberOfIndexes
, inIndexInfo
);
191 DatabaseSession::DestroyRelation(CSSM_DB_HANDLE inDbHandle
,
192 CSSM_DB_RECORDTYPE inRelationID
)
194 DbContext
&aDbContext
= findDbContext(inDbHandle
);
195 return aDbContext
.mDatabase
.destroyRelation(aDbContext
, inRelationID
);
199 DatabaseSession::Authenticate(CSSM_DB_HANDLE inDbHandle
,
200 CSSM_DB_ACCESS_TYPE inAccessRequest
,
201 const AccessCredentials
&inAccessCred
)
203 DbContext
&aDbContext
= findDbContext(inDbHandle
);
204 aDbContext
.mDatabase
.authenticate(aDbContext
, inAccessRequest
, inAccessCred
);
209 DatabaseSession::GetDbAcl(CSSM_DB_HANDLE inDbHandle
,
210 const CSSM_STRING
*inSelectionTag
,
211 uint32
&outNumberOfAclInfos
,
212 CSSM_ACL_ENTRY_INFO_PTR
&outAclInfos
)
214 DbContext
&aDbContext
= findDbContext(inDbHandle
);
215 aDbContext
.mDatabase
.getDbAcl(aDbContext
, inSelectionTag
, outNumberOfAclInfos
, outAclInfos
);
219 DatabaseSession::ChangeDbAcl(CSSM_DB_HANDLE inDbHandle
,
220 const AccessCredentials
&inAccessCred
,
221 const CSSM_ACL_EDIT
&inAclEdit
)
223 DbContext
&aDbContext
= findDbContext(inDbHandle
);
224 aDbContext
.mDatabase
.changeDbAcl(aDbContext
, inAccessCred
, inAclEdit
);
228 DatabaseSession::GetDbOwner(CSSM_DB_HANDLE inDbHandle
,
229 CSSM_ACL_OWNER_PROTOTYPE
&outOwner
)
231 DbContext
&aDbContext
= findDbContext(inDbHandle
);
232 aDbContext
.mDatabase
.getDbOwner(aDbContext
, outOwner
);
236 DatabaseSession::ChangeDbOwner(CSSM_DB_HANDLE inDbHandle
,
237 const AccessCredentials
&inAccessCred
,
238 const CSSM_ACL_OWNER_PROTOTYPE
&inNewOwner
)
240 DbContext
&aDbContext
= findDbContext(inDbHandle
);
241 aDbContext
.mDatabase
.changeDbOwner(aDbContext
, inAccessCred
, inNewOwner
);
245 DatabaseSession::GetDbNameFromHandle(CSSM_DB_HANDLE inDbHandle
,
248 DbContext
&aDbContext
= findDbContext(inDbHandle
);
249 Required(outDbName
) = aDbContext
.mDatabase
.getDbNameFromHandle(aDbContext
);
253 DatabaseSession::DataInsert(CSSM_DB_HANDLE inDbHandle
,
254 CSSM_DB_RECORDTYPE inRecordType
,
255 const CSSM_DB_RECORD_ATTRIBUTE_DATA
*inAttributes
,
256 const CssmData
*inData
,
257 CSSM_DB_UNIQUE_RECORD_PTR
&outUniqueId
)
259 DbContext
&aDbContext
= findDbContext(inDbHandle
);
260 outUniqueId
= aDbContext
.mDatabase
.dataInsert(aDbContext
, inRecordType
, inAttributes
, inData
);
265 DatabaseSession::DataDelete(CSSM_DB_HANDLE inDbHandle
,
266 const CSSM_DB_UNIQUE_RECORD
&inUniqueRecordIdentifier
)
268 DbContext
&aDbContext
= findDbContext(inDbHandle
);
269 aDbContext
.mDatabase
.dataDelete(aDbContext
, inUniqueRecordIdentifier
);
274 DatabaseSession::DataModify(CSSM_DB_HANDLE inDbHandle
,
275 CSSM_DB_RECORDTYPE inRecordType
,
276 CSSM_DB_UNIQUE_RECORD
&inoutUniqueRecordIdentifier
,
277 const CSSM_DB_RECORD_ATTRIBUTE_DATA
*inAttributesToBeModified
,
278 const CssmData
*inDataToBeModified
,
279 CSSM_DB_MODIFY_MODE inModifyMode
)
281 DbContext
&aDbContext
= findDbContext(inDbHandle
);
282 aDbContext
.mDatabase
.dataModify(aDbContext
, inRecordType
, inoutUniqueRecordIdentifier
,
283 inAttributesToBeModified
, inDataToBeModified
, inModifyMode
);
287 DatabaseSession::DataGetFirst(CSSM_DB_HANDLE inDbHandle
,
288 const DLQuery
*inQuery
,
289 CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR inoutAttributes
,
291 CSSM_DB_UNIQUE_RECORD_PTR
&outUniqueId
)
293 DbContext
&aDbContext
= findDbContext(inDbHandle
);
295 return aDbContext
.mDatabase
.dataGetFirst(aDbContext
, inQuery
,
296 inoutAttributes
, inoutData
, outUniqueId
);
300 DatabaseSession::DataGetNext(CSSM_DB_HANDLE inDbHandle
,
301 CSSM_HANDLE inResultsHandle
,
302 CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR inoutAttributes
,
304 CSSM_DB_UNIQUE_RECORD_PTR
&outUniqueRecord
)
306 DbContext
&aDbContext
= findDbContext(inDbHandle
);
308 return aDbContext
.mDatabase
.dataGetNext(aDbContext
, inResultsHandle
, inoutAttributes
,
309 inoutData
, outUniqueRecord
);
313 DatabaseSession::DataAbortQuery(CSSM_DB_HANDLE inDbHandle
,
314 CSSM_HANDLE inResultsHandle
)
316 DbContext
&aDbContext
= findDbContext(inDbHandle
);
317 aDbContext
.mDatabase
.dataAbortQuery(aDbContext
, inResultsHandle
);
321 DatabaseSession::DataGetFromUniqueRecordId(CSSM_DB_HANDLE inDbHandle
,
322 const CSSM_DB_UNIQUE_RECORD
&inUniqueRecord
,
323 CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR inoutAttributes
,
326 DbContext
&aDbContext
= findDbContext(inDbHandle
);
327 aDbContext
.mDatabase
.dataGetFromUniqueRecordId(aDbContext
, inUniqueRecord
,
328 inoutAttributes
, inoutData
);
332 DatabaseSession::FreeUniqueRecord(CSSM_DB_HANDLE inDbHandle
,
333 CSSM_DB_UNIQUE_RECORD
&inUniqueRecordIdentifier
)
335 DbContext
&aDbContext
= findDbContext(inDbHandle
);
336 aDbContext
.mDatabase
.freeUniqueRecord(aDbContext
, inUniqueRecordIdentifier
);
340 DatabaseSession::PassThrough(CSSM_DB_HANDLE inDbHandle
,
341 uint32 passThroughId
,
342 const void *inputParams
,
345 DbContext
&aDbContext
= findDbContext(inDbHandle
);
346 aDbContext
.mDatabase
.passThrough(aDbContext
, passThroughId
, inputParams
, outputParams
);