8 #include "boost/format.hpp"
31 typedef Map::value_type MapItem;
44 if (
iter->getSchema().compare(
schema, flags) == flags) {
51 if (!
iter->getTable()->getMetadata()) {
53 iter->getTable()->setMetadata(metadata);
54 metadata->set(
"EXTTYPE",
"ARCHIVE_DATA");
55 metadata->set(
"AR_CATN", catArchive,
"# of this catalog relative to the start of this archive");
62 indexRecord->set(indexKeys.id,
id);
63 indexRecord->set(indexKeys.name,
name);
64 indexRecord->set(indexKeys.module, module);
70 indexRecord->set(indexKeys.nRows, 0);
79 indexRecord->set(indexKeys.catPersistable, catPersistable);
80 indexRecord->set(indexKeys.nRows, catalog.
size());
90 "All catalogs passed to saveCatalog must be created by makeCatalog");
95 auto names =
iter->getTable()->getMetadata()->getArray<
std::string>(
"AR_NAME");
96 if (
std::find(names.begin(), names.end(),
name) == names.end()) {
97 iter->getTable()->getMetadata()->add(
"AR_NAME",
name,
"Class name for objects stored here");
100 iter->getTable()->getMetadata()->add(
"AR_NAME",
name,
"Class name for objects stored here");
103 iter->getTable()->getMetadata()->set(
"EXTNAME",
name);
104 indexRecord->set(indexKeys.row0,
iter->size());
105 indexRecord->set(indexKeys.catArchive, catArchive);
121 if (permissive && !obj->isPersistable())
return 0;
126 return put(obj.
get(),
self, permissive);
130 return r.first->second;
136 "# of catalogs in this archive, including the index");
140 iter->writeFits(fitsfile);
146 metadata->set(
"EXTTYPE",
"ARCHIVE_INDEX");
147 metadata->set(
"EXTNAME",
"ARCHIVE_INDEX");
148 metadata->set(
"AR_CATN", 0,
"# of this catalog relative to the start of this archive");
176 if (!_impl.unique()) {
180 return _impl->put(obj, _impl, permissive);
184 if (!_impl.unique()) {
188 return _impl->put(
std::move(obj), _impl, permissive);
194 if (n == 0)
return _impl->_index;
195 if (
std::size_t(n) > _impl->_catalogs.size() || n < 0) {
198 (boost::format(
"Catalog number %d is out of range [0,%d]") % n % _impl->_catalogs.size())
201 return _impl->_catalogs[n - 1];
215 _impl->saveCatalog(catalog, _id, _name, _module, _catPersistable);
222 return _impl->put(obj, _impl, permissive);
228 return _impl->put(
std::move(obj), _impl, permissive);
233 : _id(
id), _catPersistable(0), _name(
name), _module(module), _impl(impl) {}
table::Key< std::string > name
#define LSST_EXCEPT(type,...)
A simple struct that combines the two arguments that must be passed to most cfitsio routines and cont...
std::shared_ptr< RecordT > addNew()
Create a new record, add it to the end of the catalog, and return a pointer to it.
size_type size() const
Return the number of elements in the catalog.
iterator begin()
Iterator access.
std::shared_ptr< Table > getTable() const
Return the table associated with the catalog.
void writeFits(std::string const &filename, std::string const &mode="w", int flags=0) const
Write a FITS binary table to a regular file.
Defines the fields and offsets for a table.
@ EQUAL_NAMES
Fields have the same names (ordered).
@ EQUAL_KEYS
Keys have the same types offsets, and sizes.
A vector of catalogs used by Persistable.
int put(Persistable const *obj, std::shared_ptr< Impl > const &self, bool permissive)
BaseCatalog makeCatalog(Schema const &schema)
int put(std::shared_ptr< Persistable const > obj, std::shared_ptr< Impl > const &self, bool permissive)
void writeFits(fits::Fits &fitsfile)
void saveEmpty(int id, std::string const &name, std::string const &module)
void saveCatalog(BaseCatalog const &catalog, int id, std::string const &name, std::string const &module, int catPersistable)
std::shared_ptr< BaseRecord > addIndexRecord(int id, std::string const &name, std::string const &module)
An object passed to Persistable::write to allow it to persist itself.
void saveCatalog(BaseCatalog const &catalog)
Save a catalog in the archive.
OutputArchiveHandle(const OutputArchiveHandle &)=delete
void saveEmpty()
Indicate that the object being persisted has no state, and hence will never call makeCatalog() or sav...
BaseCatalog makeCatalog(Schema const &schema)
Return a new, empty catalog with the given schema.
int put(Persistable const *obj, bool permissive=false)
Save an object to the archive and return a unique ID that can be used to retrieve it from an InputArc...
A multi-catalog archive object used to save table::io::Persistable objects.
int put(std::shared_ptr< Persistable const > obj, bool permissive=false)
Save an object to the archive and return a unique ID that can be used to retrieve it from an InputArc...
void writeFits(fits::Fits &fitsfile) const
Write the archive to an already-open FITS object.
BaseCatalog const & getCatalog(int n) const
Return the nth catalog. Catalog 0 is always the index catalog.
OutputArchive & operator=(OutputArchive const &other)
Assign from another OutputArchive. Saved objects are not deep-copied.
BaseCatalog const & getIndexCatalog() const
Return the index catalog that specifies where objects are stored in the data catalogs.
OutputArchive()
Construct an empty OutputArchive containing no objects.
int countCatalogs() const
Return the total number of catalogs, including the index.
A base class for objects that can be persisted via afw::table::io Archive classes.
virtual bool isPersistable() const noexcept
Return true if this particular object can be persisted using afw::table::io.
virtual std::string getPythonModule() const
Return the fully-qualified Python module that should be imported to guarantee that its factory is reg...
virtual std::string getPersistenceName() const
Return the unique name used to persist this object and look up its factory.
virtual void write(OutputArchiveHandle &handle) const
Write the object to one or more catalogs.
CatalogT< BaseRecord > BaseCatalog
A base class for image defects.
Schema for the index catalog that specifies where objects are stored in the data catalogs.
static constexpr int const NO_CATALOGS_SAVED
Special value used for catArchive, catPersistable, and row0 when an object with no state is saved.
static ArchiveIndexSchema const & get()
Return the singleton instance.