Click here to Skip to main content
15,893,668 members
Articles / Desktop Programming / WTL

Shrinking SQL Server Transaction Logs with SQL-DMO

Rate me:
Please Sign up or sign in to vote.
4.99/5 (49 votes)
21 Apr 2004CPOL9 min read 205.8K   4.7K   70  
Using SQL-DMO to shrink SQL Server transaction logs.
/////////////////////////////////////////////////////////////////////////////
// #ifndef __ARMEN_H__
// #define __ARMEN_H__
//     Central Bank of Armenia, Information Security Department
//	   Armen Hakobyan, 2004. mailto:armen.h@web.am
//	   http://www.codeproject.com/script/articles/list_articles.asp?userid=25653
// #endif // __ARMEN_H__
/////////////////////////////////////////////////////////////////////////////

#ifndef __TLSWA_WIZPG_H__
#define __TLSWA_WIZPG_H__

#if defined( _MSC_VER ) && ( _MSC_VER >= _MSC_VER_60 )
	#pragma once
#endif

#include < atldlgs.h >
#include < atlddx.h >
#include "dmosink.h"

/////////////////////////////////////////////////////////////////////////////

#define MIN_TL_SIZE			2
#define MAX_TL_SIZE			512
#define SQLDMO_TIMEOUT		20L

/////////////////////////////////////////////////////////////////////////////

#define WIZ_INITED		0x00000001
#define WIZ_CANCELLED	0x00000002
#define WIZ_REPEAT		0x00000004
#define WIZ_ERRORS		0x00000008

/////////////////////////////////////////////////////////////////////////////

template < class T >
class ATL_NO_VTABLE CWinDataExchangeEx : public CWinDataExchange< T >
{
public:
	void OnDataValidateError( IN UINT nCtrlID, IN BOOL bSave, IN _XData& xData )
	{
		if( bSave == TRUE && 
			xData.nDataType == ddxDataInt )
		{
			_MessageBoxEx( 
				IDP_INT_RANGE, MB_OK | MB_ICONEXCLAMATION, xData.intData.nMin, xData.intData.nMax
			);

			T* pT = static_cast< T* >( this );

			CEdit wndEdit( pT->GetDlgItem( nCtrlID ) );
			wndEdit.SetFocus();
			wndEdit.SetSel( 0, -1 );
		}
	}
};

template < class T >
class ATL_NO_VTABLE CWizPgBase : public CPropertyPageImpl< T >
{
	friend class CWizPsh;

public:
	DECLARE_WND_SUPERCLASS( _T( "TLSW_Window" ), T::GetWndClassName() )

protected:
	CWizPsh* m_pWizPsh;

public:
	BEGIN_MSG_MAP( T )		
		CHAIN_MSG_MAP( CPropertyPageImpl< T > )
	END_MSG_MAP()

public:
	CWizPgBase( void ) : m_pWizPsh( NULL )
	{
		m_psp.dwFlags |= PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE; // | PSP_HASHELP;
	}

public:
	BOOL SetDlgItemTextByID( IN INT iCtrlID, IN INT uResID )
	{
		ATLASSERT( IS_INTRESOURCE( uResID ) );

		TCHAR szText[ MAX_RES_STR ] = { 0 };
		if( AtlLoadString( uResID, szText, _countof( szText ) ) )
			return SetDlgItemText( iCtrlID, szText );

		return ( FALSE );
	}

public:	
	virtual void ResetToDefaults( void )
	{	
	}
};

/////////////////////////////////////////////////////////////////////////////

class CWizPgIntro : public CWizPgBase< CWizPgIntro >
{
public:	
	enum DLGID { IDD = IDD_WIZ_INTRO };

public: // Construction
	CWizPgIntro( void );

public: // Maps
	BEGIN_MSG_MAP( CWizPgIntro )
		MESSAGE_HANDLER( WM_INITDIALOG, OnInitDialog )	
		CHAIN_MSG_MAP( CWizPgBase< CWizPgIntro > )
	END_MSG_MAP()

public: // Window notification handlers

