home *** CD-ROM | disk | FTP | other *** search
/ Total C++ 2 / TOTALCTWO.iso / borland / 32snipit.pak / DRVCAPS.C < prev    next >
C/C++ Source or Header  |  1997-05-06  |  11KB  |  298 lines

  1. // BDE32 3.x - (C) Copyright 1996 by Borland International
  2.  
  3. // drvcaps.c
  4. #include "snipit.h"
  5.  
  6. static DBIResult DisplayOptionalParams(pCHAR szDriver);
  7.  
  8. //=====================================================================
  9. //  Function:
  10. //          DriverCaps();
  11. //
  12. //  Description:
  13. //          This example shows how to determine the capabilities of
  14. //          available IDAPI drivers. This includes the table types
  15. //          supported and the fields which those table types support.
  16. //=====================================================================
  17. void
  18. DriverCaps (void)
  19. {
  20.     hDBIDb      hDb = 0;        // Handle to the database
  21.     hDBICur     hDrvCur = 0;    // Handle to the in-memory table
  22.                                 // containing the driver list
  23.     hDBICur     hTblTypeCur = 0;// Handle to the in-memory table
  24.                                 // containing the table-type list
  25.     hDBICur     hFldTypeCur = 0;// Handle to the in-memory table
  26.                                 // containing the field-type list
  27.     hDBICur     hIdxTypeCur = 0;// Handle to the in-memory table
  28.                                 // containing the index-type list
  29.     DBIResult   rslt;           // Return value from IDAPI functions
  30.     CURProps    TblProps;       // Table properties
  31.     pBYTE       pRecBuf;        // Record buffer
  32.     DBINAME     szDriver;       // String to contain the driver name
  33.     DBIMSG      szTempBuf;      // Temporary buffer for displaying information.
  34.     BOOL        bIsBlank;       // Is the field blank?
  35.     DRVType     drvType;        // Driver type information
  36.  
  37.     Screen("*** Driver Capabilities Example ***\r\n");
  38.  
  39.     BREAK_IN_DEBUGGER();
  40.  
  41.     Screen("    Initializing IDAPI...");
  42.     if (InitAndConnect(&hDb) != DBIERR_NONE)
  43.     {
  44.         Screen("\r\n*** End of Example ***");
  45.         return;
  46.     }
  47.  
  48.     Screen("    Setting the database directory...");
  49.     rslt = DbiSetDirectory(hDb, (pCHAR)szTblDirectory);
  50.     ChkRslt(rslt, "SetDirectory");
  51.  
  52.     // Get a list of the drivers which are available to the system
  53.     // (drivers which are defined in the configuration file).
  54.     rslt = DbiOpenDriverList(&hDrvCur);
  55.     if (ChkRslt(rslt, "OpenDriverList") != DBIERR_NONE)
  56.     {
  57.         CloseDbAndExit(&hDb);
  58.         Screen("\r\n*** End of example ***");
  59.         return;
  60.     }
  61.  
  62.     // Get the size of the record buffer.
  63.     rslt = DbiGetCursorProps(hDrvCur, &TblProps);
  64.     ChkRslt(rslt, "GetProps");
  65.  
  66.     // Allocate space for the record buffer.
  67.     pRecBuf = (pBYTE) malloc(TblProps.iRecBufSize * sizeof(BYTE));
  68.     if (pRecBuf == NULL)
  69.     {
  70.         Screen("    Error - Could not allocate memory");
  71.         rslt = DbiCloseCursor(&hDrvCur);
  72.         ChkRslt(rslt, "CloseCursor");
  73.         CloseDbAndExit(&hDb);
  74.         Screen("\r\n*** End of example ***");
  75.         return;
  76.     }
  77.  
  78.     Screen("    Go to the beginning of the table...");
  79.     rslt = DbiSetToBegin(hDrvCur);
  80.     ChkRslt(rslt, "SetToBegin");
  81.  
  82.     // Iterate through all available drivers in the configuration file.
  83.     while (DbiGetNextRecord(hDrvCur, dbiNOLOCK, pRecBuf, NULL) == DBIERR_NONE)
  84.     {
  85.         // Get the name of the driver
  86.         rslt = DbiGetField(hDrvCur, 1, pRecBuf, (pBYTE)szDriver,
  87.                            &bIsBlank);
  88.         ChkRslt(rslt, "GetField");
  89.  
  90.         // Get the description of the driver
  91.         rslt = DbiGetDriverDesc(szDriver, &drvType);
  92.         if (ChkRslt(rslt, "GetDriverDesc") != DBIERR_NONE)
  93.         {
  94.             continue;
  95.         }
  96.  
  97.         // Limit driver information to local tables (the edit control
  98.         // can only hold so much...)
  99.         if (drvType.edrvCat == drvFILE)
  100.         {
  101.             // Skip a line
  102.             Screen("");
  103.  
  104.             // Display the information about the driver
  105.             Screen("        Driver Name:                     %s",
  106.                    drvType.szType);
  107.             Screen("        Description:                     %s",
  108.                    drvType.szText);
  109.  
  110.             // Create a string to display depending on the driver category
  111.             switch(drvType.edrvCat)
  112.             {
  113.                 case drvFILE:
  114.                     strcpy(szTempBuf, "File-based (PDox, dBASE, Text)");
  115.                     break;
  116.                 case drvOTHERSERVER:
  117.                     strcpy(szTempBuf, "Other type of server???");
  118.                     break;
  119.                 case drvSQLBASEDSERVER:
  120.                     strcpy(szTempBuf, "SQL-based server");
  121.                     break;
  122.             }
  123.             Screen("        Category:                        %s", szTempBuf);
  124.             Screen("        Supports true database concepts: %s",
  125.                    drvType.bTrueDb ? "Yes" : "No");
  126.             Screen("        Database type to use:            %s",
  127.                    drvType.szDbType);
  128.             Screen("        Supports multi-user:             %s",
  129.                    drvType.bMultiUser ? "Yes" : "No");
  130.             Screen("        Read only?:                      %s",
  131.                    drvType.bReadWrite ? "No" : "Yes");
  132.             Screen("        Transaction support:             %s",
  133.                    drvType.bTrans ? "Yes" : "No");
  134.             Screen("        Supports pass-through SQL:       %s",
  135.                    drvType.bPassThruSQL ? "Yes" : "No");
  136.             Screen("        Requires explicit login:         %s",
  137.                    drvType.bLogIn ? "Yes" : "No");
  138.             Screen("        Can create a database:           %s",
  139.                    drvType.bCreateDb ? "Yes" : "No");
  140.             Screen("        Can drop a database:             %s",
  141.                    drvType.bDeleteDb ? "Yes" : "No");
  142.             Screen("        Can create a table:              %s",
  143.                    drvType.bCreateTable ? "Yes" : "No");
  144.             Screen("        Can delete a table:              %s",
  145.                   drvType.bDeleteTable ? "Yes" : "No");
  146.             Screen("        Multiple passwords:              %s",
  147.                    drvType.bMultiplePWs ? "Yes" : "No");
  148.  
  149.             // Determine table types that the driver can use.
  150.             rslt = DbiOpenTableTypesList(szDriver, &hTblTypeCur);
  151.             if (ChkRslt(rslt, "OpenTableTypesList") != DBIERR_NONE)
  152.             {
  153.                 continue;
  154.             }
  155.  
  156.             Screen("\r\n    Table types supported by the driver...");
  157.             DisplayInMemoryTable(hTblTypeCur, 0);
  158.  
  159.             rslt = DbiCloseCursor(&hTblTypeCur);
  160.             ChkRslt(rslt, "CloseCursor");
  161.  
  162.             // Determine field types that the driver can use.
  163.             rslt = DbiOpenFieldTypesList(szDriver, NULL, &hFldTypeCur);
  164.             if (ChkRslt(rslt, "OpenFieldTypesList") != DBIERR_NONE)
  165.             {
  166.                 continue;
  167.             }
  168.  
  169.             Screen("\r\n    Field types supported by the driver...");
  170.             DisplayInMemoryTable(hFldTypeCur, 0);
  171.  
  172.             rslt = DbiCloseCursor(&hFldTypeCur);
  173.             ChkRslt(rslt, "CloseCursor");
  174.  
  175.             // Determine index types that the driver can use.
  176.             rslt = DbiOpenIndexTypesList(szDriver, &hIdxTypeCur);
  177.             if (ChkRslt(rslt, "OpenTableTypesList") != DBIERR_NONE)
  178.             {
  179.                 continue;
  180.             }
  181.  
  182.             Screen("\r\n    Display the index types that the driver"
  183.                    " supports...");
  184.             DisplayInMemoryTable(hIdxTypeCur, 0);
  185.  
  186.             rslt = DbiCloseCursor(&hIdxTypeCur);
  187.             ChkRslt(rslt, "CloseCursor");
  188.  
  189.             Screen("\r\n    Optional parameters....\r\n");
  190.             DisplayOptionalParams(drvType.szType);
  191.         }
  192.     }
  193.  
  194.     free(pRecBuf);
  195.  
  196.     rslt = DbiCloseCursor(&hDrvCur);
  197.     ChkRslt(rslt, "CloseCursor");
  198.  
  199.     Screen("\r\n    Close the database and exit IDAPI...");
  200.     CloseDbAndExit(&hDb);
  201.  
  202.     Screen("\r\n*** End of Example ***");
  203. }
  204.  
  205. //=====================================================================
  206. //  Function:
  207. //          DisplayOptionalParams (pCHAR szDriver)
  208. //
  209. //  Input:  szDriver - name of the driver
  210. //
  211. //  Return: DBIResult - result of the operation
  212. //
  213. //  Description:
  214. //          This function is used to display the optional parameters
  215. //          for a given driver.
  216. //=====================================================================
  217. DBIResult
  218. DisplayOptionalParams (pCHAR szDriver)
  219. {
  220.     DBIResult   rslt;           // Return value from IDAPI functions
  221.     hDBICur     hCur;           // Handle to the cursor
  222.     pCHAR       szNode;         // String which contains the name of the
  223.                                 // node
  224.     pCFGDesc    CfgDesc;        // Configuration descriptor
  225.     DBIPATH     szCfgPath;      // Maximum length of the path in the
  226.                                 // configuration file.
  227.     pCHAR       szFieldNames;   // String to contain the field names
  228.     pCHAR       szFieldValues;  // String to contain the field values
  229.  
  230.     // Set up the option to get from the configuration file.
  231.     strcpy(szCfgPath, "\\");
  232.     strcat(szCfgPath, szCFGDRIVER);
  233.     strcat(szCfgPath, "\\");
  234.     strcat(szCfgPath, szDriver);
  235.     strcat(szCfgPath, "\\");
  236.     strcat(szCfgPath, szCFGTBLCREATE);
  237.  
  238.     // Open the configuration file - returns the configuration options
  239.     // for the current level in a schema table referenced by hCur.
  240.     rslt = DbiOpenCfgInfoList(NULL, dbiREADONLY, cfgPersistent,
  241.                               szCfgPath, &hCur);
  242.     if (ChkRslt(rslt, "OpenCfgInfoList") != DBIERR_NONE)
  243.     {
  244.         return rslt;
  245.     }
  246.  
  247.     // Allocate resources.
  248.     szNode = (pCHAR)malloc(DBIMAXPATHLEN * sizeof(CHAR) + 1);
  249.     szFieldNames = (pCHAR)malloc(DBIMAXSCRECSIZE * sizeof(CHAR) + 1);
  250.     szFieldValues = (pCHAR)malloc(DBIMAXSCRECSIZE * sizeof(CHAR) + 1);
  251.     CfgDesc = (pCFGDesc)malloc(sizeof(CFGDesc));
  252.     if ((szNode == NULL) || (szFieldNames == NULL) || (szFieldValues == NULL)
  253.         || (CfgDesc == NULL))
  254.     {
  255.         if (szNode) free(szNode);
  256.         if (szFieldNames) free(szFieldNames);
  257.         if (szFieldValues) free(szFieldValues);
  258.         if (CfgDesc) free((pCHAR)CfgDesc);
  259.         rslt = DbiCloseCursor(&hCur);
  260.         ChkRslt(rslt, "CloseCursor");
  261.         return DBIERR_NOMEMORY;
  262.     }
  263.  
  264.     // Set the spacing.
  265.     strcpy(szFieldNames, "    ");
  266.     strcpy(szFieldValues, "    ");
  267.  
  268.     // Process all nodes
  269.     // Get the next record in the table - contains the next option
  270.     // of the given level in the tree.
  271.     while (DbiGetNextRecord(hCur, dbiNOLOCK, (pBYTE)CfgDesc, NULL)
  272.            == DBIERR_NONE)
  273.     {
  274.         // Output this node, copying the name of the node to the
  275.         // szNode variable.
  276.         sprintf(szNode, "%-16s\t", CfgDesc->szNodeName);
  277.         strcat(szFieldNames, szNode);
  278.  
  279.         sprintf(szNode, " %-16s\t", CfgDesc->szValue);
  280.         strcat(szFieldValues, szNode);
  281.     }
  282.  
  283.     // Diplay the field names and values.
  284.     Screen(szFieldNames);
  285.     Screen(szFieldValues);
  286.  
  287.     // Clean up.
  288.     free(szNode);
  289.     free(szFieldNames);
  290.     free(szFieldValues);
  291.     free((pCHAR)CfgDesc);
  292.     rslt = DbiCloseCursor(&hCur);
  293.     ChkRslt(rslt, "CloseCursor");
  294.  
  295.     return rslt;
  296. }
  297.  
  298.