home *** CD-ROM | disk | FTP | other *** search
/ Chip 2003 February / Chip_2003-02_cd1.bin / zkuste / delphi / kompon / d34567 / KADAO77.ZIP / KDaoWorkspace.pas < prev    next >
Pascal/Delphi Source File  |  2002-08-15  |  16KB  |  501 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 D5UP}
  107. var
  108.   //   ***************************************************
  109.   //   Defined only for Delphi3 and Delphi4
  110.   //   Delphi5 has buildin support for EmptyParam
  111.   //   ***************************************************
  112.   EmptyParam : OleVariant;
  113.   Unassigned : OleVariant;
  114. {$ENDIF}
  115.  
  116.  
  117. {$IFNDEF USEDB}
  118. Procedure DatabaseError(Msg:String);
  119. Begin
  120.   Raise Exception.Create(Msg);
  121. End;
  122. {$ENDIF}
  123.  
  124. Constructor TKADaoWorkspace.Create(AOwner : TComponent);
  125. Begin
  126.  Inherited Create(AOwner);
  127.  F_ComponentVersion     := '5.70';
  128.  F_Destroyng            := False;
  129.  F_ConnectedDatabases   := 0;
  130.  F_RuntimeLicense       := '';
  131.  F_DBEngine := Nil;
  132.  {$IFDEF DYNADAO}
  133.  CoreWorkspace := Unassigned;
  134.  {$ELSE}
  135.  CoreWorkspace := Nil;
  136.  {$ENDIF}
  137.  F_DefaultCursorDriver := DaoApi.dbUseDefaultCursor;
  138.  F_EngineType          := DaoApi.dbUseJet;
  139.  F_IsolateODBCTrans    := False;
  140.  F_LoginTimeout        := 0;
  141.  F_Password            := '';
  142.  F_UserName            := 'Admin';
  143.  F_Workspace           := 'DaoWorkspace';
  144.  F_Connected           := False;
  145.  F_OLE_ON              := False;
  146.  F_Databases           := TStringList.Create;
  147.  F_Databases.Clear;
  148. End;
  149.  
  150. Destructor  TKADaoWorkspace.Destroy;
  151. Begin
  152.   F_Destroyng := True;
  153.   Connected   := False;
  154.   F_Databases.Free;
  155.   ReleaseCore;
  156.   if F_DBEngine <> Nil Then F_DBEngine.Detach(Name,Self);
  157.   Inherited Destroy;
  158. End;
  159.  
  160. Procedure TKADaoWorkspace.Attach(Name : String; Value : TComponent);
  161. Begin
  162.   F_Databases.AddObject(Name,TObject(Value));
  163.   Inc(F_ConnectedDatabases);
  164. End;
  165.  
  166. Procedure TKADaoWorkspace.Detach(Name : String; Value : TComponent);
  167. Var
  168.   I : Integer;
  169. Begin
  170.   I := F_Databases.IndexOf(Name);
  171.   if I <> -1 Then
  172.      Begin
  173.        F_Databases.Delete(I);
  174.        Dec(F_ConnectedDatabases);
  175.      End;
  176. End;
  177.  
  178. Procedure TKADaoWorkspace.ReleaseCore;
  179. Begin
  180.   {$IFDEF DYNADAO}
  181.   If Not VarIsNull(CoreWorkspace) Then CoreWorkspace.Close;
  182.    Try
  183.      VarClear(CoreWorkspace);
  184.    Except
  185.    End;
  186.   {$ELSE}
  187.   if (CoreWorkspace <> Nil) Then CoreWorkspace.Close;
  188.   CoreWorkspace := Nil;                                        
  189.   {$ENDIF}
  190. End;
  191.  
  192. Procedure TKADaoWorkspace.RecreateCore;
  193. Begin
  194.  ReleaseCore;
  195.  CoreWorkspace := F_DBEngine.CoreDBEngine.CreateWorkspace(F_Workspace,F_UserName,F_Password,F_EngineType);
  196.  F_DBEngine.CoreDBEngine.Workspaces.Append(CoreWorkspace);
  197.  if F_EngineType=dbUseODBC Then
  198.     Begin
  199.       CoreWorkspace.LoginTimeOut        := F_LoginTimeOut;
  200.       CoreWorkspace.DefaultCursorDriver := F_DefaultCursorDriver;
  201.     End
  202.  Else
  203.     Begin
  204.       CoreWorkspace.IsolateODBCTrans    := SmallInt(F_IsolateODBCTrans);
  205.     End;
  206. End;
  207.  
  208. Procedure TKADaoWorkspace.Loaded;
  209. Begin
  210.   try
  211.     inherited Loaded;
  212.     if F_Connected Then RecreateCore;
  213.   except
  214.     Application.HandleException(Self)
  215.   end;
  216. End;
  217.  
  218. Procedure TKADaoWorkspace.F_Set_ComponentVersion(Value: String);
  219. Begin
  220.   //******************************************************************* ReadOnly
  221. End;
  222.  
  223. Procedure TKADaoWorkspace.F_Set_ConnectedDatabases(Value : Integer);
  224. Begin
  225.   //******************************************************************* ReadOnly
  226. End;
  227.  
  228. Procedure TKADaoWorkspace.F_Set_DBEngine(Value : TKADaoDBEngine);
  229. Begin
  230.  if (NOT (csLoading in ComponentState)) And (F_Connected) Then DatabaseError(E1033);
  231.  if Name = '' Then Name:='KADaoWorkspace#'+IntToStr(GetTickCount);
  232.  if F_DBEngine <> Nil Then F_DBEngine.Detach(Name,Self);
  233.  F_DBEngine := Value;
  234.  if F_DBEngine <> Nil Then F_DBEngine.Attach(Name,Self);
  235.  if csLoading in ComponentState Then Exit;
  236.  if F_DBEngine=Nil Then Exit;
  237.  F_EngineType   := F_DBEngine.EngineType;
  238.  F_LoginTimeout := F_DBEngine.LoginTimeout;
  239.  F_Password     := F_DBEngine.DefaultPassword;
  240.  F_UserName     := F_DBEngine.DefaultUser;
  241. End;
  242.  
  243. Procedure TKADaoWorkspace.F_Set_DefaultCursorDriver(Value : Integer);
  244. Begin
  245.   if F_Connected Then DatabaseError(E1034);
  246.   F_DefaultCursorDriver:=Value;
  247.   if csLoading in ComponentState Then Exit;
  248. End;
  249.  
  250. Procedure TKADaoWorkspace.F_Set_EngineType(Value : Integer);
  251. Begin
  252.   if F_Connected Then DatabaseError(E1034);
  253.   F_EngineType := Value;
  254.   if (F_DBEngine <> Nil) And (F_EngineType <> F_DBEngine.EngineType) Then F_EngineType := F_DBEngine.EngineType;
  255. End;
  256.  
  257. Procedure TKADaoWorkspace.F_Set_IsolateODBCTrans(Value : Boolean);
  258. Begin
  259.   if F_Connected Then DatabaseError(E1034);
  260.   F_IsolateODBCTrans := Value;
  261.   if csLoading in ComponentState Then Exit;
  262. End;
  263.  
  264. Procedure TKADaoWorkspace.F_Set_LoginTimeout(Value : Integer);
  265. Begin
  266.   if F_Connected Then DatabaseError(E1034);
  267.   F_LoginTimeout := Value;
  268.   if csLoading in ComponentState Then Exit;
  269. End;
  270.  
  271. Procedure TKADaoWorkspace.F_Set_Password(Value : String);
  272. Begin
  273.   if F_Connected Then DatabaseError(E1034);
  274.   F_Password := Value;
  275.   if csLoading in ComponentState Then Exit;
  276. End;
  277.  
  278. Procedure TKADaoWorkspace.F_Set_UserName(Value : String);
  279. Begin
  280.   if F_Connected Then DatabaseError(E1034);
  281.   F_UserName := Value;
  282.   if csLoading in ComponentState Then Exit;
  283. End;
  284.  
  285. Procedure TKADaoWorkspace.F_Set_Workspace(Value : String);
  286. Begin
  287.   if F_Connected Then DatabaseError(E1034);
  288.   F_Workspace := Value;
  289.   if csLoading in ComponentState Then Exit;
  290. End;
  291.  
  292. Procedure TKADaoWorkspace.F_Set_Connected(Value : Boolean);
  293. Var
  294.   X : Integer;
  295. Begin
  296.   if csLoading in ComponentState Then
  297.      Begin
  298.        F_Connected := Value;
  299.        Exit;
  300.      End;
  301.   if Not Value Then
  302.      Begin
  303.         For X := 0 To F_Databases.Count-1 do
  304.             Begin
  305.               {$IFDEF USEDB}
  306.               //****************************************************************
  307.               {$ENDIF}
  308.             End;
  309.      End;
  310.   if Value Then
  311.      Begin
  312.        if Not Assigned(F_DBEngine) Then DatabaseError(E1035);
  313.        if Not F_DBEngine.Connected Then DatabaseError(E1036);
  314.        RecreateCore;
  315.      End;
  316.   F_Connected := Value;
  317. End;
  318.  
  319. Procedure TKADaoWorkspace.Open;
  320. Begin
  321.   Connected := True;
  322. End;
  323.  
  324. Procedure TKADaoWorkspace.Close;
  325. Begin
  326.   Connected := False;
  327. End;
  328.  
  329. Procedure TKADaoWorkspace.StartTransaction;
  330. Begin
  331.   if (NOT F_Connected) Then
  332.      Begin
  333.        DatabaseError(E1023);
  334.        Exit;
  335.      End;
  336.   CoreWorkspace.BeginTrans;
  337. End;
  338.  
  339. Procedure TKADaoWorkspace.Commit;
  340. Begin
  341.  if (NOT F_Connected) Then
  342.      Begin
  343.        DatabaseError(E1024);
  344.        Exit;
  345.      End;
  346.  CoreWorkspace.CommitTrans(dbForceOSFlush);
  347. End;
  348.  
  349. Procedure TKADaoWorkspace.Rollback;
  350. {$IFDEF USEDB}
  351. Var
  352.   X       : Integer;
  353.   ATable  : TComponent;
  354. {$ENDIF}
  355. Begin
  356.  CoreWorkspace.Rollback;
  357.  {$IFDEF USEDB}
  358.  For X :=0 To F_Databases.Count-1 do
  359.      Begin
  360.       //ATable:=???
  361.       //ATable.RollbackRefresh;
  362.      End;
  363.  {$ENDIF}
  364. End;
  365.  
  366. Procedure TKADaoWorkspace.RollbackRefresh;
  367. {$IFDEF USEDB}
  368. Var
  369.   X       : Integer;
  370.   ATable  : TComponent;
  371. {$ENDIF}
  372. Begin
  373.  {$IFDEF USEDB}
  374.  For X :=0 To F_Databases.Count-1 do
  375.      Begin
  376.       //ATable:=???
  377.       //ATable.RollbackRefresh;
  378.      End;
  379.  {$ENDIF}
  380. End;
  381.  
  382. Procedure TKADaoWorkspace.CreateAccessDatabase(DatabaseName:String);
  383. Var
  384.  CreateOptions : String;
  385. Begin
  386.  CreateOptions:=Format(dbLangGeneral,['0x0409','1252','0']);
  387.  {$IFDEF DAO35}
  388.  CoreWorkspace.CreateDatabase(DatabaseName,CreateOptions, dbVersion30);
  389.  {$ENDIF}
  390.  {$IFDEF DAO36}
  391.  CoreWorkspace.CreateDatabase(DatabaseName,CreateOptions, dbVersion40);
  392.  {$ENDIF}
  393.  {$IFDEF DYNADAO}
  394.  if F_DBEngine.Version='3.5' then CoreWorkspace.CreateDatabase(DatabaseName,CreateOptions, dbVersion30);
  395.  if F_DBEngine.Version='3.6' then CoreWorkspace.CreateDatabase(DatabaseName,CreateOptions, dbVersion40);
  396.  {$ENDIF}
  397. End;
  398.  
  399. Procedure TKADaoWorkspace.CreateAccessDatabaseEx(DatabaseName,LANGID,CP,COUNTRY,Password,Version:String;Encrypt:Boolean);
  400. Var
  401.  CreateOptions:String;
  402. Begin
  403.  CreateOptions:=Format(dbLangGeneral,[LANGID,CP,COUNTRY]);
  404.  if Password <> '' Then CreateOptions:=CreateOptions+';PWD='+Password;
  405.  {$IFDEF DAO35}
  406.  if Encrypt Then
  407.     CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30 OR dbEncrypt)
  408.  Else
  409.     CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30);
  410.  {$ENDIF}
  411.  {$IFDEF DAO36}
  412.   if Version='30' Then
  413.      if Encrypt Then
  414.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30 OR dbEncrypt)
  415.      Else
  416.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30)
  417.   Else
  418.      if Encrypt Then
  419.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion40 OR dbEncrypt)
  420.      Else
  421.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion40);
  422.  {$ENDIF}
  423.  {$IFDEF DYNADAO}
  424.  if F_DBEngine.Version='3.5'  Then
  425.  if Encrypt Then
  426.     CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30 OR dbEncrypt)
  427.  Else
  428.     CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30);
  429.  //*****************************************************************************
  430.   if F_DBEngine.Version='3.6'  Then
  431.   if Version='30' Then
  432.      if Encrypt Then
  433.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30 OR dbEncrypt)
  434.      Else
  435.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30)
  436.   Else
  437.      if Encrypt Then
  438.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion40 OR dbEncrypt)
  439.      Else
  440.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion40);
  441.  {$ENDIF}
  442. End;
  443.  
  444. Procedure TKADaoWorkspace.CreateAccessDatabaseEx2(DatabaseName,Language,Password,Version:String;Encrypt:Boolean);
  445. Var
  446.  CreateOptions:String;
  447. Begin
  448.  CreateOptions:=Language;
  449.  if Password <> '' Then CreateOptions:=CreateOptions+';PWD='+Password;
  450.  {$IFDEF DAO35}
  451.  if Encrypt Then
  452.     CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30 OR dbEncrypt)
  453.  Else
  454.     CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30);
  455.  {$ENDIF}
  456.  {$IFDEF DAO36}
  457.   if Version='30' Then
  458.      if Encrypt Then
  459.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30 OR dbEncrypt)
  460.      Else
  461.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30)
  462.   Else
  463.      if Encrypt Then
  464.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion40 OR dbEncrypt)
  465.      Else
  466.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion40);
  467.  {$ENDIF}
  468.  {$IFDEF DYNADAO}
  469.  if F_DBEngine.Version='3.5'  Then
  470.  if Encrypt Then
  471.     CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30 OR dbEncrypt)
  472.  Else
  473.     CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30);
  474.  //*****************************************************************************
  475.   if F_DBEngine.Version='3.6'  Then
  476.   if Version='30' Then
  477.      if Encrypt Then
  478.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30 OR dbEncrypt)
  479.      Else
  480.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion30)
  481.   Else
  482.      if Encrypt Then
  483.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion40 OR dbEncrypt)
  484.      Else
  485.         CoreWorkspace.CreateDatabase(DatabaseName, CreateOptions, dbVersion40);
  486.  {$ENDIF}
  487. End;
  488.  
  489. procedure Register;
  490. begin
  491.   RegisterComponents('KA Dao', [TKADaoWorkspace]);
  492. end;
  493.  
  494. Initialization
  495.  {$IFNDEF D5UP}
  496.   TVarData(Unassigned).VType := varEmpty;
  497.   TVarData(EmptyParam).VType := varError;
  498.   TVarData(EmptyParam).VError := $80020004;
  499.  {$ENDIF}
  500. end.
  501.