home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 October / PCWorld_2000-10_cd2.bin / Borland / interbase / IBConsole_src.ZIP / ibconsole / frmuDBValidationReport.pas < prev    next >
Pascal/Delphi Source File  |  2000-07-24  |  17KB  |  524 lines

  1. {
  2.  * The contents of this file are subject to the InterBase Public License
  3.  * Version 1.0 (the "License"); you may not use this file except in
  4.  * compliance with the License.
  5.  * 
  6.  * You may obtain a copy of the License at http://www.Inprise.com/IPL.html.
  7.  * 
  8.  * Software distributed under the License is distributed on an "AS IS"
  9.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  10.  * the License for the specific language governing rights and limitations
  11.  * under the License.  The Original Code was created by Inprise
  12.  * Corporation and its predecessors.
  13.  * 
  14.  * Portions created by Inprise Corporation are Copyright (C) Inprise
  15.  * Corporation. All Rights Reserved.
  16.  * 
  17.  * Contributor(s): ______________________________________.
  18. }
  19.  
  20. {****************************************************************
  21. *
  22. *  f r m u D B V a l i d a t i o n R e p o r t
  23. *
  24. ****************************************************************
  25. *  Author: The Client Server Factory Inc.
  26. *  Date:   March 1, 1999
  27. *
  28. *  Description:  This unit provides an interface for displaying
  29. *                the validation report and allowing the user
  30. *                the option of repairing the reported errors
  31. *
  32. *****************************************************************
  33. * Revisions:
  34. *
  35. *****************************************************************}
  36. unit frmuDBValidationReport;
  37.  
  38. interface
  39.  
  40. uses
  41.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  42.   Grids, StdCtrls, ExtCtrls, IB, IBServices, IBDatabase, zluibcClasses, frmuDlgClass;
  43.  
  44. type
  45.   TfrmDBValidationReport = class(TDialog)
  46.     lblDatabaseName: TLabel;
  47.     stxDatabaseName: TStaticText;
  48.     bvlLine1: TBevel;
  49.     memReport: TMemo;
  50.     lblOptions: TLabel;
  51.     pnlOptionName: TPanel;
  52.     sgOptions: TStringGrid;
  53.     cbOptions: TComboBox;
  54.     btnRepair: TButton;
  55.     btnCancel: TButton;
  56.     procedure FormCreate(Sender: TObject);
  57.     procedure btnCancelClick(Sender: TObject);
  58.     procedure btnRepairClick(Sender: TObject);
  59.     procedure cbOptionsChange(Sender: TObject);
  60.     procedure cbOptionsDblClick(Sender: TObject);
  61.     procedure cbOptionsExit(Sender: TObject);
  62.     procedure cbOptionsKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  63.     procedure sgOptionsDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
  64.     procedure sgOptionsSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
  65.     procedure FormShow(Sender: TObject);
  66.   private
  67.     { Private declarations }
  68.     procedure WMNCLButtonDown( var Message: TWMNCLBUTTONDOWN ); message WM_NCLBUTTONDOWN ;
  69.   public
  70.     { Public declarations }
  71.   end;
  72.  
  73. function ShowReport(const str : String; const SourceServerNode: TibcServerNode;
  74.   const CurrSelDatabase: TibcDatabaseNode; const Errors: boolean): integer;
  75.  
  76. implementation
  77.  
  78. uses zluGlobal, zluUtility, zluContextHelp, frmuMessage, frmuMain, IBErrorCodes;
  79.  
  80. {$R *.DFM}
  81.  
  82. const
  83.   OPTION_NAME_COL = 0;
  84.   OPTION_VALUE_COL = 1;
  85.   VALIDATE_RECORD_FRAGMENTS_ROW = 0;
  86.   // READ_ONLY_VALIDATION_ROW = 1;
  87.   IGNORE_CHECKSUM_ERRORS_ROW = 1;
  88.   ERR_MSG_1 = 'please retry';
  89.   ERR_MSG_2 = 'plausible options';
  90.  
  91. {****************************************************************
  92. *
  93. *  S h o w R e p o r t ( )
  94. *
  95. ****************************************************************
  96. *  Author: The Client Server Factory Inc.
  97. *  Date:   March 1, 1999
  98. *
  99. *  Input:  TibcServerNode  - currently selected server
  100. *          TibcDatabseNode - currently selected database (the
  101. *                            database to be validated)
  102. *
  103. *  Return: Integer - indicates success or failure
  104. *
  105. *  Description: Ths displays any validation errors and
  106. *               allows the user the option to repair them
  107. *
  108. *****************************************************************
  109. * Revisions:
  110. *
  111. *****************************************************************}
  112. function ShowReport(const str : String; const SourceServerNode: TibcServerNode;
  113.   const CurrSelDatabase: TibcDatabaseNode; const Errors: Boolean): integer;
  114. var
  115.   frmReport        : TfrmDBValidationReport;
  116.   lValidation      : TIBValidationService;
  117.   lValidateOptions : TValidateOptions;
  118. begin
  119.   frmReport   := Nil;
  120.   lValidation := Nil;
  121.   try
  122.     frmReport:=TfrmDBValidationReport.Create(Application);
  123.     frmReport.stxDatabaseName.Caption := CurrSelDatabase.NodeName;
  124.     frmReport.stxDatabaseName.Hint := CurrSelDatabase.NodeName;
  125.  
  126.     if Errors then
  127.     begin
  128.       frmReport.memReport.SetTextBuf(PChar(str));
  129.       if (StrPos(PChar(str), PChar(ERR_MSG_1)) <> Nil) or
  130.         (StrPos(PChar(str), PChar(ERR_MSG_2)) <> Nil) then
  131.         frmReport.btnRepair.Enabled := False;
  132.       frmReport.memReport.Lines.Append('');
  133.       frmReport.memReport.Lines.Append('Check the InterBase.Log file for additional information');
  134.     end
  135.     else
  136.     begin
  137.       frmReport.sgOptions.Enabled := false;
  138.       frmReport.cbOptions.Enabled := false;
  139.       frmReport.memReport.Lines.Add('No database validation errors were found.');
  140.       frmReport.btnRepair.Enabled := False;
  141.       frmReport.btnCancel.Caption := '&OK';
  142.       frmReport.btnCancel.Default := true;
  143.     end;
  144.  
  145.     frmReport.ShowModal;
  146.  
  147.     if (frmReport.ModalResult = mrOK) and
  148.       (not frmReport.GetErrorState) then
  149.     begin
  150.       try
  151.         lValidation := TIBValidationService.Create(Nil);
  152.         lValidateOptions := [];
  153.  
  154.         // specify the repair database option
  155.         Include(lValidateOptions, MendDB);
  156.  
  157.         try
  158.           // assign server details
  159.           lValidation.LoginPrompt := false;
  160.           lValidation.ServerName := SourceServerNode.Server.ServerName;
  161.           lValidation.Protocol := SourceServerNode.Server.Protocol;
  162.           lValidation.Params.Clear;
  163.           lValidation.Params.Assign(SourceServerNode.Server.Params);
  164.           lValidation.Attach();        // attach to server
  165.         except                         // if an exception occurs then trap it
  166.           on E:EIBError do             // and display error message
  167.           begin
  168.             DisplayMsg(ERR_SERVER_LOGIN, E.Message);
  169.             result := FAILURE;
  170.             if (E.IBErrorCode = isc_lost_db_connection) or
  171.                (E.IBErrorCode = isc_unavailable) or
  172.                (E.IBErrorCode = isc_network_error) then
  173.               frmMain.SetErrorState;
  174.             Exit;
  175.           end;
  176.         end;
  177.  
  178.         if lValidation.Active = true then
  179.         begin
  180.           // assign database details
  181.           case SourceServerNode.Server.Protocol of
  182.             TCP : lValidation.DatabaseName := Format('%s:%s',[SourceServerNode.ServerName,CurrSelDatabase.DatabaseFiles.Strings[0]]);
  183.             NamedPipe : lValidation.DatabaseName := Format('\\%s\%s',[SourceServerNode.ServerName,CurrSelDatabase.DatabaseFiles.Strings[0]]);
  184.             SPX : lValidation.DatabaseName := Format('%s@%s',[SourceServerNode.ServerName,CurrSelDatabase.DatabaseFiles.Strings[0]]);
  185.             Local : lValidation.DatabaseName := CurrSelDatabase.DatabaseFiles.Strings[0];
  186.           end;
  187.  
  188.           // determine which options have been selected
  189.           if frmReport.sgOptions.Cells[1,VALIDATE_RECORD_FRAGMENTS_ROW] = 'True' then
  190.             Include(lValidateOptions, ValidateFull)
  191.           else
  192.             Exclude(lValidateOptions, ValidateFull);
  193.  
  194.           if frmReport.sgOptions.Cells[1,IGNORE_CHECKSUM_ERRORS_ROW] = 'True' then
  195.             Include(lValidateOptions, IgnoreChecksum)
  196.           else
  197.             Exclude(lValidateOptions, IgnoreChecksum);
  198.  
  199.           // assign validation options
  200.           lValidation.Options := lValidateOptions;
  201.  
  202.           // start service
  203.           try
  204.             lValidation.ServiceStart;
  205.             while (lValidation.IsServiceRunning) and (not gApplShutdown) do
  206.               Application.ProcessMessages;
  207.  
  208.             if lValidation.Active then
  209.               lValidation.Detach();
  210.  
  211.             ShowMessage ('Database validation complete');
  212.           except
  213.             on E: EIBError do
  214.             begin
  215.               DisplayMsg(E.IBErrorCode, E.Message);
  216.               if (E.IBErrorCode = isc_lost_db_connection) or
  217.                  (E.IBErrorCode = isc_unavailable) or
  218.                  (E.IBErrorCode = isc_network_error) then
  219.                 frmMain.SetErrorState;
  220.             end;
  221.           end;
  222.         end
  223.         else
  224.         begin
  225.           result := FAILURE;
  226.           Exit;
  227.         end;
  228.       finally
  229.         lValidation.Free;
  230.       end;
  231.       Result:=SUCCESS;
  232.     end
  233.     else
  234.     begin
  235.       Result:=FAILURE;
  236.     end;
  237.   finally
  238.     frmReport.Free;
  239.   end;
  240. end;
  241.  
  242. procedure TfrmDBValidationReport.FormCreate(Sender: TObject);
  243. begin
  244.   inherited;
  245.   sgOptions.DefaultRowHeight := cbOptions.Height;
  246.   cbOptions.Visible := True;
  247.   pnlOptionName.Visible := True;
  248.  
  249.   sgOptions.RowCount := 2;
  250.  
  251.   sgOptions.Cells[OPTION_NAME_COL,VALIDATE_RECORD_FRAGMENTS_ROW] := 'Validate Record Fragments';
  252.   sgOptions.Cells[OPTION_VALUE_COL,VALIDATE_RECORD_FRAGMENTS_ROW] := 'False';
  253.  
  254.   // sgOptions.Cells[OPTION_NAME_COL,READ_ONLY_VALIDATION_ROW] := 'Read Only Validation';
  255.   // sgOptions.Cells[OPTION_VALUE_COL,READ_ONLY_VALIDATION_ROW] := 'False';
  256.  
  257.   sgOptions.Cells[OPTION_NAME_COL,IGNORE_CHECKSUM_ERRORS_ROW] := 'Ignore Checksum Errors';
  258.   sgOptions.Cells[OPTION_VALUE_COL,IGNORE_CHECKSUM_ERRORS_ROW] := 'False';
  259.  
  260.   pnlOptionName.Caption := 'Validate Record Fragments';
  261.   cbOptions.Items.Add('True');
  262.   cbOptions.Items.Add('False');
  263.   cbOptions.ItemIndex := 1;
  264. end;
  265.  
  266. procedure TfrmDBValidationReport.cbOptionsChange(Sender: TObject);
  267. begin
  268.   {
  269.   sgOptions.Cells[sgOptions.Col,sgOptions.Row] :=
  270.     cbOptions.Items[cbOptions.ItemIndex];
  271.   cbOptions.Visible := false;
  272.   sgOptions.SetFocus;
  273.   }
  274. end;
  275.  
  276. procedure TfrmDBValidationReport.cbOptionsExit(Sender: TObject);
  277. var
  278.   lR     : TRect;
  279.   iIndex : Integer;
  280. begin
  281.   iIndex := cbOptions.Items.IndexOf(cbOptions.Text);
  282.  
  283.   if (iIndex = -1) then
  284.   begin
  285.     MessageDlg('Invalid option value', mtError, [mbOK],0);
  286.  
  287.     cbOptions.ItemIndex := 0;
  288.     //Size and position the combo box to fit the cell
  289.     lR := sgOptions.CellRect(OPTION_VALUE_COL, sgOptions.Row);
  290.     lR.Left := lR.Left + sgOptions.Left;
  291.     lR.Right := lR.Right + sgOptions.Left;
  292.     lR.Top := lR.Top + sgOptions.Top;
  293.     lR.Bottom := lR.Bottom + sgOptions.Top;
  294.     cbOptions.Left := lR.Left + 1;
  295.     cbOptions.Top := lR.Top + 1;
  296.     cbOptions.Width := (lR.Right + 1) - lR.Left;
  297.     cbOptions.Height := (lR.Bottom + 1) - lR.Top;
  298.     cbOptions.Visible := True;
  299.     cbOptions.SetFocus;
  300.   end
  301.   else if (sgOptions.Col <> OPTION_NAME_COL) then
  302.   begin
  303.     sgOptions.Cells[sgOptions.Col,sgOptions.Row] := cbOptions.Items[iIndex];
  304.   end
  305.   else
  306.   begin
  307.     sgOptions.Cells[OPTION_VALUE_COL,sgOptions.Row] := cbOptions.Items[iIndex];
  308.   end;
  309. end;
  310.  
  311. {****************************************************************
  312. *
  313. *  s g O p t i o n s D r a w C e l l
  314. *
  315. ****************************************************************
  316. *  Author: The Client Server Factory Inc.
  317. *  Date:   March 1, 1999
  318. *
  319. *  Input:  TObject - Object that initiated the event
  320. *          Integer - currently selected column
  321. *          Integer - currently selected row
  322. *          TRect   - coordinates
  323. *          TGridDrawState - drawing state of grid
  324. *
  325. *  Return: None
  326. *
  327. *  Description: This procedure draws contents to a specified cell in
  328. *               the Options string grid.
  329. *
  330. *****************************************************************
  331. * Revisions:
  332. *
  333. *****************************************************************}
  334. procedure TfrmDBValidationReport.sgOptionsDrawCell(Sender: TObject; ACol,
  335.   ARow: Integer; Rect: TRect; State: TGridDrawState);
  336. const
  337.   INDENT = 2;
  338. var
  339.   lLeft: integer;
  340.   lText: string;
  341. begin
  342.   with sgOptions.canvas do
  343.   begin
  344.     if (ACol = OPTION_VALUE_COL) then
  345.     begin
  346.       font.color := clBlue;
  347.       if brush.color = clHighlight then
  348.         font.color := clWhite;
  349.       lText := sgOptions.Cells[ACol,ARow];
  350.       lLeft := Rect.Left + INDENT;
  351.       TextRect(Rect, lLeft, Rect.top + INDENT, lText);
  352.     end;
  353.   end;
  354. end;
  355.  
  356. {****************************************************************
  357. *
  358. *  s g O p t i o n s S e l e c t C e l l
  359. *
  360. ****************************************************************
  361. *  Author: The Client Server Factory Inc.
  362. *  Date:   March 1, 1999
  363. *
  364. *  Input:  TObject - Object that initiated the event
  365. *          Integer - currently selected column
  366. *          Integer - currently selected row
  367. *          Boolean - indicates whether call can be selected
  368. *
  369. *  Return: None
  370. *
  371. *  Description: This procedure shows the combo box and populates
  372. *               it when the user selects a row in the value
  373. *               column of the options grid.
  374. *
  375. *****************************************************************
  376. * Revisions:
  377. *
  378. *****************************************************************}
  379. procedure TfrmDBValidationReport.sgOptionsSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
  380. var
  381.   lR, lName : TRect;
  382. begin
  383.   cbOptions.Items.Clear;
  384.   case ARow of
  385.     VALIDATE_RECORD_FRAGMENTS_ROW:
  386.     begin
  387.       cbOptions.Items.Add('True');
  388.       cbOptions.Items.Add('False');
  389.     end;
  390.     {
  391.     READ_ONLY_VALIDATION_ROW:
  392.     begin
  393.       cbOptions.Items.Add('True');
  394.       cbOptions.Items.Add('False');
  395.     end;
  396.     }
  397.     IGNORE_CHECKSUM_ERRORS_ROW:
  398.     begin
  399.       cbOptions.Items.Add('True');
  400.       cbOptions.Items.Add('False');
  401.     end;
  402.   end;
  403.  
  404.   pnlOptionName.Caption := sgOptions.Cells[OPTION_NAME_COL, ARow];
  405.  
  406.   if ACol = OPTION_NAME_COL then
  407.     cbOptions.ItemIndex := cbOptions.Items.IndexOf(sgOptions.Cells[ACol+1,ARow])
  408.   else if ACol = OPTION_VALUE_COL then
  409.     cbOptions.ItemIndex := cbOptions.Items.IndexOf(sgOptions.Cells[ACol,ARow]);
  410.  
  411.   if ACol = OPTION_NAME_COL then
  412.   begin
  413.     lName := sgOptions.CellRect(ACol, ARow);
  414.     lR := sgOptions.CellRect(ACol + 1, ARow);
  415.   end
  416.   else
  417.   begin
  418.     lName := sgOptions.CellRect(ACol - 1, ARow);
  419.     lR := sgOptions.CellRect(ACol, ARow);
  420.   end;
  421.  
  422.   // lName := sgOptions.CellRect(ACol, ARow);
  423.   lName.Left := lName.Left + sgOptions.Left;
  424.   lName.Right := lName.Right + sgOptions.Left;
  425.   lName.Top := lName.Top + sgOptions.Top;
  426.   lName.Bottom := lName.Bottom + sgOptions.Top;
  427.   pnlOptionName.Left := lName.Left + 1;
  428.   pnlOptionName.Top := lName.Top + 1;
  429.   pnlOptionName.Width := (lName.Right + 1) - lName.Left;
  430.   pnlOptionName.Height := (lName.Bottom + 1) - lName.Top;
  431.   pnlOptionName.Visible := True;
  432.  
  433.   // lR := sgOptions.CellRect(ACol, ARow);
  434.   lR.Left := lR.Left + sgOptions.Left;
  435.   lR.Right := lR.Right + sgOptions.Left;
  436.   lR.Top := lR.Top + sgOptions.Top;
  437.   lR.Bottom := lR.Bottom + sgOptions.Top;
  438.   cbOptions.Left := lR.Left + 1;
  439.   cbOptions.Top := lR.Top + 1;
  440.   cbOptions.Width := (lR.Right + 1) - lR.Left;
  441.   cbOptions.Height := (lR.Bottom + 1) - lR.Top;
  442.   cbOptions.Visible := True;
  443.   cbOptions.SetFocus;
  444. end;
  445.  
  446. {****************************************************************
  447. *
  448. *  s g O p t i o n s D b l C l i c k
  449. *
  450. ****************************************************************
  451. *  Author: The Client Server Factory Inc.
  452. *  Date:   March 1, 1999
  453. *
  454. *  Input:  TObject - object that initiated the event
  455. *
  456. *  Return: None
  457. *
  458. *
  459. *  Description: This procedure rotates through a list of values
  460. *               when the option name or value is double-clicked.
  461. *
  462. *****************************************************************
  463. * Revisions:
  464. *
  465. *****************************************************************}
  466. procedure TfrmDBValidationReport.cbOptionsDblClick(Sender: TObject);
  467. begin
  468.   if (sgOptions.Col = OPTION_VALUE_COL) or (sgOptions.Col = OPTION_NAME_COL) then
  469.   begin
  470.     if cbOptions.ItemIndex = cbOptions.Items.Count - 1 then
  471.       cbOptions.ItemIndex := 0
  472.     else
  473.       cbOptions.ItemIndex := cbOptions.ItemIndex + 1;
  474.  
  475.     if sgOptions.Col = OPTION_VALUE_COL then
  476.       sgOptions.Cells[sgOptions.Col,sgOptions.Row] := cbOptions.Items[cbOptions.ItemIndex];
  477.  
  478.     // cbOptions.Visible := True;
  479.     // sgOptions.SetFocus;
  480.   end;
  481. end;
  482.  
  483. procedure TfrmDBValidationReport.cbOptionsKeyDown(Sender: TObject; var Key: Word;
  484.   Shift: TShiftState);
  485. begin
  486.   if (Key = VK_DOWN) then
  487.     cbOptions.DroppedDown := true;
  488. end;
  489.  
  490. procedure TfrmDBValidationReport.btnRepairClick(Sender: TObject);
  491. begin
  492.   ModalResult:=mrOK;
  493. end;
  494.  
  495. procedure TfrmDBValidationReport.btnCancelClick(Sender: TObject);
  496. begin
  497.   ModalResult:=mrCancel;
  498. end;
  499.  
  500. procedure TfrmDBValidationReport.WMNCLButtonDown( var Message: TWMNCLButtonDown );
  501. var
  502.   ScreenPt: TPoint;
  503.   ClientPt: TPoint;
  504. begin
  505.   ScreenPt.X := Message.XCursor;
  506.   ScreenPt.Y := Message.YCursor;
  507.   ClientPt := ScreenToClient( ScreenPt );
  508.   if( ClientPt.X > Width-45 )and (ClientPt.X < Width-29) then
  509.    begin
  510.     WinHelp(WindowHandle,CONTEXT_HELP_FILE,HELP_CONTEXT,DATABASE_VALIDATION);
  511.     Message.Result := 0;
  512.   end else
  513.    inherited;
  514. end;
  515.  
  516. procedure TfrmDBValidationReport.FormShow(Sender: TObject);
  517. begin
  518.   inherited;
  519.   if btnCancel.Default then
  520.     btnCancel.SetFocus;
  521. end;
  522.  
  523. end.
  524.