diff m-toolbox/classes/+utils/@mysql/connect.m @ 0:f0afece42f48

Import.
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Wed, 23 Nov 2011 19:22:13 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m-toolbox/classes/+utils/@mysql/connect.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,189 @@
+% CONNECT connects to an LTPDA repository and returns the connection object.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% DESCRIPTION: CONNECT connects to an LTPDA repository and returns the
+%              connection object.
+% 
+%              CONNECT stores a persistent set of logins where a login has
+%              the fields:
+%                  'hostname' - the hostname of the MySQL server
+%                  'db'       - the name of the database
+%                  'user'     - the username for connection to this db
+%                  'passwd'   - the password for this user
+% 
+%              If a login for the requested hostname and db doesn't exist,
+%              or if the existing login is too old (*) then the user is
+%              prompted to log in again.
+%               
+%              (*) the expiry time for MySQL logins is set to 30s.
+%
+% CALL:        conn = connect(hostname)  % connects to 'test' database
+%              conn = connect(hostname, dbname)  % dialog prompt for username and password
+%              [conn, password] = connect(hostname, dbname) % return password to caller
+%              conn = connect(hostname, dbname, dbuser, dbpass) % connect with explicit username and password
+%
+% VERSION:     $Id: connect.m,v 1.8 2010/01/22 12:46:08 ingo Exp $
+%
+% HISTORY:     24-05-2007 M Hewitson
+%                 Creation
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+%              (*) the expiry time for MySQL logins is a property of the
+%              LTPDA Toolbox and can be set in the LTPDA Preferences.
+
+
+function varargout = connect(varargin)
+
+  error('### Obsolete as of LTPDA version 2.2. Replaced my the utils class jmysql (utils.jmysql.%s)', mfilename());
+  if nargin < 1
+    error('### Incorrect inputs')
+  end
+
+  persistent logins;
+  
+  prefs = getappdata(0, 'LTPDApreferences');
+  expTime = prefs.repository.loginExpiry;
+  
+  dbuser = '';
+  dbpass = '';
+
+  force = false;
+  if nargin == 1
+    dbhost = varargin{1};
+    dbname = 'test';
+  elseif nargin == 2
+    dbhost = varargin{1};
+    dbname = varargin{2};
+  elseif nargin == 3
+    dbhost = varargin{1};
+    dbname = varargin{2};
+    force = varargin{3};
+  elseif nargin == 4
+    dbhost = varargin{1};
+    dbname = varargin{2};
+    dbuser = varargin{3};
+    dbpass = varargin{4};
+  elseif nargin == 5
+    dbhost = varargin{1};
+    dbname = varargin{2};
+    dbuser = varargin{3};
+    dbpass = varargin{4};
+    force = varargin{5};
+  end
+  
+  if isempty(logins)
+    % Prompt for username and password
+    [dbuser, dbpass] = getlogin(dbhost, dbname, dbuser, dbpass, force);
+        
+    % in the case the user clicks cancel
+    if ~ischar(dbuser) && ~ischar(dbpass)
+      if (dbuser == -1 && dbpass == -1)
+        varargout{1} = -1;
+        varargout{2} = -1;
+        return
+      end
+    end
+    
+    % Create a new login
+    login.hostname = dbhost;
+    login.db       = dbname;
+    login.user     = dbuser;
+    login.passwd   = dbpass;
+    login.ts       = now;
+    
+    % store this login
+    logins = [logins login];
+    
+  else
+    % look for a login to this hostname/db
+    loginFound = false;
+    for kk=1:numel(logins)
+      login = logins(kk);
+      dt = (now - login.ts) * 86400; % [s]
+      if strcmp(login.hostname, dbhost) && strcmp(login.db, dbname)
+        if dt < expTime
+          % get the username and password from here
+          dbuser = login.user;
+          dbpass = login.passwd;
+          logins(kk).ts = now;
+          loginFound = true;
+          break;
+        end
+      end
+    end    
+    
+    % If we didn't find a login then create a new one
+    if force || isempty(dbuser) || isempty(dbpass)
+      [dbuser, dbpass] = getlogin(dbhost, dbname, dbuser, dbpass, force);
+      
+      % Create a new login
+      login.hostname = dbhost;
+      login.db       = dbname;
+      login.user     = dbuser;
+      login.passwd   = dbpass;
+      login.ts       = now;
+      
+      % store this login
+      if ~loginFound
+        logins = [logins login];      
+      end
+    end
+    
+  end
+  
+  %% return if we don't have a dbuser
+  if isempty(dbuser)
+    return
+  end
+  
+  %% Database settings
+  dbdriver = getappdata(0, 'mysql_driver');
+  dburl    = sprintf('jdbc:mysql://%s/%s',dbhost,dbname);
+
+  disp(sprintf('** Connecting to %s as %s...', dbhost, dbuser))
+
+  conn     = database(dbname,dbuser,dbpass,dbdriver,dburl);
+  disp('** Connection status:')
+  disp(ping(conn))
+
+  % Set outputs
+  if nargout > 0
+    varargout{1} = conn;
+    if nargout == 2
+      varargout{2} = dbpass;
+    end
+  end
+
+end
+
+function [dbuser, dbpass] = getlogin(dbhost, dbname, dbuser, dbpass, force)
+      
+    % first try defaults
+    if isempty(dbuser)
+      dbuser = getappdata(0, 'ltpda_repo_user');
+    end
+    if isempty(dbpass)
+      dbpass = getappdata(0, 'ltpda_repo_pass');
+    end
+    
+    % then log-in dialog
+    if force || isempty(dbuser) || isempty(dbpass)
+
+        ld = logindialog.LoginDialog([], true);
+        ld.setVisible(true)
+        if ~ld.isCancelled
+            dbuser = char(ld.getUsername);
+            dbpass = [char(ld.getPassword)]'; % for some reason we get a column here, so transpose.
+        end
+
+      if isempty(dbuser) || isempty(dbpass)
+        warning('!!! Login process cancelled.');
+        dbuser = -1;
+        dbpass = -1;
+        return
+      end
+    end
+    
+end