8#include "boost/format.hpp"
31using MapItem = Map::value_type;
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());
84 if (iter->getTable() == catalog.getTable()) {
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);
106 iter->insert(iter->end(), catalog.begin(), catalog.end(),
false);
111 if (permissive && !obj->isPersistable())
return 0;
114 OutputArchiveHandle handle(currentId, obj->getPersistenceName(), obj->getPythonModule(), self);
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");
177 return _impl->
put(obj, _impl, permissive);
191 if (n == 0)
return _impl->
_index;
195 (boost::format(
"Catalog number %d is out of range [0,%d]") % n % _impl->
_catalogs.
size())
212 _impl->saveCatalog(catalog, _id, _name, _module, _catPersistable);
219 return _impl->put(obj, _impl, permissive);
225 return _impl->put(
std::move(obj), _impl, permissive);
230 : _id(
id), _catPersistable(0), _name(
name), _module(module), _impl(impl) {}
table::Key< std::string > name
#define LSST_EXCEPT(type,...)
Create an exception with a given 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.
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.
std::shared_ptr< BaseRecord > addIndexRecord(int id, std::string const &name, std::string const &module)
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)
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.
std::size_t countCatalogs() const
Return the total number of catalogs, including the index.
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.
A base class for objects that can be persisted via afw::table::io Archive classes.
Class for storing ordered metadata with comments.
Reports attempts to exceed implementation-defined length limits for some classes.
Reports errors in the logical structure of the program.
Reports attempts to access elements using an invalid key.
CatalogT< BaseRecord > BaseCatalog
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.