Componentes.Terceros.jvcl/official/3.39/examples/JvDBExplorer/BDEINFO.PAS
2010-01-18 16:55:50 +00:00

279 lines
8.0 KiB
Plaintext

{******************************************************************
JEDI-VCL Demo
Copyright (C) 2002 Project JEDI
Original author:
Contributor(s):
You may retrieve the latest version of this file at the JEDI-JVCL
home page, located at http://jvcl.delphi-jedi.org
The contents of this file are used with permission, subject to
the Mozilla Public License Version 1.1 (the "License"); you may
not use this file except in compliance with the License. You may
obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1_1Final.html
Software distributed under the License is distributed on an
"AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
******************************************************************}
{*******************************************************}
{ }
{ Delphi VCL Extensions (RX) demo program }
{ }
{ Copyright (c) 1997 Master-Bank }
{ }
{*******************************************************}
unit BdeInfo;
{$I jvcl.inc}
interface
uses Classes, {$IFDEF WIN32} Windows, BDE, Registry, {$ELSE} IniFiles,
DbiTypes, DbiProcs, DbiErrs, {$ENDIF WIN32} SysUtils, DB, DBTables;
{ TBdeInfo }
type
TBdeInfo = class
private
FDllList: TStrings;
FDirectory: string;
FCfgPath: string;
FVer: SYSVersion;
FConfig: SYSConfig;
FInfo: SYSInfo;
procedure UpdateInformation(OnCreate: Boolean);
procedure UpdateDllList;
procedure UpdateRegInfo;
function GetDllCount: Integer;
function GetBdeDll(Index: Integer): string;
function GetVersionDateTime: TDateTime;
function GetNetworkType: string;
function GetNetUserName: string;
function GetLanguageDriver: string;
function GetLangDriverDesc: string;
public
constructor Create;
destructor Destroy; override;
procedure Update;
property DllCount: Integer read GetDllCount;
property BdeDll[Index: Integer]: string read GetBdeDll;
property BdeDllList: TStrings read FDllList;
property VersionDateTime: TDateTime read GetVersionDateTime; { Version Date }
property BdeDirectory: string read FDirectory;
property ConfigPath: string read FCfgPath; { CFG File Path }
property EngineVersion: Word read FVer.iVersion; { Engine Version }
property InterfaceLevel: Word read FVer.iIntfLevel; { Interface Level }
property NetworkType: string read GetNetworkType; { Network Type }
property NetUserName: string read GetNetUserName; { Net User Name }
property LanguageDriver: string read GetLanguageDriver; { Language Driver }
property LangDriverDesc: string read GetLangDriverDesc; { LangDriver Description }
property BufferSpace: Word read FInfo.iBufferSpace; { Buffer size, in K }
property HeapSpace: Word read FInfo.iHeapSpace; { Heap Space, in K }
property ActiveDrivers: Word read FInfo.iDrivers; { Active Drivers }
property ActiveClients: Word read FInfo.iClients; { Active Clients }
property ActiveSessions: Word read FInfo.iSessions; { Active Sessions }
property ActiveDatabases: Word read FInfo.iDatabases; { Active Databases }
property ActiveCursors: Word read FInfo.iCursors; { Active Cursors }
end;
function FieldTypeName(AType: Word): string;
function FieldSubtypeName(ASubtype: Word): string;
implementation
uses JvJCLUtils;
{ TBdeInfo }
constructor TBdeInfo.Create;
begin
inherited Create;
FDllList := TStringList.Create;
UpdateInformation(True);
end;
destructor TBdeInfo.Destroy;
begin
FDllList.Free;
inherited Destroy;
end;
procedure TBdeInfo.Update;
begin
UpdateInformation(False);
end;
procedure TBdeInfo.UpdateRegInfo;
var
I: Integer;
{$IFDEF WIN32}
Reg: TRegistry;
begin
Reg := TRegistry.Create;
with Reg do
try
LazyWrite := False;
RootKey := HKEY_LOCAL_MACHINE;
OpenKey('SOFTWARE\Borland\Database Engine', False);
try
FDirectory := ReadString('DLLPATH');
FCfgPath := ReadString('CONFIGFILE01');
finally
CloseKey;
end;
finally
Free;
end;
{$ELSE}
Ini: TIniFile;
const
sIDAPI = 'IDAPI';
begin
Ini := TIniFile.Create('win.ini');
with Ini do
try
FDirectory := ReadString(sIDAPI, 'DLLPATH', '');
FCfgPath := ReadString(sIDAPI, 'CONFIGFILE01', '');
finally
Free;
end;
{$ENDIF WIN32}
I := Pos(';', FDirectory);
if I > 0 then FDirectory := Copy(FDirectory, 1, I - 1);
I := Pos(';', FCfgPath);
if I > 0 then FCfgPath := Copy(FCfgPath, 1, I - 1);
UpdateDllList;
end;
procedure TBdeInfo.UpdateDllList;
var
Rec: TSearchRec;
Status: Integer;
begin
FDLLList.BeginUpdate;
try
FDLLList.Clear;
Status := FindFirst(FDirectory + '\*.dll', faAnyFile, Rec);
try
while Status = 0 do begin
FDLLList.Add(AnsiUpperFirstChar(Rec.Name));
Status := FindNext(Rec);
end;
finally
FindClose(Rec);
end;
finally
FDLLList.EndUpdate;
end;
end;
function TBdeInfo.GetDllCount: Integer;
begin
Result := FDllList.Count;
end;
function TBdeInfo.GetBdeDll(Index: Integer): string;
begin
Result := FDllList[Index];
end;
procedure TBdeInfo.UpdateInformation(OnCreate: Boolean);
begin
if OnCreate then begin
UpdateRegInfo;
Check(DbiGetSysVersion(FVer));
end;
Check(DbiGetSysConfig(FConfig));
Check(DbiGetSysInfo(FInfo));
end;
function TBdeInfo.GetVersionDateTime: TDateTime;
var
Hour, Min, MSec, M, D: Word;
Y: SmallInt;
begin
Check(DbiDateDecode(FVer.dateVer, M, D, Y));
Check(DbiTimeDecode(FVer.timeVer, Hour, Min, MSec));
Result := EncodeDate(Y, M, D) + EncodeTime(Hour, Min, 0, 0);
end;
function TBdeInfo.GetNetworkType: string;
begin
Result := StrPas(FConfig.szNetType);
end;
function TBdeInfo.GetNetUserName: string;
begin
Result := StrPas(FConfig.szUserName);
end;
function TBdeInfo.GetLanguageDriver: string;
begin
Result := StrPas(FConfig.szLangDriver);
end;
function TBdeInfo.GetLangDriverDesc: string;
var
Cursor: HDBICur;
Info: LDDesc;
begin
Result := '';
Check(DbiOpenLdList(Cursor));
try
while DbiGetNextRecord(Cursor, dbiNOLOCK, @Info, nil) = DBIERR_NONE do
if StrIComp(Info.szName, FConfig.szLangDriver) = 0 then begin
Result := Format('%s (%d)', [Info.szDesc, Info.iCodePage]);
Break;
end;
finally
DbiCloseCursor(Cursor);
end;
end;
function FieldTypeName(AType: Word): string;
const
{$IFDEF COMPILER3_UP}
MaxTypes = fldCURSOR;
{$ELSE}
MaxTypes = fldLOCKINFO;
{$ENDIF}
Types: array [fldUNKNOWN..MaxTypes] of PChar =
('Unknown', 'String', 'Date', 'Blob', 'Boolean', 'Int16', 'Int32',
'Float64', 'Decimal', 'Bytes', 'Time', 'DateTime', 'UInt16', 'UInt32',
'Float80', 'VarBytes', 'LockInfo'
{$IFDEF COMPILER3_UP}, 'Oracle Cursor' {$ENDIF});
begin
if AType < Low(Types) then AType := Low(Types)
else if AType > High(Types) then AType := Low(Types);
Result := StrPas(Types[AType]);
end;
function FieldSubtypeName(ASubtype: Word): string;
const
MinSubType = fldstMONEY - 1;
MaxSubtype = fldstAUTOINC;
Subtypes: array [MinSubType..MaxSubtype] of PChar =
('Password', 'Money', 'Memo', 'Binary', 'Formatted Memo', 'OLE',
'Graphic', 'dBase OLE', 'User Typed', 'Auto Increment');
begin
Result := '';
if ASubtype = fldstPASSWORD then ASubtype := Low(Subtypes)
else begin
if ASubtype < Low(Subtypes) + 1 then ASubtype := 0
else if ASubtype > High(Subtypes) then ASubtype := 0;
end;
if ASubtype > 0 then Result := StrPas(Subtypes[ASubtype]);
end;
end.