// BDE - (C) Copyright 1995 by Borland International // BookMark.c #include "snipit.h" static const char szTblName[] = "customer"; static const char szTblType[] = szPARADOX; //===================================================================== // Function: // BookMark(); // // Description: // This example shows how to save the current position within // a cursor (the current record). The position within the // cursor will then be changed and reset to that location. // // Note: A bookmark only works with the current cursor. If the // cursor is changed - for example, when you change the active // index, the bookmark may become corrupt or invalid. // Therefore, if you switch indexes you will need to // regenerate any bookmarks. //===================================================================== void BookMark (void) { hDBIDb hDb; // Handle to the database hDBICur hCur; // Handle to the table CURProps TblProps; // Table properties pBYTE pBookBuf = NULL; // Pointer to the bookmark DBIResult rslt; // Return value from IDAPI functions Screen("*** BookMark 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"); Screen(" Opening 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; } // Get the properties of the table so that we can create the correct // bookmark size for the present condition of the table. Since the // bookmark is cursor-related it can change with any change to the // cursor, such as a change to the index or filters. rslt = DbiGetCursorProps(hCur, &TblProps); ChkRslt(rslt, "GetCursorProperties"); rslt = DbiGetNextRecord(hCur, dbiNOLOCK, NULL, NULL); ChkRslt(rslt, "GetNextRecord"); Screen(" Displaying the first record in the table..."); DisplayNextRecord(hCur); Screen("\r\n Jumping to the third record in the table... "); rslt = DbiGetRelativeRecord(hCur, 2, dbiNOLOCK, NULL, 0); ChkRslt(rslt, "GetRelativeRecord"); // Create the bookmark buffer. The size comes from the table property // iBookMarkSize. pBookBuf = (pBYTE) malloc(TblProps.iBookMarkSize); if (pBookBuf == NULL) { Screen(" Error: Out of memory"); rslt = DbiCloseCursor(&hCur); ChkRslt(rslt, "CloseCursor"); CloseDbAndExit(&hDb); Screen("\r\n*** End of Example ***"); return; } // Display the record that we will set a bookmark on. Screen(" Getting a bookmark on this record..."); rslt = DbiGetBookMark(hCur, pBookBuf); ChkRslt(rslt, "GetBookMark"); DisplayNextRecord(hCur); Screen("\r\n Jumping to the end of the table..."); rslt = DbiSetToEnd(hCur); ChkRslt(rslt, "SetToEnd"); // Set to end moves past the last record.... rslt = DbiGetPriorRecord(hCur, dbiNOLOCK, NULL, NULL); Screen(" Display the record..."); DisplayCurrentRecord(hCur); Screen("\r\n Going back to the bookmarked record..."); rslt = DbiSetToBookMark(hCur, pBookBuf); ChkRslt(rslt, "SetToBookMark"); Screen(" Displaying the bookmarked record..."); DisplayNextRecord(hCur); Screen("\r\n Close the table..."); rslt = DbiCloseCursor(&hCur); ChkRslt(rslt, "CloseCursor"); free(pBookBuf); Screen(" Close the database and exit IDAPI..."); CloseDbAndExit(&hDb); Screen("\r\n*** End of Example ***"); }