218 lines
7.9 KiB
C++
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_
|