218 lines
7.1 KiB
C++
218 lines
7.1 KiB
C++
/*++
|
|
|
|
© 1998 Seagate Software, Inc. All rights reserved.
|
|
|
|
Module Name:
|
|
|
|
Wsbdb.h
|
|
|
|
Abstract:
|
|
|
|
These classes provide support for data bases.
|
|
|
|
Author:
|
|
|
|
Ron White [ronw] 19-Nov-1996
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
|
|
#ifndef _WSBDB_
|
|
#define _WSBDB_
|
|
|
|
// Are we defining imports or exports?
|
|
#if defined(IDB_IMPL)
|
|
#define IDB_EXPORT __declspec(dllexport)
|
|
#else
|
|
#define IDB_EXPORT __declspec(dllimport)
|
|
#endif
|
|
|
|
#include "wsbdef.h"
|
|
#include "wsbdbent.h"
|
|
|
|
#define IDB_MAX_REC_TYPES 16
|
|
#define IDB_MAX_KEYS_PER_REC 10
|
|
|
|
// Maximum key size in bytes; Jet limit is currently 255 so we limit
|
|
// all implementations
|
|
#define IDB_MAX_KEY_SIZE 255
|
|
|
|
// IDB_SYS_INIT_FLAG_* flags for use with IWsbDbSys::Init
|
|
#define IDB_SYS_INIT_FLAG_FULL_LOGGING 0x00000000 // I.e. the default
|
|
#define IDB_SYS_INIT_FLAG_LIMITED_LOGGING 0x00000001
|
|
#define IDB_SYS_INIT_FLAG_SPECIAL_ERROR_MSG 0x00000002
|
|
#define IDB_SYS_INIT_FLAG_NO_BACKUP 0x00000004
|
|
#define IDB_SYS_INIT_FLAG_NO_LOGGING 0x00000008
|
|
|
|
// IDB_CREATE_FLAG_* flags for use with IWsbDb::Create
|
|
#define IDB_CREATE_FLAG_NO_TRANSACTION 0x00000001
|
|
#define IDB_CREATE_FLAG_FIXED_SCHEMA 0x00000002
|
|
|
|
// IDB_DELETE_FLAG_* flags for use with IWsbDb::Delete
|
|
#define IDB_DELETE_FLAG_NO_ERROR 0x00000001
|
|
|
|
// IDB_DUMP_FLAG_* flags for use with IWsbDB::Dump
|
|
#define IDB_DUMP_FLAG_DB_INFO 0x00000001
|
|
#define IDB_DUMP_FLAG_REC_INFO 0x00000002
|
|
#define IDB_DUMP_FLAG_KEY_INFO 0x00000004
|
|
#define IDB_DUMP_FLAG_RECORDS 0x00000008
|
|
#define IDB_DUMP_FLAG_EVERYTHING 0x0000000F
|
|
#define IDB_DUMP_FLAG_RECORD_TYPE 0x00000010
|
|
#define IDB_DUMP_FLAG_APPEND_TO_FILE 0x00000100
|
|
|
|
// IDB_KEY_FLAG_* flags for use in IDB_KEY_INFO structure:
|
|
#define IDB_KEY_FLAG_DUP_ALLOWED 0x00000001 // Duplicate keys allowed
|
|
#define IDB_KEY_FLAG_PRIMARY 0x00000002 // Primary key
|
|
|
|
// IDB_KEY_INFO - data about record keys
|
|
// Note: Only one key per record type can be a primary key. The primary
|
|
// key can not be modified in a record. In general, the primary key is
|
|
// used for the physical clustering of the records in the DB.
|
|
|
|
typedef struct : _COM_IDB_KEY_INFO {
|
|
// ULONG Type; // Key type ID; must be > 0
|
|
// ULONG Size; // Key size in bytes
|
|
// ULONG Flags; // IDB_KEY_FLAG_* values
|
|
} IDB_KEY_INFO;
|
|
|
|
|
|
// IDB_REC_FLAG_* flags for use in IDB_REC_INFO structur
|
|
#define IDB_REC_FLAG_VARIABLE 0x00000001 // Record size is not fixed
|
|
|
|
// IDB_REC_INFO - data about IDB records
|
|
// Note: It there are multiple keys, the first key is taken as the
|
|
// default key to use for a new entity created by GetEntity.
|
|
|
|
typedef struct : _COM_IDB_REC_INFO {
|
|
IDB_KEY_INFO *Key; // Key info (must be allocated by derived DB object)
|
|
} IDB_REC_INFO;
|
|
|
|
// IDB_BACKUP_FLAG_* flags for use with IWsbDbSys::Backup
|
|
#define IDB_BACKUP_FLAG_AUTO 0x00000001 // Start auto backup thread
|
|
#define IDB_BACKUP_FLAG_FORCE_FULL 0x00000002 // Force a full backup
|
|
|
|
|
|
|
|
|
|
/*++
|
|
|
|
Class Name:
|
|
|
|
CWsbDb
|
|
|
|
Class Description:
|
|
|
|
The base class for a data base object.
|
|
|
|
--*/
|
|
|
|
class IDB_EXPORT CWsbDb :
|
|
public CWsbPersistable,
|
|
public IWsbDbPriv
|
|
{
|
|
public:
|
|
|
|
// CComObjectRoot
|
|
public:
|
|
STDMETHOD(FinalConstruct)(void);
|
|
void FinalRelease(void);
|
|
|
|
// IPersist
|
|
public:
|
|
STDMETHOD(GetClassID)(LPCLSID pclsid);
|
|
|
|
// IPersistStream
|
|
public:
|
|
STDMETHOD(GetSizeMax)(ULARGE_INTEGER* /*pSize*/) {
|
|
return(E_NOTIMPL); }
|
|
STDMETHOD(Load)(IStream* pStream);
|
|
STDMETHOD(Save)(IStream* pStream, BOOL clearDirty);
|
|
|
|
// IWsbDb
|
|
public:
|
|
STDMETHOD(Close)(IWsbDbSession* pSession);
|
|
STDMETHOD(Create)(OLECHAR* path, ULONG flags = 0);
|
|
STDMETHOD(Delete)(OLECHAR* path, ULONG flags = 0);
|
|
STDMETHOD(Dump)(OLECHAR* Filename, ULONG Flags, ULONG Data);
|
|
STDMETHOD(GetEntity)(IWsbDbSession* pSession, ULONG RecId, REFIID riid, void** ppEntity);
|
|
STDMETHOD(GetName)(OLECHAR** /*pName*/) { return(E_NOTIMPL); }
|
|
STDMETHOD(GetPath)(OLECHAR** /*pPath*/) { return(E_NOTIMPL); }
|
|
STDMETHOD(GetVersion)(ULONG* /*pVer*/) { return(E_NOTIMPL); }
|
|
STDMETHOD(Locate)(OLECHAR* path);
|
|
STDMETHOD(Open)(IWsbDbSession** ppSession);
|
|
|
|
// IWsbDbPriv - For internal use only!
|
|
STDMETHOD(GetKeyInfo)(ULONG RecType, USHORT nKeys, COM_IDB_KEY_INFO* pKeyInfo);
|
|
STDMETHOD(GetRecInfo)(ULONG RecType, COM_IDB_REC_INFO* pRecInfo);
|
|
STDMETHOD(Lock)(void) { CWsbPersistable::Lock(); return(S_OK); }
|
|
STDMETHOD(Unlock)(void) { CWsbPersistable::Unlock(); return(S_OK); }
|
|
|
|
STDMETHOD(GetJetIds)(JET_SESID SessionId, ULONG RecType,
|
|
JET_TABLEID* pTableId, ULONG* pDataColId);
|
|
STDMETHOD(GetJetIndexInfo)(JET_SESID SessionId, ULONG RecType, ULONG KeyType,
|
|
ULONG* pColId, OLECHAR** pName, ULONG bufferSize);
|
|
STDMETHOD(GetNewSQN)(ULONG /*RecType*/, ULONG* /*pSeqNum*/)
|
|
{ return(E_NOTIMPL); }
|
|
|
|
private:
|
|
HRESULT db_info_from_file_block(void* block);
|
|
HRESULT db_info_to_file_block(void* block);
|
|
HRESULT rec_info_from_file_block(int index, void* block);
|
|
HRESULT rec_info_to_file_block(int index, void* block);
|
|
HRESULT session_current_index(IWsbDbSession* pSession);
|
|
|
|
HRESULT jet_init(void);
|
|
HRESULT jet_make_index_name(ULONG key_type, char* pName, ULONG bufsize);
|
|
HRESULT jet_make_table_name(ULONG rec_type, char* pName, ULONG bufsize);
|
|
HRESULT jet_load_info(void);
|
|
HRESULT jet_save_info(void);
|
|
|
|
protected:
|
|
// Values to be supplied by derived class:
|
|
|
|
CComPtr<IWsbDbSys> m_pWsbDbSys; // Strong reference to DbSys object - ensures that
|
|
// this object dies after the DBs
|
|
// Note: CWsbDbSys must NOT have strong reference to
|
|
// objects of this class (WsbDb)
|
|
ULONG m_version; // DB version
|
|
USHORT m_nRecTypes; // Number of record (object) types
|
|
IDB_REC_INFO* m_RecInfo; // Record/key info (must be allocated
|
|
// by derived DB object)
|
|
|
|
// Not to be changed by derived class:
|
|
CWsbStringPtr m_path;
|
|
void * m_pImp; // Secret stuff
|
|
|
|
ULONG m_SessionIndex;
|
|
|
|
};
|
|
|
|
#define WSB_FROM_CWSBDB \
|
|
STDMETHOD(Close)(IWsbDbSession* pSession) \
|
|
{return(CWsbDb::Close(pSession));} \
|
|
STDMETHOD(Create)(OLECHAR* path, ULONG flags = 0) \
|
|
{return(CWsbDb::Create(path, flags));} \
|
|
STDMETHOD(Delete)(OLECHAR* path, ULONG flags = 0) \
|
|
{return(CWsbDb::Delete(path, flags));} \
|
|
STDMETHOD(Dump)(OLECHAR* Filename, ULONG Flags, ULONG Data) \
|
|
{return(CWsbDb::Dump(Filename, Flags, Data));} \
|
|
STDMETHOD(GetEntity)(IWsbDbSession* pSession, ULONG RecId, REFIID riid, void** ppEntity) \
|
|
{return(CWsbDb::GetEntity(pSession, RecId, riid, ppEntity));} \
|
|
STDMETHOD(GetName)(OLECHAR** pName) \
|
|
{return(CWsbDb::GetName(pName)); } \
|
|
STDMETHOD(GetPath)(OLECHAR** pPath) \
|
|
{return(CWsbDb::GetPath(pPath)); } \
|
|
STDMETHOD(GetVersion)(ULONG* pVer) \
|
|
{return(CWsbDb::GetVersion(pVer)); } \
|
|
STDMETHOD(Locate)(OLECHAR* path) \
|
|
{return(CWsbDb::Locate(path));} \
|
|
STDMETHOD(Open)(IWsbDbSession** ppSession) \
|
|
{return(CWsbDb::Open(ppSession));} \
|
|
|
|
|
|
|
|
|
|
#endif // _WSBDB_
|