	LRESULT OnInitDialog( IN UINT /*uMsg*/, IN WPARAM /*wParam*/, IN LPARAM /*lParam*/, IN BOOL& /*bHandled*/ );
	
public: // Wizard notification handlers
	BOOL	OnSetActive( void );
};

/////////////////////////////////////////////////////////////////////////////

class CWizPgLogin : public CWizPgBase< CWizPgLogin >
				  , public CWinDataExchange< CWizPgLogin >
{
public:	
	enum DLGID { IDD = IDD_WIZ_LOGIN };

public:
	TCHAR		m_szServ [ MAX_SQL_STR ];	
	BOOL		m_bSqlSrvAuth;
	BOOL		m_bSqlStart;
	BOOL		m_bSqlRemote;

public: // Construction
	CWizPgLogin( void );

public: // Maps
	BEGIN_MSG_MAP( CWizPgLogin )
		MESSAGE_HANDLER( WM_INITDIALOG, OnInitDialog )
		COMMAND_HANDLER( IDC_CBO_SRV, CBN_DROPDOWN, OnCboSqlSrvDropDown )
	#if defined( _ATL_VER ) && ( _ATL_VER >= _ATL_VER_70 )		
		COMMAND_RANGE_CODE_HANDLER( IDC_RAD_WINAUTH, IDC_RAD_SQLAUTH, BN_CLICKED, OnRadAuthClick )
	#else
		COMMAND_HANDLER( IDC_RAD_WINAUTH, BN_CLICKED, OnRadAuthClick )
		COMMAND_HANDLER( IDC_RAD_SQLAUTH, BN_CLICKED, OnRadAuthClick )
	#endif
		CHAIN_MSG_MAP( CWizPgBase< CWizPgLogin > )
	END_MSG_MAP()
	
	BEGIN_DDX_MAP( CWizPgLogin )
		DDX_TEXT_LEN( IDC_CBO_SRV,   m_szServ,  _countof( m_szServ  ) )		
		DDX_CHECK( IDC_CHK_SQLSTART, m_bSqlStart )
		// TODO: DDX_RADIO()
	END_DDX_MAP()

public: // Window notification handlers

	LRESULT OnInitDialog( IN UINT /*uMsg*/, IN WPARAM /*wParam*/, IN LPARAM /*lParam*/, IN BOOL& /*bHandled*/ );	
	LRESULT OnRadAuthClick( IN WORD /*wNotifyCode*/, IN WORD /*wID*/, IN HWND /*hWndCtl*/, OUT BOOL& /*bHandled*/ );
	LRESULT OnCboSqlSrvDropDown( IN WORD /*wNotifyCode*/, IN WORD /*wID*/, IN HWND /*hWndCtl*/, OUT BOOL& /*bHandled*/ );

public: // Wizard notification handlers

	BOOL	OnSetActive( void );
	INT		OnWizardNext( void );

public:
	BOOL	SQLNS_InitializeSqlNs( void );
	BOOL	SQLDMO_ListSQLServers( void );
	BOOL	SQLDMO_ConnectToSqlServer( void );
	BOOL	SQLDMO_IsRemoteServer( void );
};

/////////////////////////////////////////////////////////////////////////////

