home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / bde / snipit.pak / RECLOCK.C < prev    next >
C/C++ Source or Header  |  1997-07-23  |  7KB  |  192 lines

  1. // BDE - (C) Copyright 1995 by Borland International
  2.  
  3. // reclock.c
  4. #include "snipit.h"
  5.  
  6. static const char szTblName[] = "cust";
  7. static const char szTblType[] = szDBASE;
  8.  
  9. //=====================================================================
  10. //  Function:
  11. //          RecLock();
  12. //
  13. //  Description:
  14. //          This example shows how to do record locking.  The
  15. //          example will simulate multi-user access by creating multiple
  16. //          sessions. The example will show both working and failing locks.
  17. //=====================================================================
  18. void
  19. RecLock (void)
  20. {
  21.     DBIResult   rslt;       // Value returned from IDAPI functions
  22.     CURProps    TblProps;   // Properties of the table. Used to determine
  23.                             //   the size of the record
  24.     hDBIDb      hDb1;       // Handle to the first database
  25.     hDBICur     hCur1;      // Handle to the first table
  26.     hDBISes     hSession1;  // Handle to the first session
  27.     pBYTE       pRecBuf1;   // Pointer to the record buffer
  28.     hDBIDb      hDb2;       // Handle to the second database
  29.     hDBICur     hCur2;      // Handle to the second table
  30.     hDBISes     hSession2;  // Handle to the second session
  31.     pBYTE       pRecBuf2;   // Pointer to the record buffer
  32.  
  33.     Screen("*** Record Locking Example ***\r\n");
  34.  
  35.     BREAK_IN_DEBUGGER();
  36.  
  37.     Screen("    Initializing IDAPI...\r\n");
  38.     if (InitAndConnect(&hDb1) != DBIERR_NONE)
  39.     {                                       
  40.         Screen("\r\n*** End of Example ***");
  41.         return;
  42.     }
  43.  
  44.     // Acquire a session handle. Initializing IDAPI opens a session.
  45.     Screen("    Acquiring the current session's handle...");
  46.     rslt = DbiGetCurrSession(&hSession1);
  47.     ChkRslt(rslt, "GetCurrSession");
  48.  
  49.     Screen("    Setting the database directory in session #1...");
  50.     rslt = DbiSetDirectory(hDb1, (pCHAR) szTblDirectory);
  51.     ChkRslt(rslt, "SetDirectory");
  52.  
  53.     Screen("    Opening the %s table in session #1...", szTblName);
  54.     rslt = DbiOpenTable(hDb1, (pCHAR) szTblName, (pCHAR) szTblType,
  55.                         NULL, NULL, NULL, dbiREADWRITE, dbiOPENSHARED,
  56.                         xltFIELD, FALSE, NULL, &hCur1);
  57.     if (ChkRslt(rslt, "OpenTable") != DBIERR_NONE)
  58.     {
  59.         CloseDbAndExit(&hDb1);
  60.         Screen("\r\n*** End of Example ***");
  61.         return;
  62.     }
  63.  
  64.     // Aquire a new session. This is to simulate multi-user table access.
  65.     Screen("\r\n    Opening session #2...");
  66.     rslt = DbiStartSession("", &hSession2, NULL);
  67.     ChkRslt(rslt, "StartSession");
  68.  
  69.     Screen("\r\n    Opening standard database in session #2...");
  70.     rslt = DbiOpenDatabase("", 0, dbiREADWRITE, dbiOPENSHARED,
  71.                            NULL, NULL, NULL, NULL, &hDb2);
  72.     if (ChkRslt(rslt, "OpenDatabase") != DBIERR_NONE)
  73.     {
  74.         rslt = DbiCloseCursor(&hCur1);
  75.         ChkRslt(rslt, "CloseCursor");
  76.         CloseDbAndExit(&hDb1);
  77.         Screen("\r\n*** End of Example ***");
  78.         return;
  79.     }
  80.  
  81.     Screen("    Setting the database directory in session #2...");
  82.     rslt = DbiSetDirectory(hDb2, (pCHAR) szTblDirectory);
  83.     ChkRslt(rslt, "SetDirectory");
  84.  
  85.     Screen("    Opening the %s table in session #2...", szTblName);
  86.     rslt = DbiOpenTable(hDb2, (pCHAR) szTblName, (pCHAR) szTblType,
  87.                         NULL, NULL, NULL, dbiREADWRITE, dbiOPENSHARED,
  88.                         xltFIELD, FALSE, NULL, &hCur2);
  89.     if (ChkRslt(rslt, "OpenTable") != DBIERR_NONE)
  90.     {
  91.         rslt = DbiCloseCursor(&hCur1);
  92.         ChkRslt(rslt, "CloseCursor");
  93.         rslt = DbiCloseDatabase(&hDb2);
  94.         ChkRslt(rslt, "CloseDatabase");
  95.         CloseDbAndExit(&hDb1);
  96.         Screen("\r\n*** End of Example ***");
  97.         return;
  98.     }
  99.  
  100.     // Create the record buffers.
  101.     rslt = DbiGetCursorProps(hCur2, &TblProps);
  102.     ChkRslt(rslt, "GetCursorProps");
  103.  
  104.     pRecBuf1 = (pBYTE) malloc(TblProps.iRecBufSize * sizeof(BYTE));
  105.     pRecBuf2 = (pBYTE) malloc(TblProps.iRecBufSize * sizeof(BYTE));
  106.     if ((!pRecBuf1) || (!pRecBuf2))
  107.     {
  108.         if (pRecBuf1) free(pRecBuf1);
  109.         if (pRecBuf2) free(pRecBuf2);
  110.         rslt = DbiCloseCursor(&hCur1);
  111.         ChkRslt(rslt, "CloseCursor");
  112.         rslt = DbiCloseCursor(&hCur2);
  113.         ChkRslt(rslt, "CloseCursor");
  114.         rslt = DbiCloseDatabase(&hDb2);
  115.         ChkRslt(rslt, "CloseDatabase");
  116.         CloseDbAndExit(&hDb1);
  117.         Screen("\r\n*** End of Example ***");
  118.         return;
  119.     }
  120.  
  121.     // Initialize the record buffer.
  122.     rslt = DbiInitRecord(hCur2, pRecBuf2);
  123.     ChkRslt(rslt, "InitRecord");
  124.  
  125.     Screen("    Session #2 is getting and locking the first record...");
  126.     rslt = DbiSetToBegin(hCur2);
  127.     ChkRslt(rslt, "SetToBegin");
  128.     rslt = DbiGetNextRecord(hCur2, dbiWRITELOCK, pRecBuf2, NULL);
  129.     ChkRslt(rslt, "GetRecord");
  130.  
  131.     // Set the current session to session #1.
  132.     rslt = DbiSetCurrSession(hSession1);
  133.     ChkRslt(rslt, "SetCurrSession");
  134.  
  135.     Screen("\r\n    Session #1 is getting the first record without"
  136.            " locking it...");
  137.     rslt = DbiSetToBegin(hCur1);
  138.     ChkRslt(rslt, "SetToBegin");
  139.     rslt = DbiGetNextRecord(hCur1, dbiNOLOCK, pRecBuf1, NULL);
  140.     ChkRslt(rslt, "GetRecord");
  141.  
  142.     // Attempt to modify the record in session #1 - get an error as
  143.     //   session #2 has the record locked.
  144.     Screen("    Session #1 is modifying the record...");
  145.     Screen("        Error Expected - record is locked...");
  146.     rslt = DbiModifyRecord(hCur1, pRecBuf1, TRUE);
  147.     ChkRslt(rslt, "GetRecord");
  148.  
  149.     // Switch the current session to session #2.
  150.     rslt = DbiSetCurrSession(hSession2);
  151.     ChkRslt(rslt, "SetCurrSession");
  152.  
  153.     // Modify the record in session #2. Session #2 locked the record,
  154.     //   so it will succeed this time. Note that the lock is released
  155.     //   after the record is modified. 
  156.     Screen("\r\n    Session #2 is modifying the record...");
  157.     rslt = DbiModifyRecord(hCur2, pRecBuf2, TRUE);
  158.     ChkRslt(rslt, "ModifyRecord");
  159.  
  160.     // Clean Up
  161.     free(pRecBuf1);
  162.     free(pRecBuf2);
  163.  
  164.     rslt = DbiSetCurrSession(hSession2);
  165.     ChkRslt(rslt, "SetCurrSession");
  166.  
  167.     Screen("\r\n    Close the %s table in session #2...", szTblName);
  168.     rslt = DbiCloseCursor(&hCur2);
  169.     ChkRslt(rslt, "CloseCursor");
  170.  
  171.     Screen("    Close the database handle in session #2...");
  172.     rslt = DbiCloseDatabase(&hDb2);
  173.     ChkRslt(rslt, "CloseDatabase");
  174.  
  175.     Screen("    Closing session #2...");
  176.     rslt = DbiCloseSession(hSession2);
  177.     ChkRslt(rslt, "CloseSession");
  178.  
  179.     rslt = DbiSetCurrSession(hSession1);
  180.     ChkRslt(rslt, "SetCurrSession");
  181.  
  182.     Screen("\r\n    Close the %s table in session #1...", szTblName);
  183.     rslt = DbiCloseCursor(&hCur1);
  184.     ChkRslt(rslt, "CloseCursor");
  185.  
  186.     Screen("    Close the database and exit IDAPI...");
  187.     CloseDbAndExit(&hDb1);
  188.     
  189.     Screen("\r\n*** End of Example ***");
  190. }
  191.  
  192.