#ifndef _DATABASE_H_
#define _DATABASE_H_ 1
#include <Security/cssmacl.h>
#include <Security/threading.h>
#include <Security/DbName.h>
#include <list>
#include <map>
#include <set>
#ifdef _CPP_DATABASE
# pragma export on
#endif
using namespace std;
namespace Security
{
class Database;
class DatabaseFactory;
class DatabaseSession;
class DbContext;
class DatabaseManager
{
NOCOPY(DatabaseManager)
public:
DatabaseManager ();
virtual ~DatabaseManager ();
virtual DbContext &dbOpen(DatabaseSession &inDatabaseSession,
const DbName &inDbName,
CSSM_DB_ACCESS_TYPE inAccessRequest,
const AccessCredentials *inAccessCred,
const void *inOpenParameters);
virtual DbContext &dbCreate(DatabaseSession &inDatabaseSession,
const DbName &inDbName,
const CSSM_DBINFO &inDBInfo,
CSSM_DB_ACCESS_TYPE inAccessRequest,
const CSSM_RESOURCE_CONTROL_CONTEXT *inCredAndAclEntry,
const void *inOpenParameters);
virtual void dbClose(DbContext &inDbContext);
virtual void dbDelete(DatabaseSession &inDatabaseSession,
const DbName &inDbName,
const AccessCredentials *inAccessCred);
virtual CSSM_NAME_LIST_PTR getDbNames(DatabaseSession &inDatabaseSession);
virtual void freeNameList(DatabaseSession &inDatabaseSession,
CSSM_NAME_LIST &inNameList);
protected:
virtual void removeIfUnused(Database &inDatabase);
virtual Database *get (const DbName &inDbName); virtual Database *make (const DbName &inDbName) = 0; private:
typedef map<DbName, Database *> DatabaseMap;
DatabaseMap mDatabaseMap;
Mutex mDatabaseMapLock;
};
class Database
{
public:
virtual void
dbCreate (DbContext &inDbContext, const CSSM_DBINFO &inDBInfo,
const CSSM_ACL_ENTRY_INPUT *inInitialAclEntry) = 0;
virtual DbContext &
_dbCreate(DatabaseSession &inDatabaseSession,
const CSSM_DBINFO &inDBInfo,
CSSM_DB_ACCESS_TYPE inAccessRequest,
const CSSM_RESOURCE_CONTROL_CONTEXT *inCredAndAclEntry,
const void *inOpenParameters);
virtual void
dbOpen (DbContext &inDbContext) = 0;
virtual DbContext &
_dbOpen (DatabaseSession &inDatabaseSession,
CSSM_DB_ACCESS_TYPE inAccessRequest,
const AccessCredentials *inAccessCred,
const void *inOpenParameters);
virtual void
dbClose () = 0;
virtual void
_dbClose (DbContext &dbContext);
virtual void
dbDelete(DatabaseSession &inDatabaseSession,
const AccessCredentials *inAccessCred) = 0;
virtual void
createRelation (DbContext &dbContext,
CSSM_DB_RECORDTYPE inRelationID,
const char *inRelationName,
uint32 inNumberOfAttributes,
const CSSM_DB_SCHEMA_ATTRIBUTE_INFO &inAttributeInfo,
uint32 inNumberOfIndexes,
const CSSM_DB_SCHEMA_INDEX_INFO &inIndexInfo) = 0;
virtual void
destroyRelation (DbContext &dbContext,
CSSM_DB_RECORDTYPE inRelationID) = 0;
virtual void
authenticate(DbContext &dbContext,
CSSM_DB_ACCESS_TYPE inAccessRequest,
const AccessCredentials &inAccessCred) = 0;
virtual void
getDbAcl(DbContext &dbContext,
const CSSM_STRING *inSelectionTag,
uint32 &outNumberOfAclInfos,
CSSM_ACL_ENTRY_INFO_PTR &outAclInfos) = 0;
virtual void
changeDbAcl(DbContext &dbContext,
const AccessCredentials &inAccessCred,
const CSSM_ACL_EDIT &inAclEdit) = 0;
virtual void
getDbOwner(DbContext &dbContext, CSSM_ACL_OWNER_PROTOTYPE &outOwner) = 0;
virtual void
changeDbOwner(DbContext &dbContext,
const AccessCredentials &inAccessCred,
const CSSM_ACL_OWNER_PROTOTYPE &inNewOwner) = 0;
virtual char *
getDbNameFromHandle (const DbContext &dbContext) const = 0;
virtual CSSM_DB_UNIQUE_RECORD_PTR
dataInsert (DbContext &dbContext,
CSSM_DB_RECORDTYPE RecordType,
const CSSM_DB_RECORD_ATTRIBUTE_DATA *inAttributes,
const CssmData *inData) = 0;
virtual void
dataDelete (DbContext &dbContext,
const CSSM_DB_UNIQUE_RECORD &inUniqueRecordIdentifier) = 0;
virtual void
dataModify (DbContext &dbContext,
CSSM_DB_RECORDTYPE RecordType,
CSSM_DB_UNIQUE_RECORD &inoutUniqueRecordIdentifier,
const CSSM_DB_RECORD_ATTRIBUTE_DATA *inAttributesToBeModified,
const CssmData *inDataToBeModified,
CSSM_DB_MODIFY_MODE ModifyMode) = 0;
virtual CSSM_HANDLE
dataGetFirst (DbContext &dbContext,
const DLQuery *inQuery,
CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR inoutAttributes,
CssmData *inoutData,
CSSM_DB_UNIQUE_RECORD_PTR &outUniqueRecord) = 0;
virtual bool
dataGetNext (DbContext &dbContext,
CSSM_HANDLE inResultsHandle,
CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR inoutAttributes,
CssmData *inoutData,
CSSM_DB_UNIQUE_RECORD_PTR &outUniqueRecord) = 0;
virtual void
dataAbortQuery (DbContext &dbContext,
CSSM_HANDLE inResultsHandle) = 0;
virtual void
dataGetFromUniqueRecordId (DbContext &dbContext,
const CSSM_DB_UNIQUE_RECORD &inUniqueRecord,
CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR inoutAttributes,
CssmData *inoutData) = 0;
virtual void
freeUniqueRecord (DbContext &dbContext,
CSSM_DB_UNIQUE_RECORD &inUniqueRecord) = 0;
virtual void
passThrough(DbContext &dbContext,
uint32 passThroughId,
const void *inputParams,
void **outputParams) = 0;
Database (const DbName &inDbName);
virtual ~Database ();
virtual bool hasDbContexts();
const DbName mDbName;
protected:
virtual DbContext *makeDbContext(DatabaseSession &inDatabaseSession,
CSSM_DB_ACCESS_TYPE inAccessRequest,
const AccessCredentials *inAccessCred,
const void *inOpenParameters) = 0;
private:
typedef set<DbContext *> DbContextSet;
DbContextSet mDbContextSet;
Mutex mDbContextSetLock;
};
}
#ifdef _CPP_DATABASE
# pragma export off
#endif
#endif //_DATABASE_H_