LSSTApplications  16.0-1-gce273f5+20,16.0-10-gc1446dd+20,16.0-12-g569485f+3,16.0-13-g5e87145+4,16.0-13-g5f20d24,16.0-13-g80874fd+2,16.0-13-gb122224+11,16.0-13-gd9b1b71+20,16.0-14-g08f9460+3,16.0-15-g77ef378+6,16.0-17-g6a7bfb3b+20,16.0-17-ged3ab9d,16.0-18-gdf247dd+1,16.0-2-g0febb12+16,16.0-2-g839ba83+58,16.0-2-g9d5294e+45,16.0-2-gc6e0ed0+4,16.0-23-ge8a9b866+2,16.0-3-g404ea43+12,16.0-3-gbc759ec+18,16.0-3-gcfd6c53+43,16.0-4-g03cf288+34,16.0-4-g13a27c5+20,16.0-4-g5f3a788+15,16.0-4-g8a0f11a+42,16.0-4-ga3eb747+5,16.0-5-g1991253+20,16.0-5-g1e9226d+3,16.0-5-g865efd9+22,16.0-5-gb3f8a4b+52,16.0-5-gd0f1235+9,16.0-51-gb4b4a8566+2,16.0-7-g6043bfc+8,16.0-7-gd2eeba5+2,16.0-7-gde5bd64+2,16.0-8-g0e813a6,16.0-8-g4dec96c+33,16.0-8-gfd407c0+5,16.0-9-g2f60796+2,master-g5768c874b9+4,w.2018.41
LSSTDataManagementBasePackage
Persistence.cc
Go to the documentation of this file.
1 // -*- lsst-c++ -*-
2 
3 /*
4  * LSST Data Management System
5  * Copyright 2008, 2009, 2010 LSST Corporation.
6  *
7  * This product includes software developed by the
8  * LSST Project (http://www.lsst.org/).
9  *
10  * This program is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation, either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the LSST License Statement and
21  * the GNU General Public License along with this program. If not,
22  * see <http://www.lsstcorp.org/LegalNotices/>.
23  */
24 
25 
38 #ifndef __GNUC__
39 # define __attribute__(x) /*NOTHING*/
40 #endif
41 static char const* SVNid __attribute__((unused)) = "$Id$";
42 
44 
45 #include <boost/regex.hpp>
46 
50 #include "lsst/pex/policy/Policy.h"
52 
53 namespace lsst {
54 namespace daf {
55 namespace persistence {
56 
60 Persistence::Persistence(lsst::pex::policy::Policy::Ptr policy) :
61  lsst::daf::base::Citizen(typeid(*this)), _policy(policy) {
62 }
63 
67 }
68 
76 FormatterStorage::Ptr Persistence::_getStorage(std::string const& storageType,
77  LogicalLocation const& location,
78  bool persist) {
80  if (_policy && _policy->exists(storageType)) {
81  policyPtr = _policy->getPolicy(storageType);
82  }
83  return FormatterStorage::createInstance(storageType, location, persist, policyPtr);
84 }
85 
92  LogicalLocation const& location) {
93  return _getStorage(storageType, location, true);
94 }
95 
102  LogicalLocation const& location) {
103  return _getStorage(storageType, location, false);
104 }
105 
114  lsst::daf::base::PropertySet::Ptr additionalData) {
115  // Get the policies for all Formatters, if present
116  std::string policyName = "Formatter";
118  if (_policy && _policy->exists(policyName)) {
119  policyPtr = _policy->getPolicy(policyName);
120  }
121  // Find the appropriate Formatter.
122  Formatter::Ptr f =
123  Formatter::lookupFormatter(typeid(persistable), policyPtr);
124  // Use the Formatter instance to write the Persistable to each FormatterStorage
125  // in turn. Commit the transactions (in order) when all writing is
126  // complete.
127  for (FormatterStorage::List::const_iterator it = storageList.begin();
128  it != storageList.end(); ++it) {
129  (*it)->startTransaction();
130  f->write(&persistable, *it, additionalData);
131  }
132  for (FormatterStorage::List::const_iterator it = storageList.begin();
133  it != storageList.end(); ++it) {
134  (*it)->endTransaction();
135  }
136 }
137 
148  std::string const& persistableType, FormatterStorage::List const& storageList,
149  lsst::daf::base::PropertySet::Ptr additionalData) {
150  // Get the policies for all Formatters, if present
151  std::string policyName = "Formatter";
153  if (_policy && _policy->exists(policyName)) {
154  policyPtr = _policy->getPolicy(policyName);
155  }
156  // Find the appropriate Formatter.
157  Formatter::Ptr f = Formatter::lookupFormatter(persistableType, policyPtr);
158  // Use the Formatter instance to read from the first FormatterStorage; then update
159  // from each additional FormatterStorage in turn.
161  for (FormatterStorage::List::const_iterator it = storageList.begin();
162  it != storageList.end(); ++it) {
163  (*it)->startTransaction();
164  if (!persistable) {
165  persistable = f->read(*it, additionalData);
166  } else {
167  f->update(persistable, *it, additionalData);
168  }
169  }
170  for (FormatterStorage::List::const_iterator it = storageList.begin();
171  it != storageList.end(); ++it) {
172  (*it)->endTransaction();
173  }
174  return persistable;
175 }
176 
186  std::string const& persistableType, FormatterStorage::List const& storageList,
187  lsst::daf::base::PropertySet::Ptr additionalData) {
189  unsafeRetrieve(persistableType, storageList, additionalData));
190 }
191 
198  return Persistence::Ptr(new Persistence(policy));
199 }
200 
206 {
207  return _policy;
208 }
209 
210 
211 }}} // namespace lsst::daf::persistence
static Ptr getPersistence(lsst::pex::policy::Policy::Ptr policy)
Create a Persistence object.
Definition: Persistence.cc:196
Interface for FormatterStorage abstract base class.
Class for logical location of a persisted Persistable instance.
virtual void persist(lsst::daf::base::Persistable const &persistable, FormatterStorage::List const &storageList, lsst::daf::base::PropertySet::Ptr additionalData)
Persist a Persistable instance.
Definition: Persistence.cc:112
lsst::pex::policy::Policy::Ptr getPolicy() const
Return the policy used to configure the Persistence object.
Definition: Persistence.cc:205
virtual ~Persistence(void)
Destructor.
Definition: Persistence.cc:66
T end(T... args)
Interface for Persistable base class.
Class implementing object persistence.
Definition: Persistence.h:68
STL class.
Interface for Formatter abstract base class.
A base class for image defects.
Definition: cameraGeom.dox:3
virtual FormatterStorage::Ptr getRetrieveStorage(std::string const &storageType, LogicalLocation const &location)
Create a FormatterStorage subclass configured to retrieve from a location.
Definition: Persistence.cc:101
virtual FormatterStorage::Ptr getPersistStorage(std::string const &storageType, LogicalLocation const &location)
Create a FormatterStorage subclass configured to persist to a location.
Definition: Persistence.cc:91
static Formatter::Ptr lookupFormatter(std::string const &persistableType, lsst::pex::policy::Policy::Ptr policy)
Lookup Formatter subclass by name of Persistable subclass.
Definition: Formatter.cc:84
virtual lsst::daf::base::Persistable * unsafeRetrieve(std::string const &persistableType, FormatterStorage::List const &storageList, lsst::daf::base::PropertySet::Ptr additionalData)
Retrieve a Persistable instance, returning an unsafe bare pointer.
Definition: Persistence.cc:147
static Ptr createInstance(std::string const &name, LogicalLocation const &location, bool persist, lsst::pex::policy::Policy::Ptr policy)
Create and configure a FormatterStorage subclass instance.
STL class.
Interface for Persistence class.
T begin(T... args)
std::shared_ptr< Persistence > Ptr
Definition: Persistence.h:70
std::shared_ptr< Persistable > Ptr
Definition: Persistable.h:77
virtual lsst::daf::base::Persistable::Ptr retrieve(std::string const &persistableType, FormatterStorage::List const &storageList, lsst::daf::base::PropertySet::Ptr additionalData)
Retrieve a Persistable instance.
Definition: Persistence.cc:185
Base class for all persistable classes.
Definition: Persistable.h:75
Citizen is a class that should be among all LSST classes base classes, and handles basic memory manag...
Definition: Citizen.h:55
Interface for LogicalLocation class.
#define __attribute__(x)
Definition: Persistence.cc:39