drvinfo.cpp
上传用户:jsxglz
上传日期:2007-01-03
资源大小:117k
文件大小:103k
源码类别:

SQL Server

开发平台:

Visual C++

  1. // DrvInfo.cpp : implementation file
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12. #include "stdafx.h"
  13. #include "catsets.h"
  14. #include "DrvInfo.h"
  15. #ifdef _DEBUG
  16. #define new DEBUG_NEW
  17. #undef THIS_FILE
  18. static char THIS_FILE[] = __FILE__;
  19. #endif
  20. /////////////////////////////////////////////////////////////////////////////
  21. // CMyPage property page - base class for all other pages
  22. // static members
  23. CDatabase* CMyPage::m_pDatabase = 0;
  24. CImageList* CMyPage::m_pImageList = 0;
  25. int CMyPage::m_nClients = 0;
  26. // SQLGetInfo helpers
  27. //
  28. CString CMyPage::SQLGetInfoString(UWORD fInfoType)
  29. {
  30. UCHAR   buffer[200];
  31. SWORD   cbData;
  32. ::SQLGetInfo(m_pDatabase->m_hdbc,fInfoType,
  33. (PTR)buffer,200,&cbData);
  34. return CString(buffer);
  35. }
  36. UWORD CMyPage::SQLGetInfoShort(UWORD fInfoType)
  37. {
  38. UWORD   value;
  39. SWORD   cbData;
  40. ::SQLGetInfo(m_pDatabase->m_hdbc,fInfoType,
  41. (PTR)&value,2,&cbData);
  42. return value;
  43. }
  44. UDWORD CMyPage::SQLGetInfoLong(UWORD fInfoType)
  45. {
  46. UDWORD  value;
  47. SWORD   cbData;
  48. ::SQLGetInfo(m_pDatabase->m_hdbc,fInfoType,
  49. (PTR)&value,4,&cbData);
  50. return value;
  51. }
  52. // formatting helpers
  53. //
  54. void CMyPage::ZeroIsNoneLong(CString& string,UWORD fInfoType)
  55. {
  56. UDWORD value = SQLGetInfoLong(fInfoType);
  57. if (value)
  58. string.Format(_T("%d"),value);
  59. else
  60. string = _T("<none>");
  61. }
  62. void CMyPage::ZeroIsNoneShort(CString& string,UWORD fInfoType)
  63. {
  64. UWORD value = SQLGetInfoShort(fInfoType);
  65. if (value)
  66. string.Format(_T("%d"),value);
  67. else
  68. string = _T("<none>");
  69. }
  70. void CMyPage::YIsYes(CString& string,UWORD fInfoType)
  71. {
  72. string = SQLGetInfoString(fInfoType);
  73. if (string == _T("Y"))
  74. string = _T("Yes");
  75. else if (string == _T("N"))
  76. string = _T("No");
  77. }
  78. void CMyPage::YIsSupported(CString& string,UWORD fInfoType)
  79. {
  80. string = SQLGetInfoString(fInfoType);
  81. if (string == _T("Y"))
  82. string = _T("Supported");
  83. else if (string == _T("N"))
  84. string = _T("Not Supported");
  85. }
  86. // CMyPage construction and destruction
  87. CMyPage::CMyPage(CDatabase* pDatabase, UINT nIdTemplate)
  88. : CPropertyPage(nIdTemplate)
  89. {
  90. // if no other page has set the database, set it
  91. if (!m_pDatabase)
  92. m_pDatabase = pDatabase;
  93. // if no other page has created the image list, create it
  94. if (!m_pImageList)
  95. {
  96. m_pImageList = new CImageList;
  97. m_pImageList->Create(IDB_IMAGELIST,16,0,RGB(255,255,255));
  98. }
  99. m_nClients++;
  100. }
  101. CMyPage::~CMyPage()
  102. {
  103. // decrement imagelist client count, delete if it becomes 0
  104. m_nClients--;
  105. if (!m_nClients)
  106. {
  107. if(m_pImageList)
  108. {
  109. delete m_pImageList;
  110. m_pImageList = NULL;
  111. }
  112. }
  113. }
  114. /////////////////////////////////////////////////////////////////////////////
  115. // CDriverInfo property page
  116. IMPLEMENT_DYNCREATE(CDriverInfo, CPropertyPage)
  117. CDriverInfo::CDriverInfo(CDatabase* pDatabase)
  118.  : CMyPage(pDatabase,CDriverInfo::IDD)
  119. {
  120. //{{AFX_DATA_INIT(CDriverInfo)
  121. m_strSqlUserName = _T("");
  122. m_strSqlServerName = _T("");
  123. m_strSqlDbmsName = _T("");
  124. m_strSqlDbmsVer = _T("");
  125. m_strSqlDriverName = _T("");
  126. m_strSqlDriverOdbcVer = _T("");
  127. m_strSqlDriverVer = _T("");
  128. m_strSqlOdbcVer = _T("");
  129. m_strSqlOdbcApiConformance = _T("");
  130. m_strSqlOdbcSagCliConformance = _T("");
  131. m_strSqlOdbcSqlConformance = _T("");
  132. m_strSqlOdbcSqlOptIef = _T("");
  133. m_strSqlActiveConnections = _T("");
  134. m_strSqlActiveStatements = _T("");
  135. m_strSqlMultResultSets = _T("");
  136. m_strSqlFileUsage = _T("");
  137. m_strSqlDataSourceReadOnly = _T("");
  138. m_strSqlDataSourceName = _T("");
  139. m_strSqlAccessibleProcedures = _T("");
  140. m_strSqlAccessibleTables = _T("");
  141. m_strSqlDatabaseName = _T("");
  142. //}}AFX_DATA_INIT
  143. OnNewDSN();
  144. }
  145. CDriverInfo::~CDriverInfo()
  146. {
  147. }
  148. void CDriverInfo::DumpToFile(CStdioFile& file)
  149. {
  150. if (m_pDatabase->IsOpen())
  151. {
  152. CString string;
  153. file.WriteString(_T("Driver Infon-----------n"));
  154. string.Format(_T("     Data Source Name - %sn"),m_strSqlDataSourceName);
  155. file.WriteString(string);
  156. string.Format(_T("        Database Name - %sn"),m_strSqlDatabaseName);
  157. file.WriteString(string);
  158. string.Format(_T("            User Name - %sn"),m_strSqlUserName);
  159. file.WriteString(string);
  160. string.Format(_T("          Server Name - %sn"),m_strSqlServerName);
  161. file.WriteString(string);
  162. string.Format(_T("                 DBMS - %s version %sn"),
  163. m_strSqlDbmsName,m_strSqlDbmsVer);
  164. file.WriteString(string);
  165. string.Format(_T("               Driver - %s version %sn"),
  166. m_strSqlDriverName,m_strSqlDriverVer);
  167. file.WriteString(string);
  168. string.Format(_T("     Driver ODBC Ver. - %sn"),m_strSqlDriverOdbcVer);
  169. file.WriteString(string);
  170. string.Format(_T("         ODBC Version - %sn"),m_strSqlOdbcVer);
  171. file.WriteString(string);
  172. string.Format(_T("      API Conformance - %sn"),m_strSqlOdbcApiConformance);
  173. file.WriteString(string);
  174. string.Format(_T("      SQL Conformance - %sn"),m_strSqlOdbcSqlConformance);
  175. file.WriteString(string);
  176. string.Format(_T("  SAG CLI Conformance - %sn"),m_strSqlOdbcSagCliConformance);
  177. file.WriteString(string);
  178. string.Format(_T("     Optional SQL IEF - %sn"),m_strSqlOdbcSqlOptIef);
  179. file.WriteString(string);
  180. string.Format(_T("   Active Connections - %sn"),m_strSqlActiveConnections);
  181. file.WriteString(string);
  182. string.Format(_T("    Active Statements - %sn"),m_strSqlActiveStatements);
  183. file.WriteString(string);
  184. string.Format(_T(" Multiple Result Sets - %sn"),m_strSqlMultResultSets);
  185. file.WriteString(string);
  186. string.Format(_T("           File Usage - %sn"),m_strSqlFileUsage);
  187. file.WriteString(string);
  188. string.Format(_T("    Read/Write Status - %sn"),m_strSqlDataSourceReadOnly);
  189. file.WriteString(string);
  190. string.Format(_T("Accessible Procedures - %sn"),m_strSqlAccessibleProcedures);
  191. file.WriteString(string);
  192. string.Format(_T("    Accessible Tables - %snn"),m_strSqlAccessibleTables);
  193. file.WriteString(string);
  194. }
  195. }
  196. void CDriverInfo::DoDataExchange(CDataExchange* pDX)
  197. {
  198. CPropertyPage::DoDataExchange(pDX);
  199. //{{AFX_DATA_MAP(CDriverInfo)
  200. DDX_Text(pDX, IDC_SQL_USER_NAME, m_strSqlUserName);
  201. DDX_Text(pDX, IDC_SQL_SERVER_NAME, m_strSqlServerName);
  202. DDX_Text(pDX, IDC_SQL_DBMS_NAME, m_strSqlDbmsName);
  203. DDX_Text(pDX, IDC_SQL_DBMS_VER, m_strSqlDbmsVer);
  204. DDX_Text(pDX, IDC_SQL_DRIVER_NAME, m_strSqlDriverName);
  205. DDX_Text(pDX, IDC_SQL_DRIVER_ODBC_VER, m_strSqlDriverOdbcVer);
  206. DDX_Text(pDX, IDC_SQL_DRIVER_VER, m_strSqlDriverVer);
  207. DDX_Text(pDX, IDC_SQL_ODBC_VER, m_strSqlOdbcVer);
  208. DDX_Text(pDX, IDC_SQL_ODBC_API_CONFORMANCE, m_strSqlOdbcApiConformance);
  209. DDX_Text(pDX, IDC_SQL_ODBC_SAG_CLI_CONFORMANCE, m_strSqlOdbcSagCliConformance);
  210. DDX_Text(pDX, IDC_SQL_ODBC_SQL_CONFORMANCE, m_strSqlOdbcSqlConformance);
  211. DDX_Text(pDX, IDC_SQL_ODBC_SQL_OPT_IEF, m_strSqlOdbcSqlOptIef);
  212. DDX_Text(pDX, IDC_SQL_ACTIVE_CONNECTIONS, m_strSqlActiveConnections);
  213. DDX_Text(pDX, IDC_SQL_ACTIVE_STATEMENTS, m_strSqlActiveStatements);
  214. DDX_Text(pDX, IDC_SQL_MULT_RESULT_SETS, m_strSqlMultResultSets);
  215. DDX_Text(pDX, IDC_SQL_FILE_USAGE, m_strSqlFileUsage);
  216. DDX_Text(pDX, IDC_SQL_DATA_SOURCE_READ_ONLY, m_strSqlDataSourceReadOnly);
  217. DDX_Text(pDX, IDC_DSN, m_strSqlDataSourceName);
  218. DDX_Text(pDX, IDC_SQL_ACCESSIBLE_PROCEDURES, m_strSqlAccessibleProcedures);
  219. DDX_Text(pDX, IDC_SQL_ACCESSIBLE_TABLES, m_strSqlAccessibleTables);
  220. DDX_Text(pDX, IDC_SQL_DATABASE_NAME_X, m_strSqlDatabaseName);
  221. //}}AFX_DATA_MAP
  222. }
  223. BEGIN_MESSAGE_MAP(CDriverInfo, CPropertyPage)
  224. //{{AFX_MSG_MAP(CDriverInfo)
  225. //}}AFX_MSG_MAP
  226. END_MESSAGE_MAP()
  227. /////////////////////////////////////////////////////////////////////////////
  228. // CDriverInfo message handlers
  229. void CDriverInfo::OnNewDSN()
  230. {
  231. if (m_pDatabase->IsOpen())
  232. {
  233. SWORD   value;
  234. CString string;
  235. m_strSqlDataSourceName = SQLGetInfoString(SQL_DATA_SOURCE_NAME);
  236. m_strSqlUserName = SQLGetInfoString(SQL_USER_NAME);
  237. m_strSqlServerName = SQLGetInfoString(SQL_SERVER_NAME);
  238. m_strSqlDatabaseName = SQLGetInfoString(SQL_DATABASE_NAME);
  239. m_strSqlDbmsName = SQLGetInfoString(SQL_DBMS_NAME);
  240. m_strSqlDbmsVer = SQLGetInfoString(SQL_DBMS_VER);
  241. m_strSqlDriverName = SQLGetInfoString(SQL_DRIVER_NAME);
  242. m_strSqlDriverVer = SQLGetInfoString(SQL_DRIVER_VER);
  243. m_strSqlDriverOdbcVer = SQLGetInfoString(SQL_DRIVER_ODBC_VER);
  244. m_strSqlOdbcVer = SQLGetInfoString(SQL_ODBC_VER);
  245. switch (SQLGetInfoShort(SQL_ODBC_API_CONFORMANCE))
  246. {
  247. case SQL_OAC_NONE:
  248. m_strSqlOdbcApiConformance = _T("Core");
  249. break;
  250. case SQL_OAC_LEVEL1:
  251. m_strSqlOdbcApiConformance = _T("Level 1");
  252. break;
  253. case SQL_OAC_LEVEL2:
  254. m_strSqlOdbcApiConformance = _T("Level 2");
  255. break;
  256. }
  257. switch (SQLGetInfoShort(SQL_ODBC_SQL_CONFORMANCE))
  258. {
  259. case SQL_OSC_MINIMUM:
  260. m_strSqlOdbcSqlConformance = _T("Minimum");
  261. break;
  262. case SQL_OSC_CORE:
  263. m_strSqlOdbcSqlConformance = _T("Core");
  264. break;
  265. case SQL_OSC_EXTENDED:
  266. m_strSqlOdbcSqlConformance = _T("Extended");
  267. break;
  268. }
  269. switch (SQLGetInfoShort(SQL_ODBC_SAG_CLI_CONFORMANCE))
  270. {
  271. case SQL_OSCC_NOT_COMPLIANT:
  272. m_strSqlOdbcSagCliConformance = _T("No");
  273. break;
  274. case SQL_OSCC_COMPLIANT:
  275. m_strSqlOdbcSagCliConformance = _T("Yes");
  276. break;
  277. }
  278. YIsSupported(m_strSqlOdbcSqlOptIef,SQL_ODBC_SQL_OPT_IEF);
  279. if (value = SQLGetInfoShort(SQL_ACTIVE_CONNECTIONS))
  280. m_strSqlActiveConnections.Format(_T("%d"),value);
  281. else
  282. m_strSqlActiveConnections = _T("No Limit");
  283. if (value = SQLGetInfoShort(SQL_ACTIVE_STATEMENTS))
  284. m_strSqlActiveStatements.Format(_T("%d"),value);
  285. else
  286. m_strSqlActiveStatements = _T("No Limit");
  287. YIsSupported(m_strSqlMultResultSets,SQL_MULT_RESULT_SETS);
  288. switch (SQLGetInfoShort(SQL_FILE_USAGE))
  289. {
  290. case SQL_FILE_NOT_SUPPORTED:
  291. m_strSqlFileUsage = _T("<n/a>, Driver not single-tier");
  292. break;
  293. case SQL_FILE_TABLE:
  294. m_strSqlFileUsage = _T("Files are Tables");
  295. break;
  296. case SQL_FILE_QUALIFIER:
  297. m_strSqlFileUsage = _T("Files are Qualifiers");
  298. break;
  299. }
  300. string = SQLGetInfoString(SQL_DATA_SOURCE_READ_ONLY);
  301. if (string == _T("Y"))
  302. m_strSqlDataSourceReadOnly = _T("Data source is read-only");
  303. else if (string == _T("N"))
  304. m_strSqlDataSourceReadOnly = _T("Data source is read-write");
  305. YIsYes(m_strSqlAccessibleProcedures,SQL_ACCESSIBLE_PROCEDURES);
  306. YIsYes(m_strSqlAccessibleTables,SQL_ACCESSIBLE_TABLES);
  307. if (IsWindow(m_hWnd))
  308. UpdateData(FALSE);
  309. }
  310. }
  311. BOOL CDriverInfo::OnInitDialog()
  312. {
  313. CWaitCursor wait;
  314. CPropertyPage::OnInitDialog();
  315. UpdateData(FALSE);
  316. return TRUE;  // return TRUE unless you set the focus to a control
  317.   // EXCEPTION: OCX Property Pages should return FALSE
  318. }
  319. /////////////////////////////////////////////////////////////////////////////
  320. // CFunctions property page
  321. IMPLEMENT_DYNCREATE(CFunctions, CPropertyPage)
  322. #define CONVERSIONS_START           0
  323. #define NUM_CONVERSIONS             1
  324. #define NUMERIC_START               1
  325. #define NUM_NUMERICS                24
  326. #define STRINGS_START               25
  327. #define NUM_STRINGS                 19
  328. #define SYSTEMS_START               44
  329. #define NUM_SYSTEMS                 3
  330. #define TIMEDATES_START             47
  331. #define NUM_TIMEDATES               17
  332. SDWORD  CFunctions::m_dwConversionsMasks[] =
  333. {
  334. SQL_FN_CVT_CONVERT
  335. };
  336. SDWORD  CFunctions::m_dwNumericMasks[] =
  337. {
  338. SQL_FN_NUM_ABS,
  339. SQL_FN_NUM_ACOS,
  340. SQL_FN_NUM_ASIN,
  341. SQL_FN_NUM_ATAN,
  342. SQL_FN_NUM_ATAN2,
  343. SQL_FN_NUM_CEILING,
  344. SQL_FN_NUM_COS,
  345. SQL_FN_NUM_COT,
  346. SQL_FN_NUM_DEGREES,
  347. SQL_FN_NUM_EXP,
  348. SQL_FN_NUM_FLOOR,
  349. SQL_FN_NUM_LOG,
  350. SQL_FN_NUM_LOG10,
  351. SQL_FN_NUM_MOD,
  352. SQL_FN_NUM_PI,
  353. SQL_FN_NUM_POWER,
  354. SQL_FN_NUM_RADIANS,
  355. SQL_FN_NUM_RAND,
  356. SQL_FN_NUM_ROUND,
  357. SQL_FN_NUM_SIGN,
  358. SQL_FN_NUM_SIN,
  359. SQL_FN_NUM_SQRT,
  360. SQL_FN_NUM_TAN,
  361. SQL_FN_NUM_TRUNCATE
  362. };
  363. SDWORD  CFunctions::m_dwStringsMasks[] =
  364. {
  365. SQL_FN_STR_ASCII,
  366. SQL_FN_STR_CHAR,
  367. SQL_FN_STR_CONCAT,
  368. SQL_FN_STR_DIFFERENCE,
  369. SQL_FN_STR_INSERT,
  370. SQL_FN_STR_LCASE,
  371. SQL_FN_STR_LEFT,
  372. SQL_FN_STR_LENGTH,
  373. SQL_FN_STR_LOCATE,
  374. SQL_FN_STR_LOCATE_2,
  375. SQL_FN_STR_LTRIM,
  376. SQL_FN_STR_REPEAT,
  377. SQL_FN_STR_REPLACE,
  378. SQL_FN_STR_RIGHT,
  379. SQL_FN_STR_RTRIM,
  380. SQL_FN_STR_SOUNDEX,
  381. SQL_FN_STR_SPACE,
  382. SQL_FN_STR_SUBSTRING,
  383. SQL_FN_STR_UCASE
  384. };
  385. SDWORD  CFunctions::m_dwSystemsMasks[] =
  386. {
  387. SQL_FN_SYS_DBNAME,
  388. SQL_FN_SYS_IFNULL,
  389. SQL_FN_SYS_USERNAME,
  390. };
  391. SDWORD  CFunctions::m_dwTimeDatesMasks[] =
  392. {
  393. SQL_FN_TD_CURDATE,
  394. SQL_FN_TD_CURTIME,
  395. SQL_FN_TD_DAYNAME,
  396. SQL_FN_TD_DAYOFMONTH,
  397. SQL_FN_TD_DAYOFWEEK,
  398. SQL_FN_TD_DAYOFYEAR,
  399. SQL_FN_TD_HOUR,
  400. SQL_FN_TD_MINUTE,
  401. SQL_FN_TD_MONTH,
  402. SQL_FN_TD_MONTHNAME,
  403. SQL_FN_TD_NOW,
  404. SQL_FN_TD_QUARTER,
  405. SQL_FN_TD_SECOND,
  406. SQL_FN_TD_TIMESTAMPADD,
  407. SQL_FN_TD_TIMESTAMPDIFF,
  408. SQL_FN_TD_WEEK,
  409. SQL_FN_TD_YEAR,
  410. };
  411. char*   CFunctions::m_szSqlFunctions[] =
  412. {
  413. _T("Convert()"),    // conversion
  414. _T("Abs()"),        // numeric
  415. _T("Acos()"),
  416. _T("Asin()"),
  417. _T("Atan()"),
  418. _T("Atan2()"),
  419. _T("Ceiling()"),
  420. _T("Cos()"),
  421. _T("Cot()"),
  422. _T("Degrees()"),
  423. _T("Exp()"),
  424. _T("Floor()"),
  425. _T("Log()"),
  426. _T("Log10()"),
  427. _T("Mod()"),
  428. _T("Pi()"),
  429. _T("Power()"),
  430. _T("Radians()"),
  431. _T("Rand()"),
  432. _T("Round()"),
  433. _T("Sign()"),
  434. _T("Sin()"),
  435. _T("Sqrt()"),
  436. _T("Tan()"),
  437. _T("Truncate()"),
  438. _T("Ascii()"),
  439. _T("Char()"),
  440. _T("Concat()"),
  441. _T("Difference()"),
  442. _T("Insert()"),
  443. _T("LCase()"),
  444. _T("Left()"),
  445. _T("Lenght()"),
  446. _T("Locate()"),
  447. _T("Locate2()"),
  448. _T("LTrim()"),
  449. _T("Repeat()"),
  450. _T("Replace()"),
  451. _T("Right()"),
  452. _T("RTrim()"),
  453. _T("Soundex()"),
  454. _T("Space()"),
  455. _T("Substring()"),
  456. _T("UCase()"),
  457. _T("DBName()"),
  458. _T("IfNull()"),
  459. _T("UserName()"),
  460. _T("CurDate()"),
  461. _T("CurTime()"),
  462. _T("DayName()"),
  463. _T("DayOfMonth()"),
  464. _T("DayOfWeek()"),
  465. _T("DayOfYear()"),
  466. _T("Hour()"),
  467. _T("Minute()"),
  468. _T("Month()"),
  469. _T("MonthName()"),
  470. _T("Now()"),
  471. _T("Quarter()"),
  472. _T("Second()"),
  473. _T("TimeStampAdd()"),
  474. _T("TimeStampDiff()"),
  475. _T("Week()"),
  476. _T("Year()")
  477. };
  478. char* CFunctions::m_szSqlCategories[] =
  479. {
  480. _T("Conversion"),
  481. _T("Numeric"),
  482. _T("Numeric"),
  483. _T("Numeric"),
  484. _T("Numeric"),
  485. _T("Numeric"),
  486. _T("Numeric"),
  487. _T("Numeric"),
  488. _T("Numeric"),
  489. _T("Numeric"),
  490. _T("Numeric"),
  491. _T("Numeric"),
  492. _T("Numeric"),
  493. _T("Numeric"),
  494. _T("Numeric"),
  495. _T("Numeric"),
  496. _T("Numeric"),
  497. _T("Numeric"),
  498. _T("Numeric"),
  499. _T("Numeric"),
  500. _T("Numeric"),
  501. _T("Numeric"),
  502. _T("Numeric"),
  503. _T("Numeric"),
  504. _T("Numeric"),
  505. _T("String"),
  506. _T("String"),
  507. _T("String"),
  508. _T("String"),
  509. _T("String"),
  510. _T("String"),
  511. _T("String"),
  512. _T("String"),
  513. _T("String"),
  514. _T("String"),
  515. _T("String"),
  516. _T("String"),
  517. _T("String"),
  518. _T("String"),
  519. _T("String"),
  520. _T("String"),
  521. _T("String"),
  522. _T("String"),
  523. _T("String"),
  524. _T("System"),
  525. _T("System"),
  526. _T("System"),
  527. _T("TimeDate"),
  528. _T("TimeDate"),
  529. _T("TimeDate"),
  530. _T("TimeDate"),
  531. _T("TimeDate"),
  532. _T("TimeDate"),
  533. _T("TimeDate"),
  534. _T("TimeDate"),
  535. _T("TimeDate"),
  536. _T("TimeDate"),
  537. _T("TimeDate"),
  538. _T("TimeDate"),
  539. _T("TimeDate"),
  540. _T("TimeDate"),
  541. _T("TimeDate"),
  542. _T("TimeDate"),
  543. _T("TimeDate")
  544. };
  545. char* CFunctions::m_szFunctions[] =
  546. {
  547. _T("SQLAllocConnect"),
  548. _T("SQLAllocEnv"),
  549. _T("SQLAllocStmt"),
  550. _T("SQLBindCol"),
  551. _T("SQLCancel"),
  552. _T("SQLColAttributes"),
  553. _T("SQLConnect"),
  554. _T("SQLDescribeCol"),
  555. _T("SQLDisconnect"),
  556. _T("SQLError"),
  557. _T("SQLExecDirect"),
  558. _T("SQLExecute"),
  559. _T("SQLFetch"),
  560. _T("SQLFreeConnect"),
  561. _T("SQLFreeEnv"),
  562. _T("SQLFreeStmt"),
  563. _T("SQLGetCursorName"),
  564. _T("SQLNumResultCols"),
  565. _T("SQLPrepare"),
  566. _T("SQLRowCount"),
  567. _T("SQLSetCursorName"),
  568. _T("SQLSetParam"),
  569. _T("SQLTransact"),
  570. _T(""),
  571. _T(""),
  572. _T(""),
  573. _T(""),
  574. _T(""),
  575. _T(""),
  576. _T(""),
  577. _T(""),
  578. _T(""),
  579. _T(""),
  580. _T(""),
  581. _T(""),
  582. _T(""),
  583. _T(""),
  584. _T(""),
  585. _T(""),
  586. _T("SQLColumns"),
  587. _T("SQLDriverConnect"),
  588. _T("SQLGetConnectOption"),
  589. _T("SQLGetData"),
  590. _T("SQLGetFunctions"),
  591. _T("SQLGetInfo"),
  592. _T("SQLGetStmtOption"),
  593. _T("SQLGetTypeInfo"),
  594. _T("SQLParamData"),
  595. _T("SQLPutData"),
  596. _T("SQLSetConnectOption"),
  597. _T("SQLSetStmtOption"),
  598. _T("SQLSpecialColumns"),
  599. _T("SQLStatistics"),
  600. _T("SQLTables"),
  601. _T("SQLBrowseConnect"),
  602. _T("SQLColumnPrivileges"),
  603. _T("SQLDataSources"),
  604. _T("SQLDescribeParam"),
  605. _T("SQLExtendedFetch"),
  606. _T("SQLForeignKeys"),
  607. _T("SQLMoreResults"),
  608. _T("SQLNativeSql"),
  609. _T("SQLNumParams"),
  610. _T("SQLParamOptions"),
  611. _T("SQLPrimaryKeys"),
  612. _T("SQLProcedureColumns"),
  613. _T("SQLProcedures"),
  614. _T("SQLSetPos"),
  615. _T("SQLSetScrollOptions"),
  616. _T("SQLTablePrivileges"),
  617. _T("SQLDrivers"),
  618. _T("SQLBindParameter")
  619. _T(""),
  620. _T(""),
  621. _T(""),
  622. _T(""),
  623. _T(""),
  624. _T(""),
  625. _T(""),
  626. _T(""),
  627. _T(""),
  628. _T(""),
  629. _T(""),
  630. _T(""),
  631. _T(""),
  632. _T(""),
  633. _T(""),
  634. _T(""),
  635. _T(""),
  636. _T(""),
  637. _T(""),
  638. _T(""),
  639. _T(""),
  640. _T(""),
  641. _T(""),
  642. _T(""),
  643. _T(""),
  644. _T(""),
  645. _T(""),
  646. _T(""),
  647. };
  648. CFunctions::CFunctions(CDatabase* pDatabase)
  649.  : CMyPage(pDatabase, CFunctions::IDD)
  650. {
  651. //{{AFX_DATA_INIT(CFunctions)
  652. //}}AFX_DATA_INIT
  653. m_bSort = true;
  654. }
  655. CFunctions::~CFunctions()
  656. {
  657. }
  658. void CFunctions::DumpToFile(CStdioFile& file)
  659. {
  660. if (m_pDatabase->IsOpen())
  661. {
  662. int     i,j;
  663. CString string;
  664. CString padString;
  665. UWORD   aFunctions[100];
  666. SDWORD  value;
  667. file.WriteString(_T("ODBC API Functionsn------------------n"));
  668. ::SQLGetFunctions(m_pDatabase->m_hdbc,
  669. SQL_API_ALL_FUNCTIONS,aFunctions);
  670. for (i = 0; i < SQL_NUM_FUNCTIONS; i++)
  671. {
  672. if (aFunctions[i + 1])
  673. string.Format(_T("%s - Supportedn"),m_szFunctions[i]);
  674. else
  675. string.Format(_T("%s - Not Supportedn"),m_szFunctions[i]);
  676. padString = _T("");
  677. int nLimit = 21 - lstrlen(m_szFunctions[i]) / sizeof(TCHAR);
  678. if (nLimit > 0)
  679. {
  680. for (j = 0; j < nLimit; j++)
  681. padString += ' ';
  682. file.WriteString(padString);
  683. }
  684. file.WriteString(string);
  685. }
  686. for (i = 0; i < SQL_EXT_API_LAST - SQL_EXT_API_START + 1; i++)
  687. {
  688. if (aFunctions[i + SQL_EXT_API_START])
  689. string.Format(_T("%s - Supportedn"),m_szFunctions[i + SQL_EXT_API_START - 1]);
  690. else
  691. string.Format(_T("%s - Not Supportedn"),m_szFunctions[i + SQL_EXT_API_START - 1]);
  692. padString = _T("");
  693. int nLimit = 21 - lstrlen(m_szFunctions[i + SQL_EXT_API_START - 1]) / sizeof(TCHAR);
  694. if (nLimit > 0)
  695. {
  696. for (j = 0; j < nLimit; j++)
  697. padString += ' ';
  698. file.WriteString(padString);
  699. }
  700. file.WriteString(string);
  701. }
  702. file.WriteString(_T("n"));
  703. file.WriteString(_T("SQL Conversion Functionsn------------------------n"));
  704. value = SQLGetInfoLong(SQL_CONVERT_FUNCTIONS);
  705. for (i = 0; i < NUM_CONVERSIONS; i++)
  706. {
  707. if (value & m_dwConversionsMasks[i])
  708. string.Format(_T("%s - Supportedn"),m_szSqlFunctions[CONVERSIONS_START + i]);
  709. else
  710. string.Format(_T("%s - Not Supportedn"),m_szSqlFunctions[CONVERSIONS_START + i]);
  711. padString = _T("");
  712. int nLimit = 21 - lstrlen(m_szSqlFunctions[CONVERSIONS_START + i]) / sizeof(TCHAR);
  713. if (nLimit > 0)
  714. {
  715. for (j = 0; j < nLimit; j++)
  716. padString += ' ';
  717. file.WriteString(padString);
  718. }
  719. file.WriteString(string);
  720. }
  721. file.WriteString(_T("n"));
  722. file.WriteString(_T("SQL Numeric Functionsn---------------------n"));
  723. value = SQLGetInfoLong(SQL_NUMERIC_FUNCTIONS);
  724. for (i = 0; i < NUM_NUMERICS; i++)
  725. {
  726. if (value & m_dwNumericMasks[i])
  727. string.Format(_T("%s - Supportedn"),m_szSqlFunctions[NUMERIC_START + i]);
  728. else
  729. string.Format(_T("%s - Not Supportedn"),m_szSqlFunctions[NUMERIC_START + i]);
  730. padString = _T("");
  731. int nLimit = 21 - lstrlen(m_szSqlFunctions[NUMERIC_START + i]) / sizeof(TCHAR);
  732. if (nLimit > 0)
  733. {
  734. for (j = 0; j < nLimit; j++)
  735. padString += ' ';
  736. file.WriteString(padString);
  737. }
  738. file.WriteString(string);
  739. }
  740. file.WriteString(_T("n"));
  741. file.WriteString(_T("SQL String Functionsn--------------------n"));
  742. value = SQLGetInfoLong(SQL_STRING_FUNCTIONS);
  743. for (i = 0; i < NUM_STRINGS; i++)
  744. {
  745. if (value & m_dwStringsMasks[i])
  746. string.Format(_T("%s - Supportedn"),m_szSqlFunctions[STRINGS_START + i]);
  747. else
  748. string.Format(_T("%s - Not Supportedn"),m_szSqlFunctions[STRINGS_START + i]);
  749. padString = _T("");
  750. int nLimit = 21 - lstrlen(m_szSqlFunctions[STRINGS_START + i]) / sizeof(TCHAR);
  751. if (nLimit > 0)
  752. {
  753. for (j = 0; j < nLimit; j++)
  754. padString += ' ';
  755. file.WriteString(padString);
  756. }
  757. file.WriteString(string);
  758. }
  759. file.WriteString(_T("n"));
  760. file.WriteString(_T("SQL System Functionsn--------------------n"));
  761. value = SQLGetInfoLong(SQL_SYSTEM_FUNCTIONS);
  762. for (i = 0; i < NUM_SYSTEMS; i++)
  763. {
  764. if (value & m_dwSystemsMasks[i])
  765. string.Format(_T("%s - Supportedn"),m_szSqlFunctions[SYSTEMS_START + i]);
  766. else
  767. string.Format(_T("%s - Not Supportedn"),m_szSqlFunctions[SYSTEMS_START + i]);
  768. padString = _T("");
  769. int nLimit = 21 - lstrlen(m_szSqlFunctions[SYSTEMS_START + i]) / sizeof(TCHAR);
  770. if (nLimit > 0)
  771. {
  772. for (j = 0; j < nLimit; j++)
  773. padString += ' ';
  774. file.WriteString(padString);
  775. }
  776. file.WriteString(string);
  777. }
  778. file.WriteString(_T("n"));
  779. file.WriteString(_T("SQL Time/Date Functionsn-----------------------n"));
  780. value = SQLGetInfoLong(SQL_TIMEDATE_FUNCTIONS);
  781. for (i = 0; i < NUM_TIMEDATES; i++)
  782. {
  783. if (value & m_dwTimeDatesMasks[i])
  784. string.Format(_T("%s - Supportedn"),m_szSqlFunctions[TIMEDATES_START + i]);
  785. else
  786. string.Format(_T("%s - Not Supportedn"),m_szSqlFunctions[TIMEDATES_START + i]);
  787. padString = _T("");
  788. int nLimit = 21 - lstrlen(m_szSqlFunctions[TIMEDATES_START + i]) / sizeof(TCHAR);
  789. if (nLimit > 0)
  790. {
  791. for (j = 0; j < nLimit; j++)
  792. padString += ' ';
  793. file.WriteString(padString);
  794. }
  795. file.WriteString(string);
  796. }
  797. file.WriteString(_T("n"));
  798. }
  799. }
  800. void CFunctions::DoDataExchange(CDataExchange* pDX)
  801. {
  802. CPropertyPage::DoDataExchange(pDX);
  803. //{{AFX_DATA_MAP(CFunctions)
  804. DDX_Control(pDX, IDC_SQL_FUNCTIONS, m_SqlListControl);
  805. DDX_Control(pDX, IDC_API_FUNCTIONS, m_ApiListControl);
  806. //}}AFX_DATA_MAP
  807. }
  808. BEGIN_MESSAGE_MAP(CFunctions, CPropertyPage)
  809. //{{AFX_MSG_MAP(CFunctions)
  810. ON_NOTIFY(LVN_COLUMNCLICK, IDC_SQL_FUNCTIONS, OnColumnclickSqlFunctions)
  811. //}}AFX_MSG_MAP
  812. END_MESSAGE_MAP()
  813. /////////////////////////////////////////////////////////////////////////////
  814. // CFunctions message handlers
  815. void CFunctions::OnNewDSN()
  816. {
  817. if (::IsWindow(m_hWnd))
  818. {
  819. UWORD       aFunctions[100];
  820. BOOL        bOpen = m_pDatabase->IsOpen();
  821. SDWORD      value;
  822. int         nNewItem;
  823. m_ApiListControl.DeleteAllItems();
  824. if (bOpen)
  825. ::SQLGetFunctions(m_pDatabase->m_hdbc,
  826. SQL_API_ALL_FUNCTIONS,aFunctions);
  827. for (int i = 0; i < SQL_NUM_FUNCTIONS; i++)
  828. {
  829. if (bOpen && aFunctions[i + 1])
  830. m_ApiListControl.InsertItem(i,m_szFunctions[i],1);
  831. else
  832. m_ApiListControl.InsertItem(i,m_szFunctions[i],0);
  833. }
  834. for (i = 0; i < SQL_EXT_API_LAST - SQL_EXT_API_START + 1; i++)
  835. {
  836. if (bOpen && aFunctions[i+SQL_EXT_API_START])
  837. m_ApiListControl.InsertItem(i+SQL_NUM_FUNCTIONS,
  838. m_szFunctions[i+SQL_EXT_API_START-1],1);
  839. else
  840. m_ApiListControl.InsertItem(i+SQL_NUM_FUNCTIONS,
  841. m_szFunctions[i+SQL_EXT_API_START-1],0);
  842. }
  843. m_SqlListControl.DeleteAllItems();
  844. // conversion function
  845. if (bOpen)
  846. value = SQLGetInfoLong(SQL_CONVERT_FUNCTIONS);
  847. for (i = 0; i < NUM_CONVERSIONS; i++)
  848. {
  849. if (bOpen && (value & m_dwConversionsMasks[i]))
  850. nNewItem = m_SqlListControl.InsertItem(CONVERSIONS_START + i,
  851. m_szSqlFunctions[CONVERSIONS_START + i],1);
  852. else
  853. nNewItem = m_SqlListControl.InsertItem(CONVERSIONS_START + i,
  854. m_szSqlFunctions[CONVERSIONS_START + i],0);
  855. m_SqlListControl.SetItem(nNewItem,1,LVIF_TEXT,
  856. m_szSqlCategories[CONVERSIONS_START + i],0,0,0,0);
  857. }
  858. // numeric functions
  859. if (bOpen)
  860. value = SQLGetInfoLong(SQL_NUMERIC_FUNCTIONS);
  861. for (i = 0; i < NUM_NUMERICS; i++)
  862. {
  863. if (bOpen && (value & m_dwNumericMasks[i]))
  864. nNewItem = m_SqlListControl.InsertItem(NUMERIC_START + i,
  865. m_szSqlFunctions[NUMERIC_START + i],1);
  866. else
  867. nNewItem = m_SqlListControl.InsertItem(NUMERIC_START + i,
  868. m_szSqlFunctions[NUMERIC_START + i],0);
  869. m_SqlListControl.SetItem(nNewItem,1,LVIF_TEXT,
  870. m_szSqlCategories[NUMERIC_START + i],0,0,0,0);
  871. }
  872. // string functions
  873. if (bOpen)
  874. value = SQLGetInfoLong(SQL_STRING_FUNCTIONS);
  875. for (i = 0; i < NUM_STRINGS; i++)
  876. {
  877. if (bOpen && (value & m_dwStringsMasks[i]))
  878. nNewItem = m_SqlListControl.InsertItem(STRINGS_START + i,
  879. m_szSqlFunctions[STRINGS_START + i],1);
  880. else
  881. nNewItem = m_SqlListControl.InsertItem(STRINGS_START + i,
  882. m_szSqlFunctions[STRINGS_START + i],0);
  883. m_SqlListControl.SetItem(nNewItem,1,LVIF_TEXT,
  884. m_szSqlCategories[STRINGS_START + i],0,0,0,0);
  885. }
  886. // system functions
  887. if (bOpen)
  888. value = SQLGetInfoLong(SQL_SYSTEM_FUNCTIONS);
  889. for (i = 0; i < NUM_SYSTEMS; i++)
  890. {
  891. if (bOpen && (value & m_dwSystemsMasks[i]))
  892. nNewItem = m_SqlListControl.InsertItem(SYSTEMS_START + i,
  893. m_szSqlFunctions[SYSTEMS_START + i],1);
  894. else
  895. nNewItem = m_SqlListControl.InsertItem(SYSTEMS_START + i,
  896. m_szSqlFunctions[SYSTEMS_START + i],0);
  897. m_SqlListControl.SetItem(nNewItem,1,LVIF_TEXT,
  898. m_szSqlCategories[SYSTEMS_START + i],0,0,0,0);
  899. }
  900. // timedate functions
  901. if (bOpen)
  902. value = SQLGetInfoLong(SQL_TIMEDATE_FUNCTIONS);
  903. for (i = 0; i < NUM_TIMEDATES; i++)
  904. {
  905. if (bOpen && (value & m_dwTimeDatesMasks[i]))
  906. nNewItem = m_SqlListControl.InsertItem(TIMEDATES_START + i,
  907. m_szSqlFunctions[TIMEDATES_START + i],1);
  908. else
  909. nNewItem = m_SqlListControl.InsertItem(TIMEDATES_START + i,
  910. m_szSqlFunctions[TIMEDATES_START + i],0);
  911. m_SqlListControl.SetItem(nNewItem,1,LVIF_TEXT,
  912. m_szSqlCategories[TIMEDATES_START + i],0,0,0,0);
  913. }
  914. }
  915. }
  916. BOOL CFunctions::OnInitDialog()
  917. {
  918. CWaitCursor wait;
  919. CPropertyPage::OnInitDialog();
  920. m_ApiListControl.SetImageList(m_pImageList,LVSIL_SMALL);
  921. m_SqlListControl.SetImageList(m_pImageList,LVSIL_SMALL);
  922. m_ApiListControl.InsertColumn(0,"",LVCFMT_LEFT,130);
  923. m_SqlListControl.InsertColumn(0,"Function",LVCFMT_LEFT,120);
  924. m_SqlListControl.InsertColumn(1,"Category",LVCFMT_LEFT,120);
  925. m_SqlListControl.SetFullRowSel(TRUE);
  926. m_ApiListControl.SetFullRowSel(TRUE);
  927. OnNewDSN();
  928. return TRUE;  // return TRUE unless you set the focus to a control
  929.   // EXCEPTION: OCX Property Pages should return FALSE
  930. }
  931. void CFunctions::OnColumnclickSqlFunctions(NMHDR* pNMHDR, LRESULT* pResult) 
  932. {
  933. CWaitCursor wait;
  934. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  935. CSortColumn sort(&m_SqlListControl, pNMListView->iSubItem, false);
  936. sort.Sort(m_bSort = !m_bSort);
  937. *pResult = 0;
  938. }
  939. /////////////////////////////////////////////////////////////////////////////
  940. // CSupportedSQL property page
  941. IMPLEMENT_DYNCREATE(CSupportedSQL, CPropertyPage)
  942. CSupportedSQL::CSupportedSQL(CDatabase* pDatabase)
  943.  : CMyPage(pDatabase,CSupportedSQL::IDD)
  944. {
  945. //{{AFX_DATA_INIT(CSupportedSQL)
  946. m_bSqlAlterTableAdd = FALSE;
  947. m_bSqlAlterTableDrop = FALSE;
  948. m_strSqlExpressionsInOrderby = _T("");
  949. m_strSqlGroupBy = _T("");
  950. m_strSqlOrderByColumnsInSelect = _T("");
  951. m_strSqlOuterJoins = _T("");
  952. m_bSqlSqComparison = FALSE;
  953. m_bSqlSqCorrelatedSubqueries = FALSE;
  954. m_bSqlSqExists = FALSE;
  955. m_bSqlSqIn = FALSE;
  956. m_bSqlSqQuantified = FALSE;
  957. m_bSqlUUnion = FALSE;
  958. m_bSqlUUnionAll = FALSE;
  959. m_strSqlColumnAlias = _T("");
  960. m_strSqlLikeEscapeClause = _T("");
  961. m_bSqlPsPositionedDelete = FALSE;
  962. m_bSqlPsPositionedUpdate = FALSE;
  963. m_bSqlPsSelectForUpdate = FALSE;
  964. m_strSqlCorrelationName = _T("");
  965. //}}AFX_DATA_INIT
  966. OnNewDSN();
  967. }
  968. CSupportedSQL::~CSupportedSQL()
  969. {
  970. }
  971. void CSupportedSQL::DumpToFile(CStdioFile& file)
  972. {
  973. if (m_pDatabase->IsOpen())
  974. {
  975. BOOL    b;
  976. CString string;
  977. file.WriteString(_T("Supported SQLn-------------n"));
  978. b = FALSE;
  979. file.WriteString(_T("  ALTER TABLE Support -"));
  980. if (m_bSqlAlterTableAdd)
  981. {
  982. file.WriteString(_T(" ADD"));
  983. b = TRUE;
  984. }
  985. if (m_bSqlAlterTableDrop)
  986. {
  987. if (b)
  988. file.WriteString(_T(","));
  989. file.WriteString(_T("DROP"));
  990. b = TRUE;
  991. }
  992. if (!b)
  993. file.WriteString(_T(" <none>"));
  994. file.WriteString(_T("n"));
  995. string.Format(_T("       Column Aliases - %sn"),m_strSqlColumnAlias);
  996. file.WriteString(string);
  997. string.Format(_T("    Correlation Names - %sn"),m_strSqlCorrelationName);
  998. file.WriteString(string);
  999. string.Format(_T(" ORDER BY Expressions - %sn"),m_strSqlExpressionsInOrderby);
  1000. file.WriteString(string);
  1001. string.Format(_T("GROUP BY NonAggregate - %sn"),m_strSqlGroupBy);
  1002. file.WriteString(string);
  1003. string.Format(_T("LIKE Escape Character - %sn"),m_strSqlLikeEscapeClause);
  1004. file.WriteString(string);
  1005. string.Format(_T("   ORDER BY in SELECT - %sn"),m_strSqlOrderByColumnsInSelect);
  1006. file.WriteString(string);
  1007. string.Format(_T("   Outer Join Support - %sn"),m_strSqlOuterJoins);
  1008. file.WriteString(string);
  1009. file.WriteString(_T("Positioned Statements -"));
  1010. b = FALSE;
  1011. if (m_bSqlPsPositionedDelete)
  1012. {
  1013. file.WriteString(_T(" Delete"));
  1014. b = TRUE;
  1015. }
  1016. if (m_bSqlPsPositionedUpdate)
  1017. {
  1018. if (b)
  1019. file.WriteString(_T(","));
  1020. file.WriteString(_T("Update"));
  1021. b = TRUE;
  1022. }
  1023. if (m_bSqlPsSelectForUpdate)
  1024. {
  1025. if (b)
  1026. file.WriteString(_T(","));
  1027. file.WriteString(_T("Select for Update"));
  1028. b = TRUE;
  1029. }
  1030. if (!b)
  1031. file.WriteString(_T(" <none>"));
  1032. file.WriteString(_T("n"));
  1033. file.WriteString(_T("     Subquery Support -"));
  1034. b = FALSE;
  1035. if (m_bSqlSqCorrelatedSubqueries)
  1036. {
  1037. file.WriteString(_T(" Correlated"));
  1038. b = TRUE;
  1039. }
  1040. if (m_bSqlSqComparison)
  1041. {
  1042. if (b)
  1043. file.WriteString(_T(","));
  1044. file.WriteString(_T("Comparison"));
  1045. b = TRUE;
  1046. }
  1047. if (m_bSqlSqExists)
  1048. {
  1049. if (b)
  1050. file.WriteString(_T(","));
  1051. file.WriteString(_T("EXISTS"));
  1052. b = TRUE;
  1053. }
  1054. if (m_bSqlSqIn)
  1055. {
  1056. if (b)
  1057. file.WriteString(_T(","));
  1058. file.WriteString(_T("IN"));
  1059. b = TRUE;
  1060. }
  1061. if (m_bSqlSqQuantified)
  1062. {
  1063. if (b)
  1064. file.WriteString(_T(","));
  1065. file.WriteString(_T("Quantified"));
  1066. b = TRUE;
  1067. }
  1068. if (!b)
  1069. file.WriteString(_T("<none>"));
  1070. file.WriteString(_T("n"));
  1071. file.WriteString(_T("        UNION Support -"));
  1072. b = FALSE;
  1073. if (m_bSqlUUnion)
  1074. {
  1075. file.WriteString(_T(" UNION"));
  1076. b = TRUE;
  1077. }
  1078. if (m_bSqlUUnionAll)
  1079. {
  1080. if (b)
  1081. file.WriteString(_T(","));
  1082. file.WriteString(_T("UNION with ALL"));
  1083. b = TRUE;
  1084. }
  1085. if (!b)
  1086. file.WriteString(_T("<none>"));
  1087. file.WriteString(_T("nn"));
  1088. }
  1089. }
  1090. void CSupportedSQL::DoDataExchange(CDataExchange* pDX)
  1091. {
  1092. CPropertyPage::DoDataExchange(pDX);
  1093. //{{AFX_DATA_MAP(CSupportedSQL)
  1094. DDX_Check(pDX, IDC_AT_ADD, m_bSqlAlterTableAdd);
  1095. DDX_Check(pDX, IDC_AT_DROP, m_bSqlAlterTableDrop);
  1096. DDX_Text(pDX, IDC_SQL_EXPRESSIONS_IN_ORDERBY, m_strSqlExpressionsInOrderby);
  1097. DDX_Text(pDX, IDC_SQL_GROUP_BY, m_strSqlGroupBy);
  1098. DDX_Text(pDX, IDC_SQL_ORDER_BY_COLUMNS_IN_SELECT, m_strSqlOrderByColumnsInSelect);
  1099. DDX_Text(pDX, IDC_SQL_OUTER_JOINS, m_strSqlOuterJoins);
  1100. DDX_Check(pDX, IDC_SQL_SQ_COMPARISON, m_bSqlSqComparison);
  1101. DDX_Check(pDX, IDC_SQL_SQ_CORRELATED_SUBQUERIES, m_bSqlSqCorrelatedSubqueries);
  1102. DDX_Check(pDX, IDC_SQL_SQ_EXISTS, m_bSqlSqExists);
  1103. DDX_Check(pDX, IDC_SQL_SQ_IN, m_bSqlSqIn);
  1104. DDX_Check(pDX, IDC_SQL_SQ_QUANTIFIED, m_bSqlSqQuantified);
  1105. DDX_Check(pDX, IDC_SQL_U_UNION, m_bSqlUUnion);
  1106. DDX_Check(pDX, IDC_SQL_U_UNION_ALL, m_bSqlUUnionAll);
  1107. DDX_Text(pDX, IDC_SQL_COLUMN_ALIAS, m_strSqlColumnAlias);
  1108. DDX_Text(pDX, IDC_SQL_LIKE_ESCAPE_CLAUSE, m_strSqlLikeEscapeClause);
  1109. DDX_Check(pDX, IDC_SQL_PS_POSITIONED_DELETE, m_bSqlPsPositionedDelete);
  1110. DDX_Check(pDX, IDC_SQL_PS_POSITIONED_UPDATE, m_bSqlPsPositionedUpdate);
  1111. DDX_Check(pDX, IDC_SQL_PS_SELECT_FOR_UPDATE, m_bSqlPsSelectForUpdate);
  1112. DDX_Text(pDX, IDC_SQL_CORRELATION_NAME, m_strSqlCorrelationName);
  1113. //}}AFX_DATA_MAP
  1114. }
  1115. BEGIN_MESSAGE_MAP(CSupportedSQL, CPropertyPage)
  1116. //{{AFX_MSG_MAP(CSupportedSQL)
  1117. //}}AFX_MSG_MAP
  1118. END_MESSAGE_MAP()
  1119. /////////////////////////////////////////////////////////////////////////////
  1120. // CSupportedSQL message handlers
  1121. void CSupportedSQL::OnNewDSN()
  1122. {
  1123. if (m_pDatabase->IsOpen())
  1124. {
  1125. CString string;
  1126. SDWORD  longValue;
  1127. longValue = SQLGetInfoLong(SQL_ALTER_TABLE);
  1128. if (longValue & SQL_AT_ADD_COLUMN)
  1129. m_bSqlAlterTableAdd = TRUE;
  1130. else
  1131. m_bSqlAlterTableAdd = FALSE;
  1132. if (longValue & SQL_AT_DROP_COLUMN)
  1133. m_bSqlAlterTableDrop = TRUE;
  1134. else
  1135. m_bSqlAlterTableDrop = FALSE;
  1136. YIsSupported(m_strSqlColumnAlias,SQL_COLUMN_ALIAS);
  1137. switch (SQLGetInfoShort(SQL_CORRELATION_NAME))
  1138. {
  1139. case SQL_CN_NONE:
  1140. m_strSqlCorrelationName = _T("Not Supported");
  1141. break;
  1142. case SQL_CN_DIFFERENT:
  1143. m_strSqlCorrelationName = _T("Supported, table names must be different");
  1144. break;
  1145. case SQL_CN_ANY:
  1146. m_strSqlCorrelationName = _T("Supported");
  1147. break;
  1148. }
  1149. YIsSupported(m_strSqlExpressionsInOrderby,SQL_EXPRESSIONS_IN_ORDERBY);
  1150. switch (SQLGetInfoShort(SQL_GROUP_BY))
  1151. {
  1152. case SQL_GB_NOT_SUPPORTED:
  1153. m_strSqlGroupBy = _T("GROUP BY Not Supported");
  1154. break;
  1155. case SQL_GB_GROUP_BY_EQUALS_SELECT:
  1156. m_strSqlGroupBy = _T("GROUP BY Equals SELECT");
  1157. break;
  1158. case SQL_GB_GROUP_BY_CONTAINS_SELECT:
  1159. m_strSqlGroupBy = _T("GROUP BY Contains SELECT");
  1160. break;
  1161. case SQL_GB_NO_RELATION:
  1162. m_strSqlGroupBy = _T("No Relation");
  1163. break;
  1164. }
  1165. YIsSupported(m_strSqlLikeEscapeClause,SQL_LIKE_ESCAPE_CLAUSE);
  1166. YIsYes(m_strSqlOrderByColumnsInSelect,SQL_ORDER_BY_COLUMNS_IN_SELECT);
  1167. string = SQLGetInfoString(SQL_OUTER_JOINS);
  1168. if (string == _T("N"))
  1169. m_strSqlOuterJoins = _T("No");
  1170. else if (string == _T("Y"))
  1171. m_strSqlOuterJoins = _T("Yes");
  1172. else if (string == _T("P"))
  1173. m_strSqlOuterJoins = _T("Partial");
  1174. else if (string == _T("F"))
  1175. m_strSqlOuterJoins = _T("Full");
  1176. longValue = SQLGetInfoLong(SQL_POSITIONED_STATEMENTS);
  1177. if (longValue & SQL_PS_POSITIONED_DELETE)
  1178. m_bSqlPsPositionedDelete = TRUE;
  1179. else
  1180. m_bSqlPsPositionedDelete = FALSE;
  1181. if (longValue & SQL_PS_POSITIONED_UPDATE)
  1182. m_bSqlPsPositionedUpdate = TRUE;
  1183. else
  1184. m_bSqlPsPositionedUpdate = FALSE;
  1185. if (longValue & SQL_PS_SELECT_FOR_UPDATE)
  1186. m_bSqlPsSelectForUpdate = TRUE;
  1187. else
  1188. m_bSqlPsSelectForUpdate = FALSE;
  1189. longValue = SQLGetInfoLong(SQL_SUBQUERIES);
  1190. if (longValue & SQL_SQ_CORRELATED_SUBQUERIES)
  1191. m_bSqlSqCorrelatedSubqueries = TRUE;
  1192. else
  1193. m_bSqlSqCorrelatedSubqueries = FALSE;
  1194. if (longValue & SQL_SQ_COMPARISON)
  1195. m_bSqlSqComparison = TRUE;
  1196. else
  1197. m_bSqlSqComparison = FALSE;
  1198. if (longValue & SQL_SQ_EXISTS)
  1199. m_bSqlSqExists = TRUE;
  1200. else
  1201. m_bSqlSqExists = FALSE;
  1202. if (longValue & SQL_SQ_IN)
  1203. m_bSqlSqIn = TRUE;
  1204. else
  1205. m_bSqlSqIn = FALSE;
  1206. if (longValue & SQL_SQ_QUANTIFIED)
  1207. m_bSqlSqQuantified = TRUE;
  1208. else
  1209. m_bSqlSqQuantified = FALSE;
  1210. longValue = SQLGetInfoLong(SQL_UNION);
  1211. if (longValue & SQL_U_UNION)
  1212. m_bSqlUUnion = TRUE;
  1213. else
  1214. m_bSqlUUnion = FALSE;
  1215. if (longValue & SQL_U_UNION_ALL)
  1216. m_bSqlUUnionAll = TRUE;
  1217. else
  1218. m_bSqlUUnionAll = FALSE;
  1219. if (IsWindow(m_hWnd))
  1220. UpdateData(FALSE);
  1221. }
  1222. }
  1223. BOOL CSupportedSQL::OnInitDialog()
  1224. {
  1225. CWaitCursor wait;
  1226. CPropertyPage::OnInitDialog();
  1227. UpdateData(FALSE);
  1228. return TRUE;  // return TRUE unless you set the focus to a control
  1229.   // EXCEPTION: OCX Property Pages should return FALSE
  1230. }
  1231. /////////////////////////////////////////////////////////////////////////////
  1232. // CDataTypes property page
  1233. IMPLEMENT_DYNCREATE(CDataTypes, CPropertyPage)
  1234. CDataTypes::CDataTypes(CDatabase* pDatabase)
  1235. : m_pGetTypeInfo(0),CMyPage(pDatabase,CDataTypes::IDD),
  1236. m_pTypeDataHead(0),m_pTypeDataTail(0)
  1237. {
  1238. //{{AFX_DATA_INIT(CDataTypes)
  1239. m_strSqlType = _T("");
  1240. m_strPrecision = _T("");
  1241. m_strPrefixSuffix = _T("");
  1242. m_strCreateParams = _T("");
  1243. m_strNullable = _T("");
  1244. m_strCaseSensitive = _T("");
  1245. m_strSearchable = _T("");
  1246. m_strMoney = _T("");
  1247. m_strUnsigned = _T("");
  1248. m_strAutoIncrement = _T("");
  1249. m_strMaximumScale = _T("");
  1250. m_strMinimumScale = _T("");
  1251. //}}AFX_DATA_INIT
  1252. }
  1253. CDataTypes::~CDataTypes()
  1254. {
  1255. if (m_pGetTypeInfo)
  1256. {
  1257. if (m_pGetTypeInfo->IsOpen())
  1258. m_pGetTypeInfo->Close();
  1259. delete m_pGetTypeInfo;
  1260. }
  1261. // delete type data list
  1262. TYPEDATA*   p1 = m_pTypeDataHead;
  1263. TYPEDATA*   p2;
  1264. while (p1)
  1265. {
  1266. p2 = p1;
  1267. p1 = p1->pNext;
  1268. delete p2;
  1269. }
  1270. }
  1271. void CDataTypes::DumpToFile(CStdioFile& file)
  1272. {
  1273. if (m_pDatabase->IsOpen())
  1274. {
  1275. CString string;
  1276. CString workString;
  1277. SDWORD  value;
  1278. file.WriteString(_T("Data Typesn----------nn"));
  1279. file.WriteString(_T("Native type         SQL Type          Precision   Min Scale  Max Scalen"));
  1280. file.WriteString(_T("-----------         --------          ---------   ---------  ---------n"));
  1281. if (m_pGetTypeInfo)
  1282. {
  1283. if (m_pGetTypeInfo->IsOpen())
  1284. m_pGetTypeInfo->Close();
  1285. delete m_pGetTypeInfo;
  1286. }
  1287. m_pGetTypeInfo = new CGetTypeInfo(m_pDatabase);
  1288. m_pGetTypeInfo->Open();
  1289. while (!m_pGetTypeInfo->IsEOF())
  1290. {
  1291. string = m_pGetTypeInfo->m_strTypeName;
  1292. while (string.GetLength() < 20)
  1293. string += ' ';
  1294. switch (m_pGetTypeInfo->m_fDataType)
  1295. {
  1296. case SQL_BIGINT:
  1297. string += _T("SQL_BIGINT        ");
  1298. break;
  1299. case SQL_BINARY:
  1300. string += _T("SQL_BINARY        ");
  1301. break;
  1302. case SQL_BIT:
  1303. string += _T("SQL_BIT           ");
  1304. break;
  1305. case SQL_CHAR:
  1306. string += _T("SQL_CHAR          ");
  1307. break;
  1308. case SQL_DATE:
  1309. string += _T("SQL_DATE          ");
  1310. break;
  1311. case SQL_DECIMAL:
  1312. string += _T("SQL_DECIMAL       ");
  1313. break;
  1314. case SQL_DOUBLE:
  1315. string += _T("SQL_DOUBLE        ");
  1316. break;
  1317. case SQL_FLOAT:
  1318. string += _T("SQL_FLOAT         ");
  1319. break;
  1320. case SQL_INTEGER:
  1321. string += _T("SQL_INTEGER       ");
  1322. break;
  1323. case SQL_LONGVARBINARY:
  1324. string += _T("SQL_LONGVARBINARY ");
  1325. break;
  1326. case SQL_LONGVARCHAR:
  1327. string += _T("SQL_LONGVARCHAR   ");
  1328. break;
  1329. case SQL_NUMERIC:
  1330. string += _T("SQL_NUMERIC       ");
  1331. break;
  1332. case SQL_REAL:
  1333. string += _T("SQL_REAL          ");
  1334. break;
  1335. case SQL_SMALLINT:
  1336. string += _T("SQL_SMALLINT      ");
  1337. break;
  1338. case SQL_TIME:
  1339. string += _T("SQL_TIME          ");
  1340. break;
  1341. case SQL_TIMESTAMP:
  1342. string += _T("SQL_TIMESTAMP     ");
  1343. break;
  1344. case SQL_TINYINT:
  1345. string += _T("SQL_TINYINT       ");
  1346. break;
  1347. case SQL_VARBINARY:
  1348. string += _T("SQL_VARBINARY     ");
  1349. break;
  1350. case SQL_VARCHAR:
  1351. string += _T("SQL_VARCHAR       ");
  1352. break;
  1353. default:
  1354. string += _T("<unknown type>    ");
  1355. break;
  1356. }
  1357. if (m_pGetTypeInfo->IsFieldNull(&(m_pGetTypeInfo->m_nPrecision)))
  1358. string += _T("<n/a>       ");
  1359. else
  1360. {
  1361. workString.Format(_T("%-11d "),m_pGetTypeInfo->m_nPrecision);
  1362. string += workString;
  1363. }
  1364. if (m_pGetTypeInfo->IsFieldNull(&(m_pGetTypeInfo->m_nMinimumScale)))
  1365. string += _T("<n/a>      ");
  1366. else
  1367. {
  1368. workString.Format(_T("%-5d      "),m_pGetTypeInfo->m_nMinimumScale);
  1369. string += workString;
  1370. }
  1371. if (m_pGetTypeInfo->IsFieldNull(&(m_pGetTypeInfo->m_nMaximumScale)))
  1372. string += _T("<n/a>      n");
  1373. else
  1374. {
  1375. workString.Format(_T("%-5dn"),m_pGetTypeInfo->m_nMaximumScale);
  1376. string += workString;
  1377. }
  1378. file.WriteString(string);
  1379. m_pGetTypeInfo->MoveNext();
  1380. }
  1381. file.WriteString(_T("n"));
  1382. m_pGetTypeInfo->Close();
  1383. delete m_pGetTypeInfo;
  1384. file.WriteString(_T("Native type         Nullable  Unsigned  Auto Inc  Money  Case Sensitiven"));
  1385. file.WriteString(_T("-----------         --------  --------  --------  -----  --------------n"));
  1386. m_pGetTypeInfo = new CGetTypeInfo(m_pDatabase);
  1387. m_pGetTypeInfo->Open();
  1388. while (!m_pGetTypeInfo->IsEOF())
  1389. {
  1390. string = m_pGetTypeInfo->m_strTypeName;
  1391. while (string.GetLength() < 20)
  1392. string += ' ';
  1393. switch (m_pGetTypeInfo->m_fNullable)
  1394. {
  1395. case SQL_NO_NULLS:
  1396. string += _T("No        ");
  1397. break;
  1398. case SQL_NULLABLE:
  1399. string += _T("Yes       ");
  1400. break;
  1401. case SQL_NULLABLE_UNKNOWN:
  1402. default:
  1403. string += _T("Unknown   ");
  1404. break;
  1405. }
  1406. if (m_pGetTypeInfo->IsFieldNull(&(m_pGetTypeInfo->m_fUnsignedAttribute)))
  1407. string += _T("<n/a>     ");
  1408. else if (m_pGetTypeInfo->m_fUnsignedAttribute)
  1409. string += _T("Yes       ");
  1410. else
  1411. string += _T("No        ");
  1412. if (m_pGetTypeInfo->IsFieldNull(&(m_pGetTypeInfo->m_fAutoIncrement)))
  1413. string += _T("<n/a>     ");
  1414. else if (m_pGetTypeInfo->m_fAutoIncrement)
  1415. string += _T("Yes       ");
  1416. else
  1417. string += _T("No        ");
  1418. if (m_pGetTypeInfo->m_bMoney)
  1419. string += _T("Yes    ");
  1420. else
  1421. string += _T("No     ");
  1422. if (m_pGetTypeInfo->m_bCaseSensitive)
  1423. string += _T("Yesn");
  1424. else
  1425. string += _T("Non");
  1426. file.WriteString(string);
  1427. m_pGetTypeInfo->MoveNext();
  1428. }
  1429. file.WriteString(_T("n"));
  1430. m_pGetTypeInfo->Close();
  1431. delete m_pGetTypeInfo;
  1432. file.WriteString(_T("Native type         Lit. Prefix,Suffix  Create Params    Searchablen"));
  1433. file.WriteString(_T("-----------         ------------------  -------------    ----------n"));
  1434. m_pGetTypeInfo = new CGetTypeInfo(m_pDatabase);
  1435. m_pGetTypeInfo->Open();
  1436. while (!m_pGetTypeInfo->IsEOF())
  1437. {
  1438. string = m_pGetTypeInfo->m_strTypeName;
  1439. while (string.GetLength() < 20)
  1440. string += ' ';
  1441. if (m_pGetTypeInfo->IsFieldNull(&(m_pGetTypeInfo->m_strLiteralPrefix)))
  1442. workString = _T("<n/a>");
  1443. else
  1444. workString = m_pGetTypeInfo->m_strLiteralPrefix;
  1445. workString += ',';
  1446. if (m_pGetTypeInfo->IsFieldNull(&(m_pGetTypeInfo->m_strLiteralSuffix)))
  1447. workString += _T("<n/a>");
  1448. else
  1449. workString += m_pGetTypeInfo->m_strLiteralSuffix;
  1450. while (workString.GetLength() < 20)
  1451. workString += ' ';
  1452. string += workString;
  1453. if (m_pGetTypeInfo->IsFieldNull(&(m_pGetTypeInfo->m_strCreateParams)))
  1454. string += _T("<none>           ");
  1455. else
  1456. {
  1457. workString = m_pGetTypeInfo->m_strCreateParams;
  1458. while (workString.GetLength() < 17)
  1459. workString += ' ';
  1460. string += workString;
  1461. }
  1462. switch (m_pGetTypeInfo->m_fSearchable)
  1463. {
  1464. case SQL_UNSEARCHABLE:
  1465. string += _T("Non");
  1466. break;
  1467. case SQL_LIKE_ONLY:
  1468. string += _T("Only with LIKEn");
  1469. break;
  1470. case SQL_ALL_EXCEPT_LIKE:
  1471. string += _T("with all except LIKEn");
  1472. break;
  1473. case SQL_SEARCHABLE:
  1474. string += _T("Yesn");
  1475. break;
  1476. }
  1477. file.WriteString(string);
  1478. m_pGetTypeInfo->MoveNext();
  1479. }
  1480. file.WriteString(_T("n"));
  1481. m_pGetTypeInfo->Close();
  1482. delete m_pGetTypeInfo;
  1483. file.WriteString(_T("Native type         Convert() Conversionsn"));
  1484. file.WriteString(_T("-----------         ---------------------n"));
  1485. m_pGetTypeInfo = new CGetTypeInfo(m_pDatabase);
  1486. m_pGetTypeInfo->Open();
  1487. while (!m_pGetTypeInfo->IsEOF())
  1488. {
  1489. string = m_pGetTypeInfo->m_strTypeName;
  1490. while (string.GetLength() < 20)
  1491. string += ' ';
  1492. switch (m_pGetTypeInfo->m_fDataType)
  1493. {
  1494. case SQL_BIGINT:
  1495. value = SQLGetInfoLong(SQL_CONVERT_BIGINT);
  1496. break;
  1497. case SQL_BINARY:
  1498. value = SQLGetInfoLong(SQL_CONVERT_BINARY);
  1499. break;
  1500. case SQL_BIT:
  1501. value = SQLGetInfoLong(SQL_CONVERT_BIT);
  1502. break;
  1503. case SQL_CHAR:
  1504. value = SQLGetInfoLong(SQL_CONVERT_CHAR);
  1505. break;
  1506. case SQL_DATE:
  1507. value = SQLGetInfoLong(SQL_CONVERT_DATE);
  1508. break;
  1509. case SQL_DECIMAL:
  1510. value = SQLGetInfoLong(SQL_CONVERT_DECIMAL);
  1511. break;
  1512. case SQL_DOUBLE:
  1513. value = SQLGetInfoLong(SQL_CONVERT_DOUBLE);
  1514. break;
  1515. case SQL_FLOAT:
  1516. value = SQLGetInfoLong(SQL_CONVERT_FLOAT);
  1517. break;
  1518. case SQL_INTEGER:
  1519. value = SQLGetInfoLong(SQL_CONVERT_INTEGER);
  1520. break;
  1521. case SQL_LONGVARBINARY:
  1522. value = SQLGetInfoLong(SQL_CONVERT_LONGVARBINARY);
  1523. break;
  1524. case SQL_LONGVARCHAR:
  1525. value = SQLGetInfoLong(SQL_CONVERT_LONGVARCHAR);
  1526. break;
  1527. case SQL_NUMERIC:
  1528. value = SQLGetInfoLong(SQL_CONVERT_NUMERIC);
  1529. break;
  1530. case SQL_REAL:
  1531. value = SQLGetInfoLong(SQL_CONVERT_REAL);
  1532. break;
  1533. case SQL_SMALLINT:
  1534. value = SQLGetInfoLong(SQL_CONVERT_SMALLINT);
  1535. break;
  1536. case SQL_TIME:
  1537. value = SQLGetInfoLong(SQL_CONVERT_TIME);
  1538. break;
  1539. case SQL_TIMESTAMP:
  1540. value = SQLGetInfoLong(SQL_CONVERT_TIMESTAMP);
  1541. break;
  1542. case SQL_TINYINT:
  1543. value = SQLGetInfoLong(SQL_CONVERT_TINYINT);
  1544. break;
  1545. case SQL_VARBINARY:
  1546. value = SQLGetInfoLong(SQL_CONVERT_VARBINARY);
  1547. break;
  1548. case SQL_VARCHAR:
  1549. value = SQLGetInfoLong(SQL_CONVERT_VARCHAR);
  1550. break;
  1551. default:
  1552. value = 0;
  1553. break;
  1554. }
  1555. if (!value)
  1556. string += _T("<none>");
  1557. else
  1558. {
  1559. BOOL    b = FALSE;
  1560. PrintConversions(b,value,SQL_CVT_BIGINT,string,_T("SQL_BIGINT"),file);
  1561. PrintConversions(b,value,SQL_CVT_BINARY,string,_T("SQL_BINARY"),file);
  1562. PrintConversions(b,value,SQL_CVT_BIT,string,_T("SQL_BIT"),file);
  1563. PrintConversions(b,value,SQL_CVT_CHAR,string,_T("SQL_CHAR"),file);
  1564. PrintConversions(b,value,SQL_CVT_DATE,string,_T("SQL_DATE"),file);
  1565. PrintConversions(b,value,SQL_CVT_DECIMAL,string,_T("SQL_DECIMAL"),file);
  1566. PrintConversions(b,value,SQL_CVT_DOUBLE,string,_T("SQL_DOUBLE"),file);
  1567. PrintConversions(b,value,SQL_CVT_FLOAT,string,_T("SQL_FLOAT"),file);
  1568. PrintConversions(b,value,SQL_CVT_INTEGER,string,_T("SQL_INTEGER"),file);
  1569. PrintConversions(b,value,SQL_CVT_LONGVARBINARY,string,_T("SQL_LONGVARBINARY"),file);
  1570. PrintConversions(b,value,SQL_CVT_LONGVARCHAR,string,_T("SQL_LONGVARCHAR"),file);
  1571. PrintConversions(b,value,SQL_CVT_NUMERIC,string,_T("SQL_NUMERIC"),file);
  1572. PrintConversions(b,value,SQL_CVT_REAL,string,_T("SQL_REAL"),file);
  1573. PrintConversions(b,value,SQL_CVT_SMALLINT,string,_T("SQL_SMALLINT"),file);
  1574. PrintConversions(b,value,SQL_CVT_TIME,string,_T("SQL_TIME"),file);
  1575. PrintConversions(b,value,SQL_CVT_TIMESTAMP,string,_T("SQL_TIMESTAMP"),file);
  1576. PrintConversions(b,value,SQL_CVT_TINYINT,string,_T("SQL_TINYINT"),file);
  1577. PrintConversions(b,value,SQL_CVT_VARBINARY,string,_T("SQL_VARBINARY"),file);
  1578. PrintConversions(b,value,SQL_CVT_VARCHAR,string,_T("SQL_VARCHAR"),file);
  1579. }
  1580. string += _T("nn");
  1581. file.WriteString(string);
  1582. m_pGetTypeInfo->MoveNext();
  1583. }
  1584. file.WriteString(_T("n"));
  1585. m_pGetTypeInfo->Close();
  1586. delete m_pGetTypeInfo;
  1587. m_pGetTypeInfo = 0;
  1588. file.WriteString(_T("n"));
  1589. }
  1590. }
  1591. void CDataTypes::PrintConversions(BOOL& flag,SDWORD value,SDWORD mask,
  1592.   CString& string,const CString& strType,CStdioFile& file)
  1593. {
  1594. CString workString;
  1595. if (value & mask)
  1596. {
  1597. if (string.GetLength() + strType.GetLength() > 75)
  1598. {
  1599. string += _T("n");
  1600. file.WriteString(string);
  1601. string = _T("                    ") + strType;
  1602. }
  1603. else
  1604. {
  1605. if (flag)
  1606. string += _T(",");
  1607. string += strType;
  1608. }
  1609. flag = TRUE;
  1610. }
  1611. }
  1612. void CDataTypes::DoDataExchange(CDataExchange* pDX)
  1613. {
  1614. CPropertyPage::DoDataExchange(pDX);
  1615. //{{AFX_DATA_MAP(CDataTypes)
  1616. DDX_Control(pDX, IDC_CONVERSIONS, m_lbConversions);
  1617. DDX_Control(pDX, IDC_DATA_TYPE_LIST, m_lbDataTypes);
  1618. DDX_Text(pDX, IDC_SQL_TYPE, m_strSqlType);
  1619. DDX_Text(pDX, IDC_PRECISION, m_strPrecision);
  1620. DDX_Text(pDX, IDD_PREFIX_SUFFIX, m_strPrefixSuffix);
  1621. DDX_Text(pDX, IDD_CREATE_PARAMS, m_strCreateParams);
  1622. DDX_Text(pDX, IDC_NULLABLE, m_strNullable);
  1623. DDX_Text(pDX, IDC_CASE_SENSITIVE, m_strCaseSensitive);
  1624. DDX_Text(pDX, IDC_SEARCHABLE, m_strSearchable);
  1625. DDX_Text(pDX, IDC_MONEY, m_strMoney);
  1626. DDX_Text(pDX, IDC_UNSIGNED, m_strUnsigned);
  1627. DDX_Text(pDX, IDC_AUTO_INCREMENT, m_strAutoIncrement);
  1628. DDX_Text(pDX, IDC_MAXIMUM_SCALE, m_strMaximumScale);
  1629. DDX_Text(pDX, IDC_MINIMUM_SCALE, m_strMinimumScale);
  1630. //}}AFX_DATA_MAP
  1631. }
  1632. BEGIN_MESSAGE_MAP(CDataTypes, CPropertyPage)
  1633. //{{AFX_MSG_MAP(CDataTypes)
  1634. ON_LBN_SELCHANGE(IDC_DATA_TYPE_LIST, OnSelchangeDataTypeList)
  1635. //}}AFX_MSG_MAP
  1636. END_MESSAGE_MAP()
  1637. /////////////////////////////////////////////////////////////////////////////
  1638. // CDataTypes message handlers
  1639. void CDataTypes::OnNewDSN()
  1640. {
  1641. if (IsWindow(m_hWnd) && m_pDatabase->IsOpen())
  1642. {
  1643. if (m_pGetTypeInfo)
  1644. {
  1645. if (m_pGetTypeInfo->IsOpen())
  1646. m_pGetTypeInfo->Close();
  1647. delete m_pGetTypeInfo;
  1648. }
  1649. // delete type data list
  1650. TYPEDATA*   p1 = m_pTypeDataHead;
  1651. TYPEDATA*   p2;
  1652. while (p1)
  1653. {
  1654. p2 = p1;
  1655. p1 = p1->pNext;
  1656. delete p2;
  1657. }
  1658. m_pTypeDataHead = m_pTypeDataTail = 0;
  1659. m_lbDataTypes.ResetContent();
  1660. m_pGetTypeInfo = new CGetTypeInfo(m_pDatabase);
  1661. m_pGetTypeInfo->Open();
  1662. while (!m_pGetTypeInfo->IsEOF())
  1663. {
  1664. TYPEDATA*   pTypeData = new TYPEDATA;
  1665. pTypeData->strTypeName = m_pGetTypeInfo->m_strTypeName;
  1666. pTypeData->nSqlType = m_pGetTypeInfo->m_fDataType;
  1667. if (m_pGetTypeInfo->IsFieldNull(&(m_pGetTypeInfo->m_nPrecision)))
  1668. pTypeData->nPrecision = -1;
  1669. else
  1670. pTypeData->nPrecision = m_pGetTypeInfo->m_nPrecision;
  1671. if (m_pGetTypeInfo->IsFieldNull(&(m_pGetTypeInfo->m_strLiteralPrefix)))
  1672. pTypeData->strLiteralPrefix = "";
  1673. else
  1674. pTypeData->strLiteralPrefix = m_pGetTypeInfo->m_strLiteralPrefix;
  1675. if (m_pGetTypeInfo->IsFieldNull(&(m_pGetTypeInfo->m_strLiteralSuffix)))
  1676. pTypeData->strLiteralSuffix = "";
  1677. else
  1678. pTypeData->strLiteralSuffix = m_pGetTypeInfo->m_strLiteralSuffix;
  1679. if (m_pGetTypeInfo->IsFieldNull(&(m_pGetTypeInfo->m_strCreateParams)))
  1680. pTypeData->strCreateParams = "";
  1681. else
  1682. pTypeData->strCreateParams = m_pGetTypeInfo->m_strCreateParams;
  1683. pTypeData->nNullable = m_pGetTypeInfo->m_fNullable;
  1684. pTypeData->bCaseSensitive = m_pGetTypeInfo->m_bCaseSensitive;
  1685. pTypeData->nSearchable = m_pGetTypeInfo->m_fSearchable;
  1686. if (m_pGetTypeInfo->IsFieldNull(
  1687. &(m_pGetTypeInfo->m_fUnsignedAttribute)))
  1688. {
  1689. pTypeData->nUnsigned = -1;
  1690. }
  1691. else if (m_pGetTypeInfo->m_fUnsignedAttribute)
  1692. pTypeData->nUnsigned = 1;
  1693. else
  1694. pTypeData->nUnsigned = 0;
  1695. pTypeData->bMoney = m_pGetTypeInfo->m_bMoney;
  1696. if (m_pGetTypeInfo->IsFieldNull(
  1697. &(m_pGetTypeInfo->m_fAutoIncrement)))
  1698. {
  1699. pTypeData->nAutoIncrement = -1;
  1700. }
  1701. else if (m_pGetTypeInfo->m_fAutoIncrement)
  1702. pTypeData->nAutoIncrement = 1;
  1703. else
  1704. pTypeData->nAutoIncrement = 0;
  1705. if (m_pGetTypeInfo->IsFieldNull(&(m_pGetTypeInfo->m_nMinimumScale)))
  1706. pTypeData->nMinimumScale = -1;
  1707. else
  1708. pTypeData->nMinimumScale = m_pGetTypeInfo->m_nMinimumScale;
  1709. if (m_pGetTypeInfo->IsFieldNull(&(m_pGetTypeInfo->m_nMaximumScale)))
  1710. pTypeData->nMaximumScale = -1;
  1711. else
  1712. pTypeData->nMaximumScale = m_pGetTypeInfo->m_nMaximumScale;
  1713. pTypeData->pNext = 0;
  1714. InsertTypeData(pTypeData);
  1715. m_lbDataTypes.AddString(m_pGetTypeInfo->m_strTypeName);
  1716. m_pGetTypeInfo->MoveNext();
  1717. }
  1718. m_pGetTypeInfo->Close();
  1719. delete m_pGetTypeInfo;
  1720. m_pGetTypeInfo = 0;
  1721. if (m_lbDataTypes.GetCount())
  1722. {
  1723. m_lbDataTypes.SetCurSel(0);
  1724. OnSelchangeDataTypeList();
  1725. }
  1726. }
  1727. }
  1728. void CDataTypes::InsertTypeData(TYPEDATA* pTypeData)
  1729. {
  1730. TYPEDATA*   p1 = m_pTypeDataTail;
  1731. if (!p1)
  1732. m_pTypeDataHead = m_pTypeDataTail = pTypeData;
  1733. else
  1734. {
  1735. p1->pNext = pTypeData;
  1736. m_pTypeDataTail = pTypeData;
  1737. }
  1738. }
  1739. BOOL CDataTypes::OnInitDialog()
  1740. {
  1741. CWaitCursor wait;
  1742. CPropertyPage::OnInitDialog();
  1743. OnNewDSN();
  1744. return TRUE;  // return TRUE unless you set the focus to a control
  1745.   // EXCEPTION: OCX Property Pages should return FALSE
  1746. }
  1747. void CDataTypes::OnSelchangeDataTypeList()
  1748. {
  1749. if (m_pTypeDataHead)
  1750. {
  1751. CString string;
  1752. m_lbDataTypes.GetText(m_lbDataTypes.GetCurSel(),string);
  1753. TYPEDATA* pTypeData = m_pTypeDataHead;
  1754. while (pTypeData)
  1755. {
  1756. if (pTypeData->strTypeName == string)
  1757. break;
  1758. pTypeData = pTypeData->pNext;
  1759. }
  1760. if (pTypeData)
  1761. {
  1762. // note: table lookup would be bettter here
  1763. switch (pTypeData->nSqlType)
  1764. {
  1765. case SQL_BIGINT:
  1766. m_strSqlType = _T("SQL_BIGINT");
  1767. ShowConversions(SQLGetInfoLong(SQL_CONVERT_BIGINT));
  1768. break;
  1769. case SQL_BINARY:
  1770. m_strSqlType = _T("SQL_BINARY");
  1771. ShowConversions(SQLGetInfoLong(SQL_CONVERT_BINARY));
  1772. break;
  1773. case SQL_BIT:
  1774. m_strSqlType = _T("SQL_BIT");
  1775. ShowConversions(SQLGetInfoLong(SQL_CONVERT_BIT));
  1776. break;
  1777. case SQL_CHAR:
  1778. m_strSqlType = _T("SQL_CHAR");
  1779. ShowConversions(SQLGetInfoLong(SQL_CONVERT_CHAR));
  1780. break;
  1781. case SQL_DATE:
  1782. m_strSqlType = _T("SQL_DATE");
  1783. ShowConversions(SQLGetInfoLong(SQL_CONVERT_DATE));
  1784. break;
  1785. case SQL_DECIMAL:
  1786. m_strSqlType = _T("SQL_DECIMAL");
  1787. ShowConversions(SQLGetInfoLong(SQL_CONVERT_DECIMAL));
  1788. break;
  1789. case SQL_DOUBLE:
  1790. m_strSqlType = _T("SQL_DOUBLE");
  1791. ShowConversions(SQLGetInfoLong(SQL_CONVERT_DOUBLE));
  1792. break;
  1793. case SQL_FLOAT:
  1794. m_strSqlType = _T("SQL_FLOAT");
  1795. ShowConversions(SQLGetInfoLong(SQL_CONVERT_FLOAT));
  1796. break;
  1797. case SQL_INTEGER:
  1798. m_strSqlType = _T("SQL_INTEGER");
  1799. ShowConversions(SQLGetInfoLong(SQL_CONVERT_INTEGER));
  1800. break;
  1801. case SQL_LONGVARBINARY:
  1802. m_strSqlType = _T("SQL_LONGVARBINARY");
  1803. ShowConversions(SQLGetInfoLong(SQL_CONVERT_LONGVARBINARY));
  1804. break;
  1805. case SQL_LONGVARCHAR:
  1806. m_strSqlType = _T("SQL_LONGVARCHAR");
  1807. ShowConversions(SQLGetInfoLong(SQL_CONVERT_LONGVARCHAR));
  1808. break;
  1809. case SQL_NUMERIC:
  1810. m_strSqlType = _T("SQL_NUMERIC");
  1811. ShowConversions(SQLGetInfoLong(SQL_CONVERT_NUMERIC));
  1812. break;
  1813. case SQL_REAL:
  1814. m_strSqlType = _T("SQL_REAL");
  1815. ShowConversions(SQLGetInfoLong(SQL_CONVERT_REAL));
  1816. break;
  1817. case SQL_SMALLINT:
  1818. m_strSqlType = _T("SQL_SMALLINT");
  1819. ShowConversions(SQLGetInfoLong(SQL_CONVERT_SMALLINT));
  1820. break;
  1821. case SQL_TIME:
  1822. m_strSqlType = _T("SQL_TIME");
  1823. ShowConversions(SQLGetInfoLong(SQL_CONVERT_TIME));
  1824. break;
  1825. case SQL_TIMESTAMP:
  1826. m_strSqlType = _T("SQL_TIMESTAMP");
  1827. ShowConversions(SQLGetInfoLong(SQL_CONVERT_TIMESTAMP));
  1828. break;
  1829. case SQL_TINYINT:
  1830. m_strSqlType = _T("SQL_TINYINT");
  1831. ShowConversions(SQLGetInfoLong(SQL_CONVERT_TINYINT));
  1832. break;
  1833. case SQL_VARBINARY:
  1834. m_strSqlType = _T("SQL_VARBINARY");
  1835. ShowConversions(SQLGetInfoLong(SQL_CONVERT_VARBINARY));
  1836. break;
  1837. case SQL_VARCHAR:
  1838. m_strSqlType = _T("SQL_VARCHAR");
  1839. ShowConversions(SQLGetInfoLong(SQL_CONVERT_VARCHAR));
  1840. break;
  1841. default:
  1842. m_strSqlType = _T("<new or driver-specific type>");
  1843. ShowConversions(0);
  1844. break;
  1845. }
  1846. if (pTypeData->nPrecision == -1)
  1847. m_strPrecision = _T("<n/a>");
  1848. else
  1849. m_strPrecision.Format("%d",pTypeData->nPrecision);
  1850. if (pTypeData->strLiteralPrefix == "")
  1851. m_strPrefixSuffix = _T("<n/a>");
  1852. else
  1853. m_strPrefixSuffix = pTypeData->strLiteralPrefix;
  1854. m_strPrefixSuffix += ",";
  1855. if (pTypeData->strLiteralSuffix == "")
  1856. m_strPrefixSuffix += _T("<n/a>");
  1857. else
  1858. m_strPrefixSuffix += pTypeData->strLiteralSuffix;
  1859. if (pTypeData->strCreateParams == "")
  1860. m_strCreateParams = _T("<none>");
  1861. else
  1862. m_strCreateParams = pTypeData->strCreateParams;
  1863. switch (pTypeData->nNullable)
  1864. {
  1865. case SQL_NO_NULLS:
  1866. m_strNullable = _T("No");
  1867. break;
  1868. case SQL_NULLABLE:
  1869. m_strNullable = _T("Yes");
  1870. break;
  1871. case SQL_NULLABLE_UNKNOWN:
  1872. m_strNullable = _T("Unknown");
  1873. break;
  1874. }
  1875. if (pTypeData->bCaseSensitive)
  1876. m_strCaseSensitive = _T("Yes");
  1877. else
  1878. m_strCaseSensitive = _T("No");
  1879. switch (pTypeData->nSearchable)
  1880. {
  1881. case SQL_UNSEARCHABLE:
  1882. m_strSearchable = _T("No");
  1883. break;
  1884. case SQL_LIKE_ONLY:
  1885. m_strSearchable = _T("Only with LIKE");
  1886. break;
  1887. case SQL_ALL_EXCEPT_LIKE:
  1888. m_strSearchable = _T("with all except LIKE");
  1889. break;
  1890. case SQL_SEARCHABLE:
  1891. m_strSearchable = _T("Yes");
  1892. break;
  1893. }
  1894. switch (pTypeData->nUnsigned)
  1895. {
  1896. case -1:
  1897. m_strUnsigned = _T("<n/a>");
  1898. break;
  1899. case 0:
  1900. m_strUnsigned = _T("No");
  1901. break;
  1902. case 1:
  1903. m_strUnsigned = _T("Yes");
  1904. break;
  1905. }
  1906. if (pTypeData->bMoney)
  1907. m_strMoney = _T("Yes");
  1908. else
  1909. m_strMoney = _T("No");
  1910. switch (pTypeData->nAutoIncrement)
  1911. {
  1912. case -1:
  1913. m_strAutoIncrement = _T("<n/a>");
  1914. break;
  1915. case 0:
  1916. m_strAutoIncrement = _T("No");
  1917. break;
  1918. case 1:
  1919. m_strAutoIncrement = _T("Yes");
  1920. break;
  1921. }
  1922. if (pTypeData->nMinimumScale == -1)
  1923. m_strMinimumScale = _T("<n/a>");
  1924. else
  1925. m_strMinimumScale.Format(_T("%d"),pTypeData->nMinimumScale);
  1926. if (pTypeData->nMaximumScale == -1)
  1927. m_strMaximumScale = _T("<n/a>");
  1928. else
  1929. m_strMaximumScale.Format(_T("%d"),pTypeData->nMaximumScale);
  1930. }
  1931. else
  1932. m_strSqlType = _T("<n/a>?");
  1933. }
  1934. else
  1935. m_strSqlType = _T("<n/a>");
  1936. UpdateData(FALSE);
  1937. }
  1938. void CDataTypes::ShowConversions(SDWORD dwDataType)
  1939. {
  1940. m_lbConversions.ResetContent();
  1941. if (!dwDataType)
  1942. m_lbConversions.AddString(_T("<none>"));
  1943. else
  1944. {
  1945. if (dwDataType & SQL_CVT_BIGINT)
  1946. m_lbConversions.AddString(_T("SQL_BIGINT"));
  1947. if (dwDataType & SQL_CVT_BINARY)
  1948. m_lbConversions.AddString(_T("SQL_BINARY"));
  1949. if (dwDataType & SQL_CVT_BIT)
  1950. m_lbConversions.AddString(_T("SQL_BIT"));
  1951. if (dwDataType & SQL_CVT_CHAR)
  1952. m_lbConversions.AddString(_T("SQL_CHAR"));
  1953. if (dwDataType & SQL_CVT_DATE)
  1954. m_lbConversions.AddString(_T("SQL_DATE"));
  1955. if (dwDataType & SQL_CVT_DECIMAL)
  1956. m_lbConversions.AddString(_T("SQL_DECIMAL"));
  1957. if (dwDataType & SQL_CVT_DOUBLE)
  1958. m_lbConversions.AddString(_T("SQL_DOUBLE"));
  1959. if (dwDataType & SQL_CVT_FLOAT)
  1960. m_lbConversions.AddString(_T("SQL_FLOAT"));
  1961. if (dwDataType & SQL_CVT_INTEGER)
  1962. m_lbConversions.AddString(_T("SQL_INTEGER"));
  1963. if (dwDataType & SQL_CVT_LONGVARBINARY)
  1964. m_lbConversions.AddString(_T("SQL_LONGVARBINARY"));
  1965. if (dwDataType & SQL_CVT_LONGVARCHAR)
  1966. m_lbConversions.AddString(_T("SQL_LONGVARCHAR"));
  1967. if (dwDataType & SQL_CVT_NUMERIC)
  1968. m_lbConversions.AddString(_T("SQL_NUMERIC"));
  1969. if (dwDataType & SQL_CVT_REAL)
  1970. m_lbConversions.AddString(_T("SQL_REAL"));
  1971. if (dwDataType & SQL_CVT_SMALLINT)
  1972. m_lbConversions.AddString(_T("SQL_SMALLINT"));
  1973. if (dwDataType & SQL_CVT_TIME)
  1974. m_lbConversions.AddString(_T("SQL_TIME"));
  1975. if (dwDataType & SQL_CVT_TIMESTAMP)
  1976. m_lbConversions.AddString(_T("SQL_TIMESTAMP"));
  1977. if (dwDataType & SQL_CVT_TINYINT)
  1978. m_lbConversions.AddString(_T("SQL_TINYINT"));
  1979. if (dwDataType & SQL_CVT_VARBINARY)
  1980. m_lbConversions.AddString(_T("SQL_VARBINARY"));
  1981. if (dwDataType & SQL_CVT_VARCHAR)
  1982. m_lbConversions.AddString(_T("SQL_VARCHAR"));
  1983. }
  1984. }
  1985. /////////////////////////////////////////////////////////////////////////////
  1986. // CIdentifiers property page
  1987. IMPLEMENT_DYNCREATE(CIdentifiers, CPropertyPage)
  1988. CIdentifiers::CIdentifiers(CDatabase* pDatabase)
  1989.  : CMyPage(pDatabase,CIdentifiers::IDD)
  1990. {
  1991. //{{AFX_DATA_INIT(CIdentifiers)
  1992. m_strSqlIdentifierCase = _T("");
  1993. m_strSqlIdentifierQuoteChar = _T("");
  1994. m_strSqlOwnerTerm = _T("");
  1995. m_strSqlProcedureTerm = _T("");
  1996. m_strSqlQualifierLocation = _T("");
  1997. m_strSqlQualifierNameSeparator = _T("");
  1998. m_strSqlQualifierTerm = _T("");
  1999. m_strSqlQuotedIdentifierCase = _T("");
  2000. m_strSqlSearchPatternEscape = _T("");
  2001. m_strSqlTableTerm = _T("");
  2002. m_strSqlSpecialCharacters = _T("");
  2003. //}}AFX_DATA_INIT
  2004. OnNewDSN();
  2005. }
  2006. CIdentifiers::~CIdentifiers()
  2007. {
  2008. }
  2009. void CIdentifiers::DumpToFile(CStdioFile& file)
  2010. {
  2011. if (m_pDatabase->IsOpen())
  2012. {
  2013. CString bufferString;
  2014. CString string;
  2015. CString workString;
  2016. file.WriteString(_T("Identifiersn-----------nn"));
  2017. file.WriteString(_T("Driver-Specific Keywords:n-------------------------n"));
  2018. char    buffer[32000];
  2019. SWORD   cbData;
  2020. ::SQLGetInfo(m_pDatabase->m_hdbc,SQL_KEYWORDS,
  2021. (PTR)buffer,32000,&cbData);
  2022. bufferString = buffer;
  2023. int     n;
  2024. string = "";
  2025. BOOL    b = FALSE;
  2026. while ((n = bufferString.Find(',')) != -1)
  2027. {
  2028. workString = bufferString.Left(n);
  2029. bufferString = bufferString.Right(bufferString.GetLength() - n - 1);
  2030. if (string.GetLength() + workString.GetLength() > 75)
  2031. {
  2032. string += _T("n");
  2033. file.WriteString(string);
  2034. string = workString;
  2035. }
  2036. else
  2037. {
  2038. if (b)
  2039. string += _T(",");
  2040. string += workString;
  2041. }
  2042. b = TRUE;
  2043. }
  2044. string += _T("nn");
  2045. file.WriteString(string);
  2046. string.Format(_T("          Identifier Case - %sn"),m_strSqlIdentifierCase);
  2047. file.WriteString(string);
  2048. string.Format(_T("   Quoted Identifier Case - %sn"),m_strSqlQuotedIdentifierCase);
  2049. file.WriteString(string);
  2050. string.Format(_T("    Search Pattern Escape - %sn"),m_strSqlSearchPatternEscape);
  2051. file.WriteString(string);
  2052. string.Format(_T("    Identifier Quote Char - %sn"),m_strSqlIdentifierQuoteChar);
  2053. file.WriteString(string);
  2054. string.Format(_T("       Qualifier Location - %sn"),m_strSqlQualifierLocation);
  2055. file.WriteString(string);
  2056. string.Format(_T("      Qualifier Separator - %sn"),m_strSqlQualifierNameSeparator);
  2057. file.WriteString(string);
  2058. string.Format(_T("               Owner Term - %sn"),m_strSqlOwnerTerm);
  2059. file.WriteString(string);
  2060. string.Format(_T("           Procedure Term - %sn"),m_strSqlProcedureTerm);
  2061. file.WriteString(string);
  2062. string.Format(_T("           Qualifier Term - %sn"),m_strSqlQualifierTerm);
  2063. file.WriteString(string);
  2064. string.Format(_T("                TableTerm - %snn"),m_strSqlTableTerm);
  2065. file.WriteString(string);
  2066. file.WriteString(_T("Special Characters:n-------------------n"));
  2067. if (m_strSqlSpecialCharacters.GetLength() == 0)
  2068. file.WriteString(_T("<none>nn"));
  2069. else
  2070. {
  2071. string = m_strSqlSpecialCharacters;
  2072. while (string.GetLength() > 75)
  2073. {
  2074. workString = string.Left(75);
  2075. string = string.Right(string.GetLength() - n - 1);
  2076. workString += _T("n");
  2077. file.WriteString(workString);
  2078. }
  2079. string += _T("n");
  2080. file.WriteString(string);
  2081. }
  2082. file.WriteString(_T("n"));
  2083. }
  2084. }
  2085. void CIdentifiers::DoDataExchange(CDataExchange* pDX)
  2086. {
  2087. CPropertyPage::DoDataExchange(pDX);
  2088. //{{AFX_DATA_MAP(CIdentifiers)
  2089. DDX_Control(pDX, IDC_DRIVER_KEYWORDS, m_lbDriverKeywords);
  2090. DDX_Control(pDX, IDC_ODBC_KEYWORDS, m_lbOdbcKeywords);
  2091. DDX_Text(pDX, IDC_SQL_IDENTIFIER_CASE, m_strSqlIdentifierCase);
  2092. DDX_Text(pDX, IDC_SQL_IDENTIFIER_QUOTE_CHAR, m_strSqlIdentifierQuoteChar);
  2093. DDX_Text(pDX, IDC_SQL_OWNER_TERM, m_strSqlOwnerTerm);
  2094. DDX_Text(pDX, IDC_SQL_PROCEDURE_TERM, m_strSqlProcedureTerm);
  2095. DDX_Text(pDX, IDC_SQL_QUALIFIER_LOCATION, m_strSqlQualifierLocation);
  2096. DDX_Text(pDX, IDC_SQL_QUALIFIER_NAME_SEPARATOR, m_strSqlQualifierNameSeparator);
  2097. DDX_Text(pDX, IDC_SQL_QUALIFIER_TERM, m_strSqlQualifierTerm);
  2098. DDX_Text(pDX, IDC_SQL_QUOTED_IDENTIFIER_CASE, m_strSqlQuotedIdentifierCase);
  2099. DDX_Text(pDX, IDC_SQL_SEARCH_PATTERN_ESCAPE, m_strSqlSearchPatternEscape);
  2100. DDX_Text(pDX, IDC_SQL_TABLE_TERM, m_strSqlTableTerm);
  2101. DDX_Text(pDX, IDC_SQL_SPECIAL_CHARACTERS, m_strSqlSpecialCharacters);
  2102. //}}AFX_DATA_MAP
  2103. }
  2104. BEGIN_MESSAGE_MAP(CIdentifiers, CPropertyPage)
  2105. //{{AFX_MSG_MAP(CIdentifiers)
  2106. //}}AFX_MSG_MAP
  2107. END_MESSAGE_MAP()
  2108. /////////////////////////////////////////////////////////////////////////////
  2109. // CIdentifiers message handlers
  2110. void CIdentifiers::OnNewDSN()
  2111. {
  2112. if (m_pDatabase->IsOpen())
  2113. {
  2114. switch (SQLGetInfoShort(SQL_IDENTIFIER_CASE))
  2115. {
  2116. case SQL_IC_UPPER:
  2117. m_strSqlIdentifierCase = _T("Upper");
  2118. break;
  2119. case SQL_IC_LOWER:
  2120. m_strSqlIdentifierCase = _T("Lower");
  2121. break;
  2122. case SQL_IC_SENSITIVE:
  2123. m_strSqlIdentifierCase = _T("Sensitive");
  2124. break;
  2125. case SQL_IC_MIXED:
  2126. m_strSqlIdentifierCase = _T("Mixed");
  2127. break;
  2128. }
  2129. m_strSqlIdentifierQuoteChar = SQLGetInfoString(SQL_IDENTIFIER_QUOTE_CHAR);
  2130. m_strSqlOwnerTerm = SQLGetInfoString(SQL_OWNER_TERM);
  2131. m_strSqlProcedureTerm = SQLGetInfoString(SQL_PROCEDURE_TERM);
  2132. switch (SQLGetInfoShort(SQL_QUALIFIER_LOCATION))
  2133. {
  2134. case SQL_QL_START:
  2135. m_strSqlQualifierLocation = _T("Start");
  2136. break;
  2137. case SQL_QL_END:
  2138. m_strSqlQualifierLocation = _T("End");
  2139. break;
  2140. }
  2141. m_strSqlQualifierNameSeparator = SQLGetInfoString(SQL_QUALIFIER_NAME_SEPARATOR);
  2142. m_strSqlQualifierTerm = SQLGetInfoString(SQL_QUALIFIER_TERM);
  2143. switch (SQLGetInfoShort(SQL_QUOTED_IDENTIFIER_CASE))
  2144. {
  2145. case SQL_IC_UPPER:
  2146. m_strSqlQuotedIdentifierCase = _T("Upper");
  2147. break;
  2148. case SQL_IC_LOWER:
  2149. m_strSqlQuotedIdentifierCase = _T("Lower");
  2150. break;
  2151. case SQL_IC_SENSITIVE:
  2152. m_strSqlQuotedIdentifierCase = _T("Sensitive");
  2153. break;
  2154. case SQL_IC_MIXED:
  2155. m_strSqlQuotedIdentifierCase = _T("Mixed");
  2156. break;
  2157. }
  2158. m_strSqlSearchPatternEscape = SQLGetInfoString(SQL_SEARCH_PATTERN_ESCAPE);
  2159. m_strSqlSpecialCharacters = SQLGetInfoString(SQL_SPECIAL_CHARACTERS);
  2160. m_strSqlTableTerm = SQLGetInfoString(SQL_TABLE_TERM);
  2161. if (IsWindow(m_hWnd))
  2162. {
  2163. char    buffer[32000];
  2164. SWORD   cbData;
  2165. ::SQLGetInfo(m_pDatabase->m_hdbc,SQL_KEYWORDS,
  2166. (PTR)buffer,32000,&cbData);
  2167. CString string = buffer;
  2168. int     n;
  2169. m_lbDriverKeywords.ResetContent();
  2170. while ((n = string.Find(',')) != -1)
  2171. {
  2172. m_lbDriverKeywords.AddString(string.Left(n));
  2173. string = string.Right(string.GetLength() - n - 1);
  2174. }
  2175. UpdateData(FALSE);
  2176. }
  2177. }
  2178. }
  2179. BOOL CIdentifiers::OnInitDialog()
  2180. {
  2181. CWaitCursor wait;
  2182. CPropertyPage::OnInitDialog();
  2183. m_lbOdbcKeywords.ResetContent();
  2184. CString string = SQL_ODBC_KEYWORDS;
  2185. int     n;
  2186. while ((n = string.Find(',')) != -1)
  2187. {
  2188. m_lbOdbcKeywords.AddString(string.Left(n));
  2189. string = string.Right(string.GetLength() - n - 1);
  2190. }
  2191. char    buffer[32000];
  2192. SWORD   cbData;
  2193. ::SQLGetInfo(m_pDatabase->m_hdbc,SQL_KEYWORDS,
  2194. (PTR)buffer,32000,&cbData);
  2195. string = buffer;
  2196. m_lbDriverKeywords.ResetContent();
  2197. while ((n = string.Find(',')) != -1)
  2198. {
  2199. m_lbDriverKeywords.AddString(string.Left(n));
  2200. string = string.Right(string.GetLength() - n - 1);
  2201. }
  2202. UpdateData(FALSE);
  2203. return TRUE;  // return TRUE unless you set the focus to a control
  2204.   // EXCEPTION: OCX Property Pages should return FALSE
  2205. }
  2206. /////////////////////////////////////////////////////////////////////////////
  2207. // CLimits property page
  2208. #define NUM_INTERVALS   9
  2209. IMPLEMENT_DYNCREATE(CLimits, CPropertyPage)
  2210. UWORD CLimits::m_nIntervalMasks[] =
  2211. {
  2212. SQL_FN_TSI_FRAC_SECOND,
  2213. SQL_FN_TSI_SECOND,
  2214. SQL_FN_TSI_MINUTE,
  2215. SQL_FN_TSI_HOUR,
  2216. SQL_FN_TSI_DAY,
  2217. SQL_FN_TSI_WEEK,
  2218. SQL_FN_TSI_MONTH,
  2219. SQL_FN_TSI_QUARTER,
  2220. SQL_FN_TSI_YEAR
  2221. };
  2222. char* CLimits::m_szIntervalNames[] =
  2223. {
  2224. _T("Second Fraction"),
  2225. _T("Second"),
  2226. _T("Minute"),
  2227. _T("Hour"),
  2228. _T("Day"),
  2229. _T("Week"),
  2230. _T("Month"),
  2231. _T("Quarter"),
  2232. _T("Year")
  2233. };
  2234. CLimits::CLimits(CDatabase* pDatabase)
  2235.  : CMyPage(pDatabase,CLimits::IDD)
  2236. {
  2237. //{{AFX_DATA_INIT(CLimits)
  2238. m_strSqlMaxBinaryLiteralLen = _T("");
  2239. m_strSqlMaxCharLiteralLen = _T("");
  2240. m_strSqlMaxColumnNameLen = _T("");
  2241. m_strSqlMaxColumnsInGroupBy = _T("");
  2242. m_strSqlMaxColumnsInIndex = _T("");
  2243. m_strSqlMaxColumnsInOrderBy = _T("");
  2244. m_strSqlMaxColumnsInSelect = _T("");
  2245. m_strSqlMaxColumnsInTable = _T("");
  2246. m_strSqlMaxCursorNameLen = _T("");
  2247. m_strSqlMaxIndexSize = _T("");
  2248. m_strSqlMaxOwnerNameLen = _T("");
  2249. m_strSqlMaxProcedureNameLen = _T("");
  2250. m_strSqlMaxQualifierNameLen = _T("");
  2251. m_strSqlMaxRowSize = _T("");
  2252. m_strSqlMaxRowSizeIncludesLong = _T("");
  2253. m_strSqlMaxStatementLen = _T("");
  2254. m_strSqlMaxTableNameLen = _T("");
  2255. m_strSqlMaxTablesInSelect = _T("");
  2256. m_strSqlMaxUserNameLen = _T("");
  2257. //}}AFX_DATA_INIT
  2258. OnNewDSN();
  2259. }
  2260. CLimits::~CLimits()
  2261. {
  2262. }
  2263. void CLimits::DumpToFile(CStdioFile& file)
  2264. {
  2265. if (m_pDatabase->IsOpen())
  2266. {
  2267. CString string;
  2268. BOOL    b;
  2269. file.WriteString(_T("Limitsn------nn"));
  2270. string.Format(_T("Max Binary Literal Length - %sn"),m_strSqlMaxBinaryLiteralLen);
  2271. file.WriteString(string);
  2272. string.Format(_T("  Max Char Literal Length - %sn"),m_strSqlMaxCharLiteralLen);
  2273. file.WriteString(string);
  2274. string.Format(_T("   Max Column Name Length - %sn"),m_strSqlMaxColumnNameLen);
  2275. file.WriteString(string);
  2276. string.Format(_T("  Max Columns in GROUP BY - %sn"),m_strSqlMaxColumnsInGroupBy);
  2277. file.WriteString(string);
  2278. string.Format(_T("     Max Columns in Index - %sn"),m_strSqlMaxColumnsInIndex);
  2279. file.WriteString(string);
  2280. string.Format(_T("  Max Columns in ORDER BY - %sn"),m_strSqlMaxColumnsInOrderBy);
  2281. file.WriteString(string);
  2282. string.Format(_T("    Max Columns in SELECT - %sn"),m_strSqlMaxColumnsInSelect);
  2283. file.WriteString(string);
  2284. string.Format(_T("     Max Columns in Table - %sn"),m_strSqlMaxColumnsInTable);
  2285. file.WriteString(string);
  2286. string.Format(_T("   Max Cursor Name Length - %sn"),m_strSqlMaxCursorNameLen);
  2287. file.WriteString(string);
  2288. string.Format(_T("           Max Index Size - %sn"),m_strSqlMaxIndexSize);
  2289. file.WriteString(string);
  2290. string.Format(_T("    Max Owner Name Length - %sn"),m_strSqlMaxOwnerNameLen);
  2291. file.WriteString(string);
  2292. string.Format(_T("Max Procedure Name Length - %sn"),m_strSqlMaxProcedureNameLen);
  2293. file.WriteString(string);
  2294. string.Format(_T("Max Qualifier Name Length - %sn"),m_strSqlMaxQualifierNameLen);
  2295. file.WriteString(string);
  2296. string.Format(_T("             Max Row Size - %sn"),m_strSqlMaxRowSize);
  2297. file.WriteString(string);
  2298. string.Format(_T("Max Rowsize Includes Long - %sn"),m_strSqlMaxRowSizeIncludesLong);
  2299. file.WriteString(string);
  2300. string.Format(_T("     Max Statement Length - %sn"),m_strSqlMaxStatementLen);
  2301. file.WriteString(string);
  2302. string.Format(_T("    Max Table Name Length - %sn"),m_strSqlMaxTableNameLen);
  2303. file.WriteString(string);
  2304. string.Format(_T("     Max Tables In SELECT - %sn"),m_strSqlMaxTablesInSelect);
  2305. file.WriteString(string);
  2306. string.Format(_T("     Max User Name Length - %snn"),m_strSqlMaxUserNameLen);
  2307. file.WriteString(string);
  2308. if (!(SQLGetInfoLong(SQL_TIMEDATE_FUNCTIONS) & SQL_FN_TD_TIMESTAMPADD))
  2309. file.WriteString(_T("Timestamp Add Intervals: <n/a>nn"));
  2310. else
  2311. {
  2312. file.WriteString(_T("Timestamp Add Intervals:n"));
  2313. UDWORD  fAddIntervals = SQLGetInfoLong(SQL_TIMEDATE_ADD_INTERVALS);
  2314. b = FALSE;
  2315. for (int i = 0; i < NUM_INTERVALS; i++)
  2316. {
  2317. if (m_nIntervalMasks[i] & fAddIntervals)
  2318. {
  2319. if (b)
  2320. file.WriteString(_T(","));
  2321. file.WriteString(m_szIntervalNames[i]);
  2322. b = TRUE;
  2323. }
  2324. }
  2325. file.WriteString(_T("nn"));
  2326. }
  2327. if (!(SQLGetInfoLong(SQL_TIMEDATE_FUNCTIONS) & SQL_FN_TD_TIMESTAMPDIFF))
  2328. file.WriteString(_T("Timestamp Diff Intervals: <n/a>nn"));
  2329. else
  2330. {
  2331. file.WriteString(_T("Timestamp Diff Intervals:n"));
  2332. UDWORD  fDiffIntervals = SQLGetInfoLong(SQL_TIMEDATE_DIFF_INTERVALS);
  2333. b = FALSE;
  2334. for (int i = 0; i < NUM_INTERVALS; i++)
  2335. {
  2336. if (m_nIntervalMasks[i] & fDiffIntervals)
  2337. {
  2338. if (b)
  2339. file.WriteString(_T(","));
  2340. file.WriteString(m_szIntervalNames[i]);
  2341. b = TRUE;
  2342. }
  2343. }
  2344. file.WriteString(_T("nn"));
  2345. }
  2346. file.WriteString(_T("n"));
  2347. }
  2348. }
  2349. void CLimits::DoDataExchange(CDataExchange* pDX)
  2350. {
  2351. CPropertyPage::DoDataExchange(pDX);
  2352. //{{AFX_DATA_MAP(CLimits)
  2353. DDX_Control(pDX, IDC_SQL_TIMEDATE_DIFF_INTERVALS, m_lcSqlTimedateDiffIntervals);
  2354. DDX_Control(pDX, IDC_SQL_TIMEDATE_ADD_INTERVALS, m_lcSqlTimedateAddIntervals);
  2355. DDX_Text(pDX, IDC_SQL_MAX_BINARY_LITERAL_LEN, m_strSqlMaxBinaryLiteralLen);
  2356. DDX_Text(pDX, IDC_SQL_MAX_CHAR_LITERAL_LEN, m_strSqlMaxCharLiteralLen);
  2357. DDX_Text(pDX, IDC_SQL_MAX_COLUMN_NAME_LEN, m_strSqlMaxColumnNameLen);
  2358. DDX_Text(pDX, IDC_SQL_MAX_COLUMNS_IN_GROUP_BY, m_strSqlMaxColumnsInGroupBy);
  2359. DDX_Text(pDX, IDC_SQL_MAX_COLUMNS_IN_INDEX, m_strSqlMaxColumnsInIndex);
  2360. DDX_Text(pDX, IDC_SQL_MAX_COLUMNS_IN_ORDER_BY, m_strSqlMaxColumnsInOrderBy);
  2361. DDX_Text(pDX, IDC_SQL_MAX_COLUMNS_IN_SELECT, m_strSqlMaxColumnsInSelect);
  2362. DDX_Text(pDX, IDC_SQL_MAX_COLUMNS_IN_TABLE, m_strSqlMaxColumnsInTable);
  2363. DDX_Text(pDX, IDC_SQL_MAX_CURS0R_NAME_LEN, m_strSqlMaxCursorNameLen);
  2364. DDX_Text(pDX, IDC_SQL_MAX_INDEX_SIZE, m_strSqlMaxIndexSize);
  2365. DDX_Text(pDX, IDC_SQL_MAX_OWNER_NAME_LEN, m_strSqlMaxOwnerNameLen);
  2366. DDX_Text(pDX, IDC_SQL_MAX_PROCEDURE_NAME_LEN, m_strSqlMaxProcedureNameLen);
  2367. DDX_Text(pDX, IDC_SQL_MAX_QUALIFIER_NAME_LEN, m_strSqlMaxQualifierNameLen);
  2368. DDX_Text(pDX, IDC_SQL_MAX_ROW_SIZE, m_strSqlMaxRowSize);
  2369. DDX_Text(pDX, IDC_SQL_MAX_ROW_SIZE_INCLUDES_LONG, m_strSqlMaxRowSizeIncludesLong);
  2370. DDX_Text(pDX, IDC_SQL_MAX_STATEMENT_LEN, m_strSqlMaxStatementLen);
  2371. DDX_Text(pDX, IDC_SQL_MAX_TABLE_NAME_LEN, m_strSqlMaxTableNameLen);
  2372. DDX_Text(pDX, IDC_SQL_MAX_TABLES_IN_SELECT, m_strSqlMaxTablesInSelect);
  2373. DDX_Text(pDX, IDC_SQL_MAX_USER_NAME_LEN, m_strSqlMaxUserNameLen);
  2374. //}}AFX_DATA_MAP
  2375. }
  2376. BEGIN_MESSAGE_MAP(CLimits, CPropertyPage)
  2377. //{{AFX_MSG_MAP(CLimits)
  2378. //}}AFX_MSG_MAP
  2379. END_MESSAGE_MAP()
  2380. /////////////////////////////////////////////////////////////////////////////
  2381. // CLimits message handlers
  2382. void CLimits::OnNewDSN()
  2383. {
  2384. if (m_pDatabase->IsOpen())
  2385. {
  2386. ZeroIsNoneLong(m_strSqlMaxBinaryLiteralLen,SQL_MAX_BINARY_LITERAL_LEN);
  2387. ZeroIsNoneLong(m_strSqlMaxCharLiteralLen,SQL_MAX_CHAR_LITERAL_LEN);
  2388. ZeroIsNoneShort(m_strSqlMaxColumnNameLen,SQL_MAX_COLUMN_NAME_LEN);
  2389. ZeroIsNoneShort(m_strSqlMaxColumnsInGroupBy,SQL_MAX_COLUMNS_IN_GROUP_BY);
  2390. ZeroIsNoneShort(m_strSqlMaxColumnsInIndex,SQL_MAX_COLUMNS_IN_INDEX);
  2391. ZeroIsNoneShort(m_strSqlMaxColumnsInOrderBy,SQL_MAX_COLUMNS_IN_ORDER_BY);
  2392. ZeroIsNoneShort(m_strSqlMaxColumnsInSelect,SQL_MAX_COLUMNS_IN_SELECT);
  2393. ZeroIsNoneShort(m_strSqlMaxColumnsInTable,SQL_MAX_COLUMNS_IN_TABLE);
  2394. ZeroIsNoneShort(m_strSqlMaxCursorNameLen,SQL_MAX_CURSOR_NAME_LEN);
  2395. ZeroIsNoneLong(m_strSqlMaxIndexSize,SQL_MAX_INDEX_SIZE);
  2396. ZeroIsNoneShort(m_strSqlMaxOwnerNameLen,SQL_MAX_OWNER_NAME_LEN);
  2397. ZeroIsNoneShort(m_strSqlMaxProcedureNameLen,SQL_MAX_PROCEDURE_NAME_LEN);
  2398. ZeroIsNoneShort(m_strSqlMaxQualifierNameLen,SQL_MAX_QUALIFIER_NAME_LEN);
  2399. ZeroIsNoneLong(m_strSqlMaxRowSize,SQL_MAX_ROW_SIZE);
  2400. YIsYes(m_strSqlMaxRowSizeIncludesLong,SQL_MAX_ROW_SIZE_INCLUDES_LONG);
  2401. ZeroIsNoneLong(m_strSqlMaxStatementLen,SQL_MAX_STATEMENT_LEN);
  2402. ZeroIsNoneShort(m_strSqlMaxTableNameLen,SQL_MAX_TABLE_NAME_LEN);
  2403. ZeroIsNoneShort(m_strSqlMaxTablesInSelect,SQL_MAX_TABLES_IN_SELECT);
  2404. ZeroIsNoneShort(m_strSqlMaxUserNameLen,SQL_MAX_USER_NAME_LEN);
  2405. if (IsWindow(m_hWnd))
  2406. {
  2407. UDWORD  fAddIntervals = SQLGetInfoLong(SQL_TIMEDATE_ADD_INTERVALS);
  2408. UDWORD  fDiffIntervals = SQLGetInfoLong(SQL_TIMEDATE_DIFF_INTERVALS);
  2409. m_lcSqlTimedateAddIntervals.DeleteAllItems();
  2410. if (!(SQLGetInfoLong(SQL_TIMEDATE_FUNCTIONS) & SQL_FN_TD_TIMESTAMPADD))
  2411. m_lcSqlTimedateAddIntervals.InsertItem(0,_T("<n/a>"));
  2412. else
  2413. {
  2414. for (int i = 0; i < NUM_INTERVALS; i++)
  2415. {
  2416. int nCheck = 0;
  2417. if (m_nIntervalMasks[i] & fAddIntervals)
  2418. nCheck = 1;
  2419. m_lcSqlTimedateAddIntervals.InsertItem(
  2420. i,m_szIntervalNames[i],nCheck);
  2421. }
  2422. }
  2423. m_lcSqlTimedateDiffIntervals.DeleteAllItems();
  2424. if (!(SQLGetInfoLong(SQL_TIMEDATE_FUNCTIONS) & SQL_FN_TD_TIMESTAMPDIFF))
  2425. m_lcSqlTimedateDiffIntervals.InsertItem(0,_T("<n/a>"));
  2426. else
  2427. {
  2428. for (int i = 0; i < NUM_INTERVALS; i++)
  2429. {
  2430. int nCheck = 0;
  2431. if (m_nIntervalMasks[i] & fDiffIntervals)
  2432. nCheck = 1;
  2433. m_lcSqlTimedateDiffIntervals.InsertItem(
  2434. i,m_szIntervalNames[i],nCheck);
  2435. }
  2436. }
  2437. UpdateData(FALSE);
  2438. }
  2439. }
  2440. }
  2441. BOOL CLimits::OnInitDialog()
  2442. {
  2443. CWaitCursor wait;
  2444. CPropertyPage::OnInitDialog();
  2445. m_lcSqlTimedateDiffIntervals.SetImageList(m_pImageList,LVSIL_SMALL);
  2446. m_lcSqlTimedateAddIntervals.SetImageList(m_pImageList,LVSIL_SMALL);
  2447. m_lcSqlTimedateDiffIntervals.InsertColumn(0,"",LVCFMT_LEFT,100);
  2448. m_lcSqlTimedateAddIntervals.InsertColumn(0,"",LVCFMT_LEFT,100);
  2449. m_lcSqlTimedateDiffIntervals.SetFullRowSel(TRUE);
  2450. m_lcSqlTimedateAddIntervals.SetFullRowSel(TRUE);
  2451. UDWORD  fAddIntervals = SQLGetInfoLong(SQL_TIMEDATE_ADD_INTERVALS);
  2452. UDWORD  fDiffIntervals = SQLGetInfoLong(SQL_TIMEDATE_DIFF_INTERVALS);
  2453. m_lcSqlTimedateAddIntervals.DeleteAllItems();
  2454. if (!(SQLGetInfoLong(SQL_TIMEDATE_FUNCTIONS) & SQL_FN_TD_TIMESTAMPADD))
  2455. m_lcSqlTimedateAddIntervals.InsertItem(0,_T("<n/a>"));
  2456. else
  2457. {
  2458. for (int i = 0; i < NUM_INTERVALS; i++)
  2459. {
  2460. int nCheck = 0;
  2461. if (m_nIntervalMasks[i] & fAddIntervals)
  2462. nCheck = 1;
  2463. m_lcSqlTimedateAddIntervals.InsertItem(
  2464. i,m_szIntervalNames[i],nCheck);
  2465. }
  2466. }
  2467. m_lcSqlTimedateDiffIntervals.DeleteAllItems();
  2468. if (!(SQLGetInfoLong(SQL_TIMEDATE_FUNCTIONS) & SQL_FN_TD_TIMESTAMPDIFF))
  2469. m_lcSqlTimedateDiffIntervals.InsertItem(0,_T("<n/a>"));
  2470. else
  2471. {
  2472. for (int i = 0; i < NUM_INTERVALS; i++)
  2473. {
  2474. int nCheck = 0;
  2475. if (m_nIntervalMasks[i] & fDiffIntervals)
  2476. nCheck = 1;
  2477. m_lcSqlTimedateDiffIntervals.InsertItem(
  2478. i,m_szIntervalNames[i],nCheck);
  2479. }
  2480. }
  2481. UpdateData(FALSE);
  2482. return TRUE;  // return TRUE unless you set the focus to a control
  2483.   // EXCEPTION: OCX Property Pages should return FALSE
  2484. }
  2485. /////////////////////////////////////////////////////////////////////////////
  2486. // CMisc1 property page
  2487. IMPLEMENT_DYNCREATE(CMisc1, CPropertyPage)
  2488. CMisc1::CMisc1(CDatabase* pDatabase)
  2489.  : CMyPage(pDatabase,CMisc1::IDD)
  2490. {
  2491. //{{AFX_DATA_INIT(CMisc1)
  2492. m_strSqlTxnCapable = _T("");
  2493. m_strSqlCursorCommitBehavior = _T("");
  2494. m_strSqlCursorRollbackBehavior = _T("");
  2495. m_bSqlTxnReadCommitted = FALSE;
  2496. m_bSqlTxnReadUncommitted = FALSE;
  2497. m_bSqlTxnRepeatableRead = FALSE;
  2498. m_bSqlTxnSerializable = FALSE;
  2499. m_strSqlDefaultTxnIsolation = _T("");
  2500. m_strSqlMultipleActiveTxn = _T("");
  2501. m_bSqlBpClose = FALSE;
  2502. m_bSqlBpDelete = FALSE;
  2503. m_bSqlBpDrop = FALSE;
  2504. m_bSqlBpOtherHstmt = FALSE;
  2505. m_bSqlBpScroll = FALSE;
  2506. m_bSqlBpTransaction = FALSE;
  2507. m_bSqlBpUpdate = FALSE;
  2508. m_bSqlLckExclusive = FALSE;
  2509. m_bSqlLckNoChange = FALSE;
  2510. m_bSqlLckUnlock = FALSE;
  2511. m_bSqlSsAdditions = FALSE;
  2512. m_bSqlSsDeletions = FALSE;
  2513. m_bSqlSsUpdates = FALSE;
  2514. //}}AFX_DATA_INIT
  2515. OnNewDSN();
  2516. }
  2517. CMisc1::~CMisc1()
  2518. {
  2519. }
  2520. void CMisc1::DumpToFile(CStdioFile& file)
  2521. {
  2522. if (m_pDatabase->IsOpen())
  2523. {
  2524. CString string;
  2525. CString workString;
  2526. BOOL    b;
  2527. file.WriteString(_T("Miscellaneousn-------------nn"));
  2528. string.Format(_T(" Transaction Capabilities - %sn"),m_strSqlTxnCapable);
  2529. file.WriteString(string);
  2530. string.Format(_T("   Cursor Commit Behavior - %sn"),m_strSqlCursorCommitBehavior);
  2531. file.WriteString(string);
  2532. string.Format(_T(" Cursor Rollback Behavior - %sn"),m_strSqlCursorRollbackBehavior);
  2533. file.WriteString(string);
  2534. file.WriteString(_T("  Trans. Isolation Levels - "));
  2535. b = FALSE;
  2536. if (m_bSqlTxnReadCommitted)
  2537. {
  2538. file.WriteString(_T("Read Commit"));
  2539. b = TRUE;
  2540. }
  2541. if (m_bSqlTxnReadUncommitted)
  2542. {
  2543. if (b)
  2544. file.WriteString(_T(","));
  2545. file.WriteString(_T("Read Uncommit"));
  2546. b = TRUE;
  2547. }
  2548. if (m_bSqlTxnRepeatableRead)
  2549. {
  2550. if (b)
  2551. file.WriteString(_T(","));
  2552. file.WriteString(_T("Repeat Read"));
  2553. b = TRUE;
  2554. }
  2555. if (m_bSqlTxnSerializable)
  2556. {
  2557. if (b)
  2558. file.WriteString(_T(","));
  2559. file.WriteString(_T("Serializable"));
  2560. b = TRUE;
  2561. }
  2562. if (!b)
  2563. file.WriteString(_T("<none>"));
  2564. file.WriteString(_T("n"));
  2565. string.Format(_T(" Default Trans. Isolation - %sn"),m_strSqlDefaultTxnIsolation);
  2566. file.WriteString(string);
  2567. string.Format(_T("   Multiple Active Trans. - %sn"),m_strSqlMultipleActiveTxn);
  2568. file.WriteString(string);
  2569. file.WriteString(_T("     Bookmark Persistance - "));
  2570. b = FALSE;
  2571. if (m_bSqlBpClose)
  2572. {
  2573. file.WriteString(_T("Close"));
  2574. b = TRUE;
  2575. }
  2576. if (m_bSqlBpDelete)
  2577. {
  2578. if (b)
  2579. file.WriteString(_T(","));
  2580. file.WriteString(_T("Delete"));
  2581. b = TRUE;
  2582. }
  2583. if (m_bSqlBpDrop)
  2584. {
  2585. if (b)
  2586. file.WriteString(_T(","));
  2587. file.WriteString(_T("Drop"));
  2588. b = TRUE;
  2589. }
  2590. if (m_bSqlBpOtherHstmt)
  2591. {
  2592. if (b)
  2593. file.WriteString(_T(","));
  2594. file.WriteString(_T("Other HSTMT"));
  2595. b = TRUE;
  2596. }
  2597. if (m_bSqlBpScroll)
  2598. {
  2599. if (b)
  2600. file.WriteString(_T(","));
  2601. file.WriteString(_T("Scroll"));
  2602. b = TRUE;
  2603. }
  2604. if (m_bSqlBpTransaction)
  2605. {
  2606. if (b)
  2607. file.WriteString(_T(","));
  2608. file.WriteString(_T("Transaction"));
  2609. b = TRUE;
  2610. }
  2611. if (m_bSqlBpUpdate)
  2612. {
  2613. if (b)
  2614. file.WriteString(_T(","));
  2615. file.WriteString(_T("Update"));
  2616. b = TRUE;
  2617. }
  2618. if (!b)
  2619. file.WriteString(_T("<none>"));
  2620. file.WriteString(_T("n"));
  2621. file.WriteString(_T("               Lock Types - "));
  2622. b = FALSE;
  2623. if (m_bSqlLckExclusive)
  2624. {
  2625. file.WriteString(_T("Exclusive"));
  2626. b = TRUE;
  2627. }
  2628. if (m_bSqlLckNoChange)
  2629. {
  2630. if (b)
  2631. file.WriteString(_T(","));
  2632. file.WriteString(_T("No Change"));
  2633. b = TRUE;
  2634. }
  2635. if (m_bSqlLckUnlock)
  2636. {
  2637. if (b)
  2638. file.WriteString(_T(","));
  2639. file.WriteString(_T("Unlock"));
  2640. b = TRUE;
  2641. }
  2642. if (!b)
  2643. file.WriteString(_T("<none>"));
  2644. file.WriteString(_T("n"));
  2645. file.WriteString(_T("       Static Sensitivity - "));
  2646. b = FALSE;
  2647. if (m_bSqlSsAdditions)
  2648. {
  2649. file.WriteString(_T("Additions"));
  2650. b = TRUE;
  2651. }
  2652. if (m_bSqlSsDeletions)
  2653. {
  2654. if (b)
  2655. file.WriteString(_T(","));
  2656. file.WriteString(_T("Deletions"));
  2657. b = TRUE;
  2658. }
  2659. if (m_bSqlSsUpdates)
  2660. {
  2661. if (b)
  2662. file.WriteString(_T(","));
  2663. file.WriteString(_T("Updates"));
  2664. b = TRUE;
  2665. }
  2666. if (!b)
  2667. file.WriteString(_T("<none>"));
  2668. file.WriteString(_T("nn"));
  2669. }
  2670. }
  2671. void CMisc1::DoDataExchange(CDataExchange* pDX)
  2672. {
  2673. CPropertyPage::DoDataExchange(pDX);
  2674. //{{AFX_DATA_MAP(CMisc1)
  2675. DDX_Text(pDX, IDC_SQL_TXN_CAPABLE, m_strSqlTxnCapable);
  2676. DDX_Text(pDX, IDC_SQL_CURSOR_COMMIT_BEHAVIOR, m_strSqlCursorCommitBehavior);
  2677. DDX_Text(pDX, IDC_SQL_CURSOR_ROLLBACK_BEHAVIOR, m_strSqlCursorRollbackBehavior);
  2678. DDX_Check(pDX, IDC_SQL_TXN_READ_COMMITTED, m_bSqlTxnReadCommitted);
  2679. DDX_Check(pDX, IDC_SQL_TXN_READ_UNCOMMITTED, m_bSqlTxnReadUncommitted);
  2680. DDX_Check(pDX, IDC_SQL_TXN_REPEATABLE_READ, m_bSqlTxnRepeatableRead);
  2681. DDX_Check(pDX, IDC_SQL_TXN_SERIALIZABLE, m_bSqlTxnSerializable);
  2682. DDX_Text(pDX, IDC_SQL_DEFAULT_TXN_ISOLATION, m_strSqlDefaultTxnIsolation);
  2683. DDX_Text(pDX, IDC_SQL_MULTIPLE_ACTIVE_TXN, m_strSqlMultipleActiveTxn);
  2684. DDX_Check(pDX, IDC_SQL_BP_CLOSE, m_bSqlBpClose);
  2685. DDX_Check(pDX, IDC_SQL_BP_DELETE, m_bSqlBpDelete);
  2686. DDX_Check(pDX, IDC_SQL_BP_DROP, m_bSqlBpDrop);
  2687. DDX_Check(pDX, IDC_SQL_BP_OTHER_HSTMT, m_bSqlBpOtherHstmt);
  2688. DDX_Check(pDX, IDC_SQL_BP_SCROLL, m_bSqlBpScroll);
  2689. DDX_Check(pDX, IDC_SQL_BP_TRANSACTION, m_bSqlBpTransaction);
  2690. DDX_Check(pDX, IDC_SQL_BP_UPDATE, m_bSqlBpUpdate);
  2691. DDX_Check(pDX, IDC_SQL_LCK_EXCLUSIVE, m_bSqlLckExclusive);
  2692. DDX_Check(pDX, IDC_SQL_LCK_NO_CHANGE, m_bSqlLckNoChange);
  2693. DDX_Check(pDX, IDC_SQL_LCK_UNLOCK, m_bSqlLckUnlock);
  2694. DDX_Check(pDX, IDC_SQL_SS_ADDITIONS, m_bSqlSsAdditions);
  2695. DDX_Check(pDX, IDC_SQL_SS_DELETIONS, m_bSqlSsDeletions);
  2696. DDX_Check(pDX, IDC_SQL_SS_UPDATES, m_bSqlSsUpdates);
  2697. //}}AFX_DATA_MAP
  2698. }
  2699. BEGIN_MESSAGE_MAP(CMisc1, CPropertyPage)
  2700. //{{AFX_MSG_MAP(CMisc1)
  2701. //}}AFX_MSG_MAP
  2702. END_MESSAGE_MAP()
  2703. /////////////////////////////////////////////////////////////////////////////
  2704. // CMisc1 message handlers
  2705. void CMisc1::OnNewDSN()
  2706. {
  2707. if (m_pDatabase->IsOpen())
  2708. {
  2709. SDWORD  longValue;
  2710. switch (SQLGetInfoShort(SQL_TXN_CAPABLE))
  2711. {
  2712. case SQL_TC_NONE:
  2713. m_strSqlTxnCapable = _T("None");
  2714. m_strSqlCursorCommitBehavior = _T("<n/a>");
  2715. m_strSqlCursorRollbackBehavior = _T("<n/a>");
  2716. m_bSqlTxnReadUncommitted = FALSE;
  2717. m_bSqlTxnReadCommitted = FALSE;
  2718. m_bSqlTxnRepeatableRead = FALSE;
  2719. m_bSqlTxnSerializable = FALSE;
  2720. m_strSqlDefaultTxnIsolation = _T("<n/a>");
  2721. m_strSqlMultipleActiveTxn = _T("<n/a>");
  2722. if (IsWindow(m_hWnd))
  2723. UpdateData(FALSE);
  2724. return;
  2725. case SQL_TC_DML:
  2726. m_strSqlTxnCapable = _T("DDL statements cause an error");
  2727. break;
  2728. case SQL_TC_DDL_COMMIT:
  2729. m_strSqlTxnCapable = _T("DDL statements cause a commit");
  2730. break;
  2731. case SQL_TC_DDL_IGNORE:
  2732. m_strSqlTxnCapable = _T("DDL statements are ignored");
  2733. break;
  2734. case SQL_TC_ALL:
  2735. m_strSqlTxnCapable = _T("DDL and DML statements supported");
  2736. break;
  2737. }
  2738. switch (SQLGetInfoShort(SQL_CURSOR_COMMIT_BEHAVIOR))
  2739. {
  2740. case SQL_CB_DELETE:
  2741. m_strSqlCursorCommitBehavior = _T("Close Cursors, Delete Statements");
  2742. break;
  2743. case SQL_CB_CLOSE:
  2744. m_strSqlCursorCommitBehavior = _T("Close Cursors");
  2745. break;
  2746. case SQL_CB_PRESERVE:
  2747. m_strSqlCursorCommitBehavior = _T("Preserve Cursors");
  2748. break;
  2749. }
  2750. switch (SQLGetInfoShort(SQL_CURSOR_ROLLBACK_BEHAVIOR))
  2751. {
  2752. case SQL_CB_DELETE:
  2753. m_strSqlCursorRollbackBehavior = _T("Close Cursors, Delete Statements");
  2754. break;
  2755. case SQL_CB_CLOSE:
  2756. m_strSqlCursorRollbackBehavior = _T("Close Cursors");
  2757. break;
  2758. case SQL_CB_PRESERVE:
  2759. m_strSqlCursorRollbackBehavior = _T("Preserve Cursors");
  2760. break;
  2761. }
  2762. longValue = SQLGetInfoLong(SQL_TXN_ISOLATION_OPTION);
  2763. if (longValue & SQL_TXN_READ_UNCOMMITTED)
  2764. m_bSqlTxnReadUncommitted = TRUE;
  2765. else
  2766. m_bSqlTxnReadUncommitted = FALSE;
  2767. if (longValue & SQL_TXN_READ_COMMITTED)
  2768. m_bSqlTxnReadCommitted = TRUE;
  2769. else
  2770. m_bSqlTxnReadCommitted = FALSE;
  2771. if (longValue & SQL_TXN_REPEATABLE_READ)
  2772. m_bSqlTxnRepeatableRead = TRUE;
  2773. else
  2774. m_bSqlTxnRepeatableRead = FALSE;
  2775. if (longValue & SQL_TXN_SERIALIZABLE)
  2776. m_bSqlTxnSerializable = TRUE;
  2777. else
  2778. m_bSqlTxnSerializable = FALSE;
  2779. switch (SQLGetInfoLong(SQL_DEFAULT_TXN_ISOLATION))
  2780. {
  2781. case SQL_TXN_READ_UNCOMMITTED:
  2782. m_strSqlDefaultTxnIsolation = _T("Read Uncommitted");
  2783. break;
  2784. case SQL_TXN_READ_COMMITTED:
  2785. m_strSqlDefaultTxnIsolation = _T("Read Committed");
  2786. break;
  2787. case SQL_TXN_REPEATABLE_READ:
  2788. m_strSqlDefaultTxnIsolation = _T("Repeatable Read");
  2789. break;
  2790. case SQL_TXN_SERIALIZABLE:
  2791. m_strSqlDefaultTxnIsolation = _T("Serializable");
  2792. break;
  2793. }
  2794. YIsSupported(m_strSqlMultipleActiveTxn,SQL_MULTIPLE_ACTIVE_TXN);
  2795. longValue = SQLGetInfoLong(SQL_BOOKMARK_PERSISTENCE);
  2796. if (longValue & SQL_BP_CLOSE)
  2797. m_bSqlBpClose = TRUE;
  2798. else
  2799. m_bSqlBpClose = FALSE;
  2800. if (longValue & SQL_BP_DELETE)
  2801. m_bSqlBpDelete = TRUE;
  2802. else
  2803. m_bSqlBpDelete = FALSE;
  2804. if (longValue & SQL_BP_DROP)
  2805. m_bSqlBpDrop = TRUE;
  2806. else
  2807. m_bSqlBpDrop = FALSE;
  2808. if (longValue & SQL_BP_SCROLL)
  2809. m_bSqlBpScroll = TRUE;
  2810. else
  2811. m_bSqlBpScroll = FALSE;
  2812. if (longValue & SQL_BP_TRANSACTION)
  2813. m_bSqlBpTransaction = TRUE;
  2814. else
  2815. m_bSqlBpTransaction = FALSE;
  2816. if (longValue & SQL_BP_UPDATE)
  2817. m_bSqlBpUpdate = TRUE;
  2818. else
  2819. m_bSqlBpUpdate = FALSE;
  2820. if (longValue & SQL_BP_OTHER_HSTMT)
  2821. m_bSqlBpOtherHstmt = TRUE;
  2822. else
  2823. m_bSqlBpOtherHstmt = FALSE;
  2824. longValue = SQLGetInfoLong(SQL_LOCK_TYPES);
  2825. if (longValue & SQL_LCK_NO_CHANGE)
  2826. m_bSqlLckNoChange = TRUE;
  2827. else
  2828. m_bSqlLckNoChange = FALSE;
  2829. if (longValue & SQL_LCK_EXCLUSIVE)
  2830. m_bSqlLckExclusive = TRUE;
  2831. else
  2832. m_bSqlLckExclusive = FALSE;
  2833. if (longValue & SQL_LCK_UNLOCK)
  2834. m_bSqlLckUnlock = TRUE;
  2835. else
  2836. m_bSqlLckUnlock = FALSE;
  2837. longValue = SQLGetInfoLong(SQL_STATIC_SENSITIVITY);
  2838. if (longValue & SQL_SS_ADDITIONS)
  2839. m_bSqlSsAdditions = TRUE;
  2840. else
  2841. m_bSqlSsAdditions = FALSE;
  2842. if (longValue & SQL_SS_DELETIONS)
  2843. m_bSqlSsDeletions = TRUE;
  2844. else
  2845. m_bSqlSsDeletions = FALSE;
  2846. if (longValue & SQL_SS_UPDATES)
  2847. m_bSqlSsUpdates = TRUE;
  2848. else
  2849. m_bSqlSsUpdates = FALSE;
  2850. if (IsWindow(m_hWnd))
  2851. UpdateData(FALSE);
  2852. }
  2853. }
  2854. BOOL CMisc1::OnInitDialog()
  2855. {
  2856. CWaitCursor wait;
  2857. CPropertyPage::OnInitDialog();
  2858. UpdateData(FALSE);
  2859. return TRUE;  // return TRUE unless you set the focus to a control
  2860.   // EXCEPTION: OCX Property Pages should return FALSE
  2861. }
  2862. /////////////////////////////////////////////////////////////////////////////
  2863. // CMisc2 property page
  2864. IMPLEMENT_DYNCREATE(CMisc2, CPropertyPage)
  2865. CMisc2::CMisc2(CDatabase* pDatabase)
  2866. : CMyPage(pDatabase,CMisc2::IDD)
  2867.  {
  2868. //{{AFX_DATA_INIT(CMisc2)
  2869. m_bSqlOuDmlStatements = FALSE;
  2870. m_bSqlOuIndexDefinition = FALSE;
  2871. m_bSqlOuPrivilegeDefinition = FALSE;
  2872. m_bSqlOuProcedureInvocation = FALSE;
  2873. m_bSqlOuTableDefinition = FALSE;
  2874. m_bSqlQuDmlStatements = FALSE;
  2875. m_bSqlQuIndexDefinition = FALSE;
  2876. m_bSqlQuPrivilegeDefinition = FALSE;
  2877. m_bSqlQuProcedureInvocation = FALSE;
  2878. m_bSqlQuTableDefinition = FALSE;
  2879. m_bSqlSoDynamic = FALSE;
  2880. m_bSqlSoForwardOnly = FALSE;
  2881. m_bSqlSoKeysetDriven = FALSE;
  2882. m_bSqlSoMixed = FALSE;
  2883. m_bSqlSoStatic = FALSE;
  2884. m_bSqlSccoLock = FALSE;
  2885. m_bSqlSccoOptRowver = FALSE;
  2886. m_bSqlSccoOptValues = FALSE;
  2887. m_bSqlSccoReadOnly = FALSE;
  2888. m_bSqlPosAdd = FALSE;
  2889. m_bSqlPosDelete = FALSE;
  2890. m_bSqlPosPosition = FALSE;
  2891. m_bSqlPosRefresh = FALSE;
  2892. m_bSqlPosUpdate = FALSE;
  2893. m_bSqlFdFetchAbsolute = FALSE;
  2894. m_bSqlFdFetchBookmark = FALSE;
  2895. m_bSqlFdFetchFirst = FALSE;
  2896. m_bSqlFdFetchLast = FALSE;
  2897. m_bSqlFdFetchNext = FALSE;
  2898. m_bSqlFdFetchPrior = FALSE;
  2899. m_bSqlFdFetchRelative = FALSE;
  2900. m_bSqlGdAnyColumn = FALSE;
  2901. m_bSqlGdAnyOrder = FALSE;
  2902. m_bSqlGdBlock = FALSE;
  2903. m_bSqlGdBound = FALSE;
  2904. m_strSqlConcatNullBehavior = _T("");
  2905. m_strSqlNeedLongDataLen = _T("");
  2906. m_strSqlNonNullableColumns = _T("");
  2907. m_strSqlNullCollation = _T("");
  2908. m_strSqlProcedures = _T("");
  2909. m_strSqlRowUpdates = _T("");
  2910. //}}AFX_DATA_INIT
  2911. OnNewDSN();
  2912. }
  2913. CMisc2::~CMisc2()
  2914. {
  2915. }
  2916. void CMisc2::DumpToFile(CStdioFile& file)
  2917. {
  2918. if (m_pDatabase->IsOpen())
  2919. {
  2920. CString string;
  2921. BOOL    b;
  2922. string.Format(_T("    Need Long Data Length - %sn"),m_strSqlNeedLongDataLen);
  2923. file.WriteString(string);
  2924. string.Format(_T("     Non-Nullable Columns - %sn"),m_strSqlNonNullableColumns);
  2925. file.WriteString(string);
  2926. string.Format(_T("       Null Concatenation - %sn"),m_strSqlConcatNullBehavior);
  2927. file.WriteString(string);
  2928. string.Format(_T("           Null Collation - %sn"),m_strSqlNullCollation);
  2929. file.WriteString(string);
  2930. string.Format(_T("               Procedures - %sn"),m_strSqlProcedures);
  2931. file.WriteString(string);
  2932. string.Format(_T("              Row Updates - %sn"),m_strSqlRowUpdates);
  2933. file.WriteString(string);
  2934. file.WriteString(_T("          Fetch Direction - "));
  2935. b = FALSE;
  2936. if (m_bSqlFdFetchAbsolute)
  2937. {
  2938. file.WriteString(_T("Absolute"));
  2939. b = TRUE;
  2940. }
  2941. if (m_bSqlFdFetchBookmark)
  2942. {
  2943. if (b)
  2944. file.WriteString(_T(","));
  2945. file.WriteString(_T("Bookmark"));
  2946. b = TRUE;
  2947. }
  2948. if (m_bSqlFdFetchFirst)
  2949. {
  2950. if (b)
  2951. file.WriteString(_T(","));
  2952. file.WriteString(_T("First"));
  2953. b = TRUE;
  2954. }
  2955. if (m_bSqlFdFetchLast)
  2956. {
  2957. if (b)
  2958. file.WriteString(_T(","));
  2959. file.WriteString(_T("Last"));
  2960. b = TRUE;
  2961. }
  2962. if (m_bSqlFdFetchNext)
  2963. {
  2964. if (b)
  2965. file.WriteString(_T(","));
  2966. file.WriteString(_T("Next"));
  2967. b = TRUE;
  2968. }
  2969. if (m_bSqlFdFetchPrior)
  2970. {
  2971. if (b)
  2972. file.WriteString(_T(","));
  2973. file.WriteString(_T("Prior"));
  2974. b = TRUE;
  2975. }
  2976. if (m_bSqlFdFetchRelative)
  2977. {
  2978. if (b)
  2979. file.WriteString(_T(","));
  2980. file.WriteString(_T("Relative"));
  2981. b = TRUE;
  2982. }
  2983. if (!b)
  2984. file.WriteString(_T("<none>"));
  2985. file.WriteString(_T("n"));
  2986. file.WriteString(_T("      Get Data Extensions - "));
  2987. b = FALSE;
  2988. if (m_bSqlGdAnyColumn)
  2989. {
  2990. file.WriteString(_T("Any Column"));
  2991. b = TRUE;
  2992. }
  2993. if (m_bSqlGdAnyOrder)
  2994. {
  2995. if (b)
  2996. file.WriteString(_T(","));
  2997. file.WriteString(_T("Any Order"));
  2998. b = TRUE;
  2999. }
  3000. if (m_bSqlGdBlock)
  3001. {
  3002. if (b)
  3003. file.WriteString(_T(","));
  3004. file.WriteString(_T("Block"));
  3005. b = TRUE;
  3006. }
  3007. if (m_bSqlGdBound)
  3008. {
  3009. if (b)
  3010. file.WriteString(_T(","));
  3011. file.WriteString(_T("Bound"));
  3012. b = TRUE;
  3013. }
  3014. if (!b)
  3015. file.WriteString(_T("<none>"));
  3016. file.WriteString(_T("n"));
  3017. file.WriteString(_T("    Positioned Operations - "));
  3018. b = FALSE;
  3019. if (m_bSqlPosAdd)
  3020. {
  3021. file.WriteString(_T("Add"));
  3022. b = TRUE;
  3023. }
  3024. if (m_bSqlPosDelete)
  3025. {
  3026. if (b)
  3027. file.WriteString(_T(","));
  3028. file.WriteString(_T("Delete"));
  3029. b = TRUE;
  3030. }
  3031. if (m_bSqlPosPosition)
  3032. {
  3033. if (b)
  3034. file.WriteString(_T(","));
  3035. file.WriteString(_T("Position"));
  3036. b = TRUE;
  3037. }
  3038. if (m_bSqlPosRefresh)
  3039. {
  3040. if (b)
  3041. file.WriteString(_T(","));
  3042. file.WriteString(_T("Refresh"));
  3043. b = TRUE;
  3044. }
  3045. if (m_bSqlPosUpdate)
  3046. {
  3047. if (b)
  3048. file.WriteString(_T(","));
  3049. file.WriteString(_T("Update"));
  3050. b = TRUE;
  3051. }
  3052. if (!b)
  3053. file.WriteString(_T("<none>"));
  3054. file.WriteString(_T("n"));
  3055. file.WriteString(_T("       Scroll Concurrency - "));
  3056. b = FALSE;
  3057. if (m_bSqlSccoLock)
  3058. {
  3059. file.WriteString(_T("Lock"));
  3060. b = TRUE;
  3061. }
  3062. if (m_bSqlSccoOptRowver)
  3063. {
  3064. if (b)
  3065. file.WriteString(_T(","));
  3066. file.WriteString(_T("Opt/RowVer"));
  3067. b = TRUE;
  3068. }
  3069. if (m_bSqlSccoOptValues)
  3070. {
  3071. if (b)
  3072. file.WriteString(_T(","));
  3073. file.WriteString(_T("Opt/Values"));
  3074. b = TRUE;
  3075. }
  3076. if (m_bSqlSccoReadOnly)
  3077. {
  3078. if (b)
  3079. file.WriteString(_T(","));
  3080. file.WriteString(_T("Read Only"));
  3081. b = TRUE;
  3082. }
  3083. if (!b)
  3084. file.WriteString(_T("<none>"));
  3085. file.WriteString(_T("n"));
  3086. file.WriteString(_T("           Scroll Options - "));
  3087. b = FALSE;
  3088. if (m_bSqlSoDynamic)
  3089. {
  3090. file.WriteString(_T("Dynamic"));
  3091. b = TRUE;
  3092. }
  3093. if (m_bSqlSoForwardOnly)
  3094. {
  3095. if (b)
  3096. file.WriteString(_T(","));
  3097. file.WriteString(_T("Forward Only"));
  3098. b = TRUE;
  3099. }
  3100. if (m_bSqlSoKeysetDriven)
  3101. {
  3102. if (b)
  3103. file.WriteString(_T(","));
  3104. file.WriteString(_T("Keyset Driven"));
  3105. b = TRUE;
  3106. }
  3107. if (m_bSqlSoMixed)
  3108. {
  3109. if (b)
  3110. file.WriteString(_T(","));
  3111. file.WriteString(_T("Mixed"));
  3112. b = TRUE;
  3113. }
  3114. if (m_bSqlSoStatic)
  3115. {
  3116. if (b)
  3117. file.WriteString(_T(","));
  3118. file.WriteString(_T("Static"));
  3119. b = TRUE;
  3120. }
  3121. if (!b)
  3122. file.WriteString(_T("<none>"));
  3123. file.WriteString(_T("n"));
  3124. file.WriteString(_T("              Owner Usage - "));
  3125. b = FALSE;
  3126. if (m_bSqlOuDmlStatements)
  3127. {
  3128. file.WriteString(_T("DML Stmt"));
  3129. b = TRUE;
  3130. }
  3131. if (m_bSqlOuIndexDefinition)
  3132. {
  3133. if (b)
  3134. file.WriteString(_T(","));
  3135. file.WriteString(_T("Index Def"));
  3136. b = TRUE;
  3137. }
  3138. if (m_bSqlOuPrivilegeDefinition)
  3139. {
  3140. if (b)
  3141. file.WriteString(_T(","));
  3142. file.WriteString(_T("Priv Def"));
  3143. b = TRUE;
  3144. }
  3145. if (m_bSqlOuProcedureInvocation)
  3146. {
  3147. if (b)
  3148. file.WriteString(_T(","));
  3149. file.WriteString(_T("Proc Invoke"));
  3150. b = TRUE;
  3151. }
  3152. if (m_bSqlOuTableDefinition)
  3153. {
  3154. if (b)
  3155. file.WriteString(_T(","));
  3156. file.WriteString(_T("Table Def"));
  3157. b = TRUE;
  3158. }
  3159. if (!b)
  3160. file.WriteString(_T("<none>"));
  3161. file.WriteString(_T("n"));
  3162. file.WriteString(_T("          Qualifier Usage - "));
  3163. b = FALSE;
  3164. if (m_bSqlQuDmlStatements)
  3165. {
  3166. file.WriteString(_T("DML Stmt"));
  3167. b = TRUE;
  3168. }
  3169. if (m_bSqlQuIndexDefinition)
  3170. {
  3171. if (b)
  3172. file.WriteString(_T(","));
  3173. file.WriteString(_T("Index Def"));
  3174. b = TRUE;
  3175. }
  3176. if (m_bSqlQuPrivilegeDefinition)
  3177. {
  3178. if (b)
  3179. file.WriteString(_T(","));
  3180. file.WriteString(_T("Priv Def"));
  3181. b = TRUE;
  3182. }
  3183. if (m_bSqlQuProcedureInvocation)
  3184. {
  3185. if (b)
  3186. file.WriteString(_T(","));
  3187. file.WriteString(_T("Proc Invoke"));
  3188. b = TRUE;
  3189. }
  3190. if (m_bSqlQuTableDefinition)
  3191. {
  3192. if (b)
  3193. file.WriteString(_T(","));
  3194. file.WriteString(_T("Table Def"));
  3195. b = TRUE;
  3196. }
  3197. if (!b)
  3198. file.WriteString(_T("<none>"));
  3199. file.WriteString(_T("n"));
  3200. }
  3201. }
  3202. void CMisc2::DoDataExchange(CDataExchange* pDX)
  3203. {
  3204. CPropertyPage::DoDataExchange(pDX);
  3205. //{{AFX_DATA_MAP(CMisc2)
  3206. DDX_Check(pDX, IDC_SQL_OU_DML_STATEMENTS, m_bSqlOuDmlStatements);
  3207. DDX_Check(pDX, IDC_SQL_OU_INDEX_DEFINITION, m_bSqlOuIndexDefinition);
  3208. DDX_Check(pDX, IDC_SQL_OU_PRIVILEGE_DEFINITION, m_bSqlOuPrivilegeDefinition);
  3209. DDX_Check(pDX, IDC_SQL_OU_PROCEDURE_INVOCATION, m_bSqlOuProcedureInvocation);
  3210. DDX_Check(pDX, IDC_SQL_OU_TABLE_DEFINITION, m_bSqlOuTableDefinition);
  3211. DDX_Check(pDX, IDC_SQL_QU_DML_STATEMENTS, m_bSqlQuDmlStatements);
  3212. DDX_Check(pDX, IDC_SQL_QU_INDEX_DEFINITION, m_bSqlQuIndexDefinition);
  3213. DDX_Check(pDX, IDC_SQL_QU_PRIVILEGE_DEFINITION, m_bSqlQuPrivilegeDefinition);
  3214. DDX_Check(pDX, IDC_SQL_QU_PROCEDURE_INVOCATION, m_bSqlQuProcedureInvocation);
  3215. DDX_Check(pDX, IDC_SQL_QU_TABLE_DEFINITION, m_bSqlQuTableDefinition);
  3216. DDX_Check(pDX, IDC_SQL_SO_DYNAMIC, m_bSqlSoDynamic);
  3217. DDX_Check(pDX, IDC_SQL_SO_FORWARD_ONLY, m_bSqlSoForwardOnly);
  3218. DDX_Check(pDX, IDC_SQL_SO_KEYSET_DRIVEN, m_bSqlSoKeysetDriven);
  3219. DDX_Check(pDX, IDC_SQL_SO_MIXED, m_bSqlSoMixed);
  3220. DDX_Check(pDX, IDC_SQL_SO_STATIC, m_bSqlSoStatic);
  3221. DDX_Check(pDX, IDC_SQL_SCCO_LOCK, m_bSqlSccoLock);
  3222. DDX_Check(pDX, IDC_SQL_SCCO_OPT_ROWVER, m_bSqlSccoOptRowver);
  3223. DDX_Check(pDX, IDC_SQL_SCCO_OPT_VALUES, m_bSqlSccoOptValues);
  3224. DDX_Check(pDX, IDC_SQL_SCCO_READ_ONLY, m_bSqlSccoReadOnly);
  3225. DDX_Check(pDX, IDC_SQL_POS_ADD, m_bSqlPosAdd);
  3226. DDX_Check(pDX, IDC_SQL_POS_DELETE, m_bSqlPosDelete);
  3227. DDX_Check(pDX, IDC_SQL_POS_POSITION, m_bSqlPosPosition);
  3228. DDX_Check(pDX, IDC_SQL_POS_REFRESH, m_bSqlPosRefresh);
  3229. DDX_Check(pDX, IDC_SQL_POS_UPDATE, m_bSqlPosUpdate);
  3230. DDX_Check(pDX, IDC_SQL_FD_FETCH_ABSOLUTE, m_bSqlFdFetchAbsolute);
  3231. DDX_Check(pDX, IDC_SQL_FD_FETCH_BOOKMARK, m_bSqlFdFetchBookmark);
  3232. DDX_Check(pDX, IDC_SQL_FD_FETCH_FIRST, m_bSqlFdFetchFirst);
  3233. DDX_Check(pDX, IDC_SQL_FD_FETCH_LAST, m_bSqlFdFetchLast);
  3234. DDX_Check(pDX, IDC_SQL_FD_FETCH_NEXT, m_bSqlFdFetchNext);
  3235. DDX_Check(pDX, IDC_SQL_FD_FETCH_PRIOR, m_bSqlFdFetchPrior);
  3236. DDX_Check(pDX, IDC_SQL_FD_FETCH_RELATIVE, m_bSqlFdFetchRelative);
  3237. DDX_Check(pDX, IDC_SQL_GD_ANY_COLUMN, m_bSqlGdAnyColumn);
  3238. DDX_Check(pDX, IDC_SQL_GD_ANY_ORDER, m_bSqlGdAnyOrder);
  3239. DDX_Check(pDX, IDC_SQL_GD_BLOCK, m_bSqlGdBlock);
  3240. DDX_Check(pDX, IDC_SQL_GD_BOUND, m_bSqlGdBound);
  3241. DDX_Text(pDX, IDC_SQL_CONCAT_NULL_BEHAVIOR, m_strSqlConcatNullBehavior);
  3242. DDX_Text(pDX, IDC_SQL_NEED_LONG_DATA_LEN, m_strSqlNeedLongDataLen);
  3243. DDX_Text(pDX, IDC_SQL_NON_NULLABLE_COLUMNS, m_strSqlNonNullableColumns);
  3244. DDX_Text(pDX, IDC_SQL_NULL_COLLATION, m_strSqlNullCollation);
  3245. DDX_Text(pDX, IDC_SQL_PROCEDURES, m_strSqlProcedures);
  3246. DDX_Text(pDX, IDC_SQL_ROW_UPDATES, m_strSqlRowUpdates);
  3247. //}}AFX_DATA_MAP
  3248. }
  3249. BEGIN_MESSAGE_MAP(CMisc2, CPropertyPage)
  3250. //{{AFX_MSG_MAP(CMisc2)
  3251. //}}AFX_MSG_MAP
  3252. END_MESSAGE_MAP()
  3253. /////////////////////////////////////////////////////////////////////////////
  3254. // CMisc2 message handlers
  3255. void CMisc2::OnNewDSN()
  3256. {
  3257. if (m_pDatabase->IsOpen())
  3258. {
  3259. SDWORD  longValue;
  3260. YIsYes(m_strSqlNeedLongDataLen,SQL_NEED_LONG_DATA_LEN);
  3261. switch (SQLGetInfoShort(SQL_NON_NULLABLE_COLUMNS))
  3262. {
  3263. case SQL_NNC_NULL:
  3264. m_strSqlNonNullableColumns = _T("Not Supported");
  3265. break;
  3266. case SQL_NNC_NON_NULL:
  3267. m_strSqlNonNullableColumns = _T("Supported");
  3268. break;
  3269. }
  3270. switch (SQLGetInfoShort(SQL_CONCAT_NULL_BEHAVIOR))
  3271. {
  3272. case SQL_CB_NULL:
  3273. m_strSqlConcatNullBehavior = _T("Result is NULL");
  3274. break;
  3275. case SQL_CB_NON_NULL:
  3276. m_strSqlConcatNullBehavior = _T("Result is not NULL");
  3277. break;
  3278. }
  3279. switch (SQLGetInfoShort(SQL_NULL_COLLATION))
  3280. {
  3281. case SQL_NC_END:
  3282. m_strSqlNullCollation = _T("End");
  3283. break;
  3284. case SQL_NC_HIGH:
  3285. m_strSqlNullCollation = _T("High");
  3286. break;
  3287. case SQL_NC_LOW:
  3288. m_strSqlNullCollation = _T("Low");
  3289. break;
  3290. case SQL_NC_START:
  3291. m_strSqlNullCollation = _T("Start");
  3292. break;
  3293. }
  3294. YIsSupported(m_strSqlProcedures,SQL_PROCEDURES);
  3295. YIsYes(m_strSqlRowUpdates,SQL_ROW_UPDATES);
  3296. longValue = SQLGetInfoLong(SQL_FETCH_DIRECTION);
  3297. if (longValue & SQL_FD_FETCH_NEXT)
  3298. m_bSqlFdFetchNext = TRUE;
  3299. else
  3300. m_bSqlFdFetchNext = FALSE;
  3301. if (longValue & SQL_FD_FETCH_FIRST)
  3302. m_bSqlFdFetchFirst = TRUE;
  3303. else
  3304. m_bSqlFdFetchFirst = FALSE;
  3305. if (longValue & SQL_FD_FETCH_LAST)
  3306. m_bSqlFdFetchLast = TRUE;
  3307. else
  3308. m_bSqlFdFetchLast = FALSE;
  3309. if (longValue & SQL_FD_FETCH_PRIOR)
  3310. m_bSqlFdFetchPrior = TRUE;
  3311. else
  3312. m_bSqlFdFetchPrior = FALSE;
  3313. if (longValue & SQL_FD_FETCH_ABSOLUTE)
  3314. m_bSqlFdFetchAbsolute = TRUE;
  3315. else
  3316. m_bSqlFdFetchAbsolute = FALSE;
  3317. if (longValue & SQL_FD_FETCH_RELATIVE)
  3318. m_bSqlFdFetchRelative = TRUE;
  3319. else
  3320. m_bSqlFdFetchRelative = FALSE;
  3321. if (longValue & SQL_FD_FETCH_BOOKMARK)
  3322. m_bSqlFdFetchBookmark = TRUE;
  3323. else
  3324. m_bSqlFdFetchBookmark = FALSE;
  3325. longValue = SQLGetInfoLong(SQL_GETDATA_EXTENSIONS);
  3326. if (longValue & SQL_GD_ANY_COLUMN)
  3327. m_bSqlGdAnyColumn = TRUE;
  3328. else
  3329. m_bSqlGdAnyColumn = FALSE;
  3330. if (longValue & SQL_GD_ANY_ORDER)
  3331. m_bSqlGdAnyOrder = TRUE;
  3332. else
  3333. m_bSqlGdAnyOrder = FALSE;
  3334. if (longValue & SQL_GD_BLOCK)
  3335. m_bSqlGdBlock = TRUE;
  3336. else
  3337. m_bSqlGdBlock = FALSE;
  3338. if (longValue & SQL_GD_BOUND)
  3339. m_bSqlGdBound = TRUE;
  3340. else
  3341. m_bSqlGdBound = FALSE;
  3342. longValue = SQLGetInfoLong(SQL_POS_OPERATIONS);
  3343. if (longValue & SQL_POS_POSITION)
  3344. m_bSqlPosPosition = TRUE;
  3345. else
  3346. m_bSqlPosPosition = FALSE;
  3347. if (longValue & SQL_POS_REFRESH)
  3348. m_bSqlPosRefresh = TRUE;
  3349. else
  3350. m_bSqlPosRefresh = FALSE;
  3351. if (longValue & SQL_POS_UPDATE)
  3352. m_bSqlPosUpdate = TRUE;
  3353. else
  3354. m_bSqlPosUpdate = FALSE;
  3355. if (longValue & SQL_POS_DELETE)
  3356. m_bSqlPosDelete = TRUE;
  3357. else
  3358. m_bSqlPosDelete = FALSE;
  3359. if (longValue & SQL_POS_ADD)
  3360. m_bSqlPosAdd = TRUE;
  3361. else
  3362. m_bSqlPosAdd = FALSE;
  3363. longValue = SQLGetInfoLong(SQL_SCROLL_CONCURRENCY);
  3364. if (longValue & SQL_SCCO_READ_ONLY)
  3365. m_bSqlSccoReadOnly = TRUE;
  3366. else
  3367. m_bSqlSccoReadOnly = FALSE;
  3368. if (longValue & SQL_SCCO_LOCK)
  3369. m_bSqlSccoLock = TRUE;
  3370. else
  3371. m_bSqlSccoLock = FALSE;
  3372. if (longValue & SQL_SCCO_OPT_ROWVER)
  3373. m_bSqlSccoOptRowver = TRUE;
  3374. else
  3375. m_bSqlSccoOptRowver = FALSE;
  3376. if (longValue & SQL_SCCO_OPT_VALUES)
  3377. m_bSqlSccoOptValues = TRUE;
  3378. else
  3379. m_bSqlSccoOptValues = FALSE;
  3380. longValue = SQLGetInfoLong(SQL_SCROLL_OPTIONS);
  3381. if (longValue & SQL_SO_FORWARD_ONLY)
  3382. m_bSqlSoForwardOnly = TRUE;
  3383. else
  3384. m_bSqlSoForwardOnly = FALSE;
  3385. if (longValue & SQL_SO_STATIC)
  3386. m_bSqlSoStatic = TRUE;
  3387. else
  3388. m_bSqlSoStatic = FALSE;
  3389. if (longValue & SQL_SO_KEYSET_DRIVEN)
  3390. m_bSqlSoKeysetDriven = TRUE;
  3391. else
  3392. m_bSqlSoKeysetDriven = FALSE;
  3393. if (longValue & SQL_SO_DYNAMIC)
  3394. m_bSqlSoDynamic = TRUE;
  3395. else
  3396. m_bSqlSoDynamic = FALSE;
  3397. if (longValue & SQL_SO_MIXED)
  3398. m_bSqlSoMixed = TRUE;
  3399. else
  3400. m_bSqlSoMixed = FALSE;
  3401. longValue = SQLGetInfoLong(SQL_OWNER_USAGE);
  3402. if (longValue & SQL_OU_DML_STATEMENTS)
  3403. m_bSqlOuDmlStatements = TRUE;
  3404. else
  3405. m_bSqlOuDmlStatements = FALSE;
  3406. if (longValue & SQL_OU_PROCEDURE_INVOCATION)
  3407. m_bSqlOuProcedureInvocation = TRUE;
  3408. else
  3409. m_bSqlOuProcedureInvocation = FALSE;
  3410. if (longValue & SQL_OU_TABLE_DEFINITION)
  3411. m_bSqlOuTableDefinition = TRUE;
  3412. else
  3413. m_bSqlOuTableDefinition = FALSE;
  3414. if (longValue & SQL_OU_INDEX_DEFINITION)
  3415. m_bSqlOuIndexDefinition = TRUE;
  3416. else
  3417. m_bSqlOuIndexDefinition = FALSE;
  3418. if (longValue & SQL_OU_PRIVILEGE_DEFINITION)
  3419. m_bSqlOuPrivilegeDefinition = TRUE;
  3420. else
  3421. m_bSqlOuPrivilegeDefinition = FALSE;
  3422. longValue = SQLGetInfoLong(SQL_QUALIFIER_USAGE);
  3423. if (longValue & SQL_QU_DML_STATEMENTS)
  3424. m_bSqlQuDmlStatements = TRUE;
  3425. else
  3426. m_bSqlQuDmlStatements = FALSE;
  3427. if (longValue & SQL_QU_PROCEDURE_INVOCATION)
  3428. m_bSqlQuProcedureInvocation = TRUE;
  3429. else
  3430. m_bSqlQuProcedureInvocation = FALSE;
  3431. if (longValue & SQL_QU_TABLE_DEFINITION)
  3432. m_bSqlQuTableDefinition = TRUE;
  3433. else
  3434. m_bSqlQuTableDefinition = FALSE;
  3435. if (longValue & SQL_QU_INDEX_DEFINITION)
  3436. m_bSqlQuIndexDefinition = TRUE;
  3437. else
  3438. m_bSqlQuIndexDefinition = FALSE;
  3439. if (longValue & SQL_QU_PRIVILEGE_DEFINITION)
  3440. m_bSqlQuPrivilegeDefinition = TRUE;
  3441. else
  3442. m_bSqlQuPrivilegeDefinition = FALSE;
  3443. if (IsWindow(m_hWnd))
  3444. UpdateData(FALSE);
  3445. }
  3446. }
  3447. BOOL CMisc2::OnInitDialog()
  3448. {
  3449. CWaitCursor wait;
  3450. CPropertyPage::OnInitDialog();
  3451. UpdateData(FALSE);
  3452. return TRUE;  // return TRUE unless you set the focus to a control
  3453.   // EXCEPTION: OCX Property Pages should return FALSE
  3454. }