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

232 lines
5.3 KiB
C++

//-----------------------------------------------------------------------------
// Microsoft OLE DB TABLECOPY Sample
// Copyright (C) 1995-2000 Microsoft Corporation
//
// @doc
//
// @module TABLE.H
//
//-----------------------------------------------------------------------------
#ifndef _TABLE_H_
#define _TABLE_H_
/////////////////////////////////////////////////////////////////
// Includes
//
/////////////////////////////////////////////////////////////////
#include "DataSource.h"
#include "TableCopy.h"
/////////////////////////////////////////////////////////////////
// Defines
//
/////////////////////////////////////////////////////////////////
enum ESQL_STMT
{
ESQL_SELECT,
ESQL_INSERT,
ESQL_CREATE_TABLE,
ESQL_DROP_TABLE
};
/////////////////////////////////////////////////////////////////
// Structs for Column/Index info
//
/////////////////////////////////////////////////////////////////
struct TYPEINFO
{
WCHAR wszTypeName[MAX_NAME_LEN];
USHORT wType;
ULONG ulColumnSize;
WCHAR wszCreateParams[MAX_NAME_LEN];
VARIANT_BOOL fIsNullable;
VARIANT_BOOL fIsAutoInc;
};
struct INDEXINFO
{
//INDEXINFO
WCHAR wszIndexName[MAX_NAME_LEN];
VARIANT_BOOL fUnique;
VARIANT_BOOL fClustered;
DBTYPE wType;
DWORD dwFillFactor;
DWORD dwInitialSize;
DWORD dwNulls;
VARIANT_BOOL fSortBookmarks;
VARIANT_BOOL fAutoUpdate;
DWORD dwNullCollation;
DWORD iOrdinal;
WCHAR wszColName[MAX_NAME_LEN];
DWORD dwCollation;
//PRIMARYKEY
BOOL fIsPrimaryKey;
};
struct PRIMARYKEY
{
WCHAR wszColName[MAX_NAME_LEN];
};
struct TABLEINFO
{
WCHAR wszCatalogName[MAX_NAME_LEN];
WCHAR wszSchemaName[MAX_NAME_LEN];
WCHAR wszTableName[MAX_NAME_LEN];
WCHAR wszType[MAX_NAME_LEN];
};
struct COLDESC
{
//DBCOLUMNINFO
WCHAR wszColName[MAX_NAME_LEN];
DBORDINAL iOrdinal;
DBCOLUMNFLAGS dwFlags;
DBLENGTH ulColumnSize;
DBTYPE wType;
BYTE bPrecision;
BYTE bScale;
//TYPEINFO
WCHAR wszTypeName[MAX_NAME_LEN];
ULONG ulCreateParams;
BOOL fIsNullable;
BOOL fIsAutoInc;
//INDEXINFO
BOOL fIsPrimaryKey;
};
struct BINDINGINFO
{
HACCESSOR hAccessor;
ULONG cBindings;
DBBINDING* rgBindings;
};
/////////////////////////////////////////////////////////////////
// CTable
//
/////////////////////////////////////////////////////////////////
class CTable
{
public:
//Constructors
CTable(CWizard* pCWizard);
virtual ~CTable();
//Members
virtual BOOL Connect(HWND hWnd, CDataSource* pCDataSource = NULL);
virtual BOOL IsConnected();
virtual BOOL GetQuotedID(WCHAR* pwszOutBuff, size_t cwchOutBuff, WCHAR* pwszInBuff);
virtual HRESULT GetColInfo(DWORD dwInsertOpt);
virtual HRESULT GetTypeInfo();
virtual HRESULT GetLiteralInfo();
virtual HRESULT GetTypeNameAndParams(ULONG iCol, WCHAR* pwszName, size_t cwchName);
virtual HRESULT GetColumnDesc(DBCOLUMNDESC** prgColumnDesc);
virtual HRESULT CreateSQLStmt(ESQL_STMT eSqlStmt, WCHAR* pwszSqlStmt, size_t cwchSqlStmt, BOOL fShowSql = TRUE);
virtual HRESULT MapTableInfo(CTable* pCSourceTable);
virtual HRESULT CreateTable();
virtual HRESULT AdjustBindings(ULONG cBindings, DBBINDING* rgBindings, void* pData);
virtual HRESULT GetRowset(DWORD dwInsertOpt);
virtual HRESULT CreateAccessors(ULONG* pcBindingInfo, BINDINGINFO** prgBindingInfo, ULONG* pcRowSize, ULONG ulBlobSize, BOOL* pbOutofLine);
virtual HRESULT CopyData(CTable* pCSourceTable, DBCOUNTITEM* pcRowsCopied);
virtual HRESULT CopyIndexes(CTable* pCSourceTable);
virtual HRESULT GetTypeInfoRowset(IAccessor** ppIAccessor, HACCESSOR* phAccessor, IRowset** ppIRowset);
//Data
WCHAR m_wszIDQuote[MAX_NAME_LEN];
WCHAR m_wszIDSeperator[MAX_NAME_LEN];
//TableInfo
TABLEINFO m_TableInfo;
WCHAR m_wszQualTableName[MAX_NAME_LEN];
//Index info
ULONG m_cIndexes; // Count of indexes
INDEXINFO* m_rgIndexInfo; // Index information
//ColumnInfo
ULONG m_cColumns; // Count of columns
COLDESC* m_rgColDesc; // Column Information
//DataSource
CDataSource* m_pCDataSource;
CWizard* m_pCWizard;
//Rowset
IAccessor* m_pIAccessor;
IRowset* m_pIRowset;
};
///////////////////////////////////////////////////////////////////////////////
// Class CISeqStream
//
// My implementation of ISeqStream interface
///////////////////////////////////////////////////////////////////////////////
class CISeqStream : public ISequentialStream
{
public:
//Constructors
CISeqStream();
virtual ~CISeqStream();
virtual BOOL Seek(ULONG iPos);
virtual BOOL Clear();
virtual BOOL CompareData(void* pBuffer);
virtual ULONG Length() { return m_cBufSize; };
virtual operator void* const() { return m_pBuffer; };
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv);
STDMETHODIMP Read(
/* [out] */ void __RPC_FAR *pv,
/* [in] */ ULONG cb,
/* [out] */ ULONG __RPC_FAR *pcbRead);
STDMETHODIMP Write(
/* [in] */ const void __RPC_FAR *pv,
/* [in] */ ULONG cb,
/* [out] */ ULONG __RPC_FAR *pcbWritten);
virtual HRESULT Write(ISequentialStream* pISeqStream, ULONG* pcbWritten);
protected:
//Data
private:
ULONG m_cRef; // reference count
void* m_pBuffer; // buffer
ULONG m_cBufSize; // buffer size
ULONG m_iPos; // current index position in the buffer
};
#endif //_TABLE_H_