function [data,columns] = queryDatabase(db,query)
%QUERYDATABASE Query a database.
%   queryDatabase(DATABASE,QUERY) returns results of the query and the
%   column names as cell arrays.  Any errors will be thrown as
%   real errors.
%
%   Example:
%
%     db = database('foo','bar','baz');
%     query = 'select * from something';
%     [data,names] = queryDatabase(db,query)
%     s = cell2struct(data,names,2);
%     close(db);

% Matthew J. Simoneau
% Copyright 1984-2007 The MathWorks, Inc.

curs = exec(db,query);
error(curs.Message);
curs = fetch(curs);
error(curs.Message)
data = curs.Data;

cnames = columnnames(curs);
% This doesn't work if there are single quotes in the field names.
% eval(['columns = {' cnames(:) '};'])
% Use split instead.
columns = split(cnames(2:end-1),''',''');

close(curs)

if isequal(size(data),[1 1]) && isequal(data{1},'No Data')
    data = cell(0,length(columns));
end

function cellArray = split(str,delimiter)
%SPLIT divides a string into a cell array of strings based on a delimiter.
%   SPLIT(STR,DELIMITER) breaks STR into chunks sectioned by DELIMITER and
%   returns a cell array of these chunks.
%
%     >> split('fooMJSbarMJSbaz','MJS')
%     
%     ans = 
%     
%         'foo'
%         'bar'
%         'baz'

% Matthew J. Simoneau, April 2003

dLength = length(delimiter);
matches = strfind(str,delimiter);
if isempty(matches)
    cellArray{1} = str;
else
    cellArray{1} = str(1:matches(1)-1);
    for i = 1:length(matches)-1
        cellArray{end+1,1} = str(matches(i)+dLength:matches(i+1)-1);
    end
    cellArray{end+1,1} = str(matches(end)+dLength:end);
end
