home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 October / PCWorld_2000-10_cd2.bin / Borland / interbase / IBConsole_src.ZIP / ibconsole / frmuDBValidation.pas < prev    next >
Pascal/Delphi Source File  |  2000-07-24  |  18KB  |  544 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
  23. *
  24. ****************************************************************
  25. *  Author: The Client Server Factory Inc.
  26. *  Date:   March 1, 1999
  27. *
  28. *  Description:  This unit provides an interface for performing
  29. *                a database validation and repair
  30. *
  31. *****************************************************************
  32. * Revisions:
  33. *
  34. *****************************************************************}
  35. unit frmuDBValidation;
  36.  
  37. interface
  38.  
  39. uses
  40.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  41.   StdCtrls, ExtCtrls, ComCtrls, zluibcClasses, zluContextHelp, IBServices, IB,
  42.   Grids, frmuDlgClass;
  43.  
  44. type
  45.   TfrmDBValidation = class(TDialog)
  46.     lblDatabaseName: TLabel;
  47.     bvlLine1: TBevel;
  48.     lblOptions: TLabel;
  49.     pnlOptionName: TPanel;
  50.     sgOptions: TStringGrid;
  51.     cbOptions: TComboBox;
  52.     btnOK: TButton;
  53.     btnCancel: TButton;
  54.     stxDatabaseName: TLabel;
  55.     function  FormHelp(Command: Word; Data: Integer; var CallHelp: Boolean): Boolean;
  56.     procedure FormCreate(Sender: TObject);
  57.     procedure btnCancelClick(Sender: TObject);
  58.     procedure btnOKClick(Sender: TObject);
  59.     procedure cbOptionsDblClick(Sender: TObject);
  60.     procedure cbOptionsExit(Sender: TObject);
  61.     procedure cbOptionsKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  62.     procedure sgOptionsDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
  63.     procedure sgOptionsSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
  64.   private
  65.     { Private declarations }
  66.     function VerifyInputData(): boolean;
  67.     procedure WMNCLButtonDown( var Message: TWMNCLBUTTONDOWN ); message WM_NCLBUTTONDOWN ;
  68.   public
  69.     { Public declarations }
  70.   end;
  71.  
  72. function DoDBValidation(const SourceServerNode: TibcServerNode; const CurrSelDatabase: TibcDatabaseNode): integer;
  73.  
  74. implementation
  75.  
  76. uses zluGlobal, zluUtility, frmuMessage, frmuDBValidationReport,
  77.      fileCtrl, frmuMain, IBErrorCodes;
  78.  
  79. {$R *.DFM}
  80.  
  81. const
  82.   OPTION_NAME_COL = 0;
  83.   OPTION_VALUE_COL = 1;
  84.   VALIDATE_RECORD_FRAGMENTS_ROW = 0;
  85.   READ_ONLY_VALIDATION_ROW = 1;
  86.   IGNORE_CHECKSUM_ERRORS_ROW = 2;
  87.  
  88. {****************************************************************
  89. *
  90. *  D o D B V a l i d a t i o n ( )
  91. *
  92. ****************************************************************
  93. *  Author: The Client Server Factory Inc.
  94. *  Date:   March 1, 1999
  95. *
  96. *  Input:  TibcServerNode  - currently selected server
  97. *          TibcDatabseNode - currently selected database (the
  98. *                            database to be validated)
  99. *
  100. *  Return: Integer - indicates success or failure
  101. *
  102. *  Description: Ths function performs the validatation task.
  103. *
  104. *****************************************************************
  105. * Revisions:
  106. *
  107. *****************************************************************}
  108. function DoDBValidation(const SourceServerNode: TibcServerNode;
  109.   const CurrSelDatabase: TibcDatabaseNode): integer;
  110. var
  111.   frmDBValidation  : TfrmDBValidation;
  112.   lValidation      : TIBValidationService;
  113.   lValidateOptions : TValidateOptions;
  114.   lValidationInfo  : TStringList;
  115.   Validation_errors: boolean;
  116. begin
  117.   lValidationInfo := TStringList.Create;
  118.   lValidation := TIBValidationService.Create(Nil);
  119.   lValidateOptions := [];
  120.   Result := SUCCESS;
  121.   try
  122.     try
  123.       // assign server details
  124.       lValidation.LoginPrompt := false;
  125.       lValidation.ServerName := SourceServerNode.Server.ServerName;
  126.       lValidation.Protocol := SourceServerNode.Server.Protocol;
  127.       lValidation.Params.Clear;
  128.       lValidation.Params.Assign(SourceServerNode.Server.Params);
  129.       lValidation.Attach();            // try to attach to server
  130.     except                             // if an exception occurs then trap it
  131.       on E:EIBError do                 // and display an error message
  132.       begin
  133.         DisplayMsg(ERR_SERVER_LOGIN, E.Message);
  134.         result := FAILURE;
  135.         if (E.IBErrorCode = isc_lost_db_connection) or
  136.            (E.IBErrorCode = isc_unavailable) or
  137.            (E.IBErrorCode = isc_network_error) then
  138.           frmMain.SetErrorState;
  139.         Exit;
  140.       end;
  141.     end;
  142.  
  143.     // if successfully attached to server
  144.     if lValidation.Active = true then
  145.     begin
  146.       frmDBValidation := TfrmDBValidation.Create(Application);
  147.       try
  148.         frmDBValidation.stxDatabaseName.Caption := MinimizeName (CurrSelDatabase.NodeName,
  149.           frmDBValidation.stxDatabaseName.Canvas,
  150.           (frmDBValidation.stxDatabaseName.ClientRect.Left - frmDBValidation.stxDatabaseName.ClientRect.Right));
  151.         frmDBValidation.stxDatabaseName.Hint := CurrSelDatabase.NodeName;
  152.  
  153.         frmDBValidation.ShowModal;
  154.  
  155.         if (frmDBValidation.ModalResult = mrOK) and
  156.           (not frmDBValidation.GetErrorState) then
  157.         begin
  158.           Screen.Cursor := crHourGlass;
  159.  
  160.           // assign database details
  161.           case SourceServerNode.Server.Protocol of
  162.             TCP : lValidation.DatabaseName := Format('%s:%s',[SourceServerNode.ServerName,CurrSelDatabase.DatabaseFiles.Strings[0]]);
  163.             NamedPipe : lValidation.DatabaseName := Format('\\%s\%s',[SourceServerNode.ServerName,CurrSelDatabase.DatabaseFiles.Strings[0]]);
  164.             SPX : lValidation.DatabaseName := Format('%s@%s',[SourceServerNode.ServerName,CurrSelDatabase.DatabaseFiles.Strings[0]]);
  165.             Local : lValidation.DatabaseName := CurrSelDatabase.DatabaseFiles.Strings[0];
  166.           end;
  167.  
  168.           // determine which options have been selected
  169.           Include (lValidateOptions, ValidateDB);
  170.           if frmDBValidation.sgOptions.Cells[1,VALIDATE_RECORD_FRAGMENTS_ROW] = 'True' then
  171.             Include(lValidateOptions, ValidateFull);
  172.  
  173.           if frmDBValidation.sgOptions.Cells[1,READ_ONLY_VALIDATION_ROW] = 'True' then
  174.             Include(lValidateOptions, CheckDB);
  175.  
  176.           if (frmDBValidation.sgOptions.Cells[1,IGNORE_CHECKSUM_ERRORS_ROW] = 'True') then
  177.             Include(lValidateOptions, IgnoreChecksum);
  178.  
  179.           // assign validation options
  180.           lValidation.Options := lValidateOptions;
  181.  
  182.           // start service
  183.           try
  184.             lValidation.ServiceStart;
  185.             Application.ProcessMessages;
  186.  
  187.             // get validation report
  188.             while not lValidation.Eof  do
  189.               lValidationInfo.Add(Trim(lValidation.GetNextLine));
  190.  
  191.             Validation_errors := true;
  192.             if lValidationInfo.Count = 1 then  { there is an EOL marker }
  193.               Validation_errors := false;
  194.  
  195.             while (lValidation.IsServiceRunning) and (not gApplShutdown) do
  196.               Application.ProcessMessages;
  197.  
  198.             if lValidation.Active then
  199.               lValidation.Detach();
  200.  
  201.             // show the validation report form
  202.             frmuDBValidationReport.ShowReport(lValidationInfo.Text, SourceServerNode,
  203.               CurrSelDatabase, Validation_errors);
  204.           except
  205.             on E: EIBError do
  206.             begin
  207.               DisplayMsg(E.IBErrorCode, E.Message);
  208.               if (E.IBErrorCode = isc_lost_db_connection) or
  209.                  (E.IBErrorCode = isc_unavailable) or
  210.                  (E.IBErrorCode = isc_network_error) then
  211.                 frmMain.SetErrorState;
  212.             end;
  213.           end;
  214.           result := SUCCESS;
  215.         end
  216.         else
  217.           result := FAILURE;
  218.       finally
  219.         frmDBValidation.Free;
  220.       end;
  221.     end;
  222.   finally
  223.     Screen.Cursor := crDefault;
  224.     // detach from server and deallocate memory
  225.     if lValidation.Active then
  226.       lValidation.Detach();
  227.     lValidationInfo.Free;
  228.     lValidation.Free;
  229.   end;
  230. end;
  231.  
  232. procedure TfrmDBValidation.btnCancelClick(Sender: TObject);
  233. begin
  234.   ModalResult := mrCancel;
  235. end;
  236.  
  237. function TfrmDBValidation.VerifyInputData(): boolean;
  238. var
  239.   lValidateOptions: TValidateOptions;
  240.   
  241. begin
  242.   lValidateOptions := [ValidateDB];
  243.   // determine which options have been selected
  244.   if sgOptions.Cells[1,VALIDATE_RECORD_FRAGMENTS_ROW] = 'True' then
  245.     Include(lValidateOptions, ValidateFull);
  246.  
  247.   if sgOptions.Cells[1,READ_ONLY_VALIDATION_ROW] = 'True' then
  248.     Include(lValidateOptions, CheckDB);
  249.  
  250.   if sgOptions.Cells[1,IGNORE_CHECKSUM_ERRORS_ROW] = 'True' then
  251.     Include(lValidateOptions, IgnoreChecksum);
  252.  
  253.   result := not (lValidateOptions = []);
  254. end;
  255.  
  256. procedure TfrmDBValidation.btnOKClick(Sender: TObject);
  257. begin
  258.   if VerifyInputData() then
  259.     ModalResult := mrOK
  260.   else
  261.     ShowMessage ('You must specify a validation option');
  262. end;
  263.  
  264. {****************************************************************
  265. *
  266. *  F r o m C r e a t e
  267. *
  268. ****************************************************************
  269. *  Author: The Client Server Factory Inc.
  270. *  Date:   March 1, 1999
  271. *
  272. *  Input:  TObject - Object that initiated the event
  273. *
  274. *  Return: None
  275. *
  276. *  Description: This procedure is responsible for populating
  277. *               the string grids when the form is created.
  278. *
  279. *****************************************************************
  280. * Revisions:
  281. *
  282. *****************************************************************}
  283.  
  284. procedure TfrmDBValidation.FormCreate(Sender: TObject);
  285. begin
  286.   inherited;
  287.   sgOptions.DefaultRowHeight := cbOptions.Height;
  288.   cbOptions.Visible := True;
  289.   pnlOptionName.Visible := True;
  290.  
  291.   sgOptions.RowCount := 3;
  292.  
  293.   sgOptions.Cells[OPTION_NAME_COL,VALIDATE_RECORD_FRAGMENTS_ROW] := 'Validate Record Fragments';
  294.   sgOptions.Cells[OPTION_VALUE_COL,VALIDATE_RECORD_FRAGMENTS_ROW] := 'False';
  295.  
  296.   sgOptions.Cells[OPTION_NAME_COL,READ_ONLY_VALIDATION_ROW] := 'Read Only Validation';
  297.   sgOptions.Cells[OPTION_VALUE_COL,READ_ONLY_VALIDATION_ROW] := 'False';
  298.  
  299.   sgOptions.Cells[OPTION_NAME_COL,IGNORE_CHECKSUM_ERRORS_ROW] := 'Ignore Checksum Errors';
  300.   sgOptions.Cells[OPTION_VALUE_COL,IGNORE_CHECKSUM_ERRORS_ROW] := 'False';
  301.  
  302.   pnlOptionName.Caption := 'Validate Record Fragments';
  303.   cbOptions.Items.Add('True');
  304.   cbOptions.Items.Add('False');
  305.   cbOptions.ItemIndex := 1;  
  306. end;
  307.  
  308. procedure TfrmDBValidation.cbOptionsExit(Sender: TObject);
  309. var
  310.   lR     : TRect;
  311.   iIndex : Integer;
  312. begin
  313.   iIndex := cbOptions.Items.IndexOf(cbOptions.Text);
  314.  
  315.   if (iIndex = -1) then
  316.   begin
  317.     MessageDlg('Invalid option value', mtError, [mbOK], 0);
  318.  
  319.     cbOptions.ItemIndex := 0;
  320.     // Size and position the combo box to fit the cell
  321.     lR := sgOptions.CellRect(OPTION_VALUE_COL, sgOptions.Row);
  322.     lR.Left := lR.Left + sgOptions.Left;
  323.     lR.Right := lR.Right + sgOptions.Left;
  324.     lR.Top := lR.Top + sgOptions.Top;
  325.     lR.Bottom := lR.Bottom + sgOptions.Top;
  326.     cbOptions.Left := lR.Left + 1;
  327.     cbOptions.Top := lR.Top + 1;
  328.     cbOptions.Width := (lR.Right + 1) - lR.Left;
  329.     cbOptions.Height := (lR.Bottom + 1) - lR.Top;
  330.     cbOptions.Visible := True;
  331.     cbOptions.SetFocus;
  332.   end
  333.   else if (sgOptions.Col <> OPTION_NAME_COL) then
  334.   begin
  335.     sgOptions.Cells[sgOptions.Col,sgOptions.Row] := cbOptions.Items[iIndex];
  336.   end
  337.   else
  338.   begin
  339.     sgOptions.Cells[OPTION_VALUE_COL,sgOptions.Row] := cbOptions.Items[iIndex];
  340.   end;
  341. end;
  342.  
  343. {****************************************************************
  344. *
  345. *  s g O p t i o n s D r a w C e l l
  346. *
  347. ****************************************************************
  348. *  Author: The Client Server Factory Inc.
  349. *  Date:   March 1, 1999
  350. *
  351. *  Input:  TObject - Object that initiated the event
  352. *          Integer - currently selected column
  353. *          Integer - currently selected row
  354. *          TRect   - coordinates
  355. *          TGridDrawState - drawing state of grid
  356. *
  357. *  Return: None
  358. *
  359. *  Description: This procedure draws contents to a specified cell in
  360. *               the Options string grid.
  361. *
  362. *****************************************************************
  363. * Revisions:
  364. *
  365. *****************************************************************}
  366.  
  367. procedure TfrmDBValidation.sgOptionsDrawCell(Sender: TObject; ACol,
  368.   ARow: Integer; Rect: TRect; State: TGridDrawState);
  369. const
  370.   INDENT = 2;
  371. var
  372.   lLeft: integer;
  373.   lText: string;
  374. begin
  375.   with sgOptions.canvas do
  376.   begin
  377.     if (ACol = OPTION_VALUE_COL) then
  378.     begin
  379.       font.color := clBlue;
  380.       if brush.color = clHighlight then
  381.         font.color := clWhite;
  382.       lText := sgOptions.Cells[ACol,ARow];
  383.       lLeft := Rect.Left + INDENT;
  384.       TextRect(Rect, lLeft, Rect.top + INDENT, lText);
  385.     end;
  386.   end;
  387. end;
  388.  
  389. {****************************************************************
  390. *
  391. *  s g O p t i o n s S e l e c t C e l l
  392. *
  393. ****************************************************************
  394. *  Author: The Client Server Factory Inc.
  395. *  Date:   March 1, 1999
  396. *
  397. *  Input:  TObject - Object that initiated the event
  398. *          Integer - currently selected column
  399. *          Integer - currently selected row
  400. *          Boolean - indicates whether call can be selected
  401. *
  402. *  Return: None
  403. *
  404. *  Description: This procedure shows the combo box and populates
  405. *               it when the user selects a row in the value
  406. *               column of the options grid.
  407. *
  408. *****************************************************************
  409. * Revisions:
  410. *
  411. *****************************************************************}
  412.  
  413. procedure TfrmDBValidation.sgOptionsSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
  414. var
  415.   lR, lName : TRect;
  416. begin
  417.   cbOptions.Items.Clear;
  418.   case ARow of
  419.     VALIDATE_RECORD_FRAGMENTS_ROW:
  420.     begin
  421.       cbOptions.Items.Add('True');
  422.       cbOptions.Items.Add('False');
  423.     end;
  424.     READ_ONLY_VALIDATION_ROW:
  425.     begin
  426.       cbOptions.Items.Add('True');
  427.       cbOptions.Items.Add('False');
  428.     end;
  429.     IGNORE_CHECKSUM_ERRORS_ROW:
  430.     begin
  431.       cbOptions.Items.Add('True');
  432.       cbOptions.Items.Add('False');
  433.     end;
  434.   end;
  435.  
  436.   pnlOptionName.Caption := sgOptions.Cells[OPTION_NAME_COL, ARow];
  437.  
  438.   if ACol = OPTION_NAME_COL then
  439.     cbOptions.ItemIndex := cbOptions.Items.IndexOf(sgOptions.Cells[ACol+1,ARow])
  440.   else if ACol = OPTION_VALUE_COL then
  441.     cbOptions.ItemIndex := cbOptions.Items.IndexOf(sgOptions.Cells[ACol,ARow]);
  442.  
  443.   if ACol = OPTION_NAME_COL then
  444.   begin
  445.     lName := sgOptions.CellRect(ACol, ARow);
  446.     lR := sgOptions.CellRect(ACol + 1, ARow);
  447.   end
  448.   else
  449.   begin
  450.     lName := sgOptions.CellRect(ACol - 1, ARow);
  451.     lR := sgOptions.CellRect(ACol, ARow);
  452.   end;
  453.  
  454.   // lName := sgOptions.CellRect(ACol, ARow);
  455.   lName.Left := lName.Left + sgOptions.Left;
  456.   lName.Right := lName.Right + sgOptions.Left;
  457.   lName.Top := lName.Top + sgOptions.Top;
  458.   lName.Bottom := lName.Bottom + sgOptions.Top;
  459.   pnlOptionName.Left := lName.Left + 1;
  460.   pnlOptionName.Top := lName.Top + 1;
  461.   pnlOptionName.Width := (lName.Right + 1) - lName.Left;
  462.   pnlOptionName.Height := (lName.Bottom + 1) - lName.Top;
  463.   pnlOptionName.Visible := True;
  464.  
  465.   // lR := sgOptions.CellRect(ACol, ARow);
  466.   lR.Left := lR.Left + sgOptions.Left;
  467.   lR.Right := lR.Right + sgOptions.Left;
  468.   lR.Top := lR.Top + sgOptions.Top;
  469.   lR.Bottom := lR.Bottom + sgOptions.Top;
  470.   cbOptions.Left := lR.Left + 1;
  471.   cbOptions.Top := lR.Top + 1;
  472.   cbOptions.Width := (lR.Right + 1) - lR.Left;
  473.   cbOptions.Height := (lR.Bottom + 1) - lR.Top;
  474.   cbOptions.Visible := True;
  475.   cbOptions.SetFocus;
  476. end;
  477.  
  478. {****************************************************************
  479. *
  480. *  s g O p t i o n s D b l C l i c k
  481. *
  482. ****************************************************************
  483. *  Author: The Client Server Factory Inc.
  484. *  Date:   March 1, 1999
  485. *
  486. *  Input:  TObject - object that initiated the event
  487. *
  488. *  Return: None
  489. *
  490. *
  491. *  Description: This procedure rotates through a list of values
  492. *               when the option name or value is double-clicked.
  493. *
  494. *****************************************************************
  495. * Revisions:
  496. *
  497. *****************************************************************}
  498.  
  499. procedure TfrmDBValidation.cbOptionsDblClick(Sender: TObject);
  500. begin
  501.   if (sgOptions.Col = OPTION_VALUE_COL) or (sgOptions.Col = OPTION_NAME_COL) then
  502.   begin
  503.     if cbOptions.ItemIndex = cbOptions.Items.Count - 1 then
  504.       cbOptions.ItemIndex := 0
  505.     else
  506.       cbOptions.ItemIndex := cbOptions.ItemIndex + 1;
  507.  
  508.     if sgOptions.Col = OPTION_VALUE_COL then
  509.       sgOptions.Cells[sgOptions.Col,sgOptions.Row] := cbOptions.Items[cbOptions.ItemIndex];
  510.   end;
  511. end;
  512.  
  513. procedure TfrmDBValidation.cbOptionsKeyDown(Sender: TObject; var Key: Word;
  514.   Shift: TShiftState);
  515. begin
  516.   if (Key = VK_DOWN) then
  517.     cbOptions.DroppedDown := true;
  518. end;
  519.  
  520. function TfrmDBValidation.FormHelp(Command: Word; Data: Integer;
  521.   var CallHelp: Boolean): Boolean;
  522. begin
  523.   CallHelp := False;
  524.   Result := WinHelp(WindowHandle,CONTEXT_HELP_FILE,HELP_CONTEXT,DATABASE_VALIDATION);
  525. end;
  526.  
  527. procedure TfrmDBValidation.WMNCLButtonDown( var Message: TWMNCLButtonDown );
  528. var
  529.   ScreenPt: TPoint;
  530.   ClientPt: TPoint;
  531. begin
  532.   ScreenPt.X := Message.XCursor;
  533.   ScreenPt.Y := Message.YCursor;
  534.   ClientPt := ScreenToClient( ScreenPt );
  535.   if( ClientPt.X > Width-45 )and (ClientPt.X < Width-29) then
  536.    begin
  537.     WinHelp(WindowHandle,CONTEXT_HELP_FILE,HELP_CONTEXT,DATABASE_VALIDATION);
  538.     Message.Result := 0;
  539.   end else
  540.    inherited;
  541. end;
  542.  
  543. end.
  544.