view m-toolbox/classes/@repogui/cb_get_dbs.m @ 2:18e956c96a1b database-connection-manager

Add LTPDADatabaseConnectionManager implementation. Matlab code
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Sun, 04 Dec 2011 21:23:09 +0100
parents f0afece42f48
children
line wrap: on
line source

% CB_GET_DBS callback when the user clicks the 'get dbs' button.
%
% M Hewitson 22-09-08
%
% $Id: cb_get_dbs.m,v 1.7 2011/04/08 08:56:26 hewitson Exp $
%

function cb_get_dbs(varargin)

  % Handles
  myh     = varargin{1};
  mainfig = varargin{end};
  status  = findobj(mainfig.handle, 'Tag', 'RepoguiStatusTxt');
  set(status,'String','*** Retrieving databases...');

  tables = {'collections', 'objmeta', 'objs', 'transactions', 'users'};

  % Get conn
  conn = mainfig.connection;
  % Assume I don't need to open the connection
  wasEmpty = 0;

  % Open connection, if necessary
  if isempty(conn)

    % we opened the connection
    wasEmpty = 1;

    % have we a stored username and password
    dbuser = mainfig.dbuser;
    dbpass = mainfig.dbpass;

    % get hostname
    hostname = get(findobj(mainfig.handle, 'Tag','RepoguiServerEdit'), 'String');
    if isempty(hostname)
      set(status,'String','Impossible to connect: please select a server first');
      error('### Please select a server to connect to.');
    end

    % verify if the server is reachable
    try
      java.net.InetAddress.getByName(hostname);
    catch
      set(status,'String','Impossible to connect: server not responding or no internet connection available');
      error('### Please check internet connection and server availability.');
    end
    
    % connect
    try
       if ~isempty(dbuser) && ~isempty(dbpass)
          conn = utils.mysql.connect(hostname, 'test', dbuser, dbpass);
       else
          [conn, dbpass] = utils.mysql.connect(hostname);
       end
    catch
        set(status,'String','Impossible to connect: please check the provided username and password');
        error('### Please check the provided username and password')
    end

    if ~ischar(conn) && ~ischar(dbpass)
      if conn==-1 && dbpass==-1
        % user cancelled
        return;
      end
    end

    if ~isa(conn, 'database')
      error('### couldn''t connect to server');
    end

    % store the connection
    mainfig.dbuser = conn.Username;
    mainfig.dbpass = dbpass;
  else
      hostname = get(findobj(mainfig.handle, 'Tag','RepoguiServerEdit'), 'String');
  end

  % get the databases
  q = 'show databases';
  curs = exec(conn, q);
  curs = fetch(curs);

  ltpda_dbs = [];
  % Now get the LTPDA databases
  for j=1:length(curs.Data)
    db = curs.Data{j};

    if ~strcmp(db, 'information_schema')

      q = sprintf('show tables from %s', db);
      c = exec(conn, q);
      c = fetch(c);
      match = 0;
      for l=1:length(c.Data)
        for k=1:length(tables)
          if strcmp(c.Data{l}, tables{k})
            match = match + 1;
          end
        end
      end
      close(c);
      if match == 5
        % we have an LTPDA database
        ltpda_dbs = [ltpda_dbs cellstr(db)];
      end
    end

  end
  close(curs);

  % If I opened the connection, close it again
  if wasEmpty
    close(conn);
  end

  % Set the list
  id = findobj(mainfig.handle, 'Tag', 'RepoguiDatabaseList');
  set(id, 'String', ltpda_dbs, 'Value', 1);

  % Get selected DB
  dbh = findobj(mainfig.handle, 'Tag', 'RepoguiDatabaseList');
  dbs = get(dbh, 'String');
  db  = dbs{1};

  % set selected DB
  dbh = findobj(mainfig.handle, 'Tag', 'RepoguiDatabaseEdit');
  set(dbh, 'String', db);

  set(status, 'String', ['Database list retrieved from ' hostname],'ForeGroundcolor','b');
end