home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 October / PCWorld_2000-10_cd2.bin / Borland / interbase / IBConsole_src.ZIP / ibconsole / frmuDBConnect.pas < prev    next >
Pascal/Delphi Source File  |  2000-07-24  |  10KB  |  281 lines

  1. {
  2.  * The contents of this file are subject to the InterBase Public License
  3.  * Version 1.0 (the "License"); you may not use this file except in
  4.  * compliance with the License.
  5.  * 
  6.  * You may obtain a copy of the License at http://www.Inprise.com/IPL.html.
  7.  * 
  8.  * Software distributed under the License is distributed on an "AS IS"
  9.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  10.  * the License for the specific language governing rights and limitations
  11.  * under the License.  The Original Code was created by Inprise
  12.  * Corporation and its predecessors.
  13.  * 
  14.  * Portions created by Inprise Corporation are Copyright (C) Inprise
  15.  * Corporation. All Rights Reserved.
  16.  * 
  17.  * Contributor(s): ______________________________________.
  18. }
  19.  
  20. {****************************************************************
  21. *
  22. *  f r m u D B C o n n e c t
  23. *
  24. ****************************************************************
  25. *  Author: The Client Server Factory Inc.
  26. *  Date:   March 1, 1999
  27. *
  28. *  Description:  This unit provides an interface for attaching to
  29. *                a database
  30. *
  31. *****************************************************************
  32. * Revisions:
  33. *
  34. *****************************************************************}
  35. unit frmuDBConnect;
  36.  
  37. interface
  38.  
  39. uses
  40.   Windows, SysUtils, Forms, ExtCtrls, StdCtrls, Classes, Controls,
  41.   zluibcClasses, IB, Messages, frmuDlgClass;
  42.  
  43. type
  44.   TfrmDBConnect = class(TDialog)
  45.     lblDatabaseName: TLabel;
  46.     bvlLine1: TBevel;
  47.     lblUsername: TLabel;
  48.     lblPassword: TLabel;
  49.     lblRole: TLabel;
  50.     Label1: TLabel;
  51.     cbDialect: TComboBox;
  52.     btnConnect: TButton;
  53.     btnCancel: TButton;
  54.     edtRole: TEdit;
  55.     edtPassword: TEdit;
  56.     edtUsername: TEdit;
  57.     stxDatabaseName: TStaticText;
  58.     cbCaseSensitive: TCheckBox;
  59.     function FormHelp(Command: Word; Data: Integer; var CallHelp: Boolean): Boolean;
  60.     procedure btnCancelClick(Sender: TObject);
  61.     procedure btnConnectClick(Sender: TObject);
  62.     procedure edtRoleChange(Sender: TObject);
  63.   private
  64.     { Private declarations }
  65.     function VerifyInputData(): boolean;
  66.   public
  67.     { Public declarations }
  68.   end;
  69.  
  70. function DBConnect(var CurrSelDatabase: TibcDatabaseNode; const CurrSelServer: TibcServerNode; const SilentConnect: boolean): boolean;
  71.  
  72. implementation
  73.  
  74. uses
  75.   IBServices, frmuMessage, zluGlobal, zluContextHelp;
  76.  
  77. {$R *.DFM}
  78.  
  79. {****************************************************************
  80. *
  81. *  D B C o n n e c t ( )
  82. *
  83. ****************************************************************
  84. *  Author: The Client Server Factory Inc.
  85. *  Date:   March 1, 1999
  86. *
  87. *  Input:  CurrSelDatabase - The specified database
  88. *          CurrSelServer   - The specified server
  89. *          SilentConnect   - Indicates whether or not to prompt
  90. *                            the user for login information or
  91. *                            to use the default login information.
  92. *
  93. *  Return: Boolean - Indicates the success/failure of the operation
  94. *
  95. *  Description:  Connects to the specified database of the
  96. *                specified server.  If SilentConnect is false the
  97. *                user is prompted for login information.
  98. *
  99. *****************************************************************
  100. * Revisions:
  101. *
  102. *****************************************************************}
  103. function DBConnect(var CurrSelDatabase: TibcDatabaseNode;
  104.   const CurrSelServer: TibcServerNode;
  105.   const SilentConnect: boolean): boolean;
  106. var
  107.   frmDBConnect: TfrmDBConnect;
  108.   attachDialect: integer;
  109. begin
  110.   frmDBConnect := nil;
  111.   CurrSelDatabase.UserName := CurrSelServer.UserName;
  112.   CurrSelDatabase.Password := CurrSelServer.Password;
  113.  
  114.   // check if a SilentConnect is specified
  115.   if not SilentConnect then
  116.   begin
  117.     try
  118.       frmDBConnect:= TfrmDBConnect.Create(Application);
  119.       frmDBConnect.stxDatabaseName.Caption := CurrSelDatabase.NodeName;
  120.       frmDBConnect.edtUsername.Text := CurrSelDatabase.UserName;
  121.       frmDBConnect.edtRole.Text := CurrSelDatabase.Role;
  122.       frmDBConnect.cbDialect.ItemIndex := 2; // default to dialect 3
  123.       frmDBConnect.ShowModal;
  124.       if frmDBConnect.ModalResult = mrOK then
  125.       begin
  126.         // set username, password and role
  127.         CurrSelDatabase.UserName := frmDBConnect.edtUsername.Text;
  128.         CurrSelDatabase.Password := frmDBConnect.edtPassword.Text;
  129.         if frmDBConnect.cbCaseSensitive.Checked then
  130.         begin
  131.           CurrSelDatabase.Role := frmDBConnect.edtRole.Text;
  132.           attachDialect := 3;
  133.         end
  134.         else
  135.         begin
  136.           CurrSelDatabase.Role := frmDBConnect.edtRole.Text;
  137.           attachDialect := 1;
  138.         end;
  139.         CurrSelDatabase.Database.SQLDialect := frmDBConnect.cbDialect.ItemIndex+1;
  140.       end
  141.       else
  142.       begin
  143.         result := false;
  144.         Exit;
  145.       end;
  146.     finally
  147.       // deallocate memory
  148.       frmDBConnect.Free;
  149.     end;
  150.   end
  151.   else
  152.     if CurrSelDatabase.CaseSensitiveRole then
  153.       attachDialect := 3
  154.     else
  155.       attachDialect := 1;
  156.       
  157.   // if a silent connect was specified or the proper login information was supplied
  158.   try
  159.     Screen.Cursor := crHourGlass;
  160.     // check if the database isn't already connected
  161.     if (not Assigned(CurrSelDatabase.Database)) or
  162.        (not CurrSelDatabase.Database.Connected) then
  163.     begin
  164.       // check if a database file has been specified
  165.       if CurrSelDatabase.DatabaseFiles.Count > 0 then
  166.       begin
  167.         // construct UNC path to database file
  168.         case CurrSelServer.Server.Protocol of
  169.           TCP: CurrSelDatabase.Database.DatabaseName := Format('%s:%s',[CurrSelServer.ServerName,CurrSelDatabase.DatabaseFiles.Strings[0]]);
  170.           NamedPipe: CurrSelDatabase.Database.DatabaseName := Format('\\%s\%s',[CurrSelServer.ServerName,CurrSelDatabase.DatabaseFiles.Strings[0]]);
  171.           SPX: CurrSelDatabase.Database.DatabaseName := Format('%s@%s',[CurrSelServer.ServerName,CurrSelDatabase.DatabaseFiles.Strings[0]]);
  172.           Local:  CurrSelDatabase.Database.DatabaseName := CurrSelDatabase.DatabaseFiles.Strings[0];
  173.         end;
  174.       end;
  175.       // clear database parameters and submit login details
  176.       CurrSelDatabase.Database.Params.Clear;
  177.       CurrSelDatabase.Database.Params.Add(Format('isc_dpb_user_name=%s',[CurrSelDatabase.UserName]));
  178.       CurrSelDatabase.Database.Params.Add(Format('isc_dpb_password=%s',[CurrSelDatabase.Password]));
  179.       if attachDialect = 3 then
  180.         CurrSelDatabase.Database.Params.Add(Format('isc_dpb_sql_role_name="%s"',[CurrSelDatabase.Role]))
  181.       else
  182.         CurrSelDatabase.Database.Params.Add(Format('isc_dpb_sql_role_name=%s',[CurrSelDatabase.Role]));
  183.       CurrSelDatabase.Database.Params.Add(Format('isc_dpb_SQL_dialect=%d',[attachDialect]));
  184.  
  185.       // attempt to connect to the database
  186.       CurrSelDatabase.Database.Connected := true;
  187.       Application.ProcessMessages;
  188.  
  189.       // Check to see if the database dialect matches, the client dialect
  190.       with CurrSelDatabase.Database do begin
  191.         if not SilentConnect then begin
  192.           if DBSQLDialect <> SQLDialect then
  193.             DisplayMsg (WAR_DIALECT_MISMATCH,
  194.             Format ('Database dialect (%d) does not match client dialect (%d).',[DBSQLDialect, SQLDialect]));
  195.         end else
  196.           SQLDialect := DBSqlDialect;
  197.       end;
  198.     end;
  199.       result := true;
  200.       Screen.Cursor := crDefault;
  201.   except                               // if an exception occurs then trap it
  202.     on E:EIBError do                   // and show error message
  203.     begin
  204.       DisplayMsg(ERR_DB_CONNECT,E.Message);
  205.       result := false;
  206.       Screen.Cursor := crDefault;
  207. { TODO: This was removed to remove a crash when connecting to a non-existent db }      
  208. //      CurrSelDatabase := nil;
  209.     end;
  210.   end;
  211. end;
  212.  
  213. function TfrmDBConnect.FormHelp(Command: Word; Data: Integer;
  214.   var CallHelp: Boolean): Boolean;
  215. begin
  216.   CallHelp := False;
  217.   // call WinHelp and show Database Connect topic
  218.   Result := WinHelp(WindowHandle,CONTEXT_HELP_FILE,HELP_CONTEXT,DATABASE_CONNECT);
  219. end;
  220.  
  221. procedure TfrmDBConnect.btnCancelClick(Sender: TObject);
  222. begin
  223.   ModalResult := mrCancel;
  224. end;
  225.  
  226. procedure TfrmDBConnect.btnConnectClick(Sender: TObject);
  227. begin
  228.   if VerifyInputData() then
  229.     ModalResult := mrOK;
  230. end;
  231.  
  232. {****************************************************************
  233. *
  234. *  V e r i f y I n p u t D a t a ( )
  235. *
  236. ****************************************************************
  237. *  Author: The Client Server Factory Inc.
  238. *  Date:   March 1, 1999
  239. *
  240. *  Input:  None
  241. *
  242. *  Return: Boolean - Indicates the success/failure of the operation
  243. *
  244. *  Description:  Performs some basic validation on data entered by
  245. *                the user
  246. *
  247. *****************************************************************
  248. * Revisions:
  249. *
  250. *****************************************************************}
  251. function TfrmDBConnect.VerifyInputData(): boolean;
  252. begin
  253.   result := true;
  254.  
  255.   // if username was not specified
  256.   if (edtUsername.Text = '') or (edtUsername.Text = ' ') then
  257.   begin
  258.     DisplayMsg(ERR_USERNAME,'');       // show error message
  259.     edtUsername.SetFocus;              // give focus to control
  260.     result := false;
  261.     Exit;
  262.   end;
  263.  
  264.   // if password was not specified
  265.   if (edtPassword.Text = '') or (edtPassword.Text = ' ') then
  266.   begin
  267.     DisplayMsg(ERR_PASSWORD,'');       // show error message
  268.     edtPassword.SetFocus;              // give focus to control
  269.     result := false;
  270.     Exit;
  271.   end;
  272. end;
  273.  
  274. procedure TfrmDBConnect.edtRoleChange(Sender: TObject);
  275. begin
  276.   inherited;
  277.   cbCaseSensitive.Enabled := (edtRole.GetTextLen > 0);
  278. end;
  279.  
  280. end.
  281.