home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1997 May / Pcwk0597.iso / borland / cb / setup / cbuilder / data.z / NDXREBU.CPP < prev    next >
C/C++ Source or Header  |  1997-02-28  |  5KB  |  151 lines

  1. //----------------------------------------------------------------------------
  2. //Borland C++Builder
  3. //Copyright (c) 1987, 1997 Borland International Inc. All Rights Reserved.
  4. //----------------------------------------------------------------------------
  5. #include <vcl\vcl.h>
  6. #pragma hdrstop
  7.  
  8. #include "ndxrebu.h"
  9. //---------------------------------------------------------------------------
  10. #pragma resource "*.dfm"
  11. TForm1 *Form1;
  12. //---------------------------------------------------------------------------
  13. __fastcall TForm1::TForm1(TComponent* Owner)
  14.   : TForm(Owner)
  15. {
  16. }
  17. //---------------------------------------------------------------------------
  18. void __fastcall TForm1::FormCreate(TObject *Sender)
  19. {
  20.  
  21.   // Set up the exception handler.
  22.   Application->OnException = HandleExceptions;
  23.  
  24.   // Populate the Alias drop down with the currently defined aliases.
  25.   Screen->Cursor = crHourGlass;
  26.   try {
  27.     Session->GetAliasNames(cbAlias->Items);
  28.     cbAlias->ItemIndex = 0;
  29.   }
  30.   catch (...) {}  // dummy catch block to guarantee we get here.
  31.   Screen->Cursor = crDefault;
  32.  
  33.   // Now, get the table name for the first index in the list.
  34.   cbAliasChange(NULL);
  35. }
  36. //---------------------------------------------------------------------
  37.  
  38. void __fastcall TForm1::HandleExceptions(TObject *Sender, Exception *E)
  39. {
  40.   if (E->Message.Length())
  41.   {
  42.     Screen->Cursor = crArrow;
  43.     MessageDlg(E->Message, mtError, TMsgDlgButtons() << mbOK, 0);
  44.   }
  45. }
  46.  
  47. void __fastcall TForm1::cbAliasChange(TObject *Sender)
  48. {
  49.   // Get the tables in the new index.
  50.   Screen->Cursor = crHourGlass;
  51.   try {
  52.     Session->GetTableNames(cbAlias->Items->Strings[cbAlias->ItemIndex],
  53.         "", True, False, cbTable->Items);
  54.     cbTable->Items->Insert(0, "<All Tables>");
  55.     cbTable->ItemIndex = 0;
  56.   }
  57.   catch (...) {}  // dummy catch block to guarantee we get here.
  58.   Screen->Cursor = crDefault;
  59. }
  60. //---------------------------------------------------------------------
  61. void __fastcall TForm1::BitBtn1Click(TObject *Sender)
  62. {
  63.   AnsiString strTable;
  64.   int Counter;
  65.   int iNTables;
  66.   AnsiString strError;
  67.   char strMsg[1024];
  68.  
  69.   strError = "";
  70.     if (cbTable->ItemIndex > 0)
  71.   {
  72.     if (!RebuildIndexes(cbAlias->Items->Strings[cbAlias->ItemIndex],
  73.         cbTable->Items->Strings[cbTable->ItemIndex],
  74.         strError)) {
  75.         wsprintf(strMsg,
  76.                  "Unable to rebuild indexes for %s. Reason: %s",
  77.                    cbTable->Items->Strings[cbTable->ItemIndex].c_str(),
  78.                  strError.c_str());
  79.           MessageDlg(strMsg, mtError, TMsgDlgButtons() << mbOK, 0);
  80.     }
  81.   }
  82.   else
  83.   {
  84.       iNTables = cbTable->Items->Count;
  85.      for (Counter = 1; Counter <= cbTable->Items->Count - 1; Counter++)     {
  86.          StatusBar1->Panels->Items[1]->Text = AnsiString(iNTables - Counter);
  87.         StatusBar1->Update();
  88.         if (!RebuildIndexes(cbAlias->Items->Strings[cbAlias->ItemIndex],
  89.                             cbTable->Items->Strings[Counter],
  90.                             strError)){
  91.            wsprintf(strMsg,
  92.                     "Unable to rebuild indexes for %s. Reason: %s",
  93.                     cbTable->Items->Strings[Counter].c_str(),
  94.                     strError.c_str());
  95.            MessageDlg(strMsg, mtError, TMsgDlgButtons() << mbOK, 0 );
  96.         }
  97.       }
  98.       StatusBar1->Panels->Items[1]->Text = " ";
  99.       StatusBar1->Update();
  100.   }
  101. }
  102. //---------------------------------------------------------------------
  103.  
  104. bool __fastcall TForm1::RebuildIndexes(AnsiString strAlias, AnsiString strTable,
  105.     AnsiString& strError)
  106. {
  107.   bool Result = False;
  108.     DBIResult bdeResult;
  109.  
  110.   if (tblIndex->Active) tblIndex->Active = False;
  111.  
  112.   tblIndex->DatabaseName = strAlias;
  113.   tblIndex->TableName = strTable;
  114.  
  115.   Screen->Cursor = crHourGlass;
  116.   try {
  117.     WriteMsg("Opening " + strTable + "...");
  118.     tblIndex->Open();
  119.   }
  120.   catch (...) {}
  121.   Screen->Cursor = crDefault;
  122.  
  123.   if (!tblIndex->Active)
  124.     strError = "The table could not be opened exclusively.  It is " \
  125.                      "probably being used by another user or application.";
  126.   else {
  127.     WriteMsg("Regenerating indexes for " + strTable + "...");
  128.     Screen->Cursor = crHourGlass;
  129.     try {
  130.       bdeResult = DbiRegenIndexes(tblIndex->Handle);
  131.       switch (bdeResult) {
  132.         case DBIERR_NONE: Result = True; break;
  133.         case DBIERR_INVALIDHNDL: strError = "Invalid table handle."; break;
  134.         case DBIERR_NEEDEXCLACCESS: strError = "Table is open in shared mode."; break;
  135.         case DBIERR_NOTSUPPORTED: strError = "Remote indexes cannot be rebuilt."; break;
  136.           default: strError = "Unexpected Error Returned by BDE.";
  137.       }
  138.     }
  139.     catch (...) {}
  140.     Screen->Cursor = crDefault;
  141.   }
  142.   WriteMsg("");
  143.   return Result;
  144. }
  145.  
  146. void __fastcall TForm1::WriteMsg(AnsiString strWrite)
  147. {
  148.   StatusBar1->Panels->Items[0]->Text = strWrite;
  149.   StatusBar1->Update();
  150. }
  151.