#ifndef _H_DATABASESESSION
#define _H_DATABASESESSION
#include <Security/DLabstractsession.h>
#include <Security/cssmalloc.h>
#include <Security/threading.h>
#include <Security/cssmtype.h>
#include <map>
#if defined(_CPP_DATABASESESSION)
# pragma export on
#endif
namespace Security
{
class DatabaseManager;
class DbContext;
class DatabaseSession: public DLAbstractPluginSession, public CssmAllocator
{
public:
DatabaseSession(DatabaseManager &inDatabaseManager);
virtual ~DatabaseSession();
virtual void GetDbNames(CSSM_NAME_LIST_PTR &NameList);
virtual void FreeNameList(CSSM_NAME_LIST &NameList);
void DbDelete(const char *DbName,
const CSSM_NET_ADDRESS *DbLocation,
const AccessCredentials *AccessCred);
void DbCreate(const char *DbName,
const CSSM_NET_ADDRESS *DbLocation,
const CSSM_DBINFO &DBInfo,
CSSM_DB_ACCESS_TYPE AccessRequest,
const CSSM_RESOURCE_CONTROL_CONTEXT *CredAndAclEntry,
const void *OpenParameters,
CSSM_DB_HANDLE &DbHandle);
virtual void DbOpen(const char *DbName,
const CSSM_NET_ADDRESS *DbLocation,
CSSM_DB_ACCESS_TYPE AccessRequest,
const AccessCredentials *AccessCred,
const void *OpenParameters,
CSSM_DB_HANDLE &DbHandle);
void DbClose(CSSM_DB_HANDLE DBHandle);
void CreateRelation(CSSM_DB_HANDLE DBHandle,
CSSM_DB_RECORDTYPE RelationID,
const char *RelationName,
uint32 NumberOfAttributes,
const CSSM_DB_SCHEMA_ATTRIBUTE_INFO &pAttributeInfo,
uint32 NumberOfIndexes,
const CSSM_DB_SCHEMA_INDEX_INFO &pIndexInfo);
void DestroyRelation(CSSM_DB_HANDLE DBHandle,
CSSM_DB_RECORDTYPE RelationID);
void Authenticate(CSSM_DB_HANDLE DBHandle,
CSSM_DB_ACCESS_TYPE AccessRequest,
const AccessCredentials &AccessCred);
void GetDbAcl(CSSM_DB_HANDLE DBHandle,
const CSSM_STRING *SelectionTag,
uint32 &NumberOfAclInfos,
CSSM_ACL_ENTRY_INFO_PTR &AclInfos);
void ChangeDbAcl(CSSM_DB_HANDLE DBHandle,
const AccessCredentials &AccessCred,
const CSSM_ACL_EDIT &AclEdit);
void GetDbOwner(CSSM_DB_HANDLE DBHandle,
CSSM_ACL_OWNER_PROTOTYPE &Owner);
void ChangeDbOwner(CSSM_DB_HANDLE DBHandle,
const AccessCredentials &AccessCred,
const CSSM_ACL_OWNER_PROTOTYPE &NewOwner);
void GetDbNameFromHandle(CSSM_DB_HANDLE DBHandle,
char **DbName);
void DataInsert(CSSM_DB_HANDLE DBHandle,
CSSM_DB_RECORDTYPE RecordType,
const CSSM_DB_RECORD_ATTRIBUTE_DATA *Attributes,
const CssmData *Data,
CSSM_DB_UNIQUE_RECORD_PTR &UniqueId);
void DataDelete(CSSM_DB_HANDLE DBHandle,
const CSSM_DB_UNIQUE_RECORD &UniqueRecordIdentifier);
void DataModify(CSSM_DB_HANDLE DBHandle,
CSSM_DB_RECORDTYPE RecordType,
CSSM_DB_UNIQUE_RECORD &UniqueRecordIdentifier,
const CSSM_DB_RECORD_ATTRIBUTE_DATA *AttributesToBeModified,
const CssmData *DataToBeModified,
CSSM_DB_MODIFY_MODE ModifyMode);
CSSM_HANDLE DataGetFirst(CSSM_DB_HANDLE DBHandle,
const DLQuery *Query,
CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR Attributes,
CssmData *Data,
CSSM_DB_UNIQUE_RECORD_PTR &UniqueId);
bool DataGetNext(CSSM_DB_HANDLE DBHandle,
CSSM_HANDLE ResultsHandle,
CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR Attributes,
CssmData *Data,
CSSM_DB_UNIQUE_RECORD_PTR &UniqueId);
void DataAbortQuery(CSSM_DB_HANDLE DBHandle,
CSSM_HANDLE ResultsHandle);
void DataGetFromUniqueRecordId(CSSM_DB_HANDLE DBHandle,
const CSSM_DB_UNIQUE_RECORD &UniqueRecord,
CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR Attributes,
CssmData *Data);
void FreeUniqueRecord(CSSM_DB_HANDLE DBHandle,
CSSM_DB_UNIQUE_RECORD &UniqueRecord);
void PassThrough(CSSM_DB_HANDLE DBHandle,
uint32 PassThroughId,
const void *InputParams,
void **OutputParams);
DatabaseManager &mDatabaseManager;
protected:
void closeAll();
private:
CSSM_DB_HANDLE insertDbContext(DbContext &dbContext);
DbContext &findDbContext(CSSM_DB_HANDLE inDbHandle);
typedef std::map<CSSM_DB_HANDLE, DbContext *> DbContextMap;
DbContextMap mDbContextMap;
Mutex mDbContextMapLock;
};
}
#if defined(_CPP_DATABASESESSION)
# pragma export off
#endif
#endif //_H_DATABASESESSION