home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 October / PCWorld_2000-10_cd2.bin / Borland / interbase / IBConsole_src.ZIP / ibconsole / frmuDBBackup.pas < prev    next >
Pascal/Delphi Source File  |  2000-07-24  |  34KB  |  1,034 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 B a c k u p
  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 backup
  30. *
  31. *****************************************************************
  32. * Revisions:
  33. *
  34. *****************************************************************}
  35. unit frmuDBBackup;
  36.  
  37. interface
  38.  
  39. uses                       
  40.   SysUtils, Forms, ExtCtrls, StdCtrls, Classes, Controls, Dialogs, zluibcClasses,
  41.   Grids, Graphics, Windows, Comctrls, IB, Messages, frmuDlgClass;
  42.  
  43. type
  44.   TfrmDBBackup = class(TDialog)
  45.     gbDatabaseFile: TGroupBox;
  46.     lblDatabaseServer: TLabel;
  47.     lblDatabaseAlias: TLabel;
  48.     stxDatabaseServer: TStaticText;
  49.     cbDatabaseAlias: TComboBox;
  50.     imgDownArrow: TImage;
  51.     gbBackupFiles: TGroupBox;
  52.     lblBackupServer: TLabel;
  53.     lblBackupAlias: TLabel;
  54.     sgBackupFiles: TStringGrid;
  55.     cbBackupServer: TComboBox;
  56.     cbBackupAlias: TComboBox;
  57.     sgOptions: TStringGrid;
  58.     pnlOptionName: TPanel;
  59.     cbOptions: TComboBox;
  60.     btnOK: TButton;
  61.     btnCancel: TButton;
  62.     lblOptions: TLabel;
  63.     procedure FormCreate(Sender: TObject);
  64.     procedure btnCancelClick(Sender: TObject);
  65.     procedure btnOKClick(Sender: TObject);
  66.     procedure cbBackupAliasChange(Sender: TObject);
  67.     procedure cbBackupServerChange(Sender: TObject);
  68.     procedure cbOptionsChange(Sender: TObject);
  69.     procedure cbOptionsDblClick(Sender: TObject);
  70.     procedure cbOptionsExit(Sender: TObject);
  71.     procedure cbOptionsKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  72.     procedure sgBackupFilesDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
  73.     procedure sgBackupFilesKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  74.     procedure sgOptionsDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
  75.     procedure sgOptionsSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
  76.     procedure cbDatabaseAliasChange(Sender: TObject);
  77.   private
  78.     { Private declarations }
  79.     FVerboseFile: string;
  80.     FSourceServerNode: TibcServerNode;
  81.     FSourceDatabaseNode: TibcDatabaseNode;
  82.     FBackupFiles: TStringList;
  83.     function VerifyInputData(): boolean;
  84.     procedure WMNCLButtonDown( var Message: TWMNCLBUTTONDOWN ); message WM_NCLBUTTONDOWN ;
  85.   public
  86.     { Public declarations }
  87.   end;
  88.  
  89. function DoDBBackup(var SourceDBAlias,BackupAlias: string;
  90.                     var BackupFiles: TStringList;
  91.                     const SourceServerNode: TibcServerNode;
  92.                     const SourceDatabaseNode: TibcDatabaseNode): integer;
  93.  
  94. implementation
  95.  
  96. uses zluGlobal, frmuServerRegister, IBServices, frmuMessage,
  97.   frmuMain, zluUtility, zluContextHelp, IBErrorCodes;
  98.  
  99. {$R *.DFM}
  100.  
  101. const
  102.   OPTION_NAME_COL = 0;
  103.   OPTION_VALUE_COL = 1;
  104.   FORMAT_ROW = 0;
  105.   METADATA_ONLY_ROW = 1;
  106.   GARBAGE_COLLECTION_ROW = 2;
  107.   TRANSACTIONS_IN_LIMBO_ROW = 3;
  108.   CHECKSUMS_ROW = 4;
  109.   CONVERT_TO_TABLES_ROW = 5;
  110.   VERBOSE_OUTPUT_ROW = 6;
  111.  
  112. {****************************************************************
  113. *
  114. *  F o r m C r e a t e ( )
  115. *
  116. ****************************************************************
  117. *  Author: The Client Server Factory Inc.
  118. *  Date:   March 1, 1999
  119. *
  120. *  Input:  Sender - The object that initiated the event
  121. *
  122. *  Return: None
  123. *
  124. *  Description: Ths procedure intializes the form's controls when
  125. *               the form is initially created.
  126. *
  127. *****************************************************************
  128. * Revisions:
  129. *
  130. *****************************************************************}
  131. procedure TfrmDBBackup.FormCreate(Sender: TObject);
  132. begin
  133.   inherited;
  134.   sgOptions.DefaultRowHeight := cbOptions.Height;
  135.   cbOptions.Visible := True;
  136.   pnlOptionName.Visible := True;
  137.  
  138.   sgBackupFiles.Cells[0,0] := 'Filename(s)';
  139.   sgBackupFiles.Cells[1,0] := 'Size(Bytes)';
  140.   sgOptions.RowCount := 7;
  141.  
  142.   sgOptions.Cells[OPTION_NAME_COL,FORMAT_ROW] := 'Format';
  143.   sgOptions.Cells[OPTION_VALUE_COL,FORMAT_ROW] := 'Transportable';
  144.  
  145.   sgOptions.Cells[OPTION_NAME_COL,METADATA_ONLY_ROW] := 'Metadata Only';
  146.   sgOptions.Cells[OPTION_VALUE_COL,METADATA_ONLY_ROW] := 'False';
  147.  
  148.   sgOptions.Cells[OPTION_NAME_COL,GARBAGE_COLLECTION_ROW] := 'Garbage Collection';
  149.   sgOptions.Cells[OPTION_VALUE_COL,GARBAGE_COLLECTION_ROW] := 'True';
  150.  
  151.   sgOptions.Cells[OPTION_NAME_COL,TRANSACTIONS_IN_LIMBO_ROW] := 'Transactions in Limbo';
  152.   sgOptions.Cells[OPTION_VALUE_COL,TRANSACTIONS_IN_LIMBO_ROW] := 'Process';
  153.  
  154.   sgOptions.Cells[OPTION_NAME_COL,CHECKSUMS_ROW] := 'Checksums';
  155.   sgOptions.Cells[OPTION_VALUE_COL,CHECKSUMS_ROW] := 'Process';
  156.  
  157.   sgOptions.Cells[OPTION_NAME_COL,CONVERT_TO_TABLES_ROW] := 'Convert to Tables';
  158.   sgOptions.Cells[OPTION_VALUE_COL,CONVERT_TO_TABLES_ROW] := 'False';
  159.  
  160.   sgOptions.Cells[OPTION_NAME_COL,VERBOSE_OUTPUT_ROW] := 'Verbose Output';
  161.   sgOptions.Cells[OPTION_VALUE_COL,VERBOSE_OUTPUT_ROW] := 'To Screen';
  162.  
  163.   pnlOptionName.Caption := 'Format';
  164.   cbOptions.Items.Add('Transportable');
  165.   cbOptions.Items.Add('Non-Transportable');
  166.   cbOptions.ItemIndex := 0;
  167.  
  168. end;
  169.  
  170. procedure TfrmDBBackup.btnCancelClick(Sender: TObject);
  171. begin
  172.   ModalResult := mrCancel;
  173. end;
  174.  
  175. procedure TfrmDBBackup.btnOKClick(Sender: TObject);
  176. var
  177.   j: integer;
  178.   lBackupService: TIBBackupService;
  179.   lOptions: TBackupOptions;
  180.   lVerboseInfo: TStringList;
  181.  
  182. begin
  183.   if VerifyInputData() then
  184.   begin
  185.     Screen.Cursor := crHourGlass;
  186.     lVerboseInfo := TStringList.Create;
  187.     lBackupService := TIBBackupService.Create(nil);
  188.     try
  189.       try
  190.         lBackupService.LoginPrompt := false;
  191.         lBackupService.ServerName := FSourceServerNode.Server.ServerName;
  192.         lBackupService.Protocol := FSourceServerNode.Server.Protocol;
  193.         lBackupService.Params.Assign(FSourceServerNode.Server.Params);
  194.         lBackupService.Attach();
  195.       except
  196.         on E:EIBError do
  197.         begin
  198.           DisplayMsg(ERR_SERVER_LOGIN, E.Message);
  199.           Screen.Cursor := crDefault;
  200.           if (E.IBErrorCode = isc_lost_db_connection) or
  201.              (E.IBErrorCode = isc_unavailable) or
  202.              (E.IBErrorCode = isc_network_error) then
  203.              frmMain.SetErrorState;
  204.             SetErrorState;
  205.           Exit;
  206.         end;
  207.       end;
  208.  
  209.       if lBackupService.Active = true then
  210.       begin
  211.         if sgOptions.Cells[OPTION_VALUE_COL,FORMAT_ROW] = 'Non-Transportable' then
  212.         begin
  213.           Include(lOptions, NonTransportable);
  214.         end;
  215.         if sgOptions.Cells[OPTION_VALUE_COL,METADATA_ONLY_ROW] = 'True' then
  216.         begin
  217.           Include(lOptions, MetadataOnly);
  218.         end;
  219.         if sgOptions.Cells[OPTION_VALUE_COL,GARBAGE_COLLECTION_ROW] = 'False' then
  220.         begin
  221.           Include(lOptions, NoGarbageCollection);
  222.         end;
  223.         if sgOptions.Cells[OPTION_VALUE_COL,TRANSACTIONS_IN_LIMBO_ROW] = 'Ignore' then
  224.         begin
  225.           Include(lOptions, IgnoreLimbo);
  226.         end;
  227.         if sgOptions.Cells[OPTION_VALUE_COL,CHECKSUMS_ROW] = 'True' then
  228.         begin
  229.           Include(lOptions, IgnoreChecksums);
  230.         end;
  231.         if sgOptions.Cells[OPTION_VALUE_COL,CONVERT_TO_TABLES_ROW] = 'True' then
  232.         begin
  233.           Include(lOptions, ConvertExtTables);
  234.         end;
  235.  
  236.         lBackupService.Options := lOptions;
  237.  
  238.         if (sgOptions.Cells[OPTION_VALUE_COL,VERBOSE_OUTPUT_ROW] = 'To Screen') or
  239.           (sgOptions.Cells[OPTION_VALUE_COL,VERBOSE_OUTPUT_ROW] = 'To File') then
  240.         begin
  241.           lBackupService.Verbose := true;
  242.         end;
  243.  
  244.         if TibcDatabaseNode(cbDatabaseAlias.Items.Objects[cbDatabaseAlias.ItemIndex]).DatabaseFiles.Count > 0 then
  245.           lBackupService.DatabaseName := TibcDatabaseNode(cbDatabaseAlias.Items.Objects[cbDatabaseAlias.ItemIndex]).DatabaseFiles.Strings[0];
  246.  
  247.         if cbBackupServer.ItemIndex > -1 then
  248.         begin
  249.           for j := 1 to sgBackupFiles.RowCount - 1 do
  250.           begin
  251.             if not (IsValidDBName(sgBackupFiles.Cells[0,j])) then
  252.               DisplayMsg(WAR_REMOTE_FILENAME, Format('File: %s', [sgBackupFiles.Cells[0,j]]));
  253.  
  254.             if (sgBackupFiles.Cells[0,j] <> '') and (sgBackupFiles.Cells[1,j] <> '') then
  255.             begin
  256.               lBackupService.BackupFile.Add(Format('%s=%s',[sgBackupFiles.Cells[0,j],
  257.                 sgBackupFiles.Cells[1,j]]));
  258.             end
  259.             else if (sgBackupFiles.Cells[0,j] <> '') then
  260.             begin
  261.               lBackupService.BackupFile.Add(sgBackupFiles.Cells[0,j]);
  262.             end;
  263.           end;
  264.         end;
  265.  
  266.         FBackupFiles.Text := lBackupService.BackupFile.Text;
  267.  
  268.         Screen.Cursor := crHourGlass;
  269.         try
  270.           lBackupService.ServiceStart;
  271.           FSourceServerNode.OpenTextViewer (lBackupService, 'Database Backup');
  272.           while (lBackupService.IsServiceRunning) and (not gApplShutdown) do
  273.           begin
  274.             Application.ProcessMessages;
  275.             Screen.Cursor := crHourGlass;
  276.           end;
  277.  
  278.           if lBackupService.Active then
  279.             lBackupService.Detach();
  280.           ModalResult := mrOK;            
  281.         except
  282.           on E: EIBError do
  283.           begin
  284.             DisplayMsg(E.IBErrorCode, E.Message);
  285.             if (E.IBErrorCode = isc_lost_db_connection) or
  286.                (E.IBErrorCode = isc_unavailable) or
  287.                (E.IBErrorCode = isc_network_error) then
  288.               frmMain.SetErrorState;
  289.             SetErrorState;
  290.             exit;
  291.           end;
  292.         end;
  293.       end;
  294.     finally
  295.       if lBackupService.Active then
  296.         lBackupService.Detach();
  297.       lBackupService.Free();
  298.       lVerboseInfo.Free;
  299.       Screen.Cursor := crDefault;
  300.     end;
  301.   end;
  302. end;
  303.  
  304. {*******************************************************************
  305. *
  306. *  c b B a c k u p A l i a s C h a n g e ( )
  307. *
  308. ********************************************************************
  309. *  Author: The Client Server Factory Inc.
  310. *  Date:   March 1, 1999
  311. *
  312. *  Input:
  313. *
  314. *  Return:
  315. *
  316. *  Description:
  317. *
  318. ********************************************************************
  319. * Revisions:
  320. *
  321. ********************************************************************}
  322. procedure TfrmDBBackup.cbBackupAliasChange(Sender: TObject);
  323. var
  324.   i: integer;
  325.   lCurrBackupAliasNode: TTreeNode;
  326.   lCurrLine: string;
  327. begin
  328.   sgBackupFiles.RowCount := 2;
  329.   for i := 1 to sgBackupFiles.RowCount do
  330.   begin
  331.     sgBackupFiles.Cells[0,i] := '';
  332.     sgBackupFiles.Cells[1,i] := '';
  333.   end;
  334.  
  335.   if (cbBackupAlias.ItemIndex > -1) and (Assigned(cbBackupAlias.Items.Objects[cbBackupAlias.ItemIndex])) then
  336.   begin
  337.     lCurrBackupAliasNode := frmMain.tvMain.Items.GetNode(TibcBackupAliasNode(cbBackupAlias.Items.Objects[cbBackupAlias.ItemIndex]).NodeID);
  338.     for i := 1 to TibcBackupAliasNode(lCurrBackupAliasNode.Data).BackupFiles.Count do
  339.     begin
  340.       lCurrLine := TibcBackupAliasNode(lCurrBackupAliasNode.Data).BackupFiles.Strings[i-1];
  341.       while Length(lCurrLine) > 0 do
  342.       begin
  343.         sgBackupFiles.Cells[0,i] := zluUtility.GetNextField(lCurrLine,'=');
  344.         sgBackupFiles.Cells[1,i] := zluUtility.GetNextField(lCurrLine,'=');
  345.       end;
  346.       sgBackupFiles.RowCount := sgBackupFiles.RowCount + 1;
  347.     end;
  348.   end;
  349. end;
  350.  
  351. {*******************************************************************
  352. *
  353. *  c b B a c k u p S e r v e r C h a n g e ( )
  354. *
  355. ********************************************************************
  356. *  Author: The Client Server Factory Inc.
  357. *  Date:   March 1, 1999
  358. *
  359. *  Input:
  360. *
  361. *  Return:
  362. *
  363. *  Description:
  364. *
  365. ********************************************************************
  366. * Revisions:
  367. *
  368. ********************************************************************}
  369. procedure TfrmDBBackup.cbBackupServerChange(Sender: TObject);
  370. var
  371.   i: integer;
  372.   lCurrBackupAliasesNode: TTreeNode;
  373. begin
  374.   cbBackupAlias.Items.Clear;
  375.   cbBackupAlias.Text := '';
  376.  
  377.   if cbBackupServer.ItemIndex <> -1 then
  378.   begin
  379.     lCurrBackupAliasesNode := frmMain.tvMain.Items.GetNode(TibcServerNode(cbBackupServer.Items.Objects[cbBackupServer.ItemIndex]).BackupFilesID);
  380.  
  381.     // check if there are any backup aliases before trying to add to combo box
  382.     if Assigned(lCurrBackupAliasesNode) then
  383.     begin
  384.       if TibcServerNode(lCurrBackupAliasesNode.Data).ObjectList.Count <> 0 then
  385.       begin
  386.         for i := 1 to TibcServerNode(lCurrBackupAliasesNode.Data).ObjectList.Count - 1 do
  387.         begin
  388.           cbBackupAlias.Items.AddObject(TibcTreeNode(lCurrBackupAliasesNode.Data).ObjectList.Strings[i],
  389.             TibcBackupAliasNode(TTreeNode(TibcTreeNode(lCurrBackupAliasesNode.Data).ObjectList.Objects[i]).Data));
  390.         end;
  391.       end;
  392.     end;
  393.   end;
  394. end;
  395.  
  396. {****************************************************************
  397. *
  398. *  c b O p t i o n s C h a n g e ( )
  399. *
  400. ****************************************************************
  401. *  Author: The Client Server Factory Inc.
  402. *  Date:   March 1, 1999
  403. *
  404. *  Input:  Sender - The object that initiated the event
  405. *
  406. *  Return: None
  407. *
  408. *  Description: This procedure changes the value of the selected
  409. *               cell in the grid based on what was entered in the
  410. *               combobox.
  411. *
  412. *****************************************************************
  413. * Revisions:
  414. *
  415. *****************************************************************}
  416. procedure TfrmDBBackup.cbOptionsChange(Sender: TObject);
  417. var
  418.   lSaveDialog: TSaveDialog;
  419. begin
  420.   if (cbOptions.Text = 'To File') and (sgOptions.Row = VERBOSE_OUTPUT_ROW) then
  421.   begin
  422.     lSaveDialog := TSaveDialog.Create(Self);
  423.     try
  424.       lSaveDialog.Title := 'Select Verbose File';
  425.       lSaveDialog.DefaultExt := 'txt';
  426.       lSaveDialog.Filter := 'Text File (*.txt)|*.TXT|All files (*.*)|*.*';
  427.       lSaveDialog.Options := [ofHideReadOnly,ofEnableSizing];
  428.       if lSaveDialog.Execute then
  429.       begin
  430.         if FileExists(lSaveDialog.FileName) then
  431.         begin
  432.           if MessageDlg(Format('OK to overwrite %s', [lSaveDialog.FileName]),
  433.               mtConfirmation, mbYesNoCancel, 0) <> idYes then
  434.           begin
  435.             cbOptions.ItemIndex := cbOptions.Items.IndexOf('To Screen');
  436.             Exit;
  437.           end;
  438.         end;
  439.         FVerboseFile := lSaveDialog.FileName;
  440.       end
  441.       else
  442.         cbOptions.ItemIndex := cbOptions.Items.IndexOf('To Screen');
  443.     finally
  444.       lSaveDialog.free;
  445.     end;
  446.   end;
  447.  
  448.   {
  449.   sgOptions.Cells[sgOptions.Col,sgOptions.Row] :=
  450.     cbOptions.Items[cbOptions.ItemIndex];
  451.   cbOptions.Visible := false;
  452.   sgOptions.SetFocus;
  453.   }
  454. end;
  455.  
  456. {****************************************************************
  457. *
  458. *  c b O p t i o n s D b l C l i c k ( )
  459. *
  460. ****************************************************************
  461. *  Author: The Client Server Factory Inc.
  462. *  Date:   March 1, 1999
  463. *
  464. *  Input:  Sender - The object that initiated the event
  465. *
  466. *  Return: None
  467. *
  468. *  Description: This procedure rotates the values in the combobox
  469. *               and updates the selected cell in the grid each
  470. *               time is is double clicked
  471. *
  472. *****************************************************************
  473. * Revisions:
  474. *
  475. *****************************************************************}
  476. procedure TfrmDBBackup.cbOptionsDblClick(Sender: TObject);
  477. begin
  478.   if (sgOptions.Col = OPTION_VALUE_COL) or (sgOptions.Col = OPTION_NAME_COL) then
  479.   begin
  480.     if cbOptions.ItemIndex = cbOptions.Items.Count - 1 then
  481.       cbOptions.ItemIndex := 0
  482.     else
  483.       cbOptions.ItemIndex := cbOptions.ItemIndex + 1;
  484.  
  485.     if sgOptions.Col = OPTION_VALUE_COL then
  486.       sgOptions.Cells[sgOptions.Col,sgOptions.Row] := cbOptions.Items[cbOptions.ItemIndex];
  487.  
  488.     // cbOptions.Visible := True;
  489.     // sgOptions.SetFocus;
  490.   end;
  491.   cbOptionsChange(self);
  492. end;
  493.  
  494. {****************************************************************
  495. *
  496. *  c b O p t i o n s E x i t ( )
  497. *
  498. ****************************************************************
  499. *  Author: The Client Server Factory Inc.
  500. *  Date:   March 1, 1999
  501. *
  502. *  Input:  Sender - The object that initiated the event
  503. *
  504. *  Return: None
  505. *
  506. *  Description: This procedure changes the value of the selected
  507. *               cell in the grid based on what was entered in the
  508. *               combobox.
  509. *
  510. *****************************************************************
  511. * Revisions:
  512. *
  513. *****************************************************************}
  514. procedure TfrmDBBackup.cbOptionsExit(Sender: TObject);
  515. var
  516.   lR     : TRect;
  517.   iIndex : Integer;
  518. begin
  519.   iIndex := cbOptions.Items.IndexOf(cbOptions.Text);
  520.  
  521.   if (iIndex = -1) then
  522.   begin
  523.     MessageDlg('Invalid option value', mtError, [mbOK], 0);
  524.  
  525.     cbOptions.ItemIndex := 0;          // reset to first item in list
  526.     //Size and position the combo box to fit the cell
  527.     lR := sgOptions.CellRect(OPTION_VALUE_COL, sgOptions.Row);
  528.     lR.Left := lR.Left + sgOptions.Left;
  529.     lR.Right := lR.Right + sgOptions.Left;
  530.     lR.Top := lR.Top + sgOptions.Top;
  531.     lR.Bottom := lR.Bottom + sgOptions.Top;
  532.     cbOptions.Left := lR.Left + 1;
  533.     cbOptions.Top := lR.Top + 1;
  534.     cbOptions.Width := (lR.Right + 1) - lR.Left;
  535.     cbOptions.Height := (lR.Bottom + 1) - lR.Top;
  536.     // cbOptions.Visible := True;
  537.     cbOptions.SetFocus;
  538.   end
  539.   else if (sgOptions.Col <> OPTION_NAME_COL) then
  540.   begin
  541.     sgOptions.Cells[sgOptions.Col,sgOptions.Row] := cbOptions.Items[iIndex];
  542.   end
  543.   else
  544.   begin
  545.     sgOptions.Cells[OPTION_VALUE_COL,sgOptions.Row] := cbOptions.Items[iIndex];
  546.   end;
  547. end;
  548.  
  549. {****************************************************************
  550. *
  551. *  c b O p t i o n s K e y D o w n ( )
  552. *
  553. ****************************************************************
  554. *  Author: The Client Server Factory Inc.
  555. *  Date:   March 1, 1999
  556. *
  557. *  Input:  Sender - The object that initiated the event
  558. *
  559. *  Return: None
  560. *
  561. *  Description: This procedure drops down the combobox for the selected
  562. *               grid cell
  563. *
  564. *****************************************************************
  565. * Revisions:
  566. *
  567. *****************************************************************}
  568. procedure TfrmDBBackup.cbOptionsKeyDown(Sender: TObject; var Key: Word;
  569.   Shift: TShiftState);
  570. begin
  571.   if (Key = VK_DOWN) then
  572.     cbOptions.DroppedDown := true;
  573. end;
  574.  
  575. {****************************************************************
  576. *
  577. *  s g B a c k u p F i l e s D r a w C e l l ( )
  578. *
  579. ****************************************************************
  580. *  Author: The Client Server Factory Inc.
  581. *  Date:   March 1, 1999
  582. *
  583. *  Input:  Sender - The object that initiated the event
  584. *
  585. *  Return: None
  586. *
  587. *  Description: This procedure is responsible for painting blue
  588. *               the option value text in the string grid
  589. *
  590. *****************************************************************
  591. * Revisions:
  592. *
  593. *****************************************************************}
  594. procedure TfrmDBBackup.sgBackupFilesDrawCell(Sender: TObject; ACol,
  595.   ARow: Integer; Rect: TRect; State: TGridDrawState);
  596. const
  597.   INDENT = 2;
  598. var
  599.   lLeft: integer;
  600.   lText: string;
  601. begin
  602.   with sgBackupFiles.canvas do
  603.   begin
  604.     if (ACol = 2) and (ARow <> 0) then
  605.     begin
  606.       font.color := clBlack;
  607.       if brush.color = clHighlight then
  608.         font.color := clWhite;
  609.       lText := sgBackupFiles.Cells[ACol,ARow];
  610.       lLeft := Rect.Left + INDENT;
  611.       TextRect(Rect, lLeft, Rect.top + INDENT, lText);
  612.     end;
  613.   end;
  614. end;
  615.  
  616. {****************************************************************
  617. *
  618. *  s g B a c k u p F i l e s K e y D o w n ( )
  619. *
  620. ****************************************************************
  621. *  Author: The Client Server Factory Inc.
  622. *  Date:   March 1, 1999
  623. *
  624. *  Input:  Sender - The object that initiated the event
  625. *
  626. *  Return: None
  627. *
  628. *  Description: This procedure performs an action depending what keys
  629. *               where pressed. When the <CTRL> + <TAB> keys are pressed
  630. *               it allows the user to scroll through the grid from left
  631. *               to rigth, top to bottom.
  632. *
  633. *****************************************************************
  634. * Revisions:
  635. *
  636. *****************************************************************}
  637. procedure TfrmDBBackup.sgBackupFilesKeyDown(Sender: TObject; var Key: Word;
  638.   Shift: TShiftState);
  639. var
  640.   lKey : Word;
  641. begin
  642.   if (Key = VK_TAB) and (ssCtrl in Shift) then
  643.   begin
  644.     if sgBackupFiles.Col < sgBackupFiles.ColCount - 1 then
  645.     begin
  646.       sgBackupFiles.Col := sgBackupFiles.Col + 1;
  647.     end
  648.     else
  649.     begin
  650.       if sgBackupFiles.Row = sgBackupFiles.RowCount - 1 then
  651.         sgBackupFiles.RowCount := sgBackupFiles.RowCount + 1;
  652.       sgBackupFiles.Col := 0;
  653.       sgBackupFiles.Row := sgBackupFiles.Row + 1;
  654.     end;
  655.   end;
  656.  
  657.   if (Key = VK_RETURN) and
  658.     (sgBackupFiles.Cells[sgBackupFiles.Col,sgBackupFiles.Row] <> '') then
  659.   begin
  660.     lKey := VK_TAB;
  661.     sgBackupFilesKeyDown(Self, lKey, [ssCtrl]);
  662.   end;
  663.  
  664. end;
  665.  
  666. {****************************************************************
  667. *
  668. *  s g O p t i o n s D r a w C e l l ( )
  669. *
  670. ****************************************************************
  671. *  Author: The Client Server Factory Inc.
  672. *  Date:   March 1, 1999
  673. *
  674. *  Input:  Sender - The object that initiated the event
  675. *
  676. *  Return: None
  677. *
  678. *  Description: This procedure is responsible for painting blue
  679. *               the option value text in the string grid
  680. *
  681. *****************************************************************
  682. * Revisions:
  683. *
  684. *****************************************************************}
  685. procedure TfrmDBBackup.sgOptionsDrawCell(Sender: TObject; ACol,
  686.   ARow: Integer; Rect: TRect; State: TGridDrawState);
  687. const
  688.   INDENT = 2;
  689. var
  690.   // lWidth
  691.   lLeft: integer;
  692.   lText: string;
  693. begin
  694.   with sgOptions.canvas do
  695.   begin
  696.     if ACol = OPTION_VALUE_COL then
  697.     begin
  698.       font.color := clBlue;
  699.       if brush.color = clHighlight then
  700.         font.color := clWhite;
  701.       lText := sgOptions.Cells[ACol,ARow];
  702.       lLeft := Rect.Left + INDENT;
  703.       TextRect(Rect, lLeft, Rect.top + INDENT, lText);
  704.     end;
  705.   end;
  706. end;
  707.  
  708. {****************************************************************
  709. *
  710. *  s g O p t i o n s S e l e c t C e l l ( )
  711. *                                  
  712. ****************************************************************
  713. *  Author: The Client Server Factory Inc.
  714. *  Date: March 1, 1999
  715. *
  716. *  Input: Sender - The object that initiated the event
  717. *
  718. *  Return: None
  719. *
  720. *  Description: This procedure initializes and positions the combobox
  721. *               depending on which cell in the grid is selected
  722. *
  723. *****************************************************************
  724. * Revisions:
  725. *
  726. *****************************************************************}
  727. procedure TfrmDBBackup.sgOptionsSelectCell(Sender: TObject; ACol,
  728.   ARow: Integer; var CanSelect: Boolean);
  729. var
  730.   lR, lName : TRect;
  731. begin
  732.   cbOptions.Items.Clear;
  733.   case ARow of
  734.     FORMAT_ROW:
  735.     begin
  736.       cbOptions.Items.Add('Transportable');
  737.       cbOptions.Items.Add('Non-Transportable');
  738.     end;
  739.     METADATA_ONLY_ROW:
  740.     begin
  741.       cbOptions.Items.Add('True');
  742.       cbOptions.Items.Add('False');
  743.     end;
  744.     GARBAGE_COLLECTION_ROW:
  745.     begin
  746.       cbOptions.Items.Add('True');
  747.       cbOptions.Items.Add('False');
  748.     end;
  749.     TRANSACTIONS_IN_LIMBO_ROW:
  750.     begin
  751.       cbOptions.Items.Add('Process');
  752.       cbOptions.Items.Add('Ignore');
  753.     end;
  754.     CHECKSUMS_ROW:
  755.     begin
  756.       cbOptions.Items.Add('Process');
  757.       cbOptions.Items.Add('Ignore');
  758.     end;
  759.     CONVERT_TO_TABLES_ROW:
  760.     begin
  761.       cbOptions.Items.Add('True');
  762.       cbOptions.Items.Add('False');
  763.     end;
  764.     VERBOSE_OUTPUT_ROW:
  765.     begin
  766.       cbOptions.Items.Add('None');
  767.       cbOptions.Items.Add('To Screen');
  768.       cbOptions.Items.Add('To File');
  769.     end;
  770.   end;
  771.  
  772.   pnlOptionName.Caption := sgOptions.Cells[OPTION_NAME_COL, ARow];
  773.  
  774.   if ACol = OPTION_NAME_COL then
  775.     cbOptions.ItemIndex := cbOptions.Items.IndexOf(sgOptions.Cells[ACol+1,ARow])
  776.   else if ACol = OPTION_VALUE_COL then
  777.     cbOptions.ItemIndex := cbOptions.Items.IndexOf(sgOptions.Cells[ACol,ARow]);
  778.  
  779.   if ACol = OPTION_NAME_COL then
  780.   begin
  781.     lName := sgOptions.CellRect(ACol, ARow);
  782.     lR := sgOptions.CellRect(ACol + 1, ARow);
  783.   end
  784.   else
  785.   begin
  786.     lName := sgOptions.CellRect(ACol - 1, ARow);
  787.     lR := sgOptions.CellRect(ACol, ARow);
  788.   end;
  789.  
  790.   // lName := sgOptions.CellRect(ACol, ARow);
  791.   lName.Left := lName.Left + sgOptions.Left;
  792.   lName.Right := lName.Right + sgOptions.Left;
  793.   lName.Top := lName.Top + sgOptions.Top;
  794.   lName.Bottom := lName.Bottom + sgOptions.Top;
  795.   pnlOptionName.Left := lName.Left + 1;
  796.   pnlOptionName.Top := lName.Top + 1;
  797.   pnlOptionName.Width := (lName.Right + 1) - lName.Left;
  798.   pnlOptionName.Height := (lName.Bottom + 1) - lName.Top;
  799.   pnlOptionName.Visible := True;
  800.  
  801.   // lR := sgOptions.CellRect(ACol, ARow);
  802.   lR.Left := lR.Left + sgOptions.Left;
  803.   lR.Right := lR.Right + sgOptions.Left;
  804.   lR.Top := lR.Top + sgOptions.Top;
  805.   lR.Bottom := lR.Bottom + sgOptions.Top;
  806.   cbOptions.Left := lR.Left + 1;
  807.   cbOptions.Top := lR.Top + 1;
  808.   cbOptions.Width := (lR.Right + 1) - lR.Left;
  809.   cbOptions.Height := (lR.Bottom + 1) - lR.Top;
  810.   cbOptions.Visible := True;
  811.   cbOptions.SetFocus;
  812. end;
  813.  
  814. {****************************************************************
  815. *
  816. *  V e r i f y I n p u t D a t a ( )
  817. *
  818. ****************************************************************
  819. *  Author: The Client Server Factory Inc.
  820. *  Date:   March 1, 1999
  821. *
  822. *  Input:  None
  823. *
  824. *  Return: None
  825. *
  826. *  Description:  Performs some basic validation on data entered by
  827. *                the user
  828. *
  829. *****************************************************************
  830. * Revisions:
  831. *
  832. *****************************************************************}
  833. function TfrmDBBackup.VerifyInputData(): boolean;
  834. var
  835.   lCnt, iRow : Integer;
  836.   lGridRect : TGridRect;
  837.   found: boolean;
  838.   fp: string;
  839.  
  840. begin
  841.   result := true;
  842.   found := false;
  843.   
  844.   // go through all rows and check for valid integer format in size column
  845.   for iRow:=1 to sgBackupFiles.RowCount - 1 do
  846.   begin
  847.     // specify currently selected string field
  848.     lGridRect.Left := OPTION_VALUE_COL;
  849.     lGridRect.Top := iRow;
  850.     lGridRect.Right := OPTION_VALUE_COL;
  851.     lGridRect.Bottom := iRow;
  852.  
  853.     if (sgBackupFiles.Cells[OPTION_VALUE_COL, iRow] <> '') and (sgBackupFiles.Cells[OPTION_VALUE_COL, iRow] <> ' ') then
  854.     begin
  855.       try
  856.         StrToInt(sgBackupFiles.Cells[OPTION_VALUE_COL, iRow])
  857.       except on EConvertError do
  858.         begin
  859.           DisplayMsg(ERR_NUMERIC_VALUE,'');
  860.           sgBackupFiles.SetFocus;      // give focus to string grid and select the erring field
  861.           sgBackupFiles.Selection:=lGridRect;
  862.           result := false;             // set result to false
  863.           Exit;
  864.         end;
  865.       end;
  866.     end;
  867.   end;
  868.  
  869.   // check if combo box is empty or nothing selected
  870.   if (cbDatabaseAlias.ItemIndex = -1) or (cbDatabaseAlias.Text = '') or (cbDatabaseAlias.Text = ' ') then
  871.   begin
  872.     DisplayMsg(ERR_DB_ALIAS,'');
  873.     cbDatabaseAlias.SetFocus;
  874.     result := false;
  875.     Exit;
  876.   end;
  877.  
  878.   // check if combo box is empty
  879.   if (cbBackupAlias.Text = '') or (cbBackupAlias.Text = ' ') then
  880.   begin
  881.     DisplayMsg(ERR_DB_ALIAS,'');
  882.     cbBackupAlias.SetFocus;
  883.     result := false;
  884.     Exit;
  885.   end;
  886.  
  887.   // check if combo box is empty or nothing selected
  888.   if (cbBackupServer.ItemIndex = -1) or (cbBackupServer.Text = '') or (cbBackupServer.Text = ' ') then
  889.   begin
  890.     DisplayMsg(ERR_SERVER_NAME,'');
  891.     cbBackupServer.SetFocus;
  892.     result := false;
  893.     Exit;
  894.   end;
  895.  
  896.   for lCnt := 1 to sgBackupFiles.RowCount - 1 do
  897.   begin
  898.     if (sgBackupFiles.Cells[0,lCnt] <> '') then
  899.     begin
  900.       found := true;
  901.       fp := ExtractFilePath(sgBackupFiles.Cells[0,lCnt]);
  902.  
  903.       if fp = '' then
  904.       begin
  905.         DisplayMsg(ERR_NO_PATH, 'File: '+sgBackupFiles.Cells[0,lCnt]);
  906.         sgBackupFiles.SetFocus;
  907.         result := false;
  908.         exit;
  909.       end;
  910.     end;
  911.   end;
  912.  
  913.   if not found then
  914.   begin
  915.     DisplayMsg (ERR_NO_FILES,'');
  916.     result := false;
  917.     exit;
  918.   end;
  919.  
  920. end;
  921.  
  922. {*******************************************************************
  923. *
  924. *  D o B a c k u p ( )
  925. *
  926. ********************************************************************
  927. *  Author: The Client Server Factory Inc.
  928. *  Date:   March 1, 1999
  929. *
  930. *  Input:
  931. *
  932. *  Return: integer - a status code indicating the success/failure
  933. *                    of the operation.
  934. *
  935. *  Description: This procedure creates and displays the backup form
  936. *               in order to capture Backup information. It then
  937. *               performs the Backup and destroys the instance of
  938. *               the form.
  939. *
  940. ********************************************************************
  941. * Revisions:
  942. *
  943. ********************************************************************}
  944. function DoDBBackup(var SourceDBAlias,BackupAlias: string;
  945.   var BackupFiles: TStringList; const SourceServerNode: TibcServerNode;
  946.   const SourceDatabaseNode: TibcDatabaseNode): integer;
  947. var
  948.   i: integer;
  949.   frmDBBackup: TfrmDBBackup;
  950.   lCurrDatabasesNode: TTreeNode;
  951.   AliasName: String;
  952. begin
  953.   frmDBBackup := nil;
  954.   try
  955.     frmDBBackup:= TfrmDBBackup.Create(Application);
  956.     frmDBBackup.FSourceServerNode := SourceServerNode;
  957.     frmDBBackup.FSourceDatabaseNode := SourceDatabaseNode;
  958.     frmDBBackup.FBackupFiles := BackupFiles;
  959.     frmDBBackup.stxDatabaseServer.Caption := SourceServerNode.NodeName;
  960.     lCurrDatabasesNode := frmMain.tvMain.Items.GetNode(SourceServerNode.DatabasesID);
  961.  
  962.     for i := 1 to TibcTreeNode(lCurrDatabasesNode.Data).ObjectList.Count - 1 do
  963.     begin
  964.       AliasName := TibcDatabaseNode(lCurrDatabasesNode.Data).ObjectList.Strings[i];
  965.       frmDBBackup.cbDatabaseAlias.Items.AddObject(GetNextField (AliasName, DEL),
  966.         TibcDatabaseNode(TTreeNode(TibcTreeNode(lCurrDatabasesNode.Data).ObjectList.Objects[i]).Data));
  967.     end;
  968.  
  969.     if Assigned(SourceDatabaseNode) then
  970.     begin
  971.       frmDBBackup.cbDatabaseAlias.ItemIndex := frmDBBackup.cbDatabaseAlias.Items.IndexOf(SourceDatabaseNode.NodeName);
  972.       frmDBBackup.cbDatabaseAlias.Hint := frmDBBackup.cbDatabaseAlias.Text;
  973.     end;
  974.  
  975.     for i := 1 to TibcTreeNode(frmMain.tvMain.Items[0].Data).ObjectList.Count - 1 do
  976.     begin
  977.       AliasName := TibcTreeNode(frmMain.tvMain.Items[0].Data).ObjectList.Strings[i];
  978.       frmDBBackup.cbBackupServer.Items.AddObject(GetNextField(AliasName, DEL),
  979.         TibcServerNode(TTreeNode(TibcTreeNode(frmMain.tvMain.Items[0].Data).ObjectList.Objects[i]).Data));
  980.     end;
  981.  
  982. //    if Assigned(SourceBackupAliasNode) then
  983. //    begin
  984.       frmDBBackup.cbBackupServer.ItemIndex := frmDBBackup.cbBackupServer.Items.IndexOf(SourceServerNode.NodeName);
  985.       frmDBBackup.cbBackupServerChange(frmDBBackup);
  986.  
  987.       frmDBBackup.cbBackupAlias.ItemIndex := frmDBBackup.cbBackupAlias.Items.IndexOf(BackupAlias);
  988.       frmDBBackup.cbBackupAliasChange(frmDBBackup);
  989.  
  990.       frmDBBackup.cbDatabaseAlias.ItemIndex := frmDBBackup.cbDatabaseAlias.Items.IndexOf(SourceDBAlias);
  991.       frmDBBackup.cbDatabaseAliasChange(frmDBBackup);
  992. //    end;
  993.  
  994.     frmDBBackup.ShowModal;
  995.  
  996.     if (frmDBBackup.ModalResult = mrOK)  and (not frmDBBackup.GetErrorState) then
  997.     begin
  998.       BackupFiles.Text := frmDBBackup.FBackupFiles.Text;
  999.       BackupAlias := frmDBBackup.cbBackupAlias.Text;
  1000.       SourceDBAlias := frmDBBackup.cbDatabaseAlias.Text;
  1001.       DisplayMsg(INF_BACKUP_DB_SUCCESS,'');
  1002.       result := SUCCESS;
  1003.     end
  1004.     else
  1005.       result := FAILURE;
  1006.   finally
  1007.     frmDBBackup.Free;
  1008.     Screen.Cursor := crDefault;
  1009.   end;
  1010. end;
  1011.  
  1012. procedure TfrmDBBackup.WMNCLButtonDown( var Message: TWMNCLButtonDown );
  1013. var
  1014.   ScreenPt: TPoint;
  1015.   ClientPt: TPoint;
  1016. begin
  1017.   ScreenPt.X := Message.XCursor;
  1018.   ScreenPt.Y := Message.YCursor;
  1019.   ClientPt := ScreenToClient( ScreenPt );
  1020.   if( ClientPt.X > Width-45 )and (ClientPt.X < Width-29) then
  1021.    begin
  1022.     WinHelp(WindowHandle,CONTEXT_HELP_FILE,HELP_CONTEXT,DATABASE_BACKUP);
  1023.     Message.Result := 0;
  1024.   end else
  1025.    inherited;
  1026. end;
  1027.  
  1028. procedure TfrmDBBackup.cbDatabaseAliasChange(Sender: TObject);
  1029. begin
  1030.   cbDatabaseAlias.Hint := cbDatabaseAlias.Text;
  1031. end;
  1032.  
  1033. end.
  1034.