home *** CD-ROM | disk | FTP | other *** search
/ Total C++ 2 / TOTALCTWO.iso / borland / 32snipit.pak / CALLBACK.C < prev    next >
C/C++ Source or Header  |  1997-05-06  |  12KB  |  353 lines

  1. // BDE32 3.x - (C) Copyright 1996 by Borland International
  2.  
  3. // Callback.C
  4. #include "snipit.h"
  5.  
  6. static const DBIPATH szTblName      = "contacts";
  7. static const DBIPATH szRstrctTblName= "TempRest";
  8. static const char szTblType[]       = szPARADOX;
  9. pCHAR  CallBackData;
  10.  
  11. #define NUMOFFIELDS 3
  12.  
  13. static DBIResult getFieldDescs(hDBICur hCur, UINT16 *uNumFields,
  14.                                FLDDesc **fldDesc);
  15. static DBIResult changeFieldDescs(UINT16 *uNumFields, FLDDesc *fldDescSrc,
  16.                                   FLDDesc *fldDescDest, CROpType *ecrFldOp);
  17. CBRType DBIFN _export CallBackFunc(CBType ecbType, UINT32 iClientData,
  18.                                    pVOID pCbInfo);
  19.                                   
  20. //=====================================================================
  21. //  Function:
  22. //          TBRestructureCallBack();
  23. //
  24. //  Description:
  25. //          This example shows how to register and use a callback for a table
  26. //          restructure.  The restructure will simply drop fields.
  27. //
  28. //          The following steps are followed:
  29. //              Getting the existing field descriptors
  30. //              Modifying the field descriptors to the new table structure
  31. //              Initializing the CRTblDesc (create table descriptor)
  32. //              Registering the callback
  33. //              Restructuring the table
  34. //              Unregistering the callback
  35. //=====================================================================
  36. void
  37. TBRestructureCallBack (void)
  38. {
  39.     hDBIDb      hDb;                        // Handle to the database
  40.     hDBICur     hCur;                       // Handle to the table
  41.     CRTblDesc   crTblDesc;                  // Table descriptor
  42.     UINT16      uNumFields;                 // Number of fields
  43.     UINT16      uNumOfRecs = 5;             // No. of records to display
  44.     FLDDesc     *fldDescSrc;                // Array of field descriptors
  45.     FLDDesc     fldDescDest[NUMOFFIELDS];   // Restructure field descriptors
  46.     CROpType    ecrFldOp[NUMOFFIELDS];      // Restructure operations
  47.     RESTCbDesc  CbInfo;                     // Variable which is used within
  48.                                             //   the callback
  49.     DBIResult   rslt;                       // Return value from IDAPI
  50.                                             //   functions
  51.     DBIPATH     szKeyViol = "KEYVIOL";      // Name for the key violation table
  52.  
  53.     Screen("*** Restructure CallBack Example ***\r\n");
  54.  
  55.     BREAK_IN_DEBUGGER();
  56.  
  57.     Screen("    Initializing IDAPI...");
  58.     if (InitAndConnect(&hDb) != DBIERR_NONE)
  59.     {
  60.         Screen("*** End of Example ***");
  61.         return;
  62.     }
  63.  
  64.     Screen("    Setting the database directory... ");
  65.     rslt = DbiSetDirectory(hDb, (pCHAR) szTblDirectory);
  66.     ChkRslt(rslt, "SetDirectory");
  67.  
  68.     Screen("    Open the %s table....", szTblName);
  69.     rslt = DbiOpenTable(hDb, (pCHAR) szTblName, (pCHAR) szTblType,
  70.                         NULL, NULL, 0, dbiREADWRITE, dbiOPENSHARED,
  71.                         xltFIELD, FALSE, NULL, &hCur);
  72.     if (ChkRslt(rslt, "OpenTable") != DBIERR_NONE)
  73.     {
  74.         CloseDbAndExit(&hDb);
  75.         Screen("\r\n*** End of Example ***");
  76.         return;
  77.     }
  78.  
  79.     rslt = DbiSetToBegin(hCur);
  80.     ChkRslt(rslt, "SetToBegin");
  81.  
  82.     Screen("    Display the %s table...", szTblName);
  83.     DisplayTable(hCur, uNumOfRecs);
  84.  
  85.     // Get the field descriptors for the existing table.
  86.     if (getFieldDescs(hCur, &uNumFields, &fldDescSrc) != DBIERR_NONE)
  87.     {
  88.         rslt = DbiCloseCursor(&hCur);
  89.         ChkRslt(rslt, "CloseCursor");
  90.         CloseDbAndExit(&hDb);
  91.         Screen("\r\n*** End of Example ***");
  92.         return;
  93.     }
  94.  
  95.     Screen("\r\n    Close the %s table...", szTblName);
  96.     DbiCloseCursor(&hCur);
  97.  
  98.     // Allocate enough space for the data passed to the callback function.
  99.     CallBackData = (pCHAR)malloc(100 * sizeof(CHAR));
  100.     if (CallBackData == NULL)
  101.     {
  102.         CloseDbAndExit(&hDb);
  103.         Screen("\r\n*** End of Example ***");
  104.         return;
  105.     }
  106.  
  107.     // Register the callback.
  108.     rslt = DbiRegisterCallBack(NULL, cbRESTRUCTURE, (UINT32) CallBackData,
  109.                                sizeof(RESTCbDesc), &CbInfo, CallBackFunc);
  110.     if(rslt!=DBIERR_NONE)
  111.     {
  112.         free(CallBackData);
  113.         CloseDbAndExit(&hDb);
  114.         Screen("\r\n*** End of Example ***");
  115.         return;
  116.     }                                  
  117.     
  118.     Screen("    Initialize the table descriptor...");
  119.     memset(&crTblDesc, 0, sizeof(CRTblDesc));
  120.     strcpy(crTblDesc.szTblName, szTblName);
  121.     strcpy(crTblDesc.szTblType, szTblType);
  122.     crTblDesc.bPack         = TRUE;
  123.     changeFieldDescs(&uNumFields, fldDescSrc, fldDescDest, ecrFldOp);
  124.     crTblDesc.iFldCount     = uNumFields;
  125.     crTblDesc.pecrFldOp     = ecrFldOp;
  126.     crTblDesc.pfldDesc      = fldDescDest;
  127.  
  128.     Screen("    Restructure the %s table to the %s table...",
  129.            szTblName, szRstrctTblName);
  130.     rslt = DbiDoRestructure(hDb, 1, &crTblDesc, (pCHAR) szRstrctTblName,
  131.                             szKeyViol, NULL, FALSE);
  132.     if (ChkRslt(rslt, "DoRestructure") != DBIERR_NONE)
  133.     {
  134.         free(CallBackData);
  135.         free(fldDescSrc);
  136.         DbiRegisterCallBack(hCur, cbRESTRUCTURE, NULL, 0, NULL, NULL);
  137.         CloseDbAndExit(&hDb);
  138.         Screen("\r\n*** End of Example ***");
  139.         return;
  140.     }
  141.  
  142.     // Unregister the callback by passing in NULL for the function.
  143.     rslt = DbiRegisterCallBack(hCur, cbRESTRUCTURE, NULL, 0, NULL, NULL);
  144.     if (ChkRslt(rslt, "RegisterCallBack") != DBIERR_NONE)
  145.     {
  146.         free(CallBackData);
  147.         free(fldDescSrc);
  148.         rslt = DbiDeleteTable(hDb, (pCHAR) szRstrctTblName, (pCHAR) szTblType);
  149.         ChkRslt(rslt, "DeleteTable");
  150.         CloseDbAndExit(&hDb);
  151.         Screen("\r\n*** End of Example ***");
  152.         return;
  153.     }
  154.     
  155.     Screen("    Open the %s table...", szRstrctTblName);
  156.     rslt = DbiOpenTable(hDb, (pCHAR) szRstrctTblName, (pCHAR) szTblType,
  157.                         NULL, NULL, 0, dbiREADWRITE, dbiOPENSHARED,
  158.                         xltFIELD, FALSE, NULL, &hCur);
  159.     if (ChkRslt(rslt, "OpenTable") != DBIERR_NONE)
  160.     {
  161.         free(CallBackData);
  162.         free(fldDescSrc);
  163.         rslt = DbiDeleteTable(hDb, (pCHAR) szRstrctTblName, (pCHAR) szTblType);
  164.         ChkRslt(rslt, "DeleteTable");
  165.         CloseDbAndExit(&hDb);
  166.         Screen("\r\n*** End of Example ***");
  167.         return;
  168.     }
  169.  
  170.     rslt = DbiSetToBegin(hCur);
  171.     ChkRslt(rslt, "SetToBegin");
  172.  
  173.     Screen("    Display the %s table...", szRstrctTblName);
  174.     DisplayTable(hCur, uNumOfRecs);
  175.  
  176.     Screen("\r\n    Close the %s table...", szRstrctTblName);
  177.     rslt = DbiCloseCursor(&hCur);
  178.     ChkRslt(rslt, "CloseCursor");
  179.  
  180.     Screen("    Delete the %s restructured table...", szRstrctTblName);
  181.     rslt = DbiDeleteTable(hDb, (pCHAR) szRstrctTblName, (pCHAR) szTblType);
  182.     ChkRslt(rslt, "DeleteTable");
  183.  
  184.     free(fldDescSrc);
  185.     free(CallBackData);
  186.  
  187.     Screen("    Close the database and exit IDAPI...");
  188.     CloseDbAndExit(&hDb);
  189.  
  190.     Screen("\r\n*** End of Example ***");
  191. }
  192.  
  193. //===============================================================
  194. //  Function:
  195. //          getFieldDescs(hCur, *uNumFields, **fldDescSrc)
  196. //
  197. //  Input:  hCur            - Handle to the cursor
  198. //          uNumFields      - Number of fields in the field descriptor.
  199. //                            (Returned)
  200. //          fldDescSrc      - Existing field descriptor (Input)
  201. //
  202. //  Return: IDAPI return code.
  203. //
  204. //  Description:
  205. //          This function gets the field descriptor for an existing cursor
  206. //================================================================
  207. DBIResult getFieldDescs(hDBICur hCur, UINT16 *uNumFields, FLDDesc **fldDesc)
  208. {
  209.     DBIResult rslt;
  210.     CURProps curProps;
  211.  
  212.     // Change the translation mode to xltNONE to get the physical 
  213.     //   field descriptors.
  214.     rslt = DbiSetProp(hCur, curXLTMODE, xltNONE);
  215.     ChkRslt(rslt, "SetProp");
  216.  
  217.     rslt = DbiGetCursorProps(hCur, &curProps);
  218.     if (ChkRslt(rslt, "GetCursorProps") != DBIERR_NONE)
  219.     {
  220.         return rslt;
  221.     }
  222.  
  223.     *uNumFields = curProps.iFields;
  224.  
  225.     *fldDesc = (FLDDesc *) malloc(curProps.iFields * sizeof(FLDDesc));
  226.     if (fldDesc == NULL)
  227.     {
  228.         return DBIERR_NOMEMORY;
  229.     }
  230.  
  231.     rslt = DbiGetFieldDescs(hCur, *fldDesc);
  232.     if (ChkRslt(rslt, "GetFIeldDescs") != DBIERR_NONE)
  233.     {
  234.         return rslt;
  235.     }
  236.  
  237.     // Change the translation mode back to xltFIELD.
  238.     rslt = DbiSetProp(hCur, curXLTMODE, xltFIELD);
  239.     ChkRslt(rslt, "SetProp");
  240.  
  241.     return DBIERR_NONE;
  242. }
  243.  
  244. //===============================================================
  245. //  Function:
  246. //          changeFieldDescs(uNumFields, FldDescSrc,
  247. //                           fldDescDest, ecrFldOp);
  248. //
  249. //  Input:  uNumFields    - Number of fields in the existing field descriptor
  250. //                          Also returns the number of fields in the new
  251. //                          field descriptor. (Input and Returned)
  252. //          fldDescSrc    - Existing field descriptor (Input)
  253. //          fldDescDest   - New field descriptor to use. (Returned)
  254. //          ecrFldOp      - Array of operations on the fields in
  255. //                          fldDescDest. (Returned)
  256. //
  257. //  Return: IDAPI return code.
  258. //
  259. //  Description:
  260. //          This function sets up the field structure for the new table.
  261. //================================================================
  262. DBIResult changeFieldDescs(UINT16 *uNumFields, FLDDesc *fldDescSrc,
  263.                            FLDDesc *fldDescDest, CROpType *ecrFldOp)
  264. {
  265.     UINT16      i;
  266.  
  267.     for (i=0; i < NUMOFFIELDS; i++)
  268.     {
  269.         fldDescDest[i] = fldDescSrc[i];
  270.         ecrFldOp[i] = crNOOP;
  271.     }
  272.  
  273.     *uNumFields = NUMOFFIELDS;
  274.  
  275.     return DBIERR_NONE;
  276. }
  277.  
  278. //======================================================================
  279. //  Name:   CallBackFunc()
  280. //
  281. //  Input:  ecbType     - Callback type
  282. //          iClientData - Pointer to client information that is passed into
  283. //                        the callback function
  284. //          pCbInfo     - The callback structure that holds the information
  285. //                        about the current state
  286. //
  287. //  Return: The action that should be taken
  288. //
  289. //  Description:
  290. //          This function will be called from the BDE during the processing
  291. //          of the restructure.
  292. //======================================================================
  293. #ifdef __BORLANDC__
  294. #pragma argsused
  295. #endif
  296. CBRType DBIFN
  297. CallBackFunc (CBType ecbType, UINT32 iClientData, pVOID pCbInfo)
  298. {
  299.     RESTCbDesc      *eCBRestDesc;   // Variable to contain passed in
  300.                                     //   information
  301.     pCHAR            pszMsg;        // Information to be displayed.
  302.                                                            
  303. #ifndef WIN32
  304.     // Set to stop a unused variable warning.
  305.     iClientData = iClientData;
  306. #endif
  307.  
  308.     switch (ecbType)
  309.     {
  310.         // In case this is a restructure progress callback display the
  311.         //   information.
  312.         case cbRESTRUCTURE:
  313.  
  314.             eCBRestDesc = (RESTCbDesc far *)pCbInfo;
  315.  
  316.             // Restructuring the old field.
  317.             if(eCBRestDesc->eRestrObjType == restrOLDFLD)
  318.             {
  319.                 pszMsg = (pCHAR)malloc(DBIMAXMSGLEN * sizeof(CHAR) + 1);
  320.                 if (!pszMsg)
  321.                 {
  322.                     return cbrUSEDEF;
  323.                 }
  324.                 strcpy(pszMsg, eCBRestDesc->uObjDesc.fldDesc.szName);
  325.                 Screen("\r\n### CallBack information:  Deleting the %s "
  326.                        "field...", pszMsg);
  327.  
  328.                 free(pszMsg);
  329.             }
  330.             else
  331.             {
  332.                 // Restructuring the new table's index.
  333.                 if(eCBRestDesc->eRestrObjType == restrNEWINDEX)
  334.                 {
  335.                     Screen("### CallBack information: Recreating the "
  336.                            "Primary index...\r\n");
  337.                 }
  338.  
  339.                 // Not one we are expecting.
  340.                 else
  341.                 {
  342.                     Screen("### In the callback function");
  343.                 }
  344.             }
  345.             break;
  346.  
  347.         default:
  348.             Screen("### In the callback function");
  349.     }
  350.  
  351.     return cbrUSEDEF;
  352. }
  353.