MAIN.PAS
上传用户:oceanht
上传日期:2014-03-26
资源大小:1376k
文件大小:11k
源码类别:

其他数据库

开发平台:

Delphi

  1. unit main;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  5.   StdCtrls, ComCtrls, ExtCtrls, DB, TUtil32, BDE, DBTables;
  6. type
  7.   TBDEUtil = class;
  8.   
  9.   TMainForm = class(TForm)
  10.     ExitBtn: TButton;
  11.     AboutBtn: TButton;
  12.     Panel1: TPanel;
  13.     GroupBox1: TGroupBox;
  14.     Label1: TLabel;
  15.     Label2: TLabel;
  16.     Label3: TLabel;
  17.     AliasCombo: TComboBox;
  18.     TableCombo: TComboBox;
  19.     TableLocEdit: TEdit;
  20.     ByDirectBtn: TButton;
  21.     GroupBox2: TGroupBox;
  22.     Label4: TLabel;
  23.     Label5: TLabel;
  24.     Label6: TLabel;
  25.     Label7: TLabel;
  26.     Label8: TLabel;
  27.     FieldsLB: TLabel;
  28.     RecSizeLB: TLabel;
  29.     IndexLB: TLabel;
  30.     ValidLB: TLabel;
  31.     RefLB: TLabel;
  32.     Label14: TLabel;
  33.     Label15: TLabel;
  34.     Label16: TLabel;
  35.     Label17: TLabel;
  36.     Label18: TLabel;
  37.     RestructLB: TLabel;
  38.     AuxPassLB: TLabel;
  39.     CodePageLB: TLabel;
  40.     BlockSizeLB: TLabel;
  41.     TabLvlLB: TLabel;
  42.     VerifyBtn: TButton;
  43.     RebuildBtn: TButton;
  44.     GroupBox3: TGroupBox;
  45.     Label24: TLabel;
  46.     Label25: TLabel;
  47.     Label26: TLabel;
  48.     Label27: TLabel;
  49.     Label28: TLabel;
  50.     MessageLB: TLabel;
  51.     PBHeader: TProgressBar;
  52.     PBIndexes: TProgressBar;
  53.     PBData: TProgressBar;
  54.     PBRebuild: TProgressBar;
  55.     OpenDialog1: TOpenDialog;
  56.     Session1: TSession;
  57.     Database1: TDatabase;
  58.     procedure FormCreate(Sender: TObject);
  59.     procedure AliasComboChange(Sender: TObject);
  60.     procedure ByDirectBtnClick(Sender: TObject);
  61.     procedure TableComboChange(Sender: TObject);
  62.     procedure FormDestroy(Sender: TObject);
  63.     procedure ExitBtnClick(Sender: TObject);
  64.     procedure VerifyBtnClick(Sender: TObject);
  65.     procedure RebuildBtnClick(Sender: TObject);
  66.     procedure AboutBtnClick(Sender: TObject);
  67.   private
  68.     { Private declarations }
  69.     BDEUtil: TBDEUtil;
  70.     procedure OpenDatabaseList;
  71.     procedure SetTableAndDir(ByDirectory: Boolean);
  72.     procedure ClearBars;
  73.     procedure ClearLabels;
  74.     procedure SetTableInfo;
  75.     procedure ClearTable;
  76.     procedure SetTable(TableName: String);
  77.   public
  78.     { Public declarations }
  79.   end;
  80.   TBDEUtil = class
  81.     CbInfo: TUVerifyCallback;
  82.     TUProps: CURProps;
  83.     hDb: hDBIDb;
  84.     vhTSes: hTUSes;
  85.     constructor Create;
  86.     destructor Destroy; override;
  87.     function GetTCursorProps(szTable: String): Boolean;
  88.     procedure RegisterCallBack;
  89.     procedure UnRegisterCallBack;
  90.   end;
  91. var
  92.   MainForm: TMainForm;
  93. implementation
  94. uses about;
  95. {$R *.DFM}
  96. function GenProgressCallBack(ecbType: CBType; Data: LongInt; pcbInfo: Pointer):
  97.   CBRType; stdcall;
  98. var
  99.   CBInfo: TUVerifyCallBack;
  100. begin
  101.   CBInfo := TUVerifyCallBack(pcbInfo^);
  102.   if ecbType = cbGENPROGRESS then
  103.     case CBInfo.Process of
  104.      TUVerifyHeader: begin
  105.        MainForm.PBHeader.Position := CBInfo.percentdone;
  106.      end;
  107.      TUVerifyIndex: begin
  108.        MainForm.PBIndexes.Position := CBInfo.percentdone;
  109.      end;
  110.      TUVerifyData: begin
  111.        MainForm.PBData.Position := CBInfo.percentdone;
  112.      end;
  113.      TURebuild: begin
  114.        MainForm.PBRebuild.Position := CBInfo.percentdone;
  115.      end;
  116.     end;
  117.   Result := cbrUSEDEF;
  118. end;
  119. constructor TBDEUtil.Create;
  120. var
  121.   ClientData: Array[0..100] of byte;
  122. begin
  123.   Check(TUInit(vhtSes));
  124. end;
  125. destructor TBDEUtil.Destroy;
  126. begin
  127.   Check(TUExit(vhtSes));
  128.   inherited Destroy;
  129. end;
  130. function TBDEUtil.GetTCursorProps(szTable: String): Boolean;
  131. begin
  132.   if TUFillCURProps(vHtSes, PChar(szTable), TUProps) = DBIERR_NONE then
  133.     Result := True
  134.   else Result := False;
  135. end;
  136. procedure TBDEUtil.RegisterCallback;
  137. begin
  138.  Check(DbiRegisterCallBack(nil, cbGENPROGRESS, 0,
  139.             sizeof(TUVerifyCallBack), @CbInfo, GenProgressCallback));
  140. end;
  141. procedure TBDEUtil.UnRegisterCallback;
  142. begin
  143.   Check(DbiRegisterCallBack(nil, cbGENPROGRESS, 0,
  144.            sizeof(TUVerifyCallBack), @CbInfo, nil));
  145. end;
  146. procedure TMainForm.OpenDataBaseList;
  147. var
  148.   TmpCursor: hDbiCur;
  149.   vDBDesc: DBDesc;
  150. begin
  151.   AliasCombo.Items.Clear;
  152.   Check(DbiOpenDatabaseList(TmpCursor));
  153.   while (DbiGetNextRecord(TmpCursor, dbiNOLOCK, @vDBDesc, nil)
  154.                                       = DBIERR_NONE) do begin
  155.     if vDBDesc.szDBType = 'STANDARD' then
  156.       AliasCombo.Items.Add(vDBDesc.szName);
  157.   end;
  158.   Check(DbiCloseCursor(TmpCursor));
  159. end;
  160. procedure TMainForm.ClearBars;
  161. begin
  162.   MessageLB.Caption := '';
  163.   PBHeader.Position := 0;
  164.   PBIndexes.Position := 0;
  165.   PBData.Position := 0;
  166.   PBRebuild.Position := 0;
  167. end;
  168. procedure TMainForm.ClearLabels;
  169. begin
  170.   FieldsLB.Caption := '0';
  171.   RecSizeLB.Caption := '0';
  172.   IndexLB.Caption := '0';
  173.   ValidLB.Caption := '0';
  174.   RefLB.Caption := '0';
  175.   RestructLB.Caption := '0';
  176.   AuxPassLB.Caption := '0';
  177.   CodePageLB.Caption := '0';
  178.   BlockSizeLB.Caption := '0';
  179.   TabLvlLB.Caption := '0';
  180. end;
  181. procedure TMainForm.ClearTable;
  182. begin
  183.   TableLocEdit.Text := '';
  184.   VerifyBtn.Enabled := False;
  185.   RebuildBtn.Enabled := False;
  186. end;
  187. procedure TMainForm.SetTable(TableName: String);
  188. begin
  189.   TableLocEdit.Text := TableName;
  190.   VerifyBtn.Enabled := True;
  191.   RebuildBtn.Enabled := True;
  192. end;
  193. procedure TMainForm.SetTableAndDir;
  194. var
  195.   vDBDesc: DBDesc;
  196.   Alias: String;
  197.   Table: String;
  198.   DirTable: String;
  199. begin
  200.   Alias := AliasCombo.Items[AliasCombo.ItemIndex];
  201.   Table := TableCombo.Items[TableCombo.ItemIndex];
  202.   Check(DbiGetDatabaseDesc(PChar(Alias), @vDBDesc));
  203.   SetTable(Format('%s%s', [vDBDesc.szPhyName, Table]));
  204.   ClearBars;
  205.   SetTableInfo();
  206. end;
  207. procedure TMainForm.SetTableInfo;
  208. var
  209.   Buffer,
  210.   Table: String;
  211. begin
  212.   Table := TableLocEdit.Text;
  213.   if BDEUtil.GetTCursorProps(Table) then
  214.   with BDEUtil.TUProps do begin
  215.     FieldsLB.Caption := IntToStr(iFields);
  216.     RecSizeLB.Caption := IntToStr(iRecBufSize);
  217.     IndexLB.Caption := IntToStr(iIndexes);
  218.     ValidLB.Caption := InttoStr(iValChecks);
  219.     RefLB.Caption := IntToStr(iRefIntChecks);
  220.     RestructLB.Caption := IntToStr(iRestrVersion);
  221.     AuxPassLB.Caption := IntToStr(iPasswords);
  222.     CodePageLB.Caption := IntToStr(iCodePage);
  223.     BlockSizeLB.Caption := IntToStr(iBlockSize);
  224.     TabLvlLB.Caption := IntToStr(iTblLevel);
  225.   end;
  226. end;
  227. procedure TMainForm.FormCreate(Sender: TObject);
  228. begin
  229.   Session1.Active := True;
  230.   OpenDatabaseList;
  231.   BDEUtil := TBDEUtil.Create;
  232. end;
  233. procedure TMainForm.AliasComboChange(Sender: TObject);
  234. begin
  235. //  Database1.Connected := False;
  236. //  Database1.AliasName := AliasCombo.Items[AliasCombo.ItemIndex];
  237. //  DataBase1.Connected := True;
  238.   Session1.GetTableNames(AliasCombo.Items[AliasCombo.ItemIndex], '*.*',
  239.     True, False, TableCombo.Items);
  240.   ClearBars;
  241.   ClearLabels;
  242.   ClearTable;
  243. end;
  244. procedure TMainForm.ByDirectBtnClick(Sender: TObject);
  245. begin
  246.  if OpenDialog1.Execute then begin
  247.    SetTable(OpenDialog1.FileName);
  248.    AliasCombo.ItemIndex := -1;
  249.    TableCombo.Items.Clear;
  250.    ClearBars;
  251.    SetTableInfo;
  252.  end;
  253. end;
  254. procedure TMainForm.TableComboChange(Sender: TObject);
  255. begin
  256.   SetTableAndDir(False);
  257. end;
  258. procedure TMainForm.FormDestroy(Sender: TObject);
  259. begin
  260.   BDEUtil.Free;
  261. end;
  262. procedure TMainForm.ExitBtnClick(Sender: TObject);
  263. begin
  264.   Close;
  265. end;
  266. procedure TMainForm.VerifyBtnClick(Sender: TObject);
  267. var
  268.   Msg: Integer;
  269.   Table: String;
  270.   L: Integer;
  271. begin
  272.   Screen.Cursor := crHourGlass;
  273.   try
  274.     ClearBars;
  275.     Table := TableLocEdit.Text;
  276.     Check(TUExit(BDEUtil.vHtSes));
  277.     Check(TUInit(BDEUtil.vHtSes));
  278.     BDEUtil.RegisterCallBack;
  279.     try
  280.       if TUVerifyTable(BDEUtil.vHtSes, PChar(Table), szPARADOX, 'VERIFY.DB',
  281.            nil, 0, Msg) = DBIERR_NONE then begin
  282.       case Msg of
  283.         0: MessageLB.Caption := 'Verification Successful. Table has no errors.';
  284.         1: MessageLB.Caption := 'Verification Successful. Verification completed.';
  285.         2: MessageLB.Caption := 'Verification Successful. Verification could not be completed.';
  286.         3: MessageLB.Caption := 'Verification Successful. Table must be rebuild manually.';
  287.         4: MessageLB.Caption := 'Verification Successful. Table cannot be rebuilt.';
  288.       else
  289.         MessageLB.Caption := 'Verification unsuccessful.';
  290.       end;
  291.       end;
  292.     finally
  293.       BDEUtil.UnRegisterCallBack;
  294.     end;
  295.   finally
  296.     Screen.Cursor := crDefault;
  297.   end;
  298. end;
  299. procedure TMainForm.RebuildBtnClick(Sender: TObject);
  300. var
  301.   iFld, iIdx, iSec, iVal, iRI, iOptP, iOptD: word;
  302.   szTable: String;
  303.   rslt: DBIResult;
  304.   Msg: Integer;
  305.   TblDesc: CRTBlDesc;
  306.   Backup: String;
  307. begin
  308.   Screen.Cursor := crHourGlass;
  309.   try
  310.     ClearBars;
  311.     Check(TUExit(BDEUtil.vHtSes));
  312.     Check(TUInit(BDEUtil.vHtSes));
  313.     szTable := TableLocEdit.Text;
  314.     BDEUtil.RegisterCallBack;
  315.     try
  316.       Check(TUVerifyTable(BDEUtil.vHtSes, PChar(szTable), szPARADOX, 'VERIFY.DB',
  317.            nil, 0, Msg));
  318.       rslt := TUGetCRTblDescCount(BDEUtil.vhTSes, PChar(szTable), iFld,
  319.             iIdx, iSec, iVal, iRI, iOptP, iOptD);
  320.       if rslt = DBIERR_NONE then begin
  321.         FillChar(TblDesc, SizeOf(CRTBlDesc), 0);
  322.         StrPCopy(TblDesc.szTblName, szTable);
  323.         TblDesc.szTblType := szParadox;
  324.         TblDesc.szErrTblName := 'Rebuild.DB';
  325.         TblDesc.iFldCount := iFld;
  326.         GetMem(TblDesc.pFldDesc, (iFld * SizeOf(FldDesc)));
  327.         TblDesc.iIdxCount := iIdx;
  328.         GetMem(TblDesc.pIdxDesc, (iIdx * SizeOf(IdxDesc)));
  329.         TblDesc.iSecRecCount := iSec;
  330.         GetMem(TblDesc.pSecDesc, (iSec * SizeOf(SecDesc)));
  331.         TblDesc.iValChkCount := iVal;
  332.         GetMem(TblDesc.pvchkDesc, (iVal * SizeOf(VCHKDesc)));
  333.         TblDesc.iRintCount := iRI;
  334.         GetMem(TblDesc.printDesc, (iRI * SizeOf(RINTDesc)));
  335.         TblDesc.iOptParams := iOptP;
  336.         GetMem(TblDesc.pfldOptParams, (iOptP * sizeOf(FLDDesc)));
  337.         GetMem(TblDesc.pOptData, (iOptD * DBIMAXSCFLDLEN));
  338.         try
  339.            rslt := TUFillCRTblDesc(BDEUtil.vhTSes, @TblDesc, PChar(szTable), nil);
  340.            if rslt = DBIERR_NONE then begin
  341.              Backup := 'Backup.Db';
  342.              if TURebuildTable(BDEUtil.vhTSes, PChar(szTable), szPARADOX,
  343.                  PChar(Backup), 'KEYVIOL.DB', 'PROBLEM.DB', @TblDesc) = DBIERR_NONE
  344.              then MessageLB.Caption := 'Rebuild was successful.'
  345.              else MessageLB.Caption := 'Rebuild was not successful.';
  346.            end
  347.            else
  348.              MessageDlg('Error Filling table structure', mtError, [mbok], 0);
  349.         finally
  350.           FreeMem(TblDesc.pFldDesc, (iFld * SizeOf(FldDesc)));
  351.           FreeMem(TblDesc.pIdxDesc, (iIdx * SizeOf(IdxDesc)));
  352.           FreeMem(TblDesc.pSecDesc, (iSec * SizeOf(SecDesc)));
  353.           FreeMem(TblDesc.pvchkDesc, (iVal * SizeOf(VCHKDesc)));
  354.           FreeMem(TblDesc.printDesc, (iRI * SizeOf(RINTDesc)));
  355.           FreeMem(TblDesc.pfldOptParams, (iOptP * sizeOf(FLDDesc)));
  356.           FreeMem(TblDesc.pOptData, (iOptD * DBIMAXSCFLDLEN));
  357.         end;
  358.       end;
  359.     finally
  360.       BDEUtil.UnRegisterCallBack;
  361.     end;
  362.   finally
  363.     Screen.Cursor := crDefault;
  364.   end;
  365. end;
  366. procedure TMainForm.AboutBtnClick(Sender: TObject);
  367. begin
  368.   AboutForm.ShowModal;
  369. end;
  370. end.