class CWizPgSelDb : public CWizPgBase< CWizPgSelDb >
				  , public CWinDataExchange< CWizPgSelDb >
				  , public CMessageFilter
{
public:	
	enum DLGID { IDD = IDD_WIZ_SELDB };

public:
	TCHAR				m_szDbs[ MAX_SQL_STR ];
	BOOL				m_bSysDb;
	
	CComboBox/*Ex*/		m_cboDbs;
	CCheckListViewCtrl	m_lstTls;
	CToolTipCtrl		m_wndTip;

public: // Construction

	CWizPgSelDb( void );
	~CWizPgSelDb( void );

public: // Maps
	BEGIN_MSG_MAP( CWizPgSelDb )
		MESSAGE_HANDLER( WM_INITDIALOG, OnInitDialog )
		COMMAND_HANDLER( IDC_CBO_DBS,    CBN_DROPDOWN,  OnCboSelDbDropDown )
		COMMAND_HANDLER( IDC_CBO_DBS,    CBN_SELCHANGE, OnCboSelDbCloseUp  )
		COMMAND_HANDLER( IDC_CHK_SYSDB,  BN_CLICKED,    OnChkSysDbClick    )
		COMMAND_HANDLER( IDC_CMD_DBPROP, BN_CLICKED,    OnCmdDbPropClick   )		
		CHAIN_MSG_MAP( CWizPgBase< CWizPgSelDb > )
	END_MSG_MAP()

	BEGIN_DDX_MAP( CWizPgSelDb )
		DDX_CONTROL( IDC_LST_TLS, m_lstTls )
		//DDX_CONTROL( IDC_LBL_DBPROP, m_lnkDbProp )
		DDX_CONTROL_HANDLE( IDC_CBO_DBS, m_cboDbs )
		DDX_CHECK( IDC_CHK_SYSDB, m_bSysDb )

		// Fix: DDX_Text returns false on dropdown LIST combo when
		// setting its text if string is empty and all data exchange fails.

		if( bSaveAndValidate )
			DDX_TEXT_LEN( IDC_CBO_DBS, m_szDbs, _countof( m_szDbs ) )
		else
			SetDlgItemText( IDC_CBO_DBS, m_szDbs );

	END_DDX_MAP()

public: // Window notification handlers

	LRESULT OnInitDialog( IN UINT /*uMsg*/, IN WPARAM /*wParam*/, IN LPARAM /*lParam*/, IN BOOL& /*bHandled*/ );	
	LRESULT OnCboSelDbDropDown( IN WORD /*wNotifyCode*/, IN WORD /*wID*/, IN HWND /*hWndCtl*/, OUT BOOL& /*bHandled*/ );
	LRESULT OnCboSelDbCloseUp( IN WORD /*wNotifyCode*/, IN WORD /*wID*/, IN HWND /*hWndCtl*/, OUT BOOL& /*bHandled*/ );
	LRESULT OnChkSysDbClick( IN WORD /*wNotifyCode*/, IN WORD /*wID*/, IN HWND /*hWndCtl*/, OUT BOOL& /*bHandled*/ );
	LRESULT OnCmdDbPropClick( IN WORD /*wNotifyCode*/, IN WORD /*wID*/, IN HWND /*hWndCtl*/, OUT BOOL& /*bHandled*/ );
	
public: // Wizard notification handlers

	BOOL	OnSetActive( void );
	INT		OnWizardNext( void );

public: // CMessageFilter

	virtual BOOL PreTranslateMessage( IN MSG* pMsg );

public:

	void	ResetToDefaults( void );
	INT		GetCheckedTlsCount( void );

public:

	BOOL	SQLNS_ShowDatabaseProperties( void );
	BOOL	SQLDMO_EnumDatabases( void );
	BOOL	SQLDMO_EnumTransactionLogs( void );
};

/////////////////////////////////////////////////////////////////////////////

