home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Internet Business Development Kit / PRODUCT_CD.iso / sqlsvr / odbcsdk / samples / admndemo / dialogs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-07  |  17.6 KB  |  536 lines

  1. //*---------------------------------------------------------------------------------
  2. //|  ODBC System Administrator
  3. //|
  4. //|  This code is furnished on an as-is basis as part of the ODBC SDK and is
  5. //|  intended for example purposes only.
  6. //|
  7. //|    Title:    DIALOGS.C
  8. //|        This module contains the dialog procs which are used to display
  9. //|            catalog function arguements and display the results.  Note that
  10. //|            the best way to determine the size of the arguements would be
  11. //|            to use SQLGetInfo, however, due to ease of coding, the values
  12. //|            have been hard-coded to constants.
  13. //*---------------------------------------------------------------------------------
  14. #include <windows.h>
  15. #include "admndemo.h"
  16. #include "dialogs.h"
  17. #include "sql.h"
  18. #include "sqlext.h"
  19. #include "execute.h"
  20. #include "info.h"
  21. #include "results.h"
  22. #include "strings.h"
  23.  
  24. VSZFile;
  25. #define CHKNULL(str)  (*str ? str : NULL)
  26.  
  27.  
  28. //*---------------------------------------------------------------------------------
  29. //|    Local function prototypes
  30. //*---------------------------------------------------------------------------------
  31. BOOL ShowCatalogResults(CHILDINFO FAR * ci, LPSTR szTitle);
  32. BOOL EXTFUN CatalogWndProc(HWND hDlg, unsigned msg, WORD wParam, LONG lParam);
  33.  
  34.  
  35. //*---------------------------------------------------------------------------------
  36. //|    Global variables
  37. //*---------------------------------------------------------------------------------
  38. extern char OutStr[MAXBUFF];
  39.  
  40.  
  41. //
  42. // The following set of defines and host vars are used to create a common
  43. //    dialog handler for each of the catalog function dialogs.  This makes 
  44. // the code size smaller while still handling each catalog functions
  45. //    parameters.  It also allows for sharing of values from one function
  46. //    to another.
  47. //
  48. #define CAT_LAST             256
  49. #define CAT_QUALIFIER        1
  50. #define CAT_TABLE                2
  51. #define CAT_OWNER                4
  52. #define CAT_TYPE                8
  53. #define CAT_COLUMN          16
  54. #define CAT_QUALIFIER2      32
  55. #define CAT_OWNER2          64
  56. #define CAT_TABLE2         128
  57. #define CAT_PROCS             256        
  58. char szQualifierVal[MAX_QUALIFIER];
  59. char szTableVal[MAX_NAME];
  60. char szOwnerVal[MAX_OWNER];
  61. char szTypeVal[MAX_NAME];
  62. char szColumnVal[MAX_NAME];
  63. char szQualifierVal2[MAX_QUALIFIER];
  64. char szOwnerVal2[MAX_OWNER];
  65. char szTableVal2[MAX_NAME];
  66. char szProcsVal[MAX_NAME];
  67.  
  68. struct {
  69.     int            mMask;                                // Bit mask value
  70.     int            id;                                    // Edit control id
  71.     LPSTR            szStr;                                // Buffer location
  72.     int            cbMax;                                // Maximum size
  73.     } CatalogVals[] = {
  74. // mMask                        id                                szStr                            cbMax
  75. // -------------------    ---------------------    -----------------------    ------------------------
  76.     CAT_QUALIFIER,            IDE_QUALIFIER,                (LPSTR)szQualifierVal,    MAX_QUALIFIER,
  77.     CAT_TABLE,                IDE_TABLE,                    (LPSTR)szTableVal,        MAX_NAME,
  78.     CAT_OWNER,                IDE_OWNER,                    (LPSTR)szOwnerVal,        MAX_OWNER,
  79.     CAT_TYPE,                IDE_TYPE,                    (LPSTR)szTypeVal,            MAX_NAME,
  80.     CAT_COLUMN,                IDE_COLUMN,                    (LPSTR)szColumnVal,        MAX_NAME,
  81.     CAT_QUALIFIER2,        IDE_QUALIFIER2,            (LPSTR)szQualifierVal2,    MAX_QUALIFIER,
  82.     CAT_OWNER2,                IDE_OWNER2,                    (LPSTR)szOwnerVal2,        MAX_OWNER,
  83.     CAT_TABLE2,                IDE_TABLE2,                    (LPSTR)szTableVal2,        MAX_NAME,
  84.     CAT_PROCS,                IDE_PROCEDURE,                (LPSTR)szProcsVal,        MAX_NAME,
  85.     };
  86.  
  87. dCSEG(char) szTablesTitle[]                    =    "Tables";
  88. dCSEG(char) szColumnsTitle[]                    =    "Columns";
  89. dCSEG(char)    szStatistics[]                        =    "Statistics";
  90. dCSEG(char)    szPrimaryKeys[]                    =    "Primary Keys";
  91. dCSEG(char)    szForeignKeys[]                    =    "Foreign Keys";
  92. dCSEG(char)    szTablePrivs[]                        =    "Table Privileges";
  93. dCSEG(char) szColumnPrivs[]                    =    "Column Privileges";
  94. dCSEG(char) szSpecialCols[]                    =    "Special Columns";
  95. dCSEG(char) szProcsTitle[]                        =    "Procedures";
  96. dCSEG(char) szProcCols[]                        =    "Procedure Columns";
  97. dCSEG(char)    szCOLON[]                            =    ":";
  98.  
  99.  
  100. struct {
  101.     int                    idMenu;                            // Menu identifier
  102.     int                    iDialogName;                    // ID of dialog
  103. //    DLGWNDPROC             dlgProc;                            // Dialog procedure
  104.     LPSTR                    szDlgTitle;                        // Title of the dialog
  105.     UINT                    mask;                                // Mask for this dialog
  106.     } Dialogs[] = {
  107. // idMenu                        iDialogName                        szDlgTitle                    mask
  108. //    ---------------------    ------------------            -----------------------    -------------------------------------------------
  109.     IDM_TABLES,                    IDD_SQLTABLES,                    (LPSTR)szTablesTitle,    CAT_QUALIFIER | CAT_OWNER | CAT_TABLE | CAT_TYPE,
  110.     IDM_COLUMNS,                IDD_SQLCOLUMNS,                (LPSTR)szColumnsTitle,    CAT_QUALIFIER | CAT_OWNER | CAT_TABLE | CAT_COLUMN,
  111.     IDM_STATISTICS,            IDD_SQLSTATISTICS,            (LPSTR)szStatistics,      CAT_QUALIFIER | CAT_OWNER | CAT_TABLE,
  112.     IDM_PRIMARY_KEYS,            IDD_SQLPRIMARYKEYS,            (LPSTR)szPrimaryKeys,    CAT_QUALIFIER | CAT_OWNER | CAT_TABLE,
  113.     IDM_FOREIGN_KEYS,            IDD_SQLFOREIGNKEYS,            (LPSTR)szForeignKeys,    CAT_QUALIFIER | CAT_OWNER | CAT_TABLE | CAT_QUALIFIER2 | CAT_OWNER2 | CAT_TABLE2,
  114.     IDM_TABLE_PRIVS,            IDD_SQLTABLEPRIVILEGES,        (LPSTR)szTablePrivs,        CAT_QUALIFIER | CAT_OWNER | CAT_TABLE,
  115.     IDM_COLUMN_PRIVS,            IDD_SQLCOLUMNPRIVILEGES,    (LPSTR)szColumnPrivs,    CAT_QUALIFIER | CAT_OWNER | CAT_TABLE | CAT_COLUMN,
  116.     IDM_SPECIAL_COLUMNS,        IDD_SQLSPECIALCOLUMNS,        (LPSTR)szSpecialCols,    CAT_QUALIFIER | CAT_OWNER | CAT_TABLE,
  117.     IDM_PROCEDURES,            IDD_SQLPROCEDURES,            (LPSTR)szProcsTitle,        CAT_QUALIFIER | CAT_OWNER | CAT_PROCS,
  118.     IDM_PROC_COLUMNS,            IDD_SQLPROCEDURECOLUMNS,    (LPSTR)szProcCols,        CAT_QUALIFIER | CAT_OWNER | CAT_PROCS | CAT_COLUMN,
  119.     };
  120.  
  121. //
  122. // This structure is used to control the catalog fucntions
  123. //
  124. typedef struct tagCATALOGINFO {
  125.     HINSTANCE            hInst;                    // Instance handle for this app
  126.     CHILDINFO FAR *    ci;                        // Child info
  127.     int                    id;                        // Dialog id to indicate function
  128.     LPSTR                    szDlgTitle;                // Title for the dialog
  129.     UINT                    mask;                        // Dialog control mask
  130. // For SQLStatistics
  131.     UWORD                    fUnique;
  132.     UWORD                    fAccuracy;
  133. // For SQLSpecialColumns
  134.     UWORD                    fColType;
  135.     UWORD                    fScope;
  136.     UWORD                    fNullable;
  137.     } CATALOGINFO;
  138.  
  139. //
  140. // A prototype for radio button controls
  141. //
  142. typedef struct tagIDXINFO {
  143.     int                    idxVal;
  144.     int                    fType;
  145.     } IDXINFO;
  146.     
  147. //
  148. //    For SQLStatistics, fUnqiue parameter    
  149. //
  150. struct {
  151.     int                    idxVal;                            // Dialog item number
  152.     int                    fType;                            // SQL constant equivalent
  153.     } StatsfUnique[] = {
  154. //    idxVal                                fType
  155. //    --------------------------        ---------------------------------
  156.     IDX_INDEX_UNIQUE,                    SQL_INDEX_UNIQUE,
  157.     IDX_INDEX_ALL,                        SQL_INDEX_ALL,
  158.     };
  159.  
  160. //
  161. //    For SQLStatistics, fAccuracy parameter    
  162. //
  163. struct {
  164.     int                    idxVal;                            // Dialog item number
  165.     int                    fType;                            // SQL constant equivalent
  166.     } StatsfAccuracy[] = {
  167. //    idxVal                                fType
  168. //    --------------------------        ---------------------------------
  169.     IDX_ENSURE,                            SQL_ENSURE,
  170.     IDX_QUICK,                            SQL_QUICK,
  171.     };
  172.  
  173. //
  174. //    For SQLSpecialColumns, fColType parameter    
  175. //
  176. struct {
  177.     int                    idxVal;                            // Dialog item number
  178.     int                    fType;                            // SQL constant equivalent
  179.     } SpecColsfColType[] = {
  180. //    idxVal                                fType
  181. //    --------------------------        ---------------------------------
  182.     IDX_BEST_ROWID,                    SQL_BEST_ROWID,
  183.     IDX_ROWVER,                            SQL_ROWVER,
  184.     };
  185.  
  186. //
  187. //    For SQLSpecialColumns, fNullable parameter    
  188. //
  189. struct {
  190.     int                    idxVal;                            // Dialog item number
  191.     int                    fType;                            // SQL constant equivalent
  192.     } SpecColsfNullable[] = {
  193. //    idxVal                                fType
  194. //    --------------------------        ---------------------------------
  195.     IDX_NO_NULLS,                        SQL_NO_NULLS,
  196.     IDX_NULLABLE,                        SQL_NULLABLE,
  197.     };
  198.  
  199. //
  200. //    For SQLSpecialColumns, fScope parameter    
  201. //
  202. struct {
  203.     int                    idxVal;                            // Dialog item number
  204.     int                    fType;                            // SQL constant equivalent
  205.     } SpecColsfScope[] = {
  206. //    idxVal                                fType
  207. //    --------------------------        ---------------------------------
  208.     IDX_SCOPE_CURROW,                    SQL_SCOPE_CURROW,
  209.     IDX_SCOPE_TRANSACTION,            SQL_SCOPE_TRANSACTION,
  210.     IDX_SCOPE_SESSION,                SQL_SCOPE_SESSION,
  211.     };
  212.  
  213.  
  214.  
  215.  
  216. //*---------------------------------------------------------------------------------
  217. //| GetRadioValue:
  218. //|    This function will examine a group of radio buttons based on the control
  219. //|    structure and see which is checked.  When found, that value is returned.
  220. //| Parms:
  221. //|    hDlg                Window handle of dialog with control
  222. //|    stct                Radio control structure
  223. //|    cbNum                How many items in control structure
  224. //| Returns:              
  225. //|    The value for the item checked
  226. //*---------------------------------------------------------------------------------
  227. int GetRadioValue(HWND hDlg, IDXINFO FAR * stct, int cbNum)
  228.     int     dex;                                                               
  229.     for(dex=0;  dex<cbNum;  dex++)                                  
  230.         if(IsDlgButtonChecked(hDlg, stct[dex].idxVal))
  231.             return(stct[dex].fType); 
  232.     return 0;
  233. }
  234.  
  235.  
  236. //*---------------------------------------------------------------------------------
  237. //| ShowCatalogResults:
  238. //|    This function will display the results set returned by a catalog
  239. //|    function.
  240. //| Parms:
  241. //|    in            ci                            CHILDINFO information
  242. //|    in            szTitle                    Title for the results set
  243. //| Returns:              
  244. //|    Nothing.
  245. //*---------------------------------------------------------------------------------
  246. BOOL ShowCatalogResults(CHILDINFO FAR * ci, LPSTR szTitle)
  247. {
  248.     RESULTSSET FAR *     rs;
  249.     int                    cbCols;
  250.  
  251.     if(!(cbCols = GetNumResultsCols(ci->hstmt)))
  252.         return TRUE;
  253.     if(cbCols == 0) {
  254.         szWrite(ci->hwndOut, GetidsString(idsNoDataFound, OutStr, sizeof(OutStr)));
  255.         return TRUE;
  256.         }
  257.     rs = GetConnectWindowResultsNode(ci);
  258.     if(!CreateResultsSet(rs, ci->hwndClient, ci->hInst,
  259.                 cbCols, szTitle))
  260.         return TRUE;
  261.     SetMetaDataFromSql(ci->hwndOut, ci->hstmt, rs, cbCols);
  262.     if(!CreateResultsWindow(ci, rs))
  263.         return TRUE;
  264.     FetchAllRecordsToResults(ci->hwndOut, ci->hstmt, rs, cbCols, TRUE);
  265.     SQLFreeStmt(ci->hstmt, SQL_CLOSE);
  266.     
  267.     return FALSE;
  268. }
  269.  
  270.  
  271. //*---------------------------------------------------------------------------------
  272. //| DoList:
  273. //|    This function will display a selection dialog for the catalog functions
  274. //|    then process the request.
  275. //| Parms:
  276. //|    in            ci                            CHILDINFO information
  277. //|    in            idMenuSelection        Menu value
  278. //| Returns:              
  279. //|    Nothing.
  280. //*---------------------------------------------------------------------------------
  281. void DoList(CHILDINFO FAR * ci, int idMenuSelection)
  282. {
  283.     static BOOL                    fInit;                // Have we called before
  284.     CATALOGINFO                    cati;
  285.     CATALOGINFO FAR *            lpcati=&cati;
  286.     DLGPROC                      dlgproc;
  287.     int                            dex;
  288.     HWND                            fHwnd=GetFocus();
  289.  
  290.     // Clean up all buffers on first catalog function
  291.     if(!fInit) {
  292.         for(dex=0;  dex<NumItems(CatalogVals);  dex++)
  293.             memset(CatalogVals[dex].szStr, 0, CatalogVals[dex].cbMax);
  294.         fInit = TRUE;
  295.         }
  296.  
  297.     // Find the dialog
  298.     for(dex=0;  dex<NumItems(Dialogs) &&
  299.                     Dialogs[dex].idMenu != idMenuSelection;  dex++);
  300.  
  301.     // Collect information for the dialog proc
  302.     cati.hInst = ci->hInst;
  303.     cati.id = idMenuSelection;
  304.     cati.ci = ci;
  305.     cati.szDlgTitle = Dialogs[dex].szDlgTitle;
  306.     cati.mask = Dialogs[dex].mask;
  307.  
  308.     // Display the dialog
  309.     dlgproc = MakeProcInstance(CatalogWndProc, cati.hInst);
  310.     if(-1 == DialogBoxParam(cati.hInst, 
  311.             MAKEINTRESOURCE(Dialogs[dex].iDialogName),
  312.             ci->hwnd, 
  313.             dlgproc, (LPARAM)(CATALOGINFO FAR *)lpcati))
  314.         MessageBox(NULL, "Could not open dialog box.",
  315.             "DoList", MB_ICONEXCLAMATION);
  316.     FreeProcInstance((FARPROC) dlgproc);
  317.     
  318.     if(fHwnd)
  319.         SetFocus(fHwnd);
  320. }
  321.  
  322.  
  323.  
  324. //*---------------------------------------------------------------------------------
  325. //| DoCatalogFunction:
  326. //|    The caller should have prepared all the information we need, so we will
  327. //|    simply invoke the function they want to run.
  328. //|    
  329. //| Parms:
  330. //|    cati        CATALOGINFO
  331. //| Returns:              
  332. //|    Nothing
  333. //*---------------------------------------------------------------------------------
  334. void DoCatalogFunction(CATALOGINFO FAR * cati)
  335. {
  336.     char                        szTitle[MAXBUFF];
  337.     RETCODE                    retcode;
  338.     CHILDINFO FAR *        ci=cati->ci;
  339.     
  340.     SQLFreeStmt(ci->hstmt, SQL_CLOSE);
  341.  
  342.     switch(cati->id) {                    
  343.         case IDM_TABLES:
  344.             if (!*szTableVal &&
  345.                 ((!*szOwnerVal && strcmp(szQualifierVal, "%") == 0)||
  346.                 (!*szQualifierVal && strcmp(szOwnerVal, "%") == 0)))
  347.                 retcode = SQLTables(ci->hstmt,
  348.                             szQualifierVal, SQL_NTS,
  349.                             szOwnerVal, SQL_NTS,
  350.                             szTableVal, SQL_NTS,
  351.                             szTypeVal, SQL_NTS);
  352.             else
  353.                 retcode = SQLTables(ci->hstmt, 
  354.                                     CHKNULL(szQualifierVal), SQL_NTS,
  355.                                     CHKNULL(szOwnerVal), SQL_NTS,
  356.                                     CHKNULL(szTableVal), SQL_NTS,
  357.                                     CHKNULL(szTypeVal), SQL_NTS);
  358.             break;
  359.  
  360.         case IDM_COLUMNS:
  361.                 retcode = SQLColumns(ci->hstmt,
  362.                             CHKNULL(szQualifierVal), SQL_NTS,
  363.                             CHKNULL(szOwnerVal), SQL_NTS,
  364.                             CHKNULL(szTableVal), SQL_NTS,
  365.                             CHKNULL(szColumnVal), SQL_NTS);
  366.             break;
  367.             
  368.         case IDM_STATISTICS:
  369.                 retcode = SQLStatistics(ci->hstmt,
  370.                             CHKNULL(szQualifierVal), SQL_NTS,
  371.                             CHKNULL(szOwnerVal), SQL_NTS,
  372.                             CHKNULL(szTableVal), SQL_NTS,
  373.                             cati->fUnique,
  374.                             cati->fAccuracy);
  375.             break;
  376.             
  377.         case IDM_PRIMARY_KEYS:
  378.                 retcode = SQLPrimaryKeys(ci->hstmt,
  379.                             CHKNULL(szQualifierVal), SQL_NTS,
  380.                             CHKNULL(szOwnerVal), SQL_NTS,
  381.                             CHKNULL(szTableVal), SQL_NTS);
  382.             break;
  383.             
  384.         case IDM_FOREIGN_KEYS:
  385.                 retcode = SQLForeignKeys(ci->hstmt,
  386.                             CHKNULL(szQualifierVal), SQL_NTS,
  387.                             CHKNULL(szOwnerVal), SQL_NTS,
  388.                             CHKNULL(szTableVal), SQL_NTS,
  389.                             CHKNULL(szQualifierVal2), SQL_NTS,
  390.                             CHKNULL(szOwnerVal2), SQL_NTS,
  391.                             CHKNULL(szTableVal2), SQL_NTS);
  392.             break;
  393.             
  394.         case IDM_TABLE_PRIVS:
  395.                 retcode = SQLTablePrivileges(ci->hstmt,
  396.                             CHKNULL(szQualifierVal), SQL_NTS,
  397.                             CHKNULL(szOwnerVal), SQL_NTS,
  398.                             CHKNULL(szTableVal), SQL_NTS);
  399.             break;
  400.             
  401.         case IDM_COLUMN_PRIVS:
  402.                 retcode = SQLColumnPrivileges(ci->hstmt,
  403.                             CHKNULL(szQualifierVal), SQL_NTS,
  404.                             CHKNULL(szOwnerVal), SQL_NTS,
  405.                             CHKNULL(szTableVal), SQL_NTS,
  406.                             CHKNULL(szColumnVal), SQL_NTS);
  407.             break;
  408.             
  409.         case IDM_SPECIAL_COLUMNS:
  410.                 retcode = SQLSpecialColumns(ci->hstmt,
  411.                             cati->fColType,
  412.                             CHKNULL(szQualifierVal), SQL_NTS,
  413.                             CHKNULL(szOwnerVal), SQL_NTS,
  414.                             CHKNULL(szTableVal), SQL_NTS,
  415.                             cati->fScope,     
  416.                             cati->fNullable);
  417.             break;
  418.             
  419.         case IDM_PROCEDURES:
  420.                 retcode = SQLProcedures(ci->hstmt,
  421.                             CHKNULL(szQualifierVal), SQL_NTS,
  422.                             CHKNULL(szOwnerVal), SQL_NTS,
  423.                             CHKNULL(szProcsVal), SQL_NTS);
  424.             break;
  425.             
  426.         case IDM_PROC_COLUMNS:
  427.                 retcode = SQLProcedureColumns(ci->hstmt,
  428.                             CHKNULL(szQualifierVal), SQL_NTS,
  429.                             CHKNULL(szOwnerVal), SQL_NTS,
  430.                             CHKNULL(szProcsVal), SQL_NTS,
  431.                             CHKNULL(szColumnVal), SQL_NTS);
  432.             break;
  433.         
  434.         default:
  435.             break;
  436.         }
  437.         
  438.     if(retcode != SQL_SUCCESS) {
  439.         PrintErrors(ci);
  440.         return;
  441.         }
  442.  
  443.     lstrcpy((LPSTR)szTitle, (LPSTR)ci->szClientTitle);
  444.     lstrcat((LPSTR)szTitle, (LPSTR)szCOLON);
  445.     lstrcat((LPSTR)szTitle, (LPSTR)cati->szDlgTitle);
  446.     if(ShowCatalogResults(ci, (LPSTR)szTitle))
  447.         return;
  448. }
  449.  
  450.  
  451. //*------------------------------------------------------------------------
  452. //| CatalogWndProc:
  453. //|    This windows procedure handles all of the catalog function messages.
  454. //|    Many things such as setting/getting text values are table driven.
  455. //|    This reduces overall code size significantly.
  456. //| Parms:
  457. //|    in            Standard window parms
  458. //| Returns:              
  459. //|    Depends on message
  460. //*------------------------------------------------------------------------
  461. BOOL EXTFUN CatalogWndProc(HWND hDlg, unsigned msg, WORD wParam, LONG lParam)
  462. {
  463.     static CATALOGINFO FAR *     cati;
  464.     int                                dex;
  465.  
  466.     switch(msg) {
  467.         case WM_INITDIALOG:
  468.             cati = (CATALOGINFO FAR *)lParam;
  469.             CenterDialog(hDlg);
  470.             
  471.             // Set all default values for edit controls
  472.             for(dex=0;  dex<NumItems(CatalogVals);  dex++) 
  473.                 if(cati->mask & CatalogVals[dex].mMask) {
  474.                     SetWindowText(GetDlgItem(hDlg, CatalogVals[dex].id),
  475.                                     CatalogVals[dex].szStr);
  476.                     SendMessage(GetDlgItem(hDlg, CatalogVals[dex].id), EM_LIMITTEXT,
  477.                                     CatalogVals[dex].cbMax, 0L);
  478.                     }
  479.             // Special case for dialogs with options
  480.             if(cati->id == IDM_STATISTICS) {
  481.                 CheckRadioButton(hDlg, IDX_INDEX_UNIQUE, IDX_INDEX_ALL, IDX_INDEX_UNIQUE);
  482.                 CheckRadioButton(hDlg, IDX_ENSURE, IDX_QUICK, IDX_ENSURE);
  483.                 }
  484.             else if(cati->id == IDM_SPECIAL_COLUMNS) {
  485.                 CheckRadioButton(hDlg, IDX_BEST_ROWID, IDX_ROWVER, IDX_BEST_ROWID);
  486.                 CheckRadioButton(hDlg, IDX_NO_NULLS, IDX_NULLABLE, IDX_NO_NULLS);
  487.                 CheckRadioButton(hDlg, IDX_SCOPE_CURROW, IDX_SCOPE_SESSION, IDX_SCOPE_CURROW);
  488.                 }
  489.                     
  490.             return TRUE;        
  491.  
  492.  
  493.         case WM_COMMAND:
  494.             switch(GET_WM_COMMAND_ID(wParam, lParam)) {
  495.                 case IDOK:
  496.                     {
  497.                     Busy(TRUE);
  498.                     for(dex=0;  dex<NumItems(CatalogVals);  dex++) 
  499.                         if(cati->mask & CatalogVals[dex].mMask)
  500.                             GetText(GetDlgItem(hDlg, CatalogVals[dex].id),
  501.                                     CatalogVals[dex].szStr);
  502.                     // Special case for dialogs with options
  503.                     if(cati->id == IDM_STATISTICS) {
  504.                         cati->fUnique = GetRadioValue(hDlg, (IDXINFO FAR *)StatsfUnique, NumItems(StatsfUnique));
  505.                         cati->fAccuracy = GetRadioValue(hDlg, (IDXINFO FAR *)StatsfAccuracy, NumItems(StatsfAccuracy));
  506.                         }
  507.                     else if(cati->id == IDM_SPECIAL_COLUMNS) {
  508.                         cati->fColType = GetRadioValue(hDlg, (IDXINFO FAR *)SpecColsfColType,
  509.                                         NumItems(SpecColsfColType));
  510.                         cati->fScope = GetRadioValue(hDlg, (IDXINFO FAR *)SpecColsfScope,
  511.                                         NumItems(SpecColsfScope));
  512.                         cati->fNullable = GetRadioValue(hDlg, (IDXINFO FAR *)SpecColsfNullable,
  513.                                         NumItems(SpecColsfNullable));
  514.                         }
  515.                     DoCatalogFunction(cati);
  516.  
  517.                     Busy(FALSE);
  518.                     EndDialog(hDlg, IDOK);
  519.                     }
  520.                     return TRUE;
  521.             
  522.             case IDCANCEL:
  523.                    SendMessage(hDlg, WM_CLOSE, 0, 0L);
  524.                    EndDialog(hDlg, IDCANCEL);
  525.                     return TRUE;
  526.                 }
  527.             return TRUE;
  528.  
  529.         default:
  530.             return FALSE;
  531.         }
  532.     return FALSE;
  533. }
  534.  
  535.