STEP4.CPP

//----------------------------------------------------------------------------- 
// Microsoft OLE DB TABLECOPY Sample
// Copyright (C) 1996 By Microsoft Corporation.
//
// @doc
//
// @module STEP4.CPP
//
//-----------------------------------------------------------------------------

/////////////////////////////////////////////////////////////////////
// Includes
//
/////////////////////////////////////////////////////////////////////
#include "wizard.h"
#include "common.h"
#include "tablecopy.h"
#include "table.h"


/////////////////////////////////////////////////////////////////////
// CS4Dialog::CS4Dialog
//
/////////////////////////////////////////////////////////////////////
CS4Dialog::CS4Dialog(HWND hWnd, HINSTANCE hInst, CTableCopy* pCTableCopy)
: CDialog(hWnd, hInst)
{
ASSERT(pCTableCopy);
m_pCTableCopy = pCTableCopy;
}


/////////////////////////////////////////////////////////////////////
// CS4Dialog::~CS4Dialog
//
/////////////////////////////////////////////////////////////////////
CS4Dialog::~CS4Dialog()
{
}


/////////////////////////////////////////////////////////////////////////////
// ULONG CS4Dialog::Display
//
/////////////////////////////////////////////////////////////////////////////
ULONG CS4Dialog::Display()
{
return DialogBoxParam(m_hInst, MAKEINTRESOURCE(IDD_OPTIONS), NULL, DlgProc, (LPARAM)this);
}


/////////////////////////////////////////////////////////////////////
// CS4Dialog::DlgProc
//
/////////////////////////////////////////////////////////////////////
BOOL WINAPI CS4Dialog::DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_INITDIALOG:
{
//Store the "this" pointer, since this is a static method
CS4Dialog* pThis = (CS4Dialog*)lParam;
SetWindowLong(hWnd, GWL_USERDATA, (LONG)pThis);

//On INIT we know we have a valid hWnd to store
pThis->m_hWnd = hWnd;

pThis->InitControls();
CenterDialog(hWnd);
return HANDLED_MSG;
}

case WM_COMMAND:
{
//Obtain the "this" pointer
CS4Dialog* pThis = (CS4Dialog*)GetWindowLong(hWnd, GWL_USERDATA);

// All buttons are handled the same way
switch(GET_WM_COMMAND_ID(wParam, lParam))
{
case IDX_COPY_TABLE:
case IDX_COPY_INDEXES:
case IDX_SHOW_SQL:

case IDR_ALL_ROWS:
case IDR_MAX_ROWS:
case IDR_PARAM_SETS:
case IDR_INSERT_ROW:
case IDR_BLOB_SIZE:
case IDR_ISEQ_STREAM:
pThis->RefreshControls();
return HANDLED_MSG;


case IDOK:
case IDB_PREV:
if(!pThis->RefreshControls())
return HANDLED_MSG;

case IDCANCEL:
EndDialog(hWnd, GET_WM_COMMAND_ID(wParam, lParam));
return HANDLED_MSG;
}
}
}

return UNHANDLED_MSG;
}


