home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Total C++ 2
/
TOTALCTWO.iso
/
borland
/
32snipit.pak
/
OPTPARAM.C
< prev
next >
Wrap
C/C++ Source or Header
|
1997-05-06
|
11KB
|
305 lines
// BDE32 3.x - (C) Copyright 1996 by Borland International
// optparam.c
#include "snipit.h"
static const char szTblName[] = "OPTPARAM";
static const char szTblType[] = szPARADOX;
#define NAMELEN 10 // Length of the name field
// Field descriptor used in creating a table.
static SNIPFAR FLDDesc fldDesc[] = {
{ // Field 1 - AUTOINC
1, // Field number
"NUMBER", // Field name
fldFLOAT, // Field type
fldUNKNOWN, // Field subtype
0, // Field size ( 1 or 0, except
// BLOb or CHAR field )
0, // Decimal places ( 0 )
// computed
0, // Offset in record ( 0 )
0, // Length in bytes ( 0 )
0, // For Null bits ( 0 )
fldvNOCHECKS, // Validity checks ( 0 )
fldrREADWRITE // Rights
},
{ // Field 2 - ALPHA
2, "ALPHA", fldZSTRING, fldUNKNOWN,
NAMELEN, 0, 0, 0, 0,
fldvNOCHECKS, fldrREADWRITE
}
}; // Array of field descriptors
// The number of fields in the table.
static const UINT16 uNumFields = sizeof(fldDesc) / sizeof (fldDesc[0]);
static DBIResult GetOptionalParams(pCHAR szDriver, UINT16 *iFields,
pFLDDesc pfldDesc, pCHAR szData);
//=====================================================================
// Function:
// OptParam();
//
// Description:
// This function shows how to use the optional parameters
// on some of the BDE functions.
//=====================================================================
void
OptParam (void)
{
hDBIDb hDb; // Handle to the database
hDBICur hCur; // Handle to the table
CRTblDesc TblDesc; // Create table descriptor
UINT16 uDispNumRecs = 10 ; // Number of records to add and
// display.
CURProps curProps; // Cursor Properties
pFLDDesc pfldDesc; // Field Descriptor for Opt Params
UINT16 iFields; // Number of fields (Opt params)
UINT16 i; // Loop counter
UINT16 iOffset; // Offset in the default values buffer
CHAR szFieldName[DBIMAXSCRECSIZE]; // Field name
CHAR szDefault[DBIMAXSCRECSIZE]; // Default values for Opt
// params
pCHAR szTemp; // Temporary Buffer
pCHAR szData; // Data to display
DBIResult rslt; // Return value from IDAPI
// functions
Screen("*** Using Optional Parameters ***\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");
// Initialize the TblDesc variable to all zeroes
memset((void *) &TblDesc , 0, sizeof(CRTblDesc));
szTemp = (pCHAR) malloc(DBIMAXSCFLDLEN);
szData = (pCHAR) malloc(DBIMAXSCRECSIZE);
pfldDesc = (pFLDDesc) malloc(DBIMAXSCFIELDS * sizeof(FLDDesc));
// Initialize the TblDesc variable to all zeroes
memset((void*) pfldDesc , 0, sizeof(FLDDesc) * DBIMAXSCFIELDS);
// Get the field types and default values of the optional
// parameters available when creating a Paradox table
GetOptionalParams("PARADOX", &iFields, pfldDesc, szData);
Screen("\r\n Default values for optional parameters...\r\n");
strcpy(szFieldName, " ");
strcpy(szDefault, " ");
iOffset = 0;
for (i = 0; i < iFields; i++)
{
// Note: Fields are formatted to be 20 characters wide
// in order to better fit on the screen (Field widths
// default to 128).
sprintf(szTemp, "%-*s\t", 20, pfldDesc[i].szName);
strcat(szFieldName, szTemp);
sprintf(szTemp, " %-*s\t", 20, &szData[iOffset]);
strcat(szDefault, szTemp);
// Create the table as a 3.5 table.
if (! strcmp(pfldDesc[i].szName, "LEVEL"))
{
strcpy(&szData[iOffset], "3");
}
// Set the maximum size of the table to 256MB
if (! strcmp(pfldDesc[i].szName, "BLOCK SIZE"))
{
strcpy(&szData[iOffset], "4096");
}
// Increment to point to the next field within the
// array of default values.
iOffset += pfldDesc[i].iLen;
}
Screen(szFieldName);
Screen(szDefault);
Screen("\r\n Change optional parameters to...\r\n");
strcpy(szFieldName, " ");
strcpy(szDefault, " ");
iOffset = 0;
for (i = 0; i < iFields; i++)
{
// Note: Fields are formatted to be 20 characters wide
// in order to better fit on the screen (field widths
// default to 128).
sprintf(szTemp, "%-*s\t", 20, pfldDesc[i].szName);
strcat(szFieldName, szTemp);
sprintf(szTemp, " %-*s\t", 20, &szData[iOffset]);
strcat(szDefault, szTemp);
// Increment to point to the next field within the
// array of default values.
iOffset += pfldDesc[i].iLen;
}
Screen(szFieldName);
Screen(szDefault);
Screen("\r\n Initializing the table descriptor...");
lstrcpy(TblDesc.szTblName, szTblName);
lstrcpy(TblDesc.szTblType, szTblType);
TblDesc.iFldCount = (UINT16)uNumFields;
TblDesc.pfldDesc = fldDesc;
TblDesc.iOptParams = iFields;
TblDesc.pfldOptParams = pfldDesc;
TblDesc.pOptData = (pBYTE) szData;
Screen("\r\n Creating the Paradox table...");
rslt = DbiCreateTable(hDb, TRUE, &TblDesc);
if (ChkRslt(rslt, "CreateTable") != DBIERR_NONE)
{
free(szTemp);
free(szData);
free(pfldDesc);
CloseDbAndExit(&hDb);
Screen("\r\n*** End of Example ***");
return;
}
free(pfldDesc);
Screen(" Fill the table with random data...");
FillTable(hDb, (pCHAR) szTblName, (pCHAR) szTblType, uDispNumRecs);
Screen(" Open the %s table...", szTblName);
rslt = DbiOpenTable(hDb, (pCHAR) szTblName, (pCHAR) szTblType,
NULL, NULL, 0, dbiREADWRITE, dbiOPENSHARED,
xltFIELD, FALSE, NULL, &hCur);
if (ChkRslt(rslt, "OpenTable") != DBIERR_NONE)
{
rslt = DbiDeleteTable(hDb, (pCHAR) szTblName, (pCHAR) szTblType);
ChkRslt(rslt, "DeleteTable");
CloseDbAndExit(&hDb);
Screen("\r\n*** End of Example ***");
return;
}
Screen("\r\n Determine the properties of the table:");
rslt = DbiGetCursorProps(hCur, &curProps);
ChkRslt(rslt, "GetCursorProps");
Screen(" Table Level: %d", curProps.iTblLevel);
Screen(" Table block size: %d", (curProps.iBlockSize * 1024));
Screen("\r\n Display the %s table which we just created...", szTblName);
DisplayTable(hCur, uDispNumRecs);
Screen("\r\n Close the table...");
rslt = DbiCloseCursor(&hCur);
ChkRslt(rslt, "CloseCursor");
Screen(" Deleting the table...");
rslt = DbiDeleteTable(hDb, (pCHAR) szTblName, (pCHAR) szTblType);
ChkRslt(rslt, "DeleteTable");
Screen("\r\n Close the database and exit IDAPI...");
CloseDbAndExit(&hDb);
free(szTemp);
free(szData);
Screen("\r\n*** End of Example ***");
}
//=====================================================================
// Function:
// GetOptionalParams(pCHAR szDriver, UINT16 *iFields,
// pFLDDesc pfldDesc, pCHAR szData);
//
// Input: szDriver - Name of the driver
// iFields - Used to return the number of fields
// pfldDesc - Returns the descriptors of the fields.
// Memory for this variable must be allocated by
// the calling function.
// szData - Contains the values of the fields. Memory for
// this variable must be allocated by the calling
// function.
//
// Return: DBIResult - success of the function
//
// Description:
// This function is used to return the available optional
// parameters when creating a table of the given type. This
// information includes the number of optional parameters
// (iFields), an array of field descriptors describing those
// parameters, and the default values for the parameters.
// Optional parameters are available only for dBASE and
// Paradox tables.
//=====================================================================
DBIResult
GetOptionalParams(pCHAR szDriver, UINT16 *iFields,
pFLDDesc pfldDesc, pCHAR szData)
{
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.
UINT16 iOffset = 0;
*iFields = 0;
// Set up the option to get from the configuration file
strcpy(szCfgPath, "\\DRIVERS\\");
strcat(szCfgPath, szDriver);
strcat(szCfgPath, "\\TABLE CREATE");
rslt = DbiOpenCfgInfoList(NULL, dbiREADONLY, cfgPersistent, szCfgPath,
&hCur);
if (ChkRslt(rslt, "OpenCfgInfoList") != DBIERR_NONE)
{
return rslt;
}
// Allocate resources
szNode = (pCHAR) malloc((DBIMAXPATHLEN * sizeof(CHAR)) + 1);
CfgDesc = (pCFGDesc) malloc(sizeof(CFGDesc));
// 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)
{
pfldDesc[*iFields].iFldNum = (UINT16)(*iFields + 1);
pfldDesc[*iFields].iFldType = CfgDesc->iDataType;
pfldDesc[*iFields].iUnits1 = DBIMAXSCFLDLEN - 1;
pfldDesc[*iFields].iLen = DBIMAXSCFLDLEN;
strcpy(pfldDesc[*iFields].szName, CfgDesc->szNodeName);
sprintf(szNode, "%s", CfgDesc->szValue);
strcpy(&szData[iOffset], szNode);
iOffset += pfldDesc[*iFields].iLen;
(*iFields)++;
}
// Clean up
free(szNode);
free((pCHAR) CfgDesc);
rslt = DbiCloseCursor(&hCur);
ChkRslt(rslt, "CloseCursor");
return rslt;
}