home *** CD-ROM | disk | FTP | other *** search
- // BDE - (C) Copyright 1995 by Borland International
-
- // drvcaps.c
- #include "snipit.h"
-
- static DBIResult DisplayOptionalParams(pCHAR szDriver);
-
- //=====================================================================
- // Function:
- // DriverCaps();
- //
- // Description:
- // This example shows how to determine the capabilities of
- // available IDAPI drivers. This includes the table types
- // supported and the fields which those table types support.
- //=====================================================================
- void
- DriverCaps (void)
- {
- hDBIDb hDb; // Handle to the database
- hDBICur hDrvCur; // Handle to the in-memory table
- // containing the driver list
- hDBICur hTblTypeCur; // Handle to the in-memory table
- // containing the table-type list
- hDBICur hFldTypeCur; // Handle to the in-memory table
- // containing the field-type list
- hDBICur hIdxTypeCur; // Handle to the in-memory table
- // containing the index-type list
- DBIResult rslt; // Return value from IDAPI functions
- CURProps TblProps; // Table properties
- pBYTE pRecBuf; // Record buffer
- DBINAME szDriver; // String to contain the driver name
- DBIMSG szTempBuf; // Temporary buffer for displaying
- // information
- BOOL bIsBlank; // Is the field blank?
- DRVType drvType; // Driver type information
-
- Screen("*** Driver Capabilities Example ***\r\n");
-
- BREAK_IN_DEBUGGER();
-
- Screen(" Initializing IDAPI...");
- if (InitAndConnect(&hDb) != DBIERR_NONE)
- {
- Screen("\r\n*** End of Example ***");
- return;
- }
-
- Screen(" Setting the database directory...");
- rslt = DbiSetDirectory(hDb, (pCHAR) szTblDirectory);
- ChkRslt(rslt, "SetDirectory");
-
- // Get a list of the drivers which are available to the system
- // (drivers which are defined in the configuration file).
- rslt = DbiOpenDriverList(&hDrvCur);
- if (ChkRslt(rslt, "OpenDriverList") != DBIERR_NONE)
- {
- CloseDbAndExit(&hDb);
- Screen("\r\n*** End of example ***");
- return;
- }
-
- // Get the size of the record buffer.
- rslt = DbiGetCursorProps(hDrvCur, &TblProps);
- ChkRslt(rslt, "GetProps");
-
- // Allocate space for the record buffer.
- pRecBuf = (pBYTE) malloc(TblProps.iRecBufSize * sizeof(BYTE));
- if (pRecBuf == NULL)
- {
- Screen(" Error - Could not allocate memory");
- rslt = DbiCloseCursor(&hDrvCur);
- ChkRslt(rslt, "CloseCursor");
- CloseDbAndExit(&hDb);
- Screen("\r\n*** End of example ***");
- return;
- }
-
- Screen(" Go to the beginning of the table...");
- rslt = DbiSetToBegin(hDrvCur);
- ChkRslt(rslt, "SetToBegin");
-
- // Iterate through all available drivers in the configuration file.
- while (DbiGetNextRecord(hDrvCur, dbiNOLOCK, pRecBuf, NULL)
- == DBIERR_NONE)
- {
- // Get the name of the driver.
- rslt = DbiGetField(hDrvCur, 1, pRecBuf, (pBYTE) szDriver,
- &bIsBlank);
- ChkRslt(rslt, "GetField");
-
- // Get the description of the driver.
- rslt = DbiGetDriverDesc(szDriver, &drvType);
- if (ChkRslt(rslt, "GetDriverDesc") != DBIERR_NONE)
- {
- continue;
- }
-
- // Limit driver information to local tables (the edit control
- // can only hold so much....)
- if (drvType.edrvCat == drvFILE)
- {
- // Skip a line.
- Screen("");
-
- // Display the information about the driver.
- Screen(" Driver Name: %s",
- drvType.szType);
- Screen(" Description: %s",
- drvType.szText);
-
- // Create a string to display depending on the driver category.
- switch(drvType.edrvCat)
- {
- case drvFILE:
- strcpy(szTempBuf, "File-based (PDox, dBASE, Text)");
- break;
- case drvOTHERSERVER:
- strcpy(szTempBuf, "Other type of server???");
- break;
- case drvSQLBASEDSERVER:
- strcpy(szTempBuf, "SQL-based server");
- break;
- }
- Screen(" Category: %s", szTempBuf);
- Screen(" Supports true database concepts: %s",
- drvType.bTrueDb ? "Yes" : "No");
- Screen(" Database type to use: %s",
- drvType.szDbType);
- Screen(" Supports multi-user: %s",
- drvType.bMultiUser ? "Yes" : "No");
- Screen(" Read only?: %s",
- drvType.bReadWrite ? "No" : "Yes");
- Screen(" Transaction support: %s",
- drvType.bTrans ? "Yes" : "No");
- Screen(" Supports pass-through SQL: %s",
- drvType.bPassThruSQL ? "Yes" : "No");
- Screen(" Requires explicit login: %s",
- drvType.bLogIn ? "Yes" : "No");
- Screen(" Can create a database: %s",
- drvType.bCreateDb ? "Yes" : "No");
- Screen(" Can drop a database: %s",
- drvType.bDeleteDb ? "Yes" : "No");
- Screen(" Can create a table: %s",
- drvType.bCreateTable ? "Yes" : "No");
- Screen(" Can delete a table: %s",
- drvType.bDeleteTable ? "Yes" : "No");
- Screen(" Multiple passwords: %s",
- drvType.bMultiplePWs ? "Yes" : "No");
-
- // Determine table types that the driver can use.
- rslt = DbiOpenTableTypesList(szDriver, &hTblTypeCur);
- if (ChkRslt(rslt, "OpenTableTypesList") != DBIERR_NONE)
- {
- continue;
- }
-
- Screen("\r\n Table types supported by the driver...");
- DisplayInMemoryTable(hTblTypeCur, 0);
-
- rslt = DbiCloseCursor(&hTblTypeCur);
- ChkRslt(rslt, "CloseCursor");
-
- // Determine field types that the driver can use.
- rslt = DbiOpenFieldTypesList(szDriver, NULL, &hFldTypeCur);
- if (ChkRslt(rslt, "OpenFieldTypesList") != DBIERR_NONE)
- {
- continue;
- }
-
- Screen("\r\n Field types supported by the driver...");
- DisplayInMemoryTable(hFldTypeCur, 0);
-
- rslt = DbiCloseCursor(&hFldTypeCur);
- ChkRslt(rslt, "CloseCursor");
-
- // Determine index types that the driver can use.
- rslt = DbiOpenIndexTypesList(szDriver, &hIdxTypeCur);
- if (ChkRslt(rslt, "OpenTableTypesList") != DBIERR_NONE)
- {
- continue;
- }
-
- Screen("\r\n Display the index types that the driver"
- " supports...");
- DisplayInMemoryTable(hIdxTypeCur, 0);
-
- rslt = DbiCloseCursor(&hIdxTypeCur);
- ChkRslt(rslt, "CloseCursor");
-
- Screen("\r\n Optional parameters....\r\n");
- DisplayOptionalParams (drvType.szType);
- }
- }
-
- free(pRecBuf);
-
- rslt = DbiCloseCursor(&hDrvCur);
- ChkRslt(rslt, "CloseCursor");
-
- Screen("\r\n Close the database and exit IDAPI...");
- CloseDbAndExit(&hDb);
-
- Screen("\r\n*** End of Example ***");
- }
-
- //=====================================================================
- // Function:
- // DisplayOptionalParams (pCHAR szDriver)
- //
- // Input: szDriver - Name of the driver
- //
- // Return: DBIResult - Result of the operation
- //
- // Description:
- // This function is used to display the optional parameters
- // for a given driver.
- //=====================================================================
- DBIResult
- DisplayOptionalParams (pCHAR szDriver)
- {
- DBIResult rslt; // Return value from IDAPI functions
- hDBICur hCur; // Handle to the cursor
- pCHAR szNode; // String which contains the name of the
- // node
- pCFGDesc CfgDesc; // Configuration descriptor
- DBIPATH szCfgPath; // Maximum length of the path in the
- // configuration file
- pCHAR szFieldNames; // String to contain the field names
- pCHAR szFieldValues; // String to contain the field values
-
- // Set up the option to get from the configuration file.
- strcpy(szCfgPath, "\\");
- strcat(szCfgPath, szCFGDRIVER);
- strcat(szCfgPath, "\\");
- strcat(szCfgPath, szDriver);
- strcat(szCfgPath, "\\");
- strcat(szCfgPath, szCFGTBLCREATE);
- strcat(szCfgPath, "\\");
-
- // Open the configuration file - returns the configuration options
- // for the current level in a schema table referenced by hCur.
- rslt = DbiOpenCfgInfoList(NULL, dbiREADONLY, cfgPersistent,
- szCfgPath, &hCur);
- if (ChkRslt(rslt, "OpenCfgInfoList") != DBIERR_NONE)
- {
- return rslt;
- }
-
- // Allocate resources.
- szNode = (pCHAR) malloc(DBIMAXPATHLEN * sizeof(CHAR) + 1);
- szFieldNames = (pCHAR) malloc(DBIMAXSCRECSIZE * sizeof(CHAR) + 1);
- szFieldValues = (pCHAR) malloc(DBIMAXSCRECSIZE * sizeof(CHAR) + 1);
- CfgDesc = (pCFGDesc) malloc(sizeof(CFGDesc));
- if ((szNode == NULL) || (szFieldNames == NULL) || (szFieldValues == NULL)
- || (CfgDesc == NULL))
- {
- if (szNode) free(szNode);
- if (szFieldNames) free(szFieldNames);
- if (szFieldValues) free(szFieldValues);
- if (CfgDesc) free((pCHAR)CfgDesc);
- rslt = DbiCloseCursor(&hCur);
- ChkRslt(rslt, "CloseCursor");
- return DBIERR_NOMEMORY;
- }
-
- // Set the spacing.
- strcpy(szFieldNames, " ");
- strcpy(szFieldValues, " ");
-
- // Process all nodes.
- // Get the next record in the table - contains the next option
- // of the given level in the tree.
- while (DbiGetNextRecord(hCur, dbiNOLOCK, (pBYTE)CfgDesc, NULL)
- == DBIERR_NONE)
- {
- // Output this node, copying the name of the node to the
- // szNode variable.
- sprintf(szNode, "%-16s\t", CfgDesc->szNodeName);
- strcat(szFieldNames, szNode);
-
- sprintf(szNode, " %-16s\t", CfgDesc->szValue);
- strcat(szFieldValues, szNode);
- }
-
- // Display the field names and values.
- Screen(szFieldNames);
- Screen(szFieldValues);
-
- // Clean up.
- free(szNode);
- free(szFieldNames);
- free(szFieldValues);
- free((pCHAR) CfgDesc);
- rslt = DbiCloseCursor(&hCur);
- ChkRslt(rslt, "CloseCursor");
-
- return rslt;
- }
-
-