/////////////////////////////////////////////////////////////////////////////
// BOOL CS4Dialog::InitControls
//
/////////////////////////////////////////////////////////////////////////////
BOOL CS4Dialog::InitControls()
{
//IDX_COPY_TABLE (default-checked)
CheckDlgButton(m_hWnd, IDX_COPY_TABLE, m_pCTableCopy->m_fCopyTables);

//IDX_COPY_INDEXES (default-checked)
CheckDlgButton(m_hWnd, IDX_COPY_INDEXES, m_pCTableCopy->m_fCopyIndexes);

//IDX_SHOW_SQL (checked)
CheckDlgButton(m_hWnd, IDX_SHOW_SQL, m_pCTableCopy->m_fShowQuery);

//IDR_ALL_ROWS (default)
//IDR_MAX_ROWS
CheckRadioButton(m_hWnd, IDR_ALL_ROWS, IDR_MAX_ROWS, m_pCTableCopy->m_dwRowOpt);
wSetDlgItemText(m_hWnd, IDE_MAX_ROWS, L"%lu", m_pCTableCopy->m_ulMaxRows);

//IDR_PARAM_SETS (default)
//IDR_INSERT_ROW
//If multiple param sets are not supported by this driver, select only 1 set
if(!m_pCTableCopy->m_pCToTable->m_pCDataSource->m_fMultipleParamSets)
m_pCTableCopy->m_ulParamSets = 1;
CheckRadioButton(m_hWnd, IDR_PARAM_SETS, IDR_INSERT_ROW, m_pCTableCopy->m_dwParamOpt);
wSetDlgItemText(m_hWnd, IDE_PARAM_SETS, L"%lu", m_pCTableCopy->m_ulParamSets);

//IDR_BLOB_SIZE(default)
//IDR_ISEQ_STREAM
CheckRadioButton(m_hWnd, IDR_BLOB_SIZE, IDR_ISEQ_STREAM, m_pCTableCopy->m_dwBlobOpt);
wSetDlgItemText(m_hWnd, IDE_BLOB_SIZE, L"%lu", m_pCTableCopy->m_ulBlobSize);

//ISEQ_STREAM is currently disabled, until limitations are fixed
EnableWindow(GetDlgItem(m_hWnd, IDR_ISEQ_STREAM), FALSE);

//Limit the TextLength of the Edit Controls to 10 chars
SendDlgItemMessage(m_hWnd, IDE_MAX_ROWS, EM_LIMITTEXT, (WPARAM)10, 0L);
SendDlgItemMessage(m_hWnd, IDE_PARAM_SETS, EM_LIMITTEXT, (WPARAM)10, 0L);
SendDlgItemMessage(m_hWnd, IDE_BLOB_SIZE, EM_LIMITTEXT, (WPARAM)10, 0L);

// Refresh the controls
RefreshControls();
return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// BOOL CS4Dialog::RefreshControls
//
/////////////////////////////////////////////////////////////////////////////
BOOL CS4Dialog::RefreshControls()
{
// IDE_MAX_ROWS Get the Copy options first so we can check the row count if given.
if(IsDlgButtonChecked(m_hWnd, IDR_MAX_ROWS))
{
m_pCTableCopy->m_dwRowOpt = IDR_MAX_ROWS;
EnableWindow(GetDlgItem(m_hWnd, IDE_MAX_ROWS), TRUE);
}
else
{
m_pCTableCopy->m_dwRowOpt = IDR_ALL_ROWS;
EnableWindow(GetDlgItem(m_hWnd, IDE_MAX_ROWS), FALSE);
}

//Verify IDE_MAX_ROWS has legal value
if(!GetEditBoxValue(GetDlgItem(m_hWnd, IDE_MAX_ROWS), 1, LONG_MAX, &m_pCTableCopy->m_ulMaxRows))
return FALSE;

//ISEQ_STREAM is currently disabled, until limitations are fixed
EnableWindow(GetDlgItem(m_hWnd, IDR_ISEQ_STREAM), FALSE);

//IDE_BLOB_SIZE Get the Insert ParamSets options
if(IsDlgButtonChecked(m_hWnd, IDR_BLOB_SIZE))
{
m_pCTableCopy->m_dwBlobOpt = IDR_BLOB_SIZE;
EnableWindow(GetDlgItem(m_hWnd, IDE_BLOB_SIZE), TRUE);
}
else
{
m_pCTableCopy->m_dwBlobOpt = IDR_ISEQ_STREAM;
EnableWindow(GetDlgItem(m_hWnd, IDE_BLOB_SIZE), FALSE);
}

//Verify IDE_BLOB_SIZE has legal value
if(!GetEditBoxValue(GetDlgItem(m_hWnd, IDE_BLOB_SIZE), 1, MAX_COL_SIZE, &m_pCTableCopy->m_ulBlobSize))
return FALSE;

//IDE_PARAM_SETS Get the Insert ParamSets options
if(IsDlgButtonChecked(m_hWnd, IDR_PARAM_SETS))
{
m_pCTableCopy->m_dwParamOpt = IDR_PARAM_SETS;
EnableWindow(GetDlgItem(m_hWnd, IDE_PARAM_SETS), m_pCTableCopy->m_pCToTable->m_pCDataSource->m_fMultipleParamSets);
}
else
{
m_pCTableCopy->m_dwParamOpt = IDR_INSERT_ROW;
EnableWindow(GetDlgItem(m_hWnd, IDE_PARAM_SETS), FALSE);
}

//Verify IDE_PARAM_SETS has legal value
if(!GetEditBoxValue(GetDlgItem(m_hWnd, IDE_PARAM_SETS), 1, LONG_MAX, &m_pCTableCopy->m_ulParamSets))
return FALSE;

// Get Create options
m_pCTableCopy->m_fCopyTables = IsDlgButtonChecked(m_hWnd, IDX_COPY_TABLE);
m_pCTableCopy->m_fCopyIndexes = IsDlgButtonChecked(m_hWnd, IDX_COPY_INDEXES);

// Set other Options
m_pCTableCopy->m_fShowQuery = IsDlgButtonChecked(m_hWnd, IDX_SHOW_SQL);
return TRUE;
}


/////////////////////////////////////////////////////////////////////
// CTypesDialog::CTypesDialog
//
/////////////////////////////////////////////////////////////////////
CTypesDialog::CTypesDialog(HWND hWnd, HINSTANCE hInst, CTableCopy* pCTableCopy)
: CDialog(hWnd, hInst)
{
ASSERT(pCTableCopy);
m_pCTableCopy = pCTableCopy;
}


/////////////////////////////////////////////////////////////////////
// CTypesDialog::~CTypesDialog
//
/////////////////////////////////////////////////////////////////////
CTypesDialog::~CTypesDialog()
{
}


/////////////////////////////////////////////////////////////////////////////
// ULONG CTypesDialog::Display
//
/////////////////////////////////////////////////////////////////////////////
ULONG CTypesDialog::Display()
{
return DialogBoxParam(m_hInst, MAKEINTRESOURCE(IDD_DATA_TYPES), NULL, DlgProc, (LPARAM)this);
}


/////////////////////////////////////////////////////////////////////
// CTypesDialog::DlgProc
//
/////////////////////////////////////////////////////////////////////
BOOL WINAPI CTypesDialog::DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_INITDIALOG:
{
//Store the "this" pointer, since this is a static method
CTypesDialog* pThis = (CTypesDialog*)lParam;
SetWindowLong(hWnd, GWL_USERDATA, (LONG)pThis);

//On INIT we know we have a valid hWnd to store
pThis->m_hWnd = hWnd;

//Tell TableCopy to Map the Types from the Source->Target
//If MapTypes fails, end the app, (ie: same as hitting CANCEL)
if(FAILED(pThis->m_pCTableCopy->MapTypes()))
EndDialog(hWnd, IDCANCEL);

//Set Horizontal ScrollBar dimensions
SendDlgItemMessage(hWnd, IDL_FROM_DATA_TYPES, LB_SETHORIZONTALEXTENT, (WPARAM)120*4, (LPARAM)0);
SendDlgItemMessage(hWnd, IDL_TO_DATA_TYPES, LB_SETHORIZONTALEXTENT, (WPARAM)120*4, (LPARAM)0);

// Now Display the lists of Mappings
pThis->RefreshLists();
CenterDialog(hWnd);
return HANDLED_MSG;
}

case WM_COMMAND:
{
// All buttons are handled the same way

//Obtain the "this" pointer
CTypesDialog* pThis = (CTypesDialog*)GetWindowLong(hWnd, GWL_USERDATA);

switch(GET_WM_COMMAND_ID(wParam, lParam))
{
case IDOK:
//Now copy the Tables, End the Dialog first, so the user
//can't still acess it while the copiing is going on...
EndDialog(hWnd, GET_WM_COMMAND_ID(wParam, lParam));
pThis->m_pCTableCopy->CopyTables();
return HANDLED_MSG;

case IDCANCEL:
case IDB_PREV:
EndDialog(hWnd, GET_WM_COMMAND_ID(wParam, lParam));
return HANDLED_MSG;

case IDL_FROM_DATA_TYPES:
switch(GET_WM_COMMAND_CMD(wParam, lParam))
{
case LBN_SELCHANGE:
SyncSibling(GetDlgItem(hWnd,IDL_TO_DATA_TYPES), GetDlgItem(hWnd,IDL_FROM_DATA_TYPES));
return HANDLED_MSG;
}

case IDL_TO_DATA_TYPES:
switch(GET_WM_COMMAND_CMD(wParam, lParam))
{
case LBN_SELCHANGE:
SyncSibling(GetDlgItem(hWnd,IDL_FROM_DATA_TYPES), GetDlgItem(hWnd,IDL_TO_DATA_TYPES));
return HANDLED_MSG;
}
}
}
}

