Mercurial > hg > ltpda
diff m-toolbox/classes/@collection/fromRepository.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children | b11e88004fca |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/classes/@collection/fromRepository.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,174 @@ +% Retrieve a ltpda_uo from a repository +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% FUNCTION: fromRepository +% +% DESCRIPTION: Retrieve a ltpda_uo from a repository +% +% CALL: obj = fromRepository(pl) +% +% PARAMETER: pl: Parameter list object +% +% VERSION: $Id: fromRepository.m,v 1.8 2010/10/29 16:09:11 ingo Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +function coll = fromRepository(coll, pli) + + VERSION = '$Id: fromRepository.m,v 1.8 2010/10/29 16:09:11 ingo Exp $'; + + % get object info + ii = collection.getInfo('collection', 'From Repository'); + % Set the method version string in the minfo object + ii.setMversion([VERSION '-->' ii.mversion]); + + % Check if the user supplied a DB connection + conn = find(pli, 'conn'); + + % Add default values if necessary + if isempty(conn) + pl = combine(pli, ii.plists); + else + pl = pli; + end + plh = copy(pl, 1); + + % Get parameters + hostname = find(pl, 'hostname'); + database = find(pl, 'database'); + user = find(pl, 'user'); + passwd = find(pl, 'passwd'); + ids = find(pl, 'id'); + cids = find(pl, 'cid'); + bin = find(pl, 'binary'); + + collFound = false; + + %%% check if using binary or not: 'yes'/'no' or true/false or + %%% 'true'/'false' + bin = utils.prog.yes2true(bin); + + % do we have a connection? + closeConn = 0; + if isempty(conn) + closeConn = 1; + % Connect to repository + % Connect to repository + if ~isempty(user) && ~isempty(passwd) + conn = utils.jmysql.connect(hostname, database, user, passwd); + else + conn = utils.jmysql.connect(hostname, database); + end + end + if ~isa(conn, 'database') && ~isa(conn, 'mpipeline.repository.RepositoryConnection') + error('### connection to the database failed.'); + end + + if ~isempty(cids) + for kk=1:numel(cids) + cid = cids(kk); + if isa(conn, 'database') + % get the ids from the cid + ids = [ids utils.mysql.getObjIds(conn,cid)]; + else + c_ids = mpipeline.repository.MySQLUtils.getObjectIDsFromCollectionID(conn, cid); + ids = [ids c_ids.']; + end + end + end + + % Get each ID + Nids = length(ids); + collObjs = {}; + + for kk=1:Nids + + %---- copy the input plist because each object should get an other plist + plh = copy(pl, 1); + + %---- This id + id = ids(kk); + utils.helper.msg(utils.const.msg.OPROC2, 'retrieving ID %d', id); + + try + %---- call database constructor + if bin + try + robj = ltpda_uo.retrieve(conn, 'binary', id); + catch + warning('!!! Unable to do binary retrieval for object %d; trying to retrieve XML instead.', id); + robj = ltpda_uo.retrieve(conn, id); + end + else + robj = ltpda_uo.retrieve(conn, id); + end + + % - remove connection object from plist first + if isempty(hostname) || isempty(database) + txt = textscan(conn.URL, '%s', 'Delimiter', '/', 'CollectOutput', 1); + plc = plist('hostname', txt{1}{3}, 'database', txt{1}{4}); + plh = combine(pli, plc); + end + + %---- remove the connection from the history plist + if plh.isparam('conn') + plh.remove('conn'); + end + + %---- Set only the ID of the current object to the plist + plh.pset('ID', id); + + %---- Add history + robj.addHistoryWoChangingUUID(robj.getInfo(class(robj), 'From Repository'), plh, [], robj.hist); + + %---- Add to output array + if isa(robj, 'collection') + if numel(ids) == 1 + coll = robj; + return + end + + if numel(robj.objs)>0 + collFound = true; + collObjs = [collObjs; robj.objs(:)]; + end + else + collObjs = [collObjs; {robj}]; + end + catch Exception + if closeConn + close(conn); + end + throw(Exception) + end + + end + + % close connection + if closeConn + if isa(conn, 'database') + close(conn); + else + conn.closeConnection; + end + end + + if collFound + warning(sprintf(['!!! The output collection contains the contents of at least one retrieved collection.' ... + '\nThe history of those collection objects is discarded. The internal objects of those ' ... + 'objects is retained.'])); + end + if isempty(collObjs) + warning('!!! No objects were retrieved from the ids %s and/or collection id %s', mat2str(ids), mat2str(cid)); + end + + % Define collection-plist for the history + plh.pset('id', pli.find('id')); + plh.pset('cid', pli.find('cid')); + + % Set properties from the plist + coll.setProperties(pl); + coll.objs = collObjs; + coll.addHistory(ii, plh, [], []); + +end +