home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 June / Chip_2002-06_cd1.bin / zkuste / delphi / kompon / d3456 / KADAO72.ZIP / KDaoWorkspace.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2002-02-26  |  15.6 KB  |  484 lines

  1. unit KDaoWorkspace;
  2. {$B-}
  3. //******************************************************************************
  4. //                           Delphi Dao Project
  5. //                 Copyright (c) 2000-2001 by Kiril Antonov
  6. //******************************************************************************
  7. {DEFINE USEDB}                            //DISABLE IF YOU WANT TO USE PURE DAO
  8. {$I KADaoCommonDirectives.pas}
  9. interface
  10.  
  11. uses
  12. DAOApi,
  13. ComObj,
  14. {$IFDEF DAO35}
  15. DAO35Api,
  16. {$ENDIF}
  17. {$IFDEF DAO36}
  18. DAO36Api,
  19. {$ENDIF}Windows, Messages, SysUtils, Classes, Forms, Dialogs, KDaoDBEngine
  20. {$IFDEF D6UP}, Variants{$ENDIF};
  21.  
  22. //******************************************************* DatabaseError Messages
  23. {$I ErrLangDB.pas}
  24. //******************************************************************************
  25.  
  26. type
  27.   TKADaoWorkspace = class(TComponent)
  28.   private
  29.     { Private declarations }
  30.     F_OLE_ON                    : Boolean;
  31.     F_RuntimeLicense            : String;
  32.     F_Destroyng                 : Boolean;
  33.   protected
  34.     { Protected declarations }
  35.     F_ConnectedDatabases        : Integer;
  36.     F_DBEngine                  : TKADaoDBEngine;
  37.     F_DefaultCursorDriver       : Integer;
  38.     F_EngineType                : Integer;
  39.     F_IsolateODBCTrans          : Boolean;
  40.     F_LoginTimeout              : Integer;
  41.     F_Password                  : String;
  42.     F_UserName                  : String;
  43.     F_Workspace                 : String;
  44.     F_Connected                 : Boolean;
  45.     F_Databases                 : TStringList;
  46.     F_ComponentVersion          : String;
  47.     Procedure F_Set_ComponentVersion      (Value: String);
  48.     Procedure F_Set_ConnectedDatabases    (Value : Integer);
  49.     Procedure F_Set_DBEngine              (Value : TKADaoDBEngine);
  50.     Procedure F_Set_DefaultCursorDriver   (Value : Integer);
  51.     Procedure F_Set_EngineType            (Value : Integer);
  52.     Procedure F_Set_IsolateODBCTrans      (Value : Boolean);
  53.     Procedure F_Set_LoginTimeout          (Value : Integer);
  54.     Procedure F_Set_Password              (Value : String);
  55.     Procedure F_Set_UserName              (Value : String);
  56.     Procedure F_Set_Workspace             (Value : String);
  57.     Procedure F_Set_Connected             (Value : Boolean);
  58.     Procedure Loaded; override;
  59.   public
  60.     { Public declarations }
  61.     {$IFDEF DYNADAO} //****************************************************
  62.     CoreWorkspace               : OleVariant;
  63.     {$ENDIF}
  64.     {$IFDEF DAO35}
  65.     CoreWorkspace               : DAO35Api.Workspace;
  66.     {$ENDIF}
  67.     {$IFDEF DAO36}
  68.     CoreWorkspace               : DAO36Api.Workspace;
  69.     {$ENDIF}
  70.     Procedure                     Attach(Name : String; Value : TComponent);
  71.     Procedure                     Detach(Name : String; Value : TComponent);
  72.     Procedure                     ReleaseCore;
  73.     Procedure                     RecreateCore;
  74.     Procedure                     Open;
  75.     Procedure                     Close;
  76.     Procedure                     StartTransaction;
  77.     Procedure                     Commit;
  78.     Procedure                     Rollback;
  79.     Procedure                     RollbackRefresh;
  80.     Procedure                     CreateAccessDatabase    (DatabaseName:String);
  81.     Procedure                     CreateAccessDatabaseEx  (DatabaseName,LANGID,CP,COUNTRY,Password,Version:String;Encrypt:Boolean);
  82.     Procedure                     CreateAccessDatabaseEx2 (DatabaseName,Language,Password,Version:String;Encrypt:Boolean);
  83.     Constructor                   Create(AOwner : TComponent); override;
  84.     Destructor                    Destroy; override;
  85.   published
  86.     { Published declarations }
  87.     Property ComponentVersion   : String         Read F_ComponentVersion    Write F_Set_ComponentVersion;
  88.     Property ConnectedDatabases : Integer        Read F_ConnectedDatabases  Write F_Set_ConnectedDatabases;
  89.     Property DaoDBEngine        : TKADaoDBEngine Read F_DBEngine            Write F_Set_DBEngine;
  90.     Property DefaultCursorDriver: Integer        Read F_DefaultCursorDriver Write F_Set_DefaultCursorDriver;
  91.     Property EngineType         : Integer        Read F_EngineType          Write F_Set_EngineType;
  92.     Property IsolateODBCTrans   : Boolean        Read F_IsolateODBCTrans    Write F_Set_IsolateODBCTrans;
  93.     Property LoginTimeout       : Integer        Read F_LoginTimeout        Write F_Set_LoginTimeout;
  94.     Property Password           : String         Read F_Password            Write F_Set_Password;
  95.     Property UserName           : String         Read F_UserName            Write F_Set_UserName;
  96.     Property WorkspaceName      : String         Read F_Workspace           Write F_Set_Workspace;
  97.     Property Connected          : Boolean        Read F_Connected           Write F_Set_Connected;
  98.   end;
  99.  
  100. procedure Register;
  101.  
  102. implementation
  103. Uses
  104.   ActiveX {$IFDEF USEDB},DB{$ENDIF};
  105.  
  106. {$IFNDEF USEDB}
  107. Procedure DatabaseError(Msg:String);
  108. Begin
  109.   Raise Exception.Create(Msg);
  110. End;
  111. {$ENDIF}
  112.  
  113. Constructor TKADaoWorkspace.Create(AOwner : TComponent);
  114. Begin
  115.  Inherited Create(AOwner);
  116.  F_ComponentVersion     := '5.70';
  117.  F_Destroyng            := False;
  118.  F_ConnectedDatabases   := 0;
  119.  F_RuntimeLicense       := '';
  120.  F_DBEngine := Nil;
  121.  {$IFDEF DYNADAO}
  122.  CoreWorkspace := Null;
  123.  {$ELSE}
  124.  CoreWorkspace := Nil;
  125.  {$ENDIF}
  126.  F_DefaultCursorDriver := DaoApi.dbUseDefaultCursor;
  127.  F_EngineType          := DaoApi.dbUseJet;
  128.  F_IsolateODBCTrans    := False;
  129.  F_LoginTimeout        := 0;
  130.  F_Password            := '';
  131.  F_UserName            := 'Admin';
  132.  F_Workspace           := 'DaoWorkspace';
  133.  F_Connected           := False;
  134.  F_OLE_ON              := False;
  135.  F_Databases           := TStringList.Create;
  136.  F_Databases.Clear;
  137. End;
  138.  
  139. Destructor  TKADaoWorkspace.Destroy;
  140. Begin
  141.   F_Destroyng := True;
  142.   Connected   := False;
  143.   F_Databases.Free;
  144.   ReleaseCore;
  145.   if F_DBEngine <> Nil Then F_DBEngine.Detach(Name,Self);
  146.   Inherited Destroy;
  147. End;
  148.  
  149. Procedure TKADaoWorkspace.Attach(Name : String; Value : TComponent);
  150. Begin
  151.   F_Databases.AddObject(Name,TObject(Value));
  152.   Inc(F_ConnectedDatabases);
  153. End;
  154.  
  155. Procedure TKADaoWorkspace.Detach(Name : String; Value : TComponent);
  156. Var
  157.   I : Integer;
  158. Begin
  159.   I := F_Databases.IndexOf(Name);
  160.   if I <> -1 Then
  161.      Begin
  162.        F_Databases.Delete(I);
  163.        Dec(F_ConnectedDatabases);
  164.      End;
  165. End;
  166.  
  167. Procedure TKADaoWorkspace.ReleaseCore;
  168. Begin
  169.   {$IFDEF DYNADAO}
  170.   If Not VarIsNull(CoreWorkspace) Then CoreWorkspace.Close;
  171.    Try
  172.      CoreWorkspace := NULL;
  173.    Except
  174.    End;
  175.   {$ELSE}
  176.   if (CoreWorkspace <> Nil) Then CoreWorkspace.Close;
  177.   CoreWorkspace := Nil;                                        
  178.   {$ENDIF}
  179. End;
  180.  
  181. Procedure TKADaoWorkspace.RecreateCore;
  182. Begin
  183.  ReleaseCore;
  184.  CoreWorkspace := F_DBEngine.CoreDBEngine.CreateWorkspace(F_Workspace,F_UserName,F_Password,F_EngineType);
  185.  F_DBEngine.CoreDBEngine.Workspaces.Append(CoreWorkspace);
  186.  if F_EngineType=dbUseODBC Then
  187.     Begin
  188.       CoreWorkspace.LoginTimeOut        := F_LoginTimeOut;
  189.       CoreWorkspace.DefaultCursorDriver := F_DefaultCursorDriver;
  190.     End
  191.  Else
  192.     Begin
  193.       CoreWorkspace.IsolateODBCTrans    := SmallInt(F_IsolateODBCTrans);
  194.     End;
  195. End;
  196.  
  197. Procedure TKADaoWorkspace.Loaded;
  198. Begin
  199.   try
  200.     inherited Loaded;
  201.     if F_Connected Then RecreateCore;
  202.   except
  203.     Application.HandleException(Self)
  204.   end;
  205. End;
  206.  
  207. Procedure TKADaoWorkspace.F_Set_ComponentVersion(Value: String);
  208. Begin
  209.   //******************************************************************* ReadOnly
  210. End;
  211.  
  212. Procedure TKADaoWorkspace.F_Set_ConnectedDatabases(Value : Integer);
  213. Begin
  214.   //******************************************************************* ReadOnly
  215. End;
  216.  
  217. Procedure TKADaoWorkspace.F_Set_DBEngine(Value : TKADaoDBEngine);
  218. Begin
  219.  if (NOT (csLoading in ComponentState)) And (F_Connected) Then DatabaseError(E1033);
  220.  if Name = '' Then Name:='KADaoWorkspace#'+IntToStr(GetTickCount);
  221.  if F_DBEngine <> Nil Then F_DBEngine.Detach(Name,Self);
  222.  F_DBEngine := Value;
  223.  if F_DBEngine <> Nil Then F_DBEngine.Attach(Name,Self);
  224.  if csLoading in ComponentState Then Exit;
  225.  if F_DBEngine=Nil Then Exit;
  226.  F_EngineType   := F_DBEngine.EngineType;
  227.  F_LoginTimeout := F_DBEngine.LoginTimeout;
  228.  F_Password     := F_DBEngine.DefaultPassword;
  229.  F_UserName     := F_DBEngine.DefaultUser;
  230. End;
  231.  
  232. Procedure TKADaoWorkspace.F_Set_DefaultCursorDriver(Value : Integer);
  233. Begin
  234.   if F_Connected Then DatabaseError(E1034);
  235.   F_DefaultCursorDriver:=Value;
  236.   if csLoading in ComponentState Then Exit;
  237. End;
  238.  
  239. Procedure TKADaoWorkspace.F_Set_EngineType(Value : Integer);
  240. Begin
  241.   if F_Connected Then DatabaseError(E1034);
  242.   F_EngineType := Value;
  243.   if (F_DBEngine <> Nil) And (F_EngineType <> F_DBEngine.EngineType) Then F_EngineType := F_DBEngine.EngineType;
  244. End;
  245.  
  246. Procedure TKADaoWorkspace.F_Set_IsolateODBCTrans(Value : Boolean);
  247. Begin
  248.   if F_Connected Then DatabaseError(E1034);
  249.   F_IsolateODBCTrans := Value;
  250.   if csLoading in ComponentState Then Exit;
  251. End;
  252.  
  253. Procedure TKADaoWorkspace.F_Set_LoginTimeout(Value : Integer);
  254. Begin
  255.   if F_Connected Then DatabaseError(E1034);
  256.   F_LoginTimeout := Value;
  257.   if csLoading in ComponentState Then Exit;
  258. End;
  259.  
  260. Procedure TKADaoWorkspace.F_Set_Password(Value : String);
  261. Begin
  262.   if F_Connected Then DatabaseError(E1034);
  263.   F_Password := Value;
  264.   if csLoading in ComponentState Then Exit;
  265. End;
  266.  
  267. Procedure TKADaoWorkspace.F_Set_UserName(Value : String);
  268. Begin
  269.   if F_Connected Then DatabaseError(E1034);
  270.   F_UserName := Value;
  271.   if csLoading in ComponentState Then Exit;
  272. End;
  273.  
  274. Procedure TKADaoWorkspace.F_Set_Workspace(Value : String);
  275. Begin
  276.   if F_Connected Then DatabaseError(E1034);
  277.   F_Workspace := Value;
  278.   if csLoading in ComponentState Then Exit;
  279. End;
  280.  
  281. Procedure TKADaoWorkspace.F_Set_Connected(Value : Boolean);
  282. Var
  283.   X : Integer;
  284. Begin
  285.   if csLoading in ComponentState Then
  286.      Begin
  287.        F_Connected := Value;
  288.        Exit;
  289.      End;
  290.   if Not Value Then
  291.      Begin
  292.         For X := 0 To F_Databases.Count-1 do
  293.             Begin
  294.               {$IFDEF USEDB}
  295.               //****************************************************************
  296.               {$ENDIF}
  297.             End;
  298.      End;
  299.   if Value Then
  300.      Begin
  301.        if Not Assigned(F_DBEngine) Then DatabaseError(E1035);
  302.        if Not F_DBEngine.Connected Then DatabaseError(E1036);
  303.        RecreateCore;
  304.      End;
  305.   F_Connected := Value;
  306. End;
  307.  
  308. Procedure TKADaoWorkspace.Open;
  309. Begin
  310.   Connected := True;
  311. End;
  312.  
  313. Procedure TKADaoWorkspace.Close;
  314. Begin
  315.   Connected := False;
  316. End;
  317.  
  318. Procedure TKADaoWorkspace.StartTransaction;
  319. Begin
  320.   if (NOT F_Connected) Then
  321.      Begin
  322.        DatabaseError(E1023);
  323.        Exit;
  324.      End;
  325.   CoreWorkspace.BeginTrans;
  326. End;
  327.  
  328. Procedure TKADaoWorkspace.Commit;
  329. Begin
  330.  if (NOT F_Connected) Then
  331.      Begin
  332.        DatabaseError(E1024);
  333.        Exit;
  334.      End;
  335.  CoreWorkspace.CommitTrans(dbForceOSFlush);
  336. End;
  337.  
  338. Procedure TKADaoWorkspace.Rollback;
  339. {$IFDEF USEDB}
  340. Var
  341.   X       : Integer;
  342.   ATable  : TComponent;
  343. {$ENDIF}
  344. Begin
  345.  CoreWorkspace.Rollback;
  346.  {$IFDEF USEDB}
  347.  For X :=0 To F_Databases.Count-1 do
  348.      Begin
  349.       //ATable:=???
  350.       //ATable.RollbackRefresh;
  351.      End;
  352.  {$ENDIF}
  353. End;
  354.  
  355. Procedure TKADaoWorkspace.RollbackRefresh;
  356. {$IFDEF USEDB}
  357. Var
  358.   X       : Integer;
  359.   ATable  : TComponent;
  360. {$ENDIF}
  361. Begin
  362.  {$IFDEF USEDB}
  363.  For X :=0 To F_Databases.Count-1 do
  364.      Begin
  365.       //ATable:=???
  366.       //ATable.RollbackRefresh;
  367.      End;
  368.  {$ENDIF}
  369. End;
  370.  
  371. Procedure TKADaoWorkspace.CreateAccessDatabase(DatabaseName:String);
  372. Var
  373.  CreateOptions : String;
  374. Begin
  375.  CreateOptions:=Format(dbLangGeneral,['0x0409','1252','0']);
  376.  {$IFDEF DAO35}
  377.  CoreWorkspace.CreateDatabase(DatabaseName,CreateOptions, dbVersion30);
  378.  {$ENDIF}
  379.  {$IFDEF DAO36}
  380.  CoreWorkspace.CreateDatabase(DatabaseName,CreateOptions, dbVersion40);
  381.  {$ENDIF}
  382.  {$IFDEF DYNADAO}
  383.  if F_DBEngine.Version='3.5' then CoreWorkspace.CreateDatabase(DatabaseName,CreateOptions, dbVersion30);
  384.  if F_DBEngine.Version='3.6' then CoreWorkspace.CreateDatabase(DatabaseName,CreateOptions, dbVersion40);
  385.  {$ENDIF}
  386. End;
  387.  
  388. Procedure TKADaoWorkspace.CreateAccessDatabaseEx(DatabaseName,LANGID,CP,COUNTRY,Password,Version:String;Encrypt:Boolean);
  389. Var
  390.  CreateOptions:String;
  391. Begin
  392.  CreateOptions:=Format(dbLangGeneral,[LANGID,CP,COUNTRY]);
  393.  if Password <> '' Then CreateOptions:=CreateOptions+';PWD='+Password;
  394.  {$IFDEF DAO35}
  395.  if Encrypt Then
  396.     CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30 OR dbEncrypt)
  397.  Else
  398.     CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30);
  399.  {$ENDIF}
  400.  {$IFDEF DAO36}
  401.   if Version='30' Then
  402.      if Encrypt Then
  403.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30 OR dbEncrypt)
  404.      Else
  405.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30)
  406.   Else
  407.      if Encrypt Then
  408.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion40 OR dbEncrypt)
  409.      Else
  410.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion40);
  411.  {$ENDIF}
  412.  {$IFDEF DYNADAO}
  413.  if F_DBEngine.Version='3.5'  Then
  414.  if Encrypt Then
  415.     CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30 OR dbEncrypt)
  416.  Else
  417.     CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30);
  418.  //*****************************************************************************
  419.   if F_DBEngine.Version='3.6'  Then
  420.   if Version='30' Then
  421.      if Encrypt Then
  422.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30 OR dbEncrypt)
  423.      Else
  424.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30)
  425.   Else
  426.      if Encrypt Then
  427.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion40 OR dbEncrypt)
  428.      Else
  429.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion40);
  430.  {$ENDIF}
  431. End;
  432.  
  433. Procedure TKADaoWorkspace.CreateAccessDatabaseEx2(DatabaseName,Language,Password,Version:String;Encrypt:Boolean);
  434. Var
  435.  CreateOptions:String;
  436. Begin
  437.  CreateOptions:=Language;
  438.  if Password <> '' Then CreateOptions:=CreateOptions+';PWD='+Password;
  439.  {$IFDEF DAO35}
  440.  if Encrypt Then
  441.     CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30 OR dbEncrypt)
  442.  Else
  443.     CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30);
  444.  {$ENDIF}
  445.  {$IFDEF DAO36}
  446.   if Version='30' Then
  447.      if Encrypt Then
  448.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30 OR dbEncrypt)
  449.      Else
  450.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30)
  451.   Else
  452.      if Encrypt Then
  453.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion40 OR dbEncrypt)
  454.      Else
  455.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion40);
  456.  {$ENDIF}
  457.  {$IFDEF DYNADAO}
  458.  if F_DBEngine.Version='3.5'  Then
  459.  if Encrypt Then
  460.     CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30 OR dbEncrypt)
  461.  Else
  462.     CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30);
  463.  //*****************************************************************************
  464.   if F_DBEngine.Version='3.6'  Then
  465.   if Version='30' Then
  466.      if Encrypt Then
  467.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30 OR dbEncrypt)
  468.      Else
  469.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30)
  470.   Else
  471.      if Encrypt Then
  472.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion40 OR dbEncrypt)
  473.      Else
  474.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion40);
  475.  {$ENDIF}
  476. End;
  477.  
  478. procedure Register;
  479. begin
  480.   RegisterComponents('KA Dao', [TKADaoWorkspace]);
  481. end;
  482.  
  483. end.
  484.