Dblists.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:15k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {         Delphi VCL Extensions (RX)                    }
  4. {                                                       }
  5. {         Copyright (c) 1995, 1996 AO ROSNO             }
  6. {         Copyright (c) 1997, 1998 Master-Bank          }
  7. {                                                       }
  8. {*******************************************************}
  9. unit DBLists;
  10. {$I RX.INC}
  11. {$N+,P+,S-}
  12. interface
  13. uses SysUtils, Classes, DB, DBTables, DBUtils, BdeUtils,
  14. {$IFDEF WIN32} 
  15.   Windows, Bde;
  16. {$ELSE}
  17.   WinTypes, WinProcs, DbiTypes, DbiProcs, DbiErrs;
  18. {$ENDIF}
  19. type
  20. { TBDEItems }
  21.   TBDEItemType = (bdDatabases, bdDrivers, bdLangDrivers, bdUsers 
  22.     {$IFDEF WIN32}, bdRepositories {$ENDIF});
  23.   TCustomBDEItems = class(TBDEDataSet)
  24.   private
  25.     FItemType: TBDEItemType;
  26. {$IFDEF WIN32}
  27.     FSessionName: string;
  28.     FSessionLink: TDatabase;
  29.     function GetDBSession: TSession;
  30.     procedure SetSessionName(const Value: string);
  31. {$ENDIF}
  32.     procedure SetItemType(Value: TBDEItemType);
  33.   protected
  34. {$IFDEF WIN32}
  35.     function GetRecordCount: {$IFNDEF RX_D3} Longint {$ELSE}
  36.       Integer; override {$ENDIF};
  37.     procedure OpenCursor {$IFDEF RX_D3}(InfoQuery: Boolean){$ENDIF}; override;
  38.     procedure CloseCursor; override;
  39. {$ENDIF}
  40.     function CreateHandle: HDBICur; override;
  41.     property ItemType: TBDEItemType read FItemType write SetItemType
  42.       default bdDatabases;
  43.   public
  44. {$IFDEF WIN32}
  45.   {$IFDEF RX_D3}
  46.     function Locate(const KeyFields: string; const KeyValues: Variant;
  47.       Options: TLocateOptions): Boolean; override;
  48.   {$ENDIF}
  49.     property DBSession: TSession read GetDBSession;
  50.   {$IFNDEF RX_D3}
  51.     property RecordCount: Longint read GetRecordCount;
  52.   {$ENDIF}
  53.   published
  54.     property SessionName: string read FSessionName write SetSessionName;
  55. {$ENDIF WIN32}
  56.   end;
  57.   TBDEItems = class(TCustomBDEItems)
  58.   published
  59.     property ItemType;
  60.   end;
  61. { TDBListDataSet }
  62.   TDBListDataSet = class(TDBDataSet)
  63. {$IFDEF WIN32}
  64.   protected
  65.     function GetRecordCount: {$IFNDEF RX_D3} Longint {$ELSE}
  66.       Integer; override {$ENDIF};
  67.   public
  68.   {$IFDEF RX_D3}
  69.     function Locate(const KeyFields: string; const KeyValues: Variant;
  70.       Options: TLocateOptions): Boolean; override;
  71.   {$ELSE}
  72.     property RecordCount: Longint read GetRecordCount;
  73.   {$ENDIF}
  74. {$ENDIF}
  75.   end;
  76. { TDatabaseItems }
  77.   TDBItemType = (dtTables, dtStoredProcs, dtFiles {$IFDEF WIN32},
  78.     dtFunctions {$ENDIF});
  79.   TCustomDatabaseItems = class(TDBListDataSet)
  80.   private
  81.     FExtended: Boolean;
  82.     FSystemItems: Boolean;
  83.     FFileMask: string;
  84.     FItemType: TDBItemType;
  85.     procedure SetFileMask(const Value: string);
  86.     procedure SetExtendedInfo(Value: Boolean);
  87.     procedure SetSystemItems(Value: Boolean);
  88.     procedure SetItemType(Value: TDBItemType);
  89.   protected
  90.     function CreateHandle: HDBICur; override;
  91.     function GetItemName: string;
  92.     property ItemType: TDBItemType read FItemType write SetItemType
  93.       default dtTables;
  94.     property ExtendedInfo: Boolean read FExtended write SetExtendedInfo
  95.       default False;
  96.     property FileMask: string read FFileMask write SetFileMask;
  97.     property SystemItems: Boolean read FSystemItems write SetSystemItems
  98.       default False;
  99.   public
  100.     property ItemName: string read GetItemName;
  101.   end;
  102.   TDatabaseItems = class(TCustomDatabaseItems)
  103.   published
  104.     property ItemType;
  105.     property ExtendedInfo;
  106.     property FileMask;
  107.     property SystemItems;
  108.   end;
  109. { TTableItems }
  110.   TTabItemType = (dtFields, dtIndices, dtValChecks, dtRefInt,
  111.     dtSecurity, dtFamily);
  112.   TCustomTableItems = class(TDBListDataSet)
  113.   private
  114.     FTableName: TFileName;
  115.     FItemType: TTabItemType;
  116.     FPhysTypes: Boolean;
  117.     procedure SetTableName(const Value: TFileName);
  118.     procedure SetItemType(Value: TTabItemType);
  119.     procedure SetPhysTypes(Value: Boolean);
  120.   protected
  121.     function CreateHandle: HDBICur; override;
  122.     property ItemType: TTabItemType read FItemType write SetItemType
  123.       default dtFields;
  124.     property PhysTypes: Boolean read FPhysTypes write SetPhysTypes
  125.       default False; { for dtFields only }
  126.   published
  127.     property TableName: TFileName read FTableName write SetTableName;
  128.   end;
  129.   TTableItems = class(TCustomTableItems)
  130.   published
  131.     property ItemType;
  132.     property PhysTypes;
  133.   end;
  134. { TDatabaseDesc }
  135.   TDatabaseDesc = class(TObject)
  136.   private
  137.     FDescription: DBDesc;
  138.   public
  139.     constructor Create(const DatabaseName: string);
  140.     property Description: DBDesc read FDescription;
  141.   end;
  142. { TDriverDesc }
  143.   TDriverDesc = class(TObject)
  144.   private
  145.     FDescription: DRVType;
  146.   public
  147.     constructor Create(const DriverType: string);
  148.     property Description: DRVType read FDescription;
  149.   end;
  150. {*************************************************************************}
  151. {$IFNDEF CBUILDER}
  152. { Obsolete classes, for backward compatibility only }
  153. type
  154.   TDatabaseList = class(TCustomBDEItems);
  155.   TLangDrivList = class(TCustomBDEItems)
  156.     constructor Create(AOwner: TComponent); override;
  157.   end;
  158.   TTableList = class(TCustomDatabaseItems)
  159.   public
  160.     function GetTableName: string;
  161.   published
  162.     property ExtendedInfo;
  163.     property FileMask;
  164.     property SystemItems;
  165.   end;
  166.   TStoredProcList = class(TCustomDatabaseItems)
  167.   public
  168.     constructor Create(AOwner: TComponent); override;
  169.   published
  170.     property ExtendedInfo;
  171.     property SystemItems;
  172.   end;
  173.   TFieldList = class(TCustomTableItems);
  174.   TIndexList = class(TCustomTableItems)
  175.     constructor Create(AOwner: TComponent); override;
  176.   end;
  177. {$ENDIF CBUILDER}
  178. implementation
  179. uses DBConsts, {$IFDEF RX_D3} BDEConst, {$ENDIF} RxDConst;
  180. { Utility routines }
  181. function dsGetRecordCount(DataSet: TBDEDataSet): Longint;
  182. begin
  183.   if DataSet.State = dsInactive then _DBError(SDataSetClosed);
  184.   Check(DbiGetRecordCount(DataSet.Handle, Result));
  185. end;
  186. {$IFDEF WIN32}
  187. type
  188.   TSessionLink = class(TDatabase)
  189.   private
  190.     FList: TCustomBDEItems;
  191.   public
  192.     constructor Create(AOwner: TComponent); override;
  193.     destructor Destroy; override;
  194.   end;
  195. constructor TSessionLink.Create(AOwner: TComponent);
  196. begin
  197.   inherited Create(AOwner);
  198.   if (AOwner <> nil) and (AOwner is TSession) then
  199.     SessionName := TSession(AOwner).SessionName;
  200.   Temporary := True;
  201.   KeepConnection := False;
  202. end;
  203. destructor TSessionLink.Destroy;
  204. begin
  205.   if FList <> nil then begin
  206.     FList.FSessionLink := nil;
  207.     FList.Close;
  208.   end;
  209.   inherited Destroy;
  210. end;
  211. {$ENDIF}
  212. { TCustomBDEItems }
  213. procedure TCustomBDEItems.SetItemType(Value: TBDEItemType);
  214. begin
  215.   if ItemType <> Value then begin
  216.     CheckInactive;
  217.     FItemType := Value;
  218.   end;
  219. end;
  220. function TCustomBDEItems.CreateHandle: HDBICur;
  221. begin
  222.   case FItemType of
  223.     bdDatabases: Check(DbiOpenDatabaseList(Result));
  224.     bdDrivers: Check(DbiOpenDriverList(Result));
  225.     bdLangDrivers: Check(DbiOpenLdList(Result));
  226.     bdUsers: Check(DbiOpenUserList(Result));
  227. {$IFDEF WIN32}
  228.     bdRepositories: Check(DbiOpenRepositoryList(Result));
  229. {$ENDIF}
  230.   end;
  231. end;
  232. {$IFDEF WIN32}
  233. function TCustomBDEItems.GetDBSession: TSession;
  234. begin
  235.   Result := Sessions.FindSession(SessionName);
  236.   if Result = nil then
  237. {$IFDEF RX_D3}
  238.     Result := DBTables.Session;
  239. {$ELSE}
  240.     Result := DB.Session;
  241. {$ENDIF}
  242. end;
  243. procedure TCustomBDEItems.SetSessionName(const Value: string);
  244. begin
  245.   CheckInactive;
  246.   FSessionName := Value;
  247.   DataEvent(dePropertyChange, 0);
  248. end;
  249. procedure TCustomBDEItems.OpenCursor;
  250. var
  251.   S: TSession;
  252. begin
  253.   S := Sessions.List[SessionName];
  254.   S.Open;
  255.   Sessions.CurrentSession := S;
  256.   FSessionLink := TSessionLink.Create(S);
  257.   try
  258.     TSessionLink(FSessionLink).FList := Self;
  259.     inherited OpenCursor{$IFDEF RX_D3}(InfoQuery){$ENDIF};
  260.   except
  261.     FSessionLink.Free;
  262.     FSessionLink := nil;
  263.     raise;
  264.   end;
  265. end;
  266. procedure TCustomBDEItems.CloseCursor;
  267. begin
  268.   inherited CloseCursor;
  269.   if FSessionLink <> nil then begin
  270.     TSessionLink(FSessionLink).FList := nil;
  271.     FSessionLink.Free;
  272.     FSessionLink := nil;
  273.   end;
  274. end;
  275. {$ENDIF WIN32}
  276. {$IFDEF WIN32}
  277. function TCustomBDEItems.GetRecordCount: {$IFNDEF RX_D3} Longint {$ELSE} Integer {$ENDIF};
  278. begin
  279.   Result := dsGetRecordCount(Self);
  280. end;
  281. {$ENDIF WIN32}
  282. {$IFDEF RX_D3}
  283. function TCustomBDEItems.Locate(const KeyFields: string;
  284.   const KeyValues: Variant; Options: TLocateOptions): Boolean;
  285. begin
  286.   DoBeforeScroll;
  287.   Result := DataSetLocateThrough(Self, KeyFields, KeyValues, Options);
  288.   if Result then begin
  289.     DataEvent(deDataSetChange, 0);
  290.     DoAfterScroll;
  291.   end;
  292. end;
  293. {$ENDIF RX_D3}
  294. { TDBListDataSet }
  295. {$IFDEF RX_D3}
  296. function TDBListDataSet.Locate(const KeyFields: string;
  297.   const KeyValues: Variant; Options: TLocateOptions): Boolean;
  298. begin
  299.   DoBeforeScroll;
  300.   Result := DataSetLocateThrough(Self, KeyFields, KeyValues, Options);
  301.   if Result then begin
  302.     DataEvent(deDataSetChange, 0);
  303.     DoAfterScroll;
  304.   end;
  305. end;
  306. {$ENDIF RX_D3}
  307. {$IFDEF WIN32}
  308. function TDBListDataSet.GetRecordCount: {$IFNDEF RX_D3} Longint {$ELSE} Integer {$ENDIF};
  309. begin
  310.   Result := dsGetRecordCount(Self);
  311. end;
  312. {$ENDIF WIN32}
  313. { TCustomDatabaseItems }
  314. procedure TCustomDatabaseItems.SetItemType(Value: TDBItemType);
  315. begin
  316.   if ItemType <> Value then begin
  317.     CheckInactive;
  318.     FItemType := Value;
  319.     DataEvent(dePropertyChange, 0);
  320.   end;
  321. end;
  322. procedure TCustomDatabaseItems.SetFileMask(const Value: string);
  323. begin
  324.   if FileMask <> Value then begin
  325.     if Active and (FItemType in [dtTables, dtFiles]) then begin
  326.       DisableControls;
  327.       try
  328.         Close;
  329.         FFileMask := Value;
  330.         Open;
  331.       finally
  332.         EnableControls;
  333.       end;
  334.     end
  335.     else FFileMask := Value;
  336.     DataEvent(dePropertyChange, 0);
  337.   end;
  338. end;
  339. procedure TCustomDatabaseItems.SetExtendedInfo(Value: Boolean);
  340. begin
  341.   if FExtended <> Value then begin
  342.     CheckInactive;
  343.     FExtended := Value;
  344.     DataEvent(dePropertyChange, 0);
  345.   end;
  346. end;
  347. procedure TCustomDatabaseItems.SetSystemItems(Value: Boolean);
  348. begin
  349.   if FSystemItems <> Value then begin
  350.     if Active and (FItemType in [dtTables, dtStoredProcs]) then begin
  351.       DisableControls;
  352.       try
  353.         Close;
  354.         FSystemItems := Value;
  355.         Open;
  356.       finally
  357.         EnableControls;
  358.       end;
  359.     end
  360.     else FSystemItems := Value;
  361.     DataEvent(dePropertyChange, 0);
  362.   end;
  363. end;
  364. function TCustomDatabaseItems.CreateHandle: HDBICur;
  365. var
  366.   WildCard: PChar;
  367.   Pattern: array[0..DBIMAXTBLNAMELEN] of Char;
  368. begin
  369.   WildCard := nil;
  370.   if FileMask <> '' then
  371.     WildCard := AnsiToNative(DBLocale, FileMask, Pattern, SizeOf(Pattern) - 1);
  372.   case FItemType of
  373.     dtTables: Check(DbiOpenTableList(DBHandle, FExtended, FSystemItems, WildCard, Result));
  374.     dtStoredProcs:
  375.       if DataBase.IsSQLBased then
  376.         Check(DbiOpenSPList(DBHandle, FExtended, FSystemItems, nil, Result))
  377.       else DatabaseError(LoadStr(SLocalDatabase));
  378.     dtFiles: Check(DbiOpenFileList(DBHandle, WildCard, Result));
  379. {$IFDEF WIN32}
  380.     dtFunctions:
  381.       if DataBase.IsSQLBased then
  382.         Check(DbiOpenFunctionList(DBHandle, DBIFUNCOpts(FExtended), @Result))
  383.       else DatabaseError(LoadStr(SLocalDatabase));
  384. {$ENDIF}
  385.   end;
  386. end;
  387. function TCustomDatabaseItems.GetItemName: string;
  388. const
  389.   sObjListNameField = 'NAME';
  390.   sFileNameField = 'FILENAME';
  391.   sTabListExtField  = 'EXTENSION';
  392. var
  393.   Temp: string;
  394.   Field: TField;
  395. begin
  396.   Result := '';
  397.   if not Active then Exit;
  398.   if FItemType = dtFiles then Field := FindField(sFileNameField)
  399.   else Field := FindField(sObjListNameField);
  400.   if Field = nil then Exit;
  401.   Result := Field.AsString;
  402.   if FItemType in [dtTables, dtFiles] then begin
  403.     Field := FindField(sTabListExtField);
  404.     if Field = nil then Exit;
  405.     Temp := Field.AsString;
  406.     if Temp <> '' then begin
  407.       if Temp[1] <> '.' then Temp := '.' + Temp;
  408.       Result := Result + Temp;
  409.     end;
  410.   end;
  411. end;
  412. { TCustomTableItems }
  413. procedure TCustomTableItems.SetItemType(Value: TTabItemType);
  414. begin
  415.   if ItemType <> Value then begin
  416.     CheckInactive;
  417.     FItemType := Value;
  418.     DataEvent(dePropertyChange, 0);
  419.   end;
  420. end;
  421. procedure TCustomTableItems.SetPhysTypes(Value: Boolean);
  422. begin
  423.   if Value <> PhysTypes then begin
  424.     if Active and (ItemType = dtFields) then begin
  425.       DisableControls;
  426.       try
  427.         Close;
  428.         FPhysTypes := Value;
  429.         Open;
  430.       finally
  431.         EnableControls;
  432.       end;
  433.     end
  434.     else FPhysTypes := Value;
  435.     DataEvent(dePropertyChange, 0);
  436.   end;
  437. end;
  438. procedure TCustomTableItems.SetTableName(const Value: TFileName);
  439. begin
  440.   if Value <> FTableName then begin
  441.     if Active then begin
  442.       DisableControls;
  443.       try
  444.         Close;
  445.         FTableName := Value;
  446.         if FTableName <> '' then Open;
  447.       finally
  448.         EnableControls;
  449.       end;
  450.     end
  451.     else FTableName := Value;
  452.     DataEvent(dePropertyChange, 0);
  453.   end;
  454. end;
  455. function TCustomTableItems.CreateHandle: HDBICur;
  456. var
  457.   STableName: PChar;
  458. begin
  459.   if FTableName = '' then _DBError(SNoTableName);
  460.   STableName := StrAlloc(Length(FTableName) + 1);
  461.   try
  462.     AnsiToNative(DBLocale, FTableName, STableName, Length(FTableName));
  463.     case FItemType of
  464.       dtFields:
  465.         while not CheckOpen(DbiOpenFieldList(DBHandle, STableName, nil,
  466.           FPhysTypes, Result)) do {Retry};
  467.       dtIndices:
  468.         while not CheckOpen(DbiOpenIndexList(DBHandle, STableName, nil,
  469.           Result)) do {Retry};
  470.       dtValChecks:
  471.         while not CheckOpen(DbiOpenVchkList(DBHandle, STableName, nil,
  472.           Result)) do {Retry};
  473.       dtRefInt:
  474.         while not CheckOpen(DbiOpenRintList(DBHandle, STableName, nil,
  475.           Result)) do {Retry};
  476.       dtSecurity:
  477.         while not CheckOpen(DbiOpenSecurityList(DBHandle, STableName, nil,
  478.           Result)) do {Retry};
  479.       dtFamily:
  480.         while not CheckOpen(DbiOpenFamilyList(DBHandle, STableName, nil,
  481.           Result)) do {Retry};
  482.     end;
  483.   finally
  484.     StrDispose(STableName);
  485.   end;
  486. end;
  487. { TDatabaseDesc }
  488. constructor TDatabaseDesc.Create(const DatabaseName: string);
  489. var
  490.   Buffer: PChar;
  491. begin
  492.   Buffer := StrPCopy(StrAlloc(Length(DatabaseName) + 1), DatabaseName);
  493.   try
  494.     Check(DbiGetDatabaseDesc(Buffer, @FDescription));
  495.   finally
  496.     StrDispose(Buffer);
  497.   end;
  498. end;
  499. { TDriverDesc }
  500. constructor TDriverDesc.Create(const DriverType: string);
  501. var
  502.   Buffer: PChar;
  503. begin
  504.   Buffer := StrPCopy(StrAlloc(Length(DriverType) + 1), DriverType);
  505.   try
  506.     Check(DbiGetDriverDesc(Buffer, FDescription));
  507.   finally
  508.     StrDispose(Buffer);
  509.   end;
  510. end;
  511. {*************************************************************************}
  512. {$IFNDEF CBUILDER}
  513. { TLangDrivList }
  514. constructor TLangDrivList.Create(AOwner: TComponent);
  515. begin
  516.   inherited Create(AOwner);
  517.   FItemType := bdLangDrivers;
  518. end;
  519. { TTableList }
  520. function TTableList.GetTableName: string;
  521. begin
  522.   Result := ItemName;
  523. end;
  524. { TStoredProcList }
  525. constructor TStoredProcList.Create(AOwner: TComponent);
  526. begin
  527.   inherited Create(AOwner);
  528.   FItemType := dtStoredProcs;
  529. end;
  530. { TIndexList }
  531. constructor TIndexList.Create(AOwner: TComponent);
  532. begin
  533.   inherited Create(AOwner);
  534.   FItemType := dtIndices;
  535. end;
  536. {$ENDIF CBUILDER}
  537. end.