class CWizPgTasks : public CWizPgBase< CWizPgTasks >
				  , public CWinDataExchangeEx< CWizPgTasks >
{
public:	
	enum DLGID { IDD = IDD_WIZ_TASKS };

public:	
	BOOL	m_bJob;
	BOOL	m_bShrink;
	BOOL	m_bBackup;
	BOOL	m_bAppBk;
	INT		m_nShrinkSize;

public: // Construction
	CWizPgTasks( void );

public: // Maps
	BEGIN_MSG_MAP( CWizPgTasks )		
		MESSAGE_HANDLER( WM_INITDIALOG, OnInitDialog )
	#if defined( _ATL_VER ) && ( _ATL_VER >= _ATL_VER_70 )		
		COMMAND_RANGE_CODE_HANDLER( IDC_RAD_APPBK, IDC_RAD_SQLBK, BN_CLICKED, OnRadBkMethodClick )
	#else
		COMMAND_HANDLER( IDC_RAD_APPBK, BN_CLICKED, OnRadBkMethodClick )
		COMMAND_HANDLER( IDC_RAD_SQLBK, BN_CLICKED, OnRadBkMethodClick )
	#endif
		COMMAND_HANDLER( IDC_CHK_BACKUP, BN_CLICKED, OnChkBkClick       )
		CHAIN_MSG_MAP( CWizPgBase< CWizPgTasks > )
	END_MSG_MAP()

	BEGIN_DDX_MAP( CWizPgTasks )
		DDX_CHECK( IDC_CHK_JOB,		m_bJob	  )
		DDX_CHECK( IDC_CHK_SHRINK,	m_bShrink )
		DDX_CHECK( IDC_CHK_BACKUP,	m_bBackup )
		DDX_INT_RANGE( IDC_TXT_SIZE, m_nShrinkSize, MIN_TL_SIZE, MAX_TL_SIZE )
	END_DDX_MAP()

public: // Window notification handlers
	LRESULT OnInitDialog( IN UINT /*uMsg*/, IN WPARAM /*wParam*/, IN LPARAM /*lParam*/, IN BOOL& /*bHandled*/ );
	LRESULT OnRadBkMethodClick( IN WORD /*wNotifyCode*/, IN WORD /*wID*/, IN HWND /*hWndCtl*/, OUT BOOL& /*bHandled*/ );
	LRESULT OnChkBkClick( IN WORD /*wNotifyCode*/, IN WORD /*wID*/, IN HWND /*hWndCtl*/, OUT BOOL& /*bHandled*/ );

public: // Wizard notification handlers
	BOOL	OnSetActive( void );
	INT		OnWizardNext( void );

public:
	void	ResetToDefaults( void );
	void	ConfigureBackupOptions( void );
};

/////////////////////////////////////////////////////////////////////////////

class CDropListViewCtrl : public CWindowImpl< CDropListViewCtrl, CListViewCtrl >
{
public:
	BEGIN_MSG_MAP( CDropListViewCtrl )		
		MESSAGE_HANDLER( WM_DROPFILES,  OnDropFiles  )		
	END_MSG_MAP()

public:
	LRESULT OnDropFiles( IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam, IN BOOL& bHandled )
	{
		bHandled = ( FALSE );
		return ::SendMessage( ::GetParent( m_hWnd ), uMsg, wParam, lParam );
	}
};

/////////////////////////////////////////////////////////////////////////////

class CWizPgBackup : public CWizPgBase< CWizPgBackup >
				   , public CWinDataExchange< CWizPgBackup >
				   , public CMessageFilter
{
public: 
	enum DLGID { IDD = IDD_WIZ_BACKUP };

public: // Vars
	LPTSTR		m_pszBkFiles;
	BOOL		m_bBkVerify;

	TCHAR		m_szBkMedia[ MAX_SQL_STR ];
	TCHAR		m_szBkName [ MAX_SQL_STR ];
	TCHAR		m_szBkDesc [ MAX_SQL_STR ];
	
	CToolTipCtrl		m_wndTip;
	CDropListViewCtrl	m_lstBk;
	
public: // Toolbar

	// static INT	s_aTbi[ 3 ];
	// CImageList	m_imlIco;
	// TBBUTTON*	m_pTbb;
	// CToolBarCtrl	m_wndTlb;
	// BOOL	CreateToolbar( void );

public: // Construction
	CWizPgBackup( void );
	~CWizPgBackup( void );

public: // Maps
	
	BEGIN_MSG_MAP( CWizPgBackup )
		MESSAGE_HANDLER( WM_INITDIALOG, OnInitDialog )
		MESSAGE_HANDLER( WM_DROPFILES,  OnDropFiles  )		
		COMMAND_ID_HANDLER( IDC_CMD_BKADD,	OnCmdAdd	)
		COMMAND_ID_HANDLER( IDC_CMD_BKDEL,  OnCmdRemove	)
		COMMAND_ID_HANDLER( IDC_CMD_BKPROP, OnCmdProp	)		
		CHAIN_MSG_MAP( CWizPgBase< CWizPgBackup > )
	END_MSG_MAP()

	BEGIN_DDX_MAP( CWizPgBackup )
		DDX_CONTROL( IDC_LST_BKFILES, m_lstBk )
		DDX_TEXT_LEN( IDC_TXT_BKNAME, m_szBkName, _countof( m_szBkName ) )
		DDX_TEXT_LEN( IDC_TXT_BKDESC, m_szBkDesc, _countof( m_szBkDesc ) )		
		DDX_CHECK( IDC_CHK_BKVER, m_bBkVerify )
	END_DDX_MAP()
	
public: // Window notification handlers

	LRESULT OnInitDialog( IN UINT /*uMsg*/, IN WPARAM /*wParam*/, IN LPARAM /*lParam*/, IN BOOL& /*bHandled*/ );
	LRESULT OnDropFiles( IN UINT /*uMsg*/, IN WPARAM /*wParam*/, IN LPARAM /*lParam*/, IN BOOL& /*bHandled*/ );	
	LRESULT OnCmdAdd( IN WORD /*wNotifyCode*/, IN WORD /*wID*/, IN HWND /*hWndCtl*/, OUT BOOL& /*bHandled*/ );
	LRESULT OnCmdRemove( IN WORD /*wNotifyCode*/, IN WORD /*wID*/, IN HWND /*hWndCtl*/, OUT BOOL& /*bHandled*/ );
	LRESULT OnCmdProp( IN WORD /*wNotifyCode*/, IN WORD /*wID*/, IN HWND /*hWndCtl*/, OUT BOOL& /*bHandled*/ );

public: // CMessageFilter

	virtual BOOL PreTranslateMessage( IN MSG* pMsg );

public: // Wizard notification handlers

	BOOL	OnSetActive( void );
	INT		OnWizardNext( void );

public:	
	void	AutosizeListColumns( void );
	INT		FindItemPath( IN LPCTSTR pszPath );
	BOOL	GetItemPath( IN INT nItem, IN OUT LPTSTR pszPath );
	BOOL	AddFile( IN LPTSTR pszFilePath );
	BOOL	FormatAndValidateFile( IN LPTSTR pszFilePath );	

public:
	BOOL	SQLDMO_FormatMediaSetData( void );
	BOOL	SQLDMO_VerifyBackupMediaSet( void );

public:
	void	ResetToDefaults( void );
};

