2025-11-28 00:35:46 +09:00

218 lines
7.9 KiB
C++

//--------------------------------------------------------------------
// Microsoft OLE DB Test
//
// Copyright 1995-2000 Microsoft Corporation.
//
// @doc
//
// @module IIndexDefinition.H | IIndexDefinition header file for test modules.
//
//
// @rev 01 | 03-21-95 | Microsoft | Created
// @rev 02 | 09-06-95 | Microsoft | Updated
//
#ifndef _IIndexDefinition_H_
#define _IIndexDefinition_H_
#include "oledb.h" // OLE DB Header Files
#include "oledberr.h"
#include "privlib.h" //include private library, which includes
//the "transact.h"
// helper class for index creation, deletion, and various verifications
// wraps an interface and offers IIndexDefinition functionality
class CIIndexDefinition
{
protected:
IIndexDefinition *m_pIIndexDefinition;
IUnknown *m_pIDSOUnknown;
//--------------------------------------------------------------------------
//
// @cmember Read the value of a column in the indexe schema rowset
//
// RETURNS FALSE if the value was read and differ than the original one
//--------------------------------------------------------------------------
BOOL GetIndexValueFromFirstRow(
LPVOID pVariable, // [OUT] value read
BOOL *pfSet, // [OUT] if the value is set
DBBINDING *rgDBBINDING, // [IN] binding array
ULONG cColumn, // [IN] column to be read
ULONG ulDBTYPE, // [IN] type of property variant
BYTE *pData, // [IN] pointer to read DATA stru
DBPROPID PropID, // [IN] property that is being read
ULONG cPropSets, // [IN] number of property sets
DBPROPSET *rgPropSets, // [IN] array of property sets
WCHAR *lpwszMesaj // [IN] message text for error
);
//--------------------------------------------------------------------------
//
// @cmember Read the value of a column in the index schema rowset
//
// if *pfSet is TRUE then there is a coparison value for the value read,
// otherwise the new value will be used for further comparisons => save
// it in *pVariable and set *pfSet to TRUE
// RETURNS FALSE if the value was read and differ than the original one
//--------------------------------------------------------------------------
BOOL GetIndexValue(
LPVOID pVariable, // [OUT] value read
BOOL *pfSet, // [OUT] if the value is set
DBBINDING *rgDBBINDING, // [IN] binding array
ULONG cColumn, // [IN] column to be read
ULONG ulDBTYPE, // [IN] type of property variant
BYTE *pData, // [IN] pointer to read DATA stru
WCHAR *lpwszMesaj // [IN] message text for error
);
HRESULT DoesIndexExistInIndexSchemaRowset(
DBID *pTableID, // @parm [IN] Table ID
DBID *pIndexID, // @parm [IN] Index ID
BOOL *pfExists, // @parm [OUT] TRUE if index exists
BOOL fAnyIndex = FALSE // @parm [IN] TRUE if search for all indexes
);
HRESULT DoesIndexExistRowsetIndex(
DBID *pTableID, // @parm [IN] Table ID
DBID *IndexID, // @parm [IN] Index ID
BOOL *fExists // @parm [OUT] TRUE if index exists
);
public:
static BOOL s_fIRowsetIndex;
CIIndexDefinition(IIndexDefinition *pIIndexDefinition);
CIIndexDefinition(IUnknown *pISessionUnknown);
~CIIndexDefinition() {
SAFE_RELEASE(m_pIIndexDefinition);
SAFE_RELEASE(m_pIDSOUnknown);
}
// basic methods for index manipulation
HRESULT CreateIndex(
DBID *pTableID, // [in] the ID of the table
DBID *pIndexID, // [in] the ID of the index
DBORDINAL nIndexSize, // [in] index size (no of columns)
DBINDEXCOLUMNDESC *rgIndexColumnDesc, // [in] columns to be part of index
ULONG cPropSets, // [in] count of property sets
DBPROPSET *rgPropSets, // [in] array of property sets
DBID **ppIndexID // [in/out] stores output ptr to IndexID
);
HRESULT DropIndex(
DBID *pTableID, // [in] the ID of the table
DBID *pIndexID // [in] the ID of the index
);
// helper methods
HRESULT CreateIndexAndCheck(
DBID *pTableID, // [in] the ID of the table
DBID *pIndexID, // [in] the ID of the index
DBORDINAL nIndexSize, // [in] index size (no of columns)
DBINDEXCOLUMNDESC *rgIndexColumnDesc, // [in] columns to be part of index
ULONG cPropSets, // [in] count of property sets
DBPROPSET *rgPropSets, // [in] array of property sets
DBID **ppIndexID // [in/out] stores output ptr to IndexID
);
HRESULT CreateCheckAndDropIndex(
DBID *pTableID, // [in] the ID of the table
DBID *pIndexID, // [in] the ID of the index
DBORDINAL nIndexSize, // [in] index size (no of columns)
DBINDEXCOLUMNDESC *rgIndexColumnDesc, // [in] columns to be part of index
ULONG cPropSets = 0, // [in] count of property sets
DBPROPSET *rgPropSets = NULL // [in] array of property sets
);
// Check whether the index is created and property settings
BOOL CheckIndex(
DBID *pTableID, // the index of the table
DBID *pIndexID, // the index to be checked
DBORDINAL cIndexColumnDesc, // how many elements
DBINDEXCOLUMNDESC *rgIndexColumnDesc, // array with index original descriprion
ULONG cPropertySets, // number of property sets
DBPROPSET *rgPropertySets // the array of property sets
);
BOOL CheckIndexUsingIRowsetIndex(
DBID *pTableID, // the index of the table
DBID *pIndexID, // the index to be checked
DBORDINAL cIndexColumnDesc, // how many elements
DBINDEXCOLUMNDESC *rgIndexColumnDesc, // array with index original descriprion
ULONG cPropertySets, // number of property sets
DBPROPSET *rgPropertySets // the array of property sets
);
BOOL CheckIndexUsingIDBSchemaRowset(
DBID *pTableID, // the index of the table
DBID *pIndexID, // the index to be checked
DBORDINAL cIndexColumnDesc, // how many elements
DBINDEXCOLUMNDESC *rgIndexColumnDesc, // array with index original descriprion
ULONG cPropertySets, // number of property sets
DBPROPSET *rgPropertySets // the array of property sets
);
//---------------------------------------------------------------------------
// DoesIndexExist |
//
// If this index is on this table return true. If function runs correctly
// but doesn't find the table name, function will return S_OK, but *pfExists
// will be FALSE. If strIndexName is empty, returns E_FAIL.
//
// @mfunc DoesIndexExist
// @rdesc HRESULT indicating success or failure
// @flag S_OK | Function ran without problem
// @flag E_FAIL | Function ran with problems
//
//---------------------------------------------------------------------------
HRESULT DoesIndexExist(
DBID *pTableID, // @parm [IN] Table ID
DBID *pIndexID, // @parm [IN] Index ID
BOOL *pfExists, // @parm [OUT] TRUE if index exists
BOOL fAnyIndex = FALSE // @parm [IN] TRUE if search for all indexes
);
operator IIndexDefinition* (){
return m_pIIndexDefinition;
}
}; // CIIndexDefinition
BOOL CIIndexDefinition::s_fIRowsetIndex = FALSE;
class CDBID: DBID{
public:
CDBID() {
memset(this, 0, sizeof(DBID));
}
~CDBID() {
ReleaseDBID(this, FALSE);
}
}; //CDBID
class CDBIDPtr
{
protected:
DBID *m_pDBID;
public:
CDBIDPtr(DBID *pDBID = NULL) {
if (pDBID)
m_pDBID = pDBID;
else
SAFE_ALLOC(m_pDBID, DBID, 1);
CLEANUP:
return;
}
~CDBIDPtr() {
ReleaseDBID(m_pDBID, TRUE);
}
operator DBID* () {
return m_pDBID;
}
operator DBID** () {
return &m_pDBID;
}
};
#endif //_IIndexDefinition_H_