- BORLAND/: Borland C++ 4.52 (chosen over 4.5 by byte-match: CODE/RP/CW32.LIB
is identical to 4.52's install lib). BCC32/TLINK32/TLIB/MAKE run natively on
Win11; CODE/BT/OPT.MAK is the shipped BTL4OPT.EXE's exact flag recipe
(extender = Borland PowerPack DPMI32, not Phar Lap TNT).
- restoration/source410/: the literal 1995-form reconstruction of the missing
BT game source (never mixed into CODE/). Round 1-3 state:
* 6 of 10 surviving original TUs COMPILE CLEAN under the period toolchain
(BTMSSN, BTCNSL, BTSCNRL, BTTEAM, BTL4MODE, BTL4ARND) - first builds
since 1996.
* BT_L4/BTL4APP.CPP pilot reconstruction: 12/12 functions, Fail() lands on
its binary-recorded line 400 exactly.
* BT/BTCNSL.HPP: console wire IDs recovered from the binary's ctors
(Killed=9, Damaged=10, ScoreUpdate=13, DeathWithoutHonor=15 [T1];
TeamScore=12 flagged [T4]).
* MUNGA/: 8 engine-header backfills back-dated from the BT412 WinTesla tree
(VDATA numbering decomp-verified; AUDREND's OpenAL-era virtual removed -
the period compiler is the drift detector).
* Tooling: backdate.py (WinTesla->1995 header transform), compile410.sh
(per-TU verification sweep under authentic OPT.MAK flags).
* README: corrected roadmap - MECH.HPP is the capstone grown with the mech
TU reconstructions; BTREG.CPP green = the header-family milestone.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
671 lines
26 KiB
C++
671 lines
26 KiB
C++
// BDE - (C) Copyright 1995 by Borland International
|
|
|
|
// valcheck.c
|
|
#include "snipit.h"
|
|
#include <dos.h>
|
|
|
|
// Set the length of the Cube Number field.
|
|
#define CUBELEN 10
|
|
|
|
static const char szTblName[] = "personel";
|
|
static const char szTblType[] = szPARADOX;
|
|
|
|
// Lookup table name.
|
|
static const char szTblLookup[] = "CubeNum";
|
|
|
|
// Field descriptor used in creating the main table.
|
|
static SNIPFAR FLDDesc fldDesc[] = {
|
|
{ // Field 1 - Full Name
|
|
1, // Field number
|
|
"Full Name", // Field name
|
|
fldZSTRING, // Field type
|
|
fldUNKNOWN, // Field subtype
|
|
40, // 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 )
|
|
fldvHASCHECKS,// This field has validity checking
|
|
fldrREADWRITE // Rights
|
|
},
|
|
{ // Field 2 - Employee Number
|
|
2, "Employee Number", fldINT16, fldUNKNOWN,
|
|
0, 0, 0, 0, 0,
|
|
fldvHASCHECKS, fldrREADWRITE
|
|
},
|
|
{ // Field 3 - Department Number
|
|
3, "Department Number", fldINT16, fldUNKNOWN,
|
|
0, 0, 0, 0, 0,
|
|
fldvHASCHECKS, fldrREADWRITE
|
|
},
|
|
{ // Field 4 - Building Number
|
|
4, "Building Number", fldINT16, fldUNKNOWN,
|
|
0, 0, 0, 0, 0,
|
|
fldvHASCHECKS, fldrREADWRITE
|
|
},
|
|
{ // Field 5 - Social Security Number
|
|
5, "SS Number", fldZSTRING, fldUNKNOWN,
|
|
11, 0, 0, 0, 0,
|
|
fldvHASCHECKS, fldrREADWRITE
|
|
},
|
|
{ // Field 6 - Cube Number
|
|
6, "Cube Number", fldZSTRING, fldUNKNOWN,
|
|
CUBELEN, 0, 0, 0, 0,
|
|
fldvHASCHECKS, fldrREADWRITE
|
|
}
|
|
}; // Array of field descriptors.
|
|
|
|
// Field descriptor used to create the lookup table.
|
|
static SNIPFAR FLDDesc lkfldDesc[] = {
|
|
{ // Field 1 - Full Name
|
|
1, // Field number
|
|
"Cube Number",// Field name
|
|
fldZSTRING, // Field type
|
|
fldUNKNOWN, // Field subtype
|
|
CUBELEN, // 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, // This field has validity checking
|
|
fldrREADWRITE // Rights
|
|
}
|
|
}; // Array of field descriptors
|
|
|
|
// Validity check descriptor - Describes the validity checks. This validity
|
|
// check will be added to the table when the table is created.
|
|
// Note: The min val, max val, and default val validity checks are set
|
|
// within the CreateValCheck function, because the validity check
|
|
// needs to store data in the same format as the field. In this case
|
|
// the fields are fldINT16. This requires that a memset be done to
|
|
// copy the value into the validity check.
|
|
static SNIPFAR VCHKDesc VchkDesc[] = {
|
|
{ // First field validity check - Required field.
|
|
1, // Field number this belongs to
|
|
TRUE, // Is a required field
|
|
FALSE, // If True, has min value
|
|
FALSE, // If True, has max value
|
|
FALSE, // If True, has default value
|
|
{ NULL }, // Min value
|
|
{ NULL }, // Max value
|
|
{ NULL }, // Default value
|
|
{ NULL }, // Picture string
|
|
lkupNONE, // Lookup/Fill type
|
|
{ NULL }, // Lookup table name
|
|
},
|
|
{ // Second field validity check - min value - see note above.
|
|
2, FALSE, TRUE, FALSE, FALSE, {"15"}, { NULL },
|
|
{ NULL }, { NULL }, lkupNONE, { NULL }
|
|
},
|
|
{ // Third field validity check - max value - see note above.
|
|
3, FALSE, FALSE, TRUE, FALSE, { NULL }, {"3000"},
|
|
{ NULL }, { NULL }, lkupNONE, { NULL }
|
|
},
|
|
{ // Fourth field validity check - default value - see note
|
|
// above.
|
|
4, FALSE, FALSE, FALSE, TRUE, { NULL }, { NULL },
|
|
{"8"}, { NULL }, lkupNONE, { NULL }
|
|
},
|
|
{ // Fifth field validity check - picture of a SS number.
|
|
5, FALSE, FALSE, FALSE, FALSE, { NULL }, { NULL },
|
|
{ NULL }, { "###-##-####" }, lkupNONE, { NULL }
|
|
},
|
|
{ // Sixth field validity check - lookup table.
|
|
6, FALSE, FALSE, FALSE, FALSE, { NULL }, { NULL },
|
|
{ NULL }, { NULL }, lkupPRIVATE, "cubenum.db"
|
|
}
|
|
};
|
|
|
|
// Index descriptor.
|
|
static SNIPFAR IDXDesc idxDesc[] = {
|
|
{ // Primary Index - Full Name
|
|
"Employee Name", // Name
|
|
1, // Number
|
|
{ NULL }, // Tag name ( for dBase )
|
|
{ NULL }, // Optional format ( BTREE,
|
|
// HASH, etc )
|
|
TRUE, // Primary?
|
|
TRUE, // Unique?
|
|
FALSE, // Descending?
|
|
TRUE, // Maintained?
|
|
FALSE, // Subset?
|
|
FALSE, // Expression index?
|
|
NULL, // For QBE only
|
|
1, // Fields in key
|
|
1, // Length in bytes
|
|
FALSE, // Index out of date?
|
|
0, // Key type of expression
|
|
{ 1 }, // Array of field numbers
|
|
{ 0 }, // Key expression
|
|
{ 0 }, // Key condition
|
|
FALSE, // Case insensitive
|
|
0, // Block size in bytes
|
|
0 // Restructure number
|
|
}
|
|
};
|
|
|
|
// Index descriptor. This index array will be used to create the lookup table's
|
|
// primary index.
|
|
static SNIPFAR IDXDesc lkidxDesc[] = {
|
|
{ // Primary Index - Full name
|
|
"Cube_Number",// Name
|
|
1, // Number
|
|
{ NULL }, // Tag name ( for dBase )
|
|
{ NULL }, // Optional format ( BTREE,
|
|
// HASH, etc )
|
|
TRUE, // Primary?
|
|
TRUE, // Unique?
|
|
FALSE, // Descending?
|
|
TRUE, // Maintained?
|
|
FALSE, // Subset?
|
|
FALSE, // Expression index?
|
|
NULL, // For QBE only
|
|
1, // Fields in key
|
|
1, // Length in bytes
|
|
FALSE, // Index out of date?
|
|
0, // Key type of expression
|
|
{ 1 }, // Array of field numbers
|
|
{ 0 }, // Key expression
|
|
{ 0 }, // Key condition
|
|
FALSE, // Case insensitive
|
|
0, // Block size in bytes
|
|
0 // Restructure number
|
|
}
|
|
};
|
|
|
|
// The number of fields in the table.
|
|
static const unsigned uNumFields = sizeof(fldDesc) / sizeof (fldDesc[0]);
|
|
|
|
// Number of indexes to be created when the table is created.
|
|
static const unsigned uNumIndexes = sizeof(idxDesc) / sizeof(idxDesc[0]);
|
|
|
|
// The number of fields in the lookup table.
|
|
static const unsigned ulkNumFields = sizeof(lkfldDesc) /
|
|
sizeof (lkfldDesc[0]);
|
|
|
|
// Number of indexes to be created when the lookup table is created.
|
|
static const UINT16 ulkNumIndexes = sizeof(lkidxDesc) / sizeof(lkidxDesc[0]);
|
|
|
|
// Number of validity checks to be created.
|
|
static const UINT16 uNumVchks = sizeof(VchkDesc) / sizeof(VchkDesc[0]);
|
|
|
|
static DBIResult CreateVCHKTable(phDBIDb phDb);
|
|
static DBIResult InitLKTable(phDBIDb phDb);
|
|
static DBIResult AddRecord(hDBICur hCur, pCHAR pszName, INT16 lEmpNum,
|
|
INT16 lDeptNum, INT16 lBuildNum, pCHAR pszSSNum,
|
|
pCHAR pszCube);
|
|
static DBIResult AddLKRecord(hDBICur hCur, pCHAR pszCube);
|
|
static DBIResult FindRecord(pCHAR pszString, hDBICur hCur);
|
|
static void FormatPic(pCHAR pszDest, pCHAR pszPicture, pCHAR pszData);
|
|
|
|
//=====================================================================
|
|
// Function:
|
|
// ValCheck();
|
|
//
|
|
// Description:
|
|
// This function shows how validity checks are used on a Paradox
|
|
// table. This example will create a table to which the validity
|
|
// checks are added, as well as a lookup table which is used as
|
|
// part of the validity checks. All tables are deleted at the end
|
|
// of this example.
|
|
//
|
|
// This example places the following validity checks on the table:
|
|
// Required on the "Full Name" field.
|
|
// Minimum value of "15" on the "Employee Number" field.
|
|
// Maximum value of "3000" on the "Department Number" field.
|
|
// Default value of "8" on the "Building Number" field.
|
|
// Picture on the "SS Number" field.
|
|
// Lookup table for the "Cube Number" field.
|
|
//=====================================================================
|
|
void
|
|
ValCheck (void)
|
|
{
|
|
DBIResult rslt; // Return value from IDAPI functions
|
|
hDBIDb hDb; // Database handle
|
|
hDBICur hCur; // Cursor handle
|
|
CURProps TblProps; // Table properties
|
|
CHAR SSNumber[12]; // SS number string used for VC pictures
|
|
|
|
Screen("*** Validity Check 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");
|
|
|
|
// Create the lookup table and fill with data.
|
|
if (InitLKTable(&hDb))
|
|
{
|
|
CloseDbAndExit(&hDb);
|
|
Screen("\r\n*** End of Example ***");
|
|
return;
|
|
}
|
|
|
|
// Create the table and attach the validity checks.
|
|
if (CreateVCHKTable(&hDb))
|
|
{
|
|
CloseDbAndExit(&hDb);
|
|
Screen("\r\n*** End of Example ***");
|
|
return;
|
|
}
|
|
|
|
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)
|
|
{
|
|
CloseDbAndExit(&hDb);
|
|
Screen("\r\n*** End of Example ***");
|
|
return;
|
|
}
|
|
|
|
Screen(" Get the number of validity checks on the %s table...",
|
|
szTblName);
|
|
rslt = DbiGetCursorProps(hCur, &TblProps);
|
|
ChkRslt(rslt, "GetCursorProps");
|
|
|
|
Screen(" There are %d validity checks on the table",
|
|
TblProps.iValChecks);
|
|
|
|
// Add a record without the required field (field #1).
|
|
Screen("\r\n Adding the first record...");
|
|
|
|
// IDAPI does not format the data to match the picture. It only stores
|
|
// the picture.
|
|
FormatPic(SSNumber, "###-##-####", "111223333");
|
|
|
|
Screen(" Error expected - adding a record that does not have data"
|
|
"\r\n in the first field (Full Name),"
|
|
"\r\n which is a required field...");
|
|
AddRecord(hCur, "", 20, 2809, NULL, SSNumber, "2001");
|
|
|
|
Screen("\r\n Adding a record which satisfies the following"
|
|
" validity checks:\r\n\r\n\t"
|
|
" Required field for the first field - Full Name\r\n\t"
|
|
" Minimum Value of 15 for the second field - Employee Number"
|
|
"\r\n\t"
|
|
" Maximum value of 3000 for the third field - Department Number"
|
|
"\r\n\t"
|
|
" Default value of 8 for the fourth field - Building Number"
|
|
"\r\n\t"
|
|
" Picture of ###-##-#### for the fifth field - SS Number"
|
|
"\r\n\t"
|
|
" Lookup table for the sixth field - Cube Number\r\n");
|
|
|
|
// We are passing in NULL to the AddRecord function so that IDAPI will
|
|
// fill in the default value of 8 for the Building Number field.
|
|
AddRecord(hCur, "Goliath Mager", 24, 2806, NULL, SSNumber, "2004");
|
|
|
|
// Find the newly added record so we can display it.
|
|
FindRecord("Goliath Mager", hCur);
|
|
|
|
Screen(" Displaying the record...");
|
|
DisplayNextRecord(hCur);
|
|
|
|
Screen("\r\n Close the table...");
|
|
rslt = DbiCloseCursor(&hCur);
|
|
ChkRslt(rslt, "CloseCursor");
|
|
|
|
Screen(" Delete the table...");
|
|
rslt = DbiDeleteTable(hDb, (pCHAR) szTblName, (pCHAR) szTblType);
|
|
ChkRslt(rslt, "DeleteTable");
|
|
|
|
Screen(" Delete the lookup table and indexes...");
|
|
rslt = DbiDeleteTable(hDb, (pCHAR) szTblLookup, (pCHAR) szTblType);
|
|
ChkRslt(rslt, "DeleteTable");
|
|
|
|
Screen(" Close the database and exit IDAPI...");
|
|
CloseDbAndExit(&hDb);
|
|
|
|
Screen("\r\n*** End of Example ***");
|
|
}
|
|
|
|
//=====================================================================
|
|
// Function:
|
|
// CreateVCHKTable(phDb);
|
|
//
|
|
// Input: phDb - Pointer to the database handle
|
|
//
|
|
// Return: Result of the table initialization
|
|
//
|
|
// Description:
|
|
// This function will create a table with the validity
|
|
// checks that are in the array called VchkDesc.
|
|
//=====================================================================
|
|
DBIResult
|
|
CreateVCHKTable (phDBIDb phDb)
|
|
{
|
|
DBIResult rslt; // Value returned from IDAPI functions
|
|
CRTblDesc crTblDsc; // Table descriptor
|
|
BOOL bOverWrite = TRUE; // Overwrite, yes/no flag
|
|
INT16 iDefVal = 8; // Default value for the "Building Number"
|
|
// Field
|
|
INT16 iMinVal = 15; // Min Value for the "Employee Number"
|
|
// field
|
|
INT16 iMaxVal = 3000; // Max value for the "Department Number"
|
|
// field
|
|
|
|
// Need to have actual integer values for the validity check.
|
|
memcpy(&(VchkDesc[1].aMinVal), &iMinVal, sizeof(INT16));
|
|
memcpy(&(VchkDesc[2].aMaxVal), &iMaxVal, sizeof(INT16));
|
|
memcpy(&(VchkDesc[3].aDefVal), &iDefVal, sizeof(INT16));
|
|
|
|
// Initialize the table create descriptor.
|
|
memset(&crTblDsc, 0, sizeof(CRTblDesc));
|
|
strcpy(crTblDsc.szTblName, szTblName);
|
|
strcpy(crTblDsc.szTblType, szTblType);
|
|
crTblDsc.iFldCount = uNumFields;
|
|
crTblDsc.pfldDesc = fldDesc;
|
|
crTblDsc.iIdxCount = uNumIndexes;
|
|
crTblDsc.pidxDesc = idxDesc;
|
|
crTblDsc.iValChkCount = uNumVchks;
|
|
crTblDsc.pvchkDesc = VchkDesc;
|
|
|
|
Screen(" Creating the %s table...", szTblName);
|
|
rslt = DbiCreateTable(*phDb, bOverWrite, &crTblDsc);
|
|
if (ChkRslt(rslt, "CreateTable") != DBIERR_NONE)
|
|
{
|
|
return rslt;
|
|
}
|
|
|
|
return rslt;
|
|
}
|
|
|
|
//=====================================================================
|
|
// Function:
|
|
// InitLKTable(phDb);
|
|
//
|
|
// Input: phDb - Pointer to the database handle
|
|
//
|
|
// Return: Result of the table initialization
|
|
//
|
|
// Description:
|
|
// This function will create the lookup table that is used
|
|
// by the validity checks.
|
|
//=====================================================================
|
|
DBIResult
|
|
InitLKTable (phDBIDb phDb)
|
|
{
|
|
DBIResult rslt; // Value returned from IDAPI functions
|
|
hDBICur hCur; // Cursor handle for the table that is
|
|
// created
|
|
CRTblDesc crTblDsc; // Table descriptor
|
|
BOOL bOverWrite = TRUE; // Overwrite, yes/no flag
|
|
|
|
// Initialize the Table Create Descriptor.
|
|
memset(&crTblDsc, 0, sizeof(CRTblDesc));
|
|
strcpy(crTblDsc.szTblName, szTblLookup);
|
|
strcpy(crTblDsc.szTblType, szTblType);
|
|
crTblDsc.iFldCount = ulkNumFields;
|
|
crTblDsc.pfldDesc = lkfldDesc;
|
|
crTblDsc.iIdxCount = ulkNumIndexes;
|
|
crTblDsc.pidxDesc = lkidxDesc;
|
|
|
|
Screen(" Creating lookup table and indexes...");
|
|
rslt = DbiCreateTable(*phDb, bOverWrite, &crTblDsc);
|
|
if (ChkRslt(rslt, "CreateTable") != DBIERR_NONE)
|
|
{
|
|
return rslt;
|
|
}
|
|
|
|
rslt = DbiOpenTable(*phDb, (pCHAR) szTblLookup, (pCHAR) szTblType,
|
|
NULL, NULL, 0, dbiREADWRITE, dbiOPENSHARED,
|
|
xltFIELD, FALSE, NULL, &hCur);
|
|
if (ChkRslt(rslt, "OpenTable") != DBIERR_NONE)
|
|
{
|
|
return rslt;
|
|
}
|
|
|
|
// Add some records into the lookup table.
|
|
AddLKRecord(hCur, "2001");
|
|
AddLKRecord(hCur, "2002");
|
|
AddLKRecord(hCur, "2003");
|
|
AddLKRecord(hCur, "2004");
|
|
AddLKRecord(hCur, "2005");
|
|
AddLKRecord(hCur, "2006");
|
|
AddLKRecord(hCur, "2007");
|
|
|
|
// Close the table so it can be reopened from the calling function.
|
|
rslt = DbiCloseCursor(&hCur);
|
|
ChkRslt(rslt, "CloseCursor");
|
|
|
|
return rslt;
|
|
}
|
|
|
|
//=====================================================================
|
|
// Function:
|
|
// AddRecord(hCur, pszName, lEmpNum, lDeptNum, lBuildNum,
|
|
// pszSSNum, pszCube);
|
|
//
|
|
// Input: hCur - Pointer to the cursor handle
|
|
// pszName - Name
|
|
// lEmpNum - Employee number
|
|
// lDeptNum - Dept number
|
|
// lBuildNum - Building number
|
|
// pszSSNum - SS number
|
|
// pszCube - Cube number
|
|
//
|
|
// Return: Result of adding the record to the table
|
|
//
|
|
// Description:
|
|
// This function will add a record to the given table.
|
|
//=====================================================================
|
|
DBIResult
|
|
AddRecord (hDBICur hCur, pCHAR pszName, INT16 lEmpNum, INT16 lDeptNum,
|
|
INT16 lBuildNum, pCHAR pszSSNum, pCHAR pszCube)
|
|
{
|
|
DBIResult rslt; // Value returned from IDAPI functions
|
|
CURProps TblProps; // Table properties
|
|
pBYTE pRecBuf; // Record buffer
|
|
|
|
// Allocate a record buffer.
|
|
rslt = DbiGetCursorProps(hCur, &TblProps);
|
|
ChkRslt(rslt, "GetCursorProps");
|
|
|
|
pRecBuf = (pBYTE) malloc(TblProps.iRecBufSize * sizeof(BYTE));
|
|
if (pRecBuf == NULL)
|
|
{
|
|
return DBIERR_NOMEMORY;
|
|
}
|
|
|
|
// Initialize record buffer.
|
|
rslt = DbiInitRecord(hCur, pRecBuf);
|
|
ChkRslt(rslt, "InitRecord");
|
|
|
|
// First name.
|
|
rslt = DbiPutField(hCur, 1, pRecBuf, (pBYTE) pszName);
|
|
ChkRslt(rslt, "PutField");
|
|
|
|
// Employee number.
|
|
rslt = DbiPutField(hCur, 2, pRecBuf, (pBYTE) &lEmpNum);
|
|
ChkRslt(rslt, "PutField");
|
|
|
|
// Department number.
|
|
rslt = DbiPutField(hCur, 3, pRecBuf, (pBYTE) &lDeptNum);
|
|
ChkRslt(rslt, "PutField");
|
|
|
|
// Building number. If NULL, allow the default value to be used.
|
|
if (lBuildNum != NULL)
|
|
{
|
|
rslt = DbiPutField(hCur, 4, pRecBuf, (pBYTE) &lBuildNum);
|
|
ChkRslt(rslt, "PutField");
|
|
}
|
|
|
|
// SS number.
|
|
rslt = DbiPutField(hCur, 5, pRecBuf, (pBYTE) pszSSNum);
|
|
ChkRslt(rslt, "PutField");
|
|
|
|
// Place of birth.
|
|
rslt = DbiPutField(hCur, 6, pRecBuf, (pBYTE) pszCube);
|
|
ChkRslt(rslt, "PutField");
|
|
|
|
// Write the record to disk.
|
|
rslt = DbiInsertRecord(hCur, dbiNOLOCK, pRecBuf);
|
|
ChkRslt(rslt, "InsertRecord");
|
|
|
|
free(pRecBuf);
|
|
|
|
return rslt;
|
|
}
|
|
|
|
//=====================================================================
|
|
// Function:
|
|
// AddLKRecord(hCur, pszCube);
|
|
//
|
|
// Input: hCur - Pointer to the cursor handle
|
|
// pszCube - Cube name
|
|
//
|
|
// Return: Result of adding the record to the table
|
|
//
|
|
// Description:
|
|
// This function will add a record to the given table.
|
|
//=====================================================================
|
|
DBIResult
|
|
AddLKRecord (hDBICur hCur, pCHAR pszCube)
|
|
{
|
|
DBIResult rslt; // Value returned from IDAPI functions
|
|
CURProps TblProps; // Table properties
|
|
pBYTE pRecBuf; // Record buffer
|
|
|
|
// Allocate a record buffer.
|
|
rslt = DbiGetCursorProps(hCur, &TblProps);
|
|
ChkRslt(rslt, "GetCursorProps");
|
|
|
|
pRecBuf = (pBYTE) malloc(TblProps.iRecBufSize * sizeof(BYTE));
|
|
if (pRecBuf == NULL)
|
|
{
|
|
return DBIERR_NOMEMORY;
|
|
}
|
|
|
|
// Initialize the record buffer.
|
|
rslt = DbiInitRecord(hCur, pRecBuf);
|
|
ChkRslt(rslt, "InitRecord");
|
|
|
|
// Cube number.
|
|
rslt = DbiPutField(hCur, 1, pRecBuf, (pBYTE) pszCube);
|
|
ChkRslt(rslt, "PutField");
|
|
|
|
// Write the record to disk..
|
|
rslt = DbiInsertRecord(hCur, dbiNOLOCK, pRecBuf);
|
|
ChkRslt(rslt, "InsertRecord");
|
|
|
|
free(pRecBuf);
|
|
|
|
return rslt;
|
|
}
|
|
|
|
//=====================================================================
|
|
// Function:
|
|
// FindRecord(pszString, hCur);
|
|
//
|
|
// Input: pszString - String to find in the first field
|
|
// hCur - Cursor handle
|
|
//
|
|
// Return: Result of the search
|
|
//
|
|
// Description:
|
|
// This function will search the given table for the string
|
|
// passed to it in the first parameter. It will place this
|
|
// string into the first field of the record buffer and search
|
|
// for the string using the record buffer.
|
|
//=====================================================================
|
|
DBIResult
|
|
FindRecord (pCHAR pszString, hDBICur hCur)
|
|
{
|
|
CURProps TblProps; // Table properties
|
|
pBYTE pBuf = NULL; // Pointer to the record buffer
|
|
DBIResult rslt; // Return value from IDAPI functions
|
|
|
|
// Create the key buffer. The size comes from the property iRecBufSize.
|
|
rslt = DbiGetCursorProps(hCur,&TblProps);
|
|
ChkRslt(rslt, "GetCursorProps");
|
|
|
|
pBuf = (pBYTE) malloc(TblProps.iRecBufSize);
|
|
if (pBuf == NULL)
|
|
{
|
|
Screen(" Error - Out of memory");
|
|
return DBIERR_NOMEMORY;
|
|
}
|
|
|
|
// Search the "First Name" field for the pszString value.
|
|
rslt = DbiPutField(hCur, 1, pBuf, (pBYTE) pszString);
|
|
ChkRslt(rslt, "PutField");
|
|
|
|
rslt = DbiSetToKey(hCur, keySEARCHEQ, FALSE, 0, 0, pBuf);
|
|
ChkRslt(rslt, "SetToKey");
|
|
|
|
free(pBuf);
|
|
|
|
return rslt;
|
|
}
|
|
|
|
//=====================================================================
|
|
// Function:
|
|
// FormatPic(pszDest, pszPicture, pszData);
|
|
//
|
|
// Input: pszDest - Pointer to buffer that will receive the formatted
|
|
// string
|
|
// pszPicture - Pointer to buffer that holds the picture the data.
|
|
// pszData - Pointer to buffer that holds the data to be
|
|
// converted
|
|
//
|
|
// Return: A string in pszDest that matches the picture
|
|
//
|
|
// Description:
|
|
// This function only works for pictures that have a '#' symbol
|
|
// in them. This function can be expanded to work with all of
|
|
// the pictures that IDAPI provides. IDAPI does not actually
|
|
// format the string itself. This function expects that the
|
|
// pszDest variable will be large enough to hold the string after
|
|
// conversion. Therefore, the length of the pszDest variable must
|
|
// be the length of the picture plus 1 for the NULL terminating
|
|
// character.
|
|
//=====================================================================
|
|
void
|
|
FormatPic (pCHAR pszDest, pCHAR pszPicture, pCHAR pszData)
|
|
{
|
|
UINT16 iDest = 0;
|
|
UINT16 iPic = 0;
|
|
UINT16 iData = 0;
|
|
|
|
// Loop through the whole picture string and convert the data string to
|
|
// conform to it.
|
|
while (pszPicture[iPic] != NULL)
|
|
{
|
|
// If the character is a number put the number from the pszData string
|
|
// into the StrDest string.
|
|
if (pszPicture[iPic] == '#')
|
|
{
|
|
// Clean up the string one character at a time.
|
|
pszDest[iDest] = pszData[iData];
|
|
iDest++;
|
|
iPic++;
|
|
iData++;
|
|
}
|
|
|
|
// Otherwise the character is a constant to be placed within
|
|
// the string.
|
|
else
|
|
{
|
|
// Clean up the string one character at a time.
|
|
pszDest[iDest] = pszPicture[iPic];
|
|
iDest++;
|
|
iPic++;
|
|
}
|
|
}
|
|
pszDest[iDest] = 0;
|
|
}
|