Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

500 lines
13 KiB

  1. // SqlProp.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "smlogcfg.h"
  5. #include "smcfgmsg.h"
  6. #include "fileprop.h"
  7. #include "sql.h"
  8. #include "sqlext.h"
  9. #include "odbcinst.h"
  10. #include "smlogqry.h"
  11. #include "Fileprop.h"
  12. #include "SqlProp.h"
  13. #ifdef _DEBUG
  14. #define new DEBUG_NEW
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18. USE_HANDLE_MACROS("SMLOGCFG(sqlprop.cpp)");
  19. static ULONG
  20. s_aulHelpIds[] =
  21. {
  22. IDC_SQL_DSN_COMBO, IDH_SQL_DSN_COMBO,
  23. IDC_SQL_LOG_SET_EDIT, IDH_SQL_FILENAME_EDIT,
  24. IDC_SQL_SIZE_MAX_BTN, IDH_SQL_SIZE_MAX_BTN,
  25. IDC_SQL_SIZE_LIMIT_EDIT,IDH_SQL_SIZE_LIMIT_EDIT,
  26. IDC_SQL_SIZE_LIMIT_BTN, IDH_SQL_SIZE_LIMIT_BTN,
  27. IDC_SQL_SIZE_LIMIT_SPIN,IDH_SQL_SIZE_LIMIT_SPIN,
  28. 0,0
  29. };
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CSqlProp dialog
  32. CSqlProp::CSqlProp(CWnd* pParent /*=NULL*/)
  33. : CDialog(CSqlProp::IDD, pParent)
  34. {
  35. //{{AFX_DATA_INIT(CSqlProp)
  36. m_dwMaxSize = 0;
  37. m_nSqlSizeRdo = -1;
  38. m_dwFocusControl = 0;
  39. //}}AFX_DATA_INIT
  40. m_bAutoNameSuffix = FALSE;
  41. m_dwMaxSizeInternal = 0;
  42. }
  43. void CSqlProp::DoDataExchange(CDataExchange* pDX)
  44. {
  45. CDialog::DoDataExchange(pDX);
  46. //{{AFX_DATA_MAP(CSqlProp)
  47. DDX_Control(pDX, IDC_SQL_DSN_COMBO, m_comboDSN);
  48. DDX_Text(pDX, IDC_SQL_LOG_SET_EDIT, m_strLogSetName);
  49. DDV_MaxChars(pDX, m_strLogSetName, SLQ_MAX_LOG_SET_NAME_LEN);
  50. DDX_Radio(pDX, IDC_SQL_SIZE_MAX_BTN, m_nSqlSizeRdo);
  51. ValidateTextEdit(pDX, IDC_SQL_SIZE_LIMIT_EDIT, 9,
  52. &m_dwMaxSize, (DWORD)CFilesProperty::eMinSqlRecordsLimit, (DWORD)CFilesProperty::eMaxSqlRecordsLimit);
  53. //}}AFX_DATA_MAP
  54. if ( pDX->m_bSaveAndValidate ) {
  55. if (((CButton *)GetDlgItem(IDC_SQL_SIZE_MAX_BTN))->GetCheck() == 1) {
  56. m_dwMaxSizeInternal = SLQ_DISK_MAX_SIZE;
  57. } else {
  58. m_dwMaxSizeInternal = m_dwMaxSize;
  59. }
  60. }
  61. }
  62. BEGIN_MESSAGE_MAP(CSqlProp, CDialog)
  63. //{{AFX_MSG_MAP(CSqlProp)
  64. ON_WM_HELPINFO()
  65. ON_WM_CONTEXTMENU()
  66. ON_EN_KILLFOCUS(IDC_SQL_LOG_SET_EDIT, OnKillfocusSqlLogSetEdit)
  67. ON_EN_CHANGE(IDC_SQL_LOG_SET_EDIT, OnChangeSqlLogSetEdit)
  68. ON_NOTIFY(UDN_DELTAPOS, IDC_SQL_SIZE_LIMIT_SPIN, OnDeltaposSqlSizeLimitSpin)
  69. ON_BN_CLICKED(IDC_SQL_SIZE_MAX_BTN, OnSqlSizeMaxBtn)
  70. ON_BN_CLICKED(IDC_SQL_SIZE_LIMIT_BTN, OnSqlSizeLimitBtn)
  71. ON_EN_CHANGE(IDC_SQL_SIZE_LIMIT_EDIT, OnChangeSqlSizeLimitEdit)
  72. ON_EN_KILLFOCUS(IDC_SQL_SIZE_LIMIT_EDIT, OnKillfocusSqlSizeLimitEdit)
  73. //}}AFX_MSG_MAP
  74. END_MESSAGE_MAP()
  75. /////////////////////////////////////////////////////////////////////////////
  76. // CSqlProp message handlers
  77. BOOL CSqlProp::OnInitDialog()
  78. {
  79. BOOL bLimitBtnSet;
  80. BOOL bReturn = TRUE;
  81. // set the buttons
  82. m_nSqlSizeRdo = 1;
  83. if (m_dwMaxSizeInternal == SLQ_DISK_MAX_SIZE) {
  84. m_nSqlSizeRdo = 0;
  85. m_dwMaxSize = 1000; // default
  86. } else {
  87. m_nSqlSizeRdo = 1;
  88. m_dwMaxSize = m_dwMaxSizeInternal;
  89. }
  90. CDialog::OnInitDialog();
  91. ASSERT ( NULL != m_pLogQuery );
  92. InitDSNCombo();
  93. bLimitBtnSet = (m_nSqlSizeRdo == 1);
  94. ((CButton *) GetDlgItem(IDC_SQL_SIZE_LIMIT_BTN))->SetCheck(bLimitBtnSet);
  95. ((CButton *) GetDlgItem(IDC_SQL_SIZE_MAX_BTN))->SetCheck(! bLimitBtnSet);
  96. GetDlgItem(IDC_SQL_SIZE_LIMIT_EDIT)->EnableWindow(bLimitBtnSet);
  97. GetDlgItem(IDC_SQL_SIZE_LIMIT_SPIN)->EnableWindow(bLimitBtnSet);
  98. GetDlgItem(IDC_SQL_SIZE_LIMIT_UNITS)->EnableWindow(bLimitBtnSet);
  99. if ( 0 != m_dwFocusControl ) {
  100. GetDlgItem ( m_dwFocusControl )->SetFocus();
  101. bReturn = FALSE;
  102. }
  103. return TRUE; // return TRUE unless you set the focus to a control
  104. // EXCEPTION: OCX Property Pages should return FALSE
  105. }
  106. LPWSTR CSqlProp::InitDSNCombo(){
  107. HENV henv;
  108. RETCODE retcode;
  109. WCHAR szDSNName[SQL_MAX_DSN_LENGTH + 1];
  110. int nIndex = 0;
  111. INT iCurSel = 0;
  112. if(SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv)))
  113. {
  114. // set the ODBC behavior version.
  115. (void) SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
  116. (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);
  117. // Enumerate the user data sources.
  118. m_comboDSN.ResetContent();
  119. retcode = SQLDataSources (
  120. henv,
  121. SQL_FETCH_FIRST_SYSTEM,
  122. szDSNName,
  123. sizeof(szDSNName),
  124. NULL,
  125. NULL,
  126. 0,
  127. NULL
  128. );
  129. while(SQL_SUCCEEDED(retcode))
  130. {
  131. m_comboDSN.AddString(szDSNName);
  132. if ( 0 == m_strDSN.CompareNoCase ( szDSNName ) ) {
  133. iCurSel = nIndex;
  134. }
  135. nIndex++;
  136. // Do the next one, if it exists.
  137. retcode = SQLDataSources (
  138. henv,
  139. SQL_FETCH_NEXT,
  140. szDSNName,
  141. sizeof(szDSNName),
  142. NULL,
  143. NULL,
  144. 0,
  145. NULL
  146. );
  147. }
  148. SQLFreeHandle(SQL_HANDLE_ENV, henv);
  149. }
  150. m_comboDSN.SetCurSel(iCurSel);
  151. return 0;
  152. }
  153. BOOL CSqlProp::IsValidLocalData()
  154. {
  155. BOOL bIsValid = TRUE;
  156. INT iPrevLength = 0;
  157. ResourceStateManager rsm;
  158. // assumes UpdateData has been called
  159. // Trim log set name before validation
  160. iPrevLength = m_strLogSetName.GetLength();
  161. m_strLogSetName.TrimLeft();
  162. m_strLogSetName.TrimRight();
  163. if ( iPrevLength != m_strLogSetName.GetLength() ) {
  164. SetDlgItemText ( IDC_SQL_LOG_SET_EDIT, m_strLogSetName );
  165. }
  166. m_comboDSN.GetLBText(m_comboDSN.GetCurSel(),m_strDSN.GetBuffer(m_comboDSN.GetLBTextLen(m_comboDSN.GetCurSel())));
  167. m_strDSN.ReleaseBuffer();
  168. if ( m_strDSN.IsEmpty() ) {
  169. CString strMessage;
  170. strMessage.LoadString ( IDS_SQL_ERR_NODSN );
  171. MessageBox ( strMessage, m_pLogQuery->GetLogName(), MB_OK | MB_ICONERROR);
  172. m_comboDSN.SetFocus();
  173. bIsValid = FALSE;
  174. }
  175. if (bIsValid) {
  176. if ( m_strLogSetName.IsEmpty() ) {
  177. if ( !m_bAutoNameSuffix ) {
  178. CString strMessage;
  179. strMessage.LoadString ( IDS_SQL_ERR_NOLOGSETNAME );
  180. MessageBox ( strMessage, m_pLogQuery->GetLogName(), MB_OK | MB_ICONERROR);
  181. (GetDlgItem(IDC_SQL_LOG_SET_EDIT))->SetFocus();
  182. bIsValid = FALSE;
  183. }
  184. } else {
  185. if ( !FileNameIsValid ( &m_strLogSetName ) ){
  186. CString strMessage;
  187. strMessage.LoadString (IDS_ERRMSG_INVALIDCHAR);
  188. MessageBox( strMessage, m_pLogQuery->GetLogName(), MB_OK| MB_ICONERROR );
  189. (GetDlgItem(IDC_SQL_LOG_SET_EDIT))->SetFocus();
  190. bIsValid = FALSE;
  191. }
  192. }
  193. }
  194. if (bIsValid)
  195. {
  196. if ( SLQ_DISK_MAX_SIZE != m_dwMaxSizeInternal ) {
  197. bIsValid = ValidateDWordInterval(IDC_SQL_SIZE_LIMIT_EDIT,
  198. m_pLogQuery->GetLogName(),
  199. m_dwMaxSizeInternal,
  200. (DWORD)CFilesProperty::eMinSqlRecordsLimit,
  201. (DWORD)CFilesProperty::eMaxSqlRecordsLimit);
  202. }
  203. }
  204. return bIsValid;
  205. }
  206. void
  207. CSqlProp::ValidateTextEdit (
  208. CDataExchange* pDX,
  209. int nIDC,
  210. int nMaxChars,
  211. DWORD* pValue,
  212. DWORD /* minValue */,
  213. DWORD /* maxValue */)
  214. {
  215. HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);
  216. LONG currentValue = INVALID_DWORD;
  217. TCHAR szT[MAXSTR];
  218. CString strTemp;
  219. if ( NULL != pDX && NULL != pValue ) {
  220. if (pDX->m_bSaveAndValidate)
  221. {
  222. * pValue = (DWORD) currentValue;
  223. ::GetWindowText(hWndCtrl, szT, MAXSTR);
  224. strTemp = szT;
  225. DDV_MaxChars(pDX, strTemp, nMaxChars);
  226. if (szT[0] >= _T('0') && szT[0] <= _T('9'))
  227. {
  228. currentValue = _wtol(szT);
  229. * pValue = (DWORD) currentValue;
  230. }
  231. } else {
  232. if ( INVALID_DWORD != *pValue ) {
  233. wsprintf(szT, _T("%lu"), *pValue);
  234. } else {
  235. szT[0] = _T('\0');
  236. }
  237. GetDlgItem(nIDC)->SetWindowText(szT);
  238. }
  239. } else {
  240. ASSERT ( FALSE );
  241. }
  242. }
  243. BOOL
  244. CSqlProp::ValidateDWordInterval (
  245. int nIDC,
  246. LPCWSTR strLogName,
  247. DWORD dwValue,
  248. DWORD minValue,
  249. DWORD maxValue)
  250. {
  251. CString strMsg;
  252. BOOL bResult = (dwValue >= minValue)
  253. && (dwValue <= maxValue);
  254. if (! bResult)
  255. {
  256. strMsg.Format ( IDS_ERRMSG_INVALIDDWORD, minValue, maxValue );
  257. MessageBox(strMsg, strLogName, MB_OK | MB_ICONERROR);
  258. GetDlgItem(nIDC)->SetFocus();
  259. strMsg.Empty();
  260. }
  261. return (bResult);
  262. }
  263. CString
  264. CSqlProp::ComposeSQLLogName()
  265. {
  266. CString strDSNName;
  267. CString strSQLLogName;
  268. m_comboDSN.GetLBText(m_comboDSN.GetCurSel(),m_strDSN.GetBuffer(m_comboDSN.GetLBTextLen(m_comboDSN.GetCurSel())));
  269. strSQLLogName.Format(L"SQL:%s!%s",m_strDSN,m_strLogSetName);
  270. m_strDSN.ReleaseBuffer();
  271. return strSQLLogName;
  272. }
  273. void CSqlProp::OnOK()
  274. {
  275. // load data from dialog
  276. if ( UpdateData (TRUE) ) {
  277. if ( IsValidLocalData() ) {
  278. m_SqlFormattedLogName = ComposeSQLLogName();
  279. CDialog::OnOK();
  280. }
  281. }
  282. }
  283. void CSqlProp::OnKillfocusSqlLogSetEdit()
  284. {
  285. UpdateData( TRUE );
  286. }
  287. void CSqlProp::OnChangeSqlLogSetEdit()
  288. {
  289. UpdateData( TRUE );
  290. }
  291. void CSqlProp::OnSqlSizeLimitBtn()
  292. {
  293. FileSizeBtn(FALSE);
  294. }
  295. void CSqlProp::OnChangeSqlSizeLimitEdit()
  296. {
  297. UpdateData( TRUE );
  298. }
  299. void CSqlProp::OnKillfocusSqlSizeLimitEdit()
  300. {
  301. UpdateData ( TRUE );
  302. }
  303. void CSqlProp::OnDeltaposSqlSizeLimitSpin(NMHDR* pNMHDR, LRESULT* pResult)
  304. {
  305. OnDeltaposSpin(
  306. pNMHDR,
  307. pResult,
  308. &m_dwMaxSize,
  309. (DWORD)CFilesProperty::eMinSqlRecordsLimit,
  310. (DWORD)CFilesProperty::eMaxSqlRecordsLimit);
  311. }
  312. void CSqlProp::OnSqlSizeMaxBtn()
  313. {
  314. FileSizeBtn(FALSE);
  315. }
  316. void CSqlProp::FileSizeBtnEnable()
  317. {
  318. GetDlgItem(IDC_SQL_SIZE_MAX_BTN)->EnableWindow ( TRUE );
  319. }
  320. void CSqlProp::FileSizeBtn(BOOL bInit)
  321. {
  322. INT m_nRecordSizeOld;
  323. m_nRecordSizeOld = m_nSqlSizeRdo;
  324. UpdateData ( TRUE );
  325. if (bInit || (m_nRecordSizeOld != m_nSqlSizeRdo)) {
  326. BOOL bMaxBtnSet, bLimitBtnSet;
  327. // *** This can be replaced since DDX_Radio implemented.
  328. // get btn state
  329. bMaxBtnSet = ((CButton *)GetDlgItem(IDC_SQL_SIZE_MAX_BTN))->GetCheck() == 1;
  330. bLimitBtnSet = ((CButton *)GetDlgItem(IDC_SQL_SIZE_LIMIT_BTN))->GetCheck() == 1;
  331. ASSERT (bLimitBtnSet != bMaxBtnSet);
  332. GetDlgItem(IDC_SQL_SIZE_LIMIT_EDIT)->EnableWindow(bLimitBtnSet);
  333. GetDlgItem(IDC_SQL_SIZE_LIMIT_SPIN)->EnableWindow(bLimitBtnSet);
  334. GetDlgItem(IDC_SQL_SIZE_LIMIT_UNITS)->EnableWindow(bLimitBtnSet);
  335. }
  336. }
  337. void
  338. CSqlProp::OnDeltaposSpin(
  339. NMHDR *pNMHDR,
  340. LRESULT *pResult,
  341. DWORD *pValue,
  342. DWORD dMinValue,
  343. DWORD dMaxValue)
  344. {
  345. NM_UPDOWN* pNMUpDown;
  346. LONG lValue;
  347. BOOL bResult = TRUE;
  348. UpdateData(TRUE);
  349. ASSERT(dMinValue <= dMaxValue);
  350. if ( NULL != pNMHDR
  351. && NULL != pResult
  352. && NULL != pValue )
  353. {
  354. pNMUpDown = (NM_UPDOWN *) pNMHDR;
  355. lValue = (LONG) (*pValue);
  356. if (lValue == INVALID_DWORD) {
  357. lValue = (DWORD) dMinValue;
  358. } else {
  359. if ( ((lValue >= (LONG) dMinValue + 1) && (pNMUpDown->iDelta > 0))
  360. || ((lValue <= (LONG) dMaxValue - 1) && (pNMUpDown->iDelta < 0)))
  361. {
  362. lValue += (pNMUpDown->iDelta * -1);
  363. if (lValue > (LONG) dMaxValue) {
  364. lValue = (DWORD) dMaxValue;
  365. } else if (lValue < (LONG) dMinValue) {
  366. lValue = (DWORD) dMinValue;
  367. }
  368. } else if (lValue > (LONG) dMaxValue) {
  369. lValue = (DWORD) dMaxValue;
  370. } else if (lValue < (LONG) dMinValue) {
  371. lValue = (DWORD) dMinValue;
  372. } else {
  373. bResult = FALSE;
  374. }
  375. }
  376. if (bResult) {
  377. *pValue = lValue;
  378. UpdateData(FALSE);
  379. }
  380. *pResult = 0;
  381. } else {
  382. ASSERT ( FALSE );
  383. }
  384. return;
  385. }
  386. BOOL
  387. CSqlProp::OnHelpInfo(HELPINFO* pHelpInfo)
  388. {
  389. if ( pHelpInfo->iCtrlId >= IDC_SQL_FIRST_HELP_CTRL_ID ||
  390. pHelpInfo->iCtrlId == IDOK ||
  391. pHelpInfo->iCtrlId == IDCANCEL ) {
  392. InvokeWinHelp(WM_HELP,
  393. NULL,
  394. (LPARAM) pHelpInfo,
  395. m_strHelpFilePath,
  396. s_aulHelpIds);
  397. }
  398. return TRUE;
  399. }
  400. void
  401. CSqlProp::OnContextMenu(CWnd* pWnd, CPoint /* point */)
  402. {
  403. InvokeWinHelp(WM_CONTEXTMENU, (WPARAM)(pWnd->m_hWnd), NULL, m_strHelpFilePath, s_aulHelpIds);
  404. return;
  405. }
  406. DWORD
  407. CSqlProp::SetContextHelpFilePath(const CString& rstrPath)
  408. {
  409. DWORD dwStatus = ERROR_SUCCESS;
  410. MFC_TRY
  411. m_strHelpFilePath = rstrPath;
  412. MFC_CATCH_DWSTATUS
  413. return dwStatus;
  414. }