return UNHANDLED_MSG;
}


/////////////////////////////////////////////////////////////////////////////
// BOOL CTypesDialog::RefreshLists
//
/////////////////////////////////////////////////////////////////////////////
BOOL CTypesDialog::RefreshLists()
{
HWNDhWndFrom;// From data types
HWNDhWndTo;// To data types

WCHARwszType[MAX_NAME_LEN];// Buffer for type value
WCHARwszBuffer[MAX_NAME_LEN];// Buffer for type value

CTable* pCFromTable = m_pCTableCopy->m_pCFromTable;
CTable* pCToTable = m_pCTableCopy->m_pCToTable;

//Set the TABLENAME / DSN for Source
wSetDlgItemText(m_hWnd, IDT_FROM_DSN, wsz_FROM_TABLE_DSN_, pCFromTable->m_wszQualTableName, pCFromTable->m_pCDataSource->m_pwszDataSource);

//Set the TABLENAME / DSN for Target
wSetDlgItemText(m_hWnd, IDT_TO_DSN, wsz_TO_TABLE_DSN_, pCToTable->m_wszQualTableName, pCToTable->m_pCDataSource->m_pwszDataSource);

// Get window handles to speed up the population
hWndFrom = GetDlgItem(m_hWnd, IDL_FROM_DATA_TYPES);
hWndTo = GetDlgItem(m_hWnd, IDL_TO_DATA_TYPES);

// Now populate each list
for(ULONG i=0; i<pCFromTable->m_cColumns; i++)
{
// Format both values and add them to the list
wcscpy(wszType, pCFromTable->m_rgColDesc[i].wszTypeName);
ULONG ulParamFlag = pCFromTable->m_rgColDesc[i].ulCreateParams;

// Add the Precision/Scale info
if(ulParamFlag & CP_LENGTH)
{
swprintf(wszBuffer, L"(%lu)", COLINFO_SIZE(pCFromTable->m_rgColDesc[i]));
wcscat(wszType, wszBuffer);
}
else if(ulParamFlag & CP_PRECISION && ulParamFlag & CP_SCALE)
{
swprintf(wszBuffer, L"(%lu,%lu)", COLINFO_SIZE(pCFromTable->m_rgColDesc[i]), pCFromTable->m_rgColDesc[i].bScale);
wcscat(wszType, wszBuffer);
}

// Send the Entire String to the Window
swprintf(wszBuffer, wsz_TYPE_FORMAT_,
pCFromTable->m_rgColDesc[i].wszColName,wszType,
GetDBTypeName(pCFromTable->m_rgColDesc[i].wType));
wSendMessage(hWndFrom, LB_ADDSTRING, (WPARAM)0, wszBuffer);


// Format the To type info
wcscpy(wszType, pCToTable->m_rgColDesc[i].wszTypeName);
ulParamFlag = pCToTable->m_rgColDesc[i].ulCreateParams;

// Add the Precision/Scale info
if(ulParamFlag & CP_LENGTH)
{
swprintf(wszBuffer, L"(%lu)", COLINFO_SIZE(pCToTable->m_rgColDesc[i]));
wcscat(wszType, wszBuffer);
}
else if(ulParamFlag & CP_PRECISION && ulParamFlag & CP_SCALE)
{
swprintf(wszBuffer, L"(%lu,%lu)", COLINFO_SIZE(pCToTable->m_rgColDesc[i]), pCToTable->m_rgColDesc[i].bScale);
wcscat(wszType, wszBuffer);
}

// Send the Entire String to the Window
swprintf(wszBuffer, wsz_TYPE_FORMAT_,
pCToTable->m_rgColDesc[i].wszColName, wszType,
GetDBTypeName(pCToTable->m_rgColDesc[i].wType));
wSendMessage(hWndTo, LB_ADDSTRING, (WPARAM)0, wszBuffer);
}
return TRUE;
}