Technical Information Database TI150B.txt Function mapping from the Paradox Engine to BDE Category :General Programming Platform :All Product :BDE 2.x Description: Types Paradox Engine BDE Variable name in this doc ----------------------------------------------------------------- PXCODE DBIResult rslt TABLEHANDLE hDBICur tabH RECORDHANDLE pBYTE recH FIELDNUMBER UINT16 iFld LOCKHANDLE UINT32 RECORDNUMBER UINT32 recNum BLOBHANDLE INT16 Functions Paradox Engine BDE ----------------------------------------------------------------- BLANK DbiPutField(tabH, iFld, recH, NULL); (Cannot compare Field Data with BLANK in IDAPI. Use the value returned from DbiGetField in bIsBlank to determine if a field is blank.) ISBANK() Use the blank parameter in DbiGetField(tabH, iFld, recH, pDest, &bIsBlank); or DbiVerifyField(tabH, iFld, pSrc, &bIsBlank); PXBlobClone() Not Supported. (Private BLOBs are not supported in IDAPI) PXBlobClose() accept == FALSE DbiFreeBlob(tabH, recH, iFld); accept == TRUE Not required in IDAPI. Note that DbiFreeBlob(tabH, recH, iFld) needs to be called _after_ adding a record containing a BLOB to a table. PXBlobDrop() DbiGetRecord(tabH, dbiNOLOCK, recH, NULL); DbiTruncateBlob(tabH, recH, iFld, 0); DbiModifyRecord(tabH, recH, FALSE); PXBlobGet() DbiGetBlob(tabH, recH, iFld, iOff, iLen, pDest, &iRead); PXBlobGetSize() DbiGetBlobSize(tabH, recH, iFld, piSize); PXBlobOpenRead() DbiOpenBlob(tabH, recH, iField,dbiREADONLY); PXBlobOpenWrite() DbiOpenBlob(tabH, recH, iField, dbiREADWRITE); PXBlobPut() DbiPutBlob(tabH, recH, iFld, iOff, iLen, pSrc); PXBlobQuickGet() DbiGetBlobHeading(tabH, iFld, recH, &iSize); (Paradox Tables only.) PXDateDecode() DbiDateDecode(dateD, piMon, piDay, piYear); PXDateEncode() DbiDateEncode(iMon, iDay, iYear, pdateD); PXErrMsg() DbiGetErrorString(iErrorCode, szError); or DbiGetErrorInfo(&ErrInfo); (Must be called imediately after the offending function - privides more information than DbiGetErrorString.) PXExit() DbiCloseDatabase(&hDb); DbiExit(); PXFldBlank() DbiGetField(tabH, iFld, recH, NULL, &bIsBlank); or DbiVerifyField(tabH, iFld, pSrc, &bIsBlank); bIsBlank = TRUE is field is blank. PXFldHandle() DbiGetFieldDescs(tabH, &fldDesc); fldDesc.iFldNum; PXFldName() DbiGetFieldDescs(tabH, &fldDesc); fldDesc.szName; PXFldType() DbiGetFieldDescs(tabH, &fldDesc); fldDesc.iFldType; fldDesc.iSubType; PXGetAlpha() DbiGetField(tabH, iFld, recH, (pBYTE)szString, &bIsBlank); PXGetDate() DbiGetField(tabH, iFld, recH, (pBYTE)&Date, &bIsBlank); PXGetDefaults() DbiOpenCfgInfoList(hCfg, eOpenMode, eConfigMode, pszCfgPath, &tabH); PXGetDoub() DbiGetField(tabH, iFld, recH, (pBYTE)&Double, &bIsBlank); PXGetLong() DbiGetField(tabH, iFld, recH, (pBYTE)&Long, &bIsBlank); PXGetShort() DbiGetField(tabH, iFld, recH, (pBYTE)&Short, &bIsBlank); PXInit() Not Supported. See PXWinInit. PXKeyAdd() DbiAddIndex(hDb, tabH, szTblName, szTblType, &IdxDesc); PXKeyDrop() DbiDeleteIndex(hDb, tabH, szTblName, szTblType, NULL, NULL, iIndexId); PXKeyMap() Not Supported. (Key Mapping is no longer needed - all pertinent information is put in the index descriptor - IdxDesc) PXKeyNFlds() DbiGetIndexSeqNo(tabH, NULL, NULL, 0, &seqNo); DbiGetIndexDesc(tabH, seqNo, &idxDesc); idxDesc.iFldsInKey; (Note that Paradox in the only database which has the concept of a primary index) PXKeyQuery() Not Supported. (The BDE does not have any function like this. You need to call DbiGetIndexDescs() and then look for the index you want. Once found all the information about that index is available to you in the structure.) PXNetErrUser() DbiErrGetErrorContext(ecUSERNAME, szUserName); PXNetFileLock() DbiAcqPersistTableLock(hDb, (pCHAR)fileName, Driver); PXNetFileUnlock() DbiRelPersistTableLock(hDb, (pCHAR)fileName, Driver); PXNetInit() Not Support. See PXWinInit. PXNetRecGotoLock() Not Supported. (Can be simulated by setting a bookmark on the record which is locked and then switching to that bookmark: DbiSetToBookMark(tabH, pBookMark);) PXNetRecLock() DbiGetRecord(tabH, dbiWRITELOCK, NULL, NULL); PXNetRecLocked() DbiIsRecordLocked(tabH, edbiLock, piLocks); PXNetRecUnlock() DbiRelRecordLock(tabH, FALSE); or durring the update of the record - DbiModifyRecord(tabH, recH, TRUE); PXNetTblChanged() Need to register a cbTABLECHANGED callback. (Paradox only.) PXNetTblLock() DbiAcqTableLock(tabH, eLockType); (Note that only Read and Write locks are supported by this function. For a FL on a table, open the table with the dbiOPENEXCL parameter or use the DbiAcqPersistTableLock function.) PXNetTblRefresh() DbiForceReread(tabH); PXNetTableUnlock() DbiRelTableLock(tabH, eLockType); PXNetUserName() DbiGetNetUserName(pzName); PXPswAdd() DbiAddPassword(szPassword); (Paradox tables only.) PXPswDel() DbiDropPassword(szPassword); (Paradox tables only.) PXPutAlpha() DbiPutField(tabH, iFld, recH, (pBYTE)szString); PXPutBlank() DbiPutField(tabH, iFld, recH, NULL); PXPutDate() DbiPutField(tabH, iFld, recH, (pBYTE)&Date); PXPutDoub() DbiPutField(tabH, iFld, recH, (pBYTE)&Double); PXPutLong() DbiPutField(tabH, iFld, recH, (BYTE)&Long); PXPutShort() DbiPutField(tabH, iFld, recH, (pBYTE)&Short); PXRawGet() DbiSetProp((hDBIObj)tabH, curXLTMODE, xltNONE) DbiGetRecord(tabH, NULL, recH, NULL); PXRawPut() DbiSetProp((hDBIObj)tabH, curXLTMODE, xltNONE) DbiInsertRecord(tabH, dbiNOLOCK, recH, pDest); PXRecAppend() DbiAppendRecord(tabH, recH); PXRecBufClose() The application needs to release the memory associated with the record buffer. In 'C', call: free(recH). (Record buffers in IDAPI are owned by the application.) PXRecBufCopy() The application needs to copy the memory which is used for the record buffer. In 'C', call: memcpy(recHDest, recHSource, size). (Record buffers in IDAPI are owned by the application.) PXRecBufEmpty() DbiInitRecord(tabH, recH); PXRecBufOpen() The application needs to allocate memory for record buffer. In 'C', call: DbiGetCursorProps(tabH, &CurProps); recH = (pBYTE)malloc(CurProps.iRecBufSize * sizeof(BYTE)); (Record buffers in IDAPI are owned by the application.) PXRecDelete() DbiDeleteRecord(tabH, NULL); PXRecFirst() DbiSetToBegin(tabH); DbiGetNextRecord(tabH, dbiNOLOCK, NULL, NULL); (IDAPI has the concept of Beginning of file, which is before the first record). PXRecGet() DbiGetRecord(tabH, dbiNOLOCK, recH, NULL); PXRecGoto() Not supported by the SQL Drivers. Example for use with 'C': DBIResult gotoRec(hDBICur tabH, UINT32 recNum) { DBIResult lastError; CURProps curProps; lastError = DbiGetCursorProps(tabH, &curProps); if (lastError != DBIERR_NONE) { return lastError; } if (!strcmp(curProps.szTableType, szPARADOX)) { lastError = DbiSetToSeqNo(tabH, recNum); } else if (!strcmp(curProps.szTableType, szDBASE)) { lastError = DbiSetToRecordNo(tabH, recNum); } else { lastError = DBIERR_NOTSUPPORTED; } return lastError; } PXRecInsert() DbiInsertRecord(tabH, dbiNOLOCK, recH); PXRecLast() DbiSetToEnd(tabH); DbiGetPriorRecord(tabH, dbiNOLOCK, NULL, NULL); (IDAPI has the concept of End of File, which is after the last record). PXRecNext() DbiGetNextRecord(tabH, dbiNOLOCK, NULL, NULL); PXRecNFlds() DbiGetCursorProps(tabH, &CurProps); lFlds = CurProps.iFields; PXRecNum() Not supported for SQL Tables. Example for use with 'C': DBIResult getCurRecNum(hDBICur tabH, UINT32 *recNum) { DBIResult lastError; CURProps curProps; RECProps recProps; lastError = DbiGetCursorProps(tabH, &curProps); if (lastError != DBIERR_NONE) { return lastError; } if (!strcmp(curProps.szTableType, szPARADOX)) { lastError = DbiGetSeqNo(tabH, (pUINT32)recNum); } else if (!strcmp(curProps.szTableType, szDBASE)) { lastError = DbiGetRecord(tabH, dbiNOLOCK, NULL, &recProps); *recNum = recProps.iPhyRecNum; } else { lastError = DBIERR_NOTSUPPORTED; } return lastError; } PXRecPrev() DbiGetPriorRecord(tabH, dbiNOLOCK, NULL, NULL); PXRecUpdate() DbiModifyRecord(tabH, recH, TRUE); PXSave() DbiForceReread(tabH); PXSetDefaults() DbiOpenCfgInfoList() PXSetHWHandler() Not Supported PXSrchFld() DbiSetToKey(tabH, keySEARCHEQ, FALSE, iFlds iLen, pIdxBuf); PXSrchKey() DbiSwitchToIndex(&tabH, NULL, NULL, 0, TRUE); DbiSetToKey(tabH, keySEARCHEQ, FALSE, iFlds iLen, pIdxBuf); (can only search on the currently active index) PXTblAdd() DbiBatchMove(NULL, hSrcCur, NULL, hDestCur, batAPPEND, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, TRUE, FALSE, NULL, TRUE); PXTblClose() DbiCloseCursor(&tabH); PXTblCopy() DbiCopyTable(hDb, TRUE, szSrcName, szPARADOX, szDestName); PXTblCreate() DbiCreateTable(hDb, TRUE, &TblDesc); PXTblCreateMode() DbiCreateTable(hDb, TRUE, &TblDesc); (Use the optional parameters to change the level of the table.) PXTblDecrypt() Only Supported for Paradox Tables Example for use with 'C': DBIResult decryptTable(hDBIDb hDb, const char *tableName) { CRTblDesc crTblDesc; DBIResult lastError; // Clear the buffer memset(&crTblDesc, 0, sizeof(CRTblDesc)); // name of the table strcpy(crTblDesc.szTblName, tableName); lastError = DbiDoRestructure(hDb, 1, &crTblDesc, NULL, NULL, NULL, FALSE); return lastError; } PXTblDelete() DbiDeleteTable(hDb, szTblName, szPARADOX); PXTblEmpty() DbiEmptyTable(hDb, tabH, szTblName, szPARADOX); PXTblEncrypt() (Only Supported for Paradox Tables) Example for use with 'C': DBIResult encryptTable(hDBIDb hDb, const char *tableName, const char *password) { CRTblDesc crTblDesc; DBIResult lastError; // Clear the buffer memset(&crTblDesc, 0, sizeof(CRTblDesc)); // name of the table strcpy(crTblDesc.szTblName, tableName); // Master password suplied for the table crTblDesc.bProtected = TRUE; // Password for the table strcpy(crTblDesc.szPassword, password); lastError = DbiDoRestructure(hDb, 1, &crTblDesc, NULL, NULL, NULL, FALSE); return lastError; } PXTblExist() Not directly supported. Need to use DbiOpenTableList to get a list of available tables, and then search that list for the table. Example for use with 'C': BOOL tableExists(hDBIDb hDb, const char *userName, const char *tableName, const char *tableType) { BOOL exists = FALSE; BOOL isLocal = TRUE; hDBICur tabH = 0; char *tblName; TBLBaseDesc tblDesc; CHAR remoteName[DBIMAXNAMELEN+1]; DBIResult lastError; if ((!strcmp(tableType, szPARADOX)) || (!strcmp(tableType, szDBASE)) || (!strcmp(tableType, szASCII))) { tblName = _fstrtok((pCHAR)tableName, "."); isLocal = TRUE; } else if ((!strcmp(tableType, "ORACLE")) || (!strcmp(tableType, "SYBASE"))) { strcpy(remoteName, userName); strcat(remoteName, "."); strcat(remoteName, tableName); tblName = (pCHAR)tableName; isLocal = FALSE; } else { strcpy(remoteName, tableName); tblName = (pCHAR)tableName; isLocal = FALSE; } if (tblName == NULL) { lastError = DBIERR_INVALIDTABLENAME; return FALSE; } lastError = DbiOpenTableList(hDb, FALSE, TRUE,"*.*", &tabH); if (lastError != DBIERR_NONE) { return FALSE; } lastError = DbiSetToBegin(tabH); if (lastError != DBIERR_NONE) { return FALSE; } while ((DbiGetNextRecord(tabH,dbiNOLOCK, (pBYTE)&tblDesc, NULL)) == DBIERR_NONE) { if (!stricmp(tblDesc.szName, tblName)) { // Check if the types match if (strcmp(tblDesc.szType, tableName) && (isLocal)) { // keep searching it the // table is of the wrong // type continue; } lastError = DBIERR_NONE; DbiCloseCursor(&tabH); return TRUE; } } if (tabH) { DbiCloseCursor(&tabH); } lastError = DBIERR_NOSUCHTABLE; return exists; } PXTblMaxSize() DbiCreateTable(hDb, TRUE, &TblDesc); (This is done using the optional parameters in the table descriptor) PXTblName() DbiGetCursorProps(tabH, &CurProps); strcpy(szTblName, CurProps.szName); PXTblNRecs() DbiGetRecordCount(tabH, &iRecCount); (This function returns an approximation of the number of records in the table.) PXTblOpen() DbiOpenTable(hDb, szTblName, szPARADOX, NULL, NULL, indexID, dbiREADWRITE, dbiOPENSHARED, xltFIELD, TRUE, NULL, &tabH); PXTblProtected() Not directly supported. For local tables, need to call DbiOpenTableList and get the information for that table. Example for use with 'C': BOOL isProtected(hDBIDb hDb, const char *tableName, const char *tableType) { BOOL protect = FALSE; hDBICur tabH = 0; char *tblName; TBLFullDesc tblDesc; DBIResult lastError; // Different methodology required for // local and remote tables if ((!strcmp(tableType, szPARADOX)) || (!strcmp(tableType, szDBASE)) || (!strcmp(tableType, szASCII))) { tblName = _fstrtok((pCHAR)tableName, "."); if (tblName == NULL) { lastError = DBIERR_INVALIDTABLENAME; return FALSE; } lastError = DbiOpenTableList(hDb, TRUE, TRUE, "*.*", &tabH); if (lastError != DBIERR_NONE) { return FALSE; } lastError = DbiSetToBegin(tabH); if (lastError != DBIERR_NONE) { return FALSE; } while ((DbiGetNextRecord(tabH, dbiNOLOCK, (pBYTE)&tblDesc, NULL)) == DBIERR_NONE) { if (!stricmp( tblDesc.tblBase.szName, tblName)) { if (stricmp( tblDesc.tblBase.szType, tableType)) { // Keep searching if the // type doesn't match continue; } if ( tblDesc.tblExt.bProtected == TRUE) { // Table is protected lastError = DBIERR_NONE; DbiCloseCursor(&tabH); return TRUE; } else { lastError = DBIERR_NONE; DbiCloseCursor(&tabH); return FALSE; } } } if (tabH) { DbiCloseCursor(&tabH); } lastError = DBIERR_NOSUCHTABLE; } else { lastError = DbiOpenTable(hDb, (pCHAR)tableName, (pCHAR)tableType, NULL, NULL, NULL, dbiREADONLY, dbiOPENSHARED, xltNONE, FALSE, NULL, &tabH); if (lastError == DBIERR_NONE) { DbiCloseCursor(&tabH); protect = FALSE; return protect; } else if (lastError == DBIERR_INVALIDPASSWORD) { lastError = DBIERR_NONE; protect = TRUE; return protect; } } return protect; } PXTblRename() DbiRenameTable(hDb, szOldName, szTableType, szNewName); PXTblUpgrade() DbiDoRestructure(hDb, 1, pTblDesc, pSaveAs, NULL, NULL, FALSE); (Need to use the Optional Parameters to set the level of the table. Local tables only.) PXWinInit() DbiInit(NULL); DbiOpenDatabase(NULL, NULL, dbiREADWRITE, dbiOPENSHARED, NULL, 0, NULL, NULL, &hDb); Reference: 7/15/98 3:24:20 PM
Last Modified: 15-NOV-99