/////////////////////////////////////////////////////////////////////////////

class CWizPgReady : public CWizPgBase< CWizPgReady >
{
public:	
	enum DLGID { IDD = IDD_WIZ_READY };

public: // Construction
	CWizPgReady( void );

public: // Wizard notification handlers
	BOOL	OnSetActive( void );
	INT		OnWizardBack( void );
};

/////////////////////////////////////////////////////////////////////////////

class CWizPgShrink : public CWizPgBase< CWizPgShrink >
				   , public CWinDataExchange< CWizPgShrink >
{
public:
	enum DLGID { IDD = IDD_WIZ_SHRINK };

public:
	CProgressBarCtrl	m_wndPrgAll;
	CProgressBarCtrl	m_wndPrgCur;

public: // Construction
	CWizPgShrink( void );

public: // Maps
	DECLARE_WNDMSG( WM_SETACTIVE );

	BEGIN_MSG_MAP( CWizPgShrink )
		MESSAGE_HANDLER( WM_INITDIALOG, OnInitDialog     )
		MESSAGE_HANDLER( WM_SETACTIVE,  OnAfterSetActive )
		MESSAGE_HANDLER( IBackupSink::WM_SQLDMO_BACKUPPERCCOMPLETE, OnBackupPercentComplete )
		MESSAGE_HANDLER( IBackupSink::WM_SQLDMO_BACKUPNEXTMEDIA,	OnBackupNextMedia		)
		CHAIN_MSG_MAP( CWizPgBase< CWizPgShrink > )
	END_MSG_MAP()

	BEGIN_DDX_MAP( CWizPgShrink )
		DDX_CONTROL_HANDLE( IDC_PRG_ALL, m_wndPrgAll )
		DDX_CONTROL_HANDLE( IDC_PRG_CUR, m_wndPrgCur )
	END_DDX_MAP()

public: // Window notification handlers

	LRESULT OnInitDialog( IN UINT /*uMsg*/, IN WPARAM /*wParam*/, IN LPARAM /*lParam*/, IN BOOL& /*bHandled*/ );
	
public: // Sink and custom handlers

	LRESULT OnBackupPercentComplete( IN UINT /*uMsg*/, IN WPARAM /*wParam*/, IN LPARAM /*lParam*/, IN BOOL& /*bHandled*/ );
	LRESULT OnBackupNextMedia( IN UINT /*uMsg*/, IN WPARAM /*wParam*/, IN LPARAM /*lParam*/, IN BOOL& /*bHandled*/ );
	LRESULT OnAfterSetActive( IN UINT /*uMsg*/, IN WPARAM /*wParam*/, IN LPARAM /*lParam*/, IN BOOL& /*bHandled*/ );

public: // Wizard notification handlers

	BOOL	OnSetActive( void );
	INT		OnWizardNext( void );	

public:
	void	ResetToDefaults( void );
	INT		CountOverallSteps( void );	

public: // SQLDMO

	HRESULT SQLDMO_ShrinkTransactionLogs( IN SQLDMO::_SQLServer2Ptr& spSqlServer2 );
	HRESULT	SQLDMO_StartJobServer( IN SQLDMO::_SQLServer2Ptr& spSqlServer2, IN SQLDMO::JobServerPtr& spJobServer );
	HRESULT	SQLDMO_CreateJob( IN SQLDMO::_SQLServer2Ptr& spSqlServer2, IN SQLDMO::JobServerPtr& spJobServer, IN SQLDMO::_JobPtr& spJob );
	HRESULT	SQLDMO_CreateJobSteps( IN SQLDMO::_JobPtr& spJob );
	HRESULT	SQLDMO_CreateAlert( IN SQLDMO::JobServerPtr& spJobServer, IN SQLDMO::_JobPtr& spJob );
	//HRESULT	SQLDMO_StartServerAgentJob( IN SQLDMO::JobServerPtr& spJobServer, IN SQLDMO::_JobPtr& spJob, IN BOOL* pbDbcsErrors );
	HRESULT	SQLDMO_BackupDatabase( IN SQLDMO::_SQLServer2Ptr& spSqlServer2, IN SQLDMO::_Backup2Ptr& spBackup2 );
	HRESULT	SQLDMO_VerifyBackupMediaSet( IN SQLDMO::_SQLServer2Ptr& spSqlServer2, IN SQLDMO::_Backup2Ptr& spBackup2 );
	HRESULT SQLNS_InvokeDatabaseBackup( void );
};

