//-----------------------------------------------------------------------------
// Microsoft OLE DB TABLECOPY Sample
// Copyright (C) 1996 By Microsoft Corporation.
//
// @doc
//
// @module TABLECOPY.CPP
//
//-----------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////
// Includes
//
/////////////////////////////////////////////////////////////////
#define DBINITCONSTANTS //Initilaizes OLEDB Guids / Constants
#include "winmain.h"
#include "common.h"
#include "tablecopy.h"
#include "table.h"
#include "wizard.h"
#include "msdasql.h"//CLSID_MSDASQL provider guid
/////////////////////////////////////////////////////////////////
// CTableCopy::CTableCopy
//
/////////////////////////////////////////////////////////////////
CTableCopy::CTableCopy(CWizard* pCWizard)
{
ASSERT(pCWizard);
m_pCFromTable= new CTable(pCWizard);
m_pCToTable= new CTable(pCWizard);
m_dwShowTypes= SHOW_TABLES; //Default to just user Tables in the DSN
//Options
m_fShowQuery= FALSE;
//Copy Options
m_dwRowOpt= IDR_ALL_ROWS;
m_ulMaxRows= MAX_BLOCK_SIZE;
m_dwParamOpt= IDR_PARAM_SETS;
m_ulParamSets= 10;
m_dwBlobOpt= IDR_BLOB_SIZE;
m_ulBlobSize= MAX_COL_SIZE;
//Create Options
m_fCopyTables= TRUE;
m_fCopyIndexes= TRUE;
m_fTranslate= TRUE;
m_pCWizard= pCWizard; //Back pointer to windowing class
}
/////////////////////////////////////////////////////////////////
// CTableCopy::~CTableCopy
//
/////////////////////////////////////////////////////////////////
CTableCopy::~CTableCopy()
{
delete m_pCFromTable;
delete m_pCToTable;
}
/////////////////////////////////////////////////////////////////
// HRESULT CTableCopy::MapTypes
//
/////////////////////////////////////////////////////////////////
HRESULT CTableCopy::MapTypes()
{
HRESULT hr = S_OK;
// Get descriptions of each column in the Source Table
TESTC(hr = m_pCFromTable->GetColInfo());
//Now get the TypeInfo for all columns
TESTC(hr = m_pCFromTable->GetTypeInfo());
//Now map all the Types correctly from the Source to the Target
TESTC(hr = m_pCToTable->MapTableInfo(m_pCFromTable));
CLEANUP:
return hr;
}
/////////////////////////////////////////////////////////////////
// HRESULT CTableCopy::CreateTable
//
/////////////////////////////////////////////////////////////////
HRESULT CTableCopy::CreateTable()
{
HRESULT hr = S_OK;
// Create the Table (if desired)
if(m_fCopyTables)
{
TESTC(hr = m_pCToTable->CreateTable());
TESTC(hr = m_pCToTable->GetColInfo());
}
CLEANUP:
return hr;
}
///////////////////////////////////////////////////////////////////////
// HRESULT CTableCopy::CreateIndexes
//
///////////////////////////////////////////////////////////////////////
HRESULT CTableCopy::CreateIndexes()
{
HRESULT hr = S_OK;
// Create the indexes (if desired)
if(m_fCopyIndexes)
TESTC(hr = m_pCToTable->CopyIndexes(m_pCFromTable));
CLEANUP:
return hr;
}
///////////////////////////////////////////////////////////////////////
// HRESULT CTableCopy::CopyData
//
///////////////////////////////////////////////////////////////////////
HRESULT CTableCopy::CopyData(ULONG* pcRows)
{
ASSERT(pcRows);
HRESULT hr = S_OK;
//If MaxRows is specified, then copy upto number specified, otherwise
//indicate ULONG_MAX to mean all rows, (upto ULONG_MAX)
*pcRows= (m_dwRowOpt == IDR_MAX_ROWS) ? m_ulMaxRows : ULONG_MAX;
//If ParamSets are specified then use the ParamSet size, otherwise
//indicate 0 to mean no param sets
ULONG ulParamSets= (m_dwParamOpt == IDR_PARAM_SETS) ? m_ulParamSets : 0;
//If BlobSize is specified then use the Specified size, otherwise
//indicate ULONG_MAX to use ISequentialStream
ULONG ulBlobSize= (m_dwBlobOpt == IDR_BLOB_SIZE) ? m_ulBlobSize : ULONG_MAX;
//Copy the Data from the Source to the Target table
TESTC(hr = m_pCToTable->CopyData(m_pCFromTable, pcRows, ulParamSets, ulBlobSize));
CLEANUP:
return hr;
}
///////////////////////////////////////////////////////////////////////
// HRESULT CTableCopy::CopyTables
//
///////////////////////////////////////////////////////////////////////
HRESULT CTableCopy::CopyTables()
{
HRESULT hr;
ULONG cRows = 0;
//MapTypes should have already been called
ASSERT(m_pCFromTable->m_rgColDesc);
ASSERT(m_pCToTable->m_rgColDesc);
//Create the new Table
TESTC(hr = CreateTable());
//Create the Indexes
TESTC(hr = CreateIndexes());
//Now Copy the Data
TESTC(hr = CopyData(&cRows));
CLEANUP:
if(SUCCEEDED(hr))
wMessageBox(NULL, MB_ICONINFORMATION | MB_OK, wsz_SUCCESS, wsz_COPY_SUCCESS, cRows);
else
wMessageBox(NULL, MB_ICONEXCLAMATION | MB_OK, wsz_ERROR, wsz_COPY_FAILURE);
return hr;
}