/////////////////////////////////////////////////////////////////////////////

class CWizPgFinish : public CWizPgBase< CWizPgFinish >
				   , public CWinDataExchange< CWizPgFinish >
{
public:	
	enum DLGID { IDD = IDD_WIZ_FINISH };

public:
	CListViewCtrl	m_lstTls;

public: // Construction
	CWizPgFinish( void );

public:
	DECLARE_WNDMSG( WM_SETACTIVE );
	
	BEGIN_MSG_MAP( CWizPgFinish )
		MESSAGE_HANDLER( WM_INITDIALOG, OnInitDialog     )
		MESSAGE_HANDLER( WM_SETACTIVE,  OnAfterSetActive )
		CHAIN_MSG_MAP( CWizPgBase< CWizPgFinish >  )
	END_MSG_MAP()

	BEGIN_DDX_MAP( CWizPgShrink )
		DDX_CONTROL_HANDLE( IDC_LST_TLS, m_lstTls )		
	END_DDX_MAP()

public: // Window notification handlers

	LRESULT OnInitDialog( IN UINT /*uMsg*/, IN WPARAM /*wParam*/, IN LPARAM /*lParam*/, IN BOOL& /*bHandled*/ );
	LRESULT OnAfterSetActive( IN UINT /*uMsg*/, IN WPARAM /*wParam*/, IN LPARAM /*lParam*/, IN BOOL& /*bHandled*/ );

public: // Wizard notification handlers

	BOOL	OnSetActive( void );
	BOOL	OnWizardFinish( void );

public:
	BOOL	SQLDMO_EnumTransactionLogs( void );

public:
	void	ResetToDefaults( void );
};

/////////////////////////////////////////////////////////////////////////////
#endif // __TLSWA_WIZPG_H__
/////////////////////////////////////////////////////////////////////////////

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior) SafeNet Inc
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions