4 #include "Alignment/Geners/interface/AbsArchive.hh"
5 #include "Alignment/Geners/interface/IOException.hh"
7 #define GS_STREAM_COPY_BUFFER_SIZE 65536
14 bool in_fail =
in.fail();
15 bool out_fail =
out.fail();
16 while (
count > bufsize && !in_fail && !out_fail) {
21 out_fail =
out.fail();
25 if (!in_fail && !out_fail) {
34 class NotWritableRecord :
public gs::AbsRecord {
36 inline NotWritableRecord(
const gs::ClassId &classId,
const char *ioPrototype,
const char *
name,
const char *
category)
39 NotWritableRecord() =
delete;
42 inline bool writeData(std::ostream &)
const override {
return false; }
47 AbsArchive::AbsArchive(
const char *
name) : name_(
name ?
name :
""), lastItemId_(0), lastItemLength_(0) {}
49 void AbsArchive::addItemToReference(AbsReference &
r,
const unsigned long long id)
const {
r.addItemId(
id); }
51 unsigned long long AbsArchive::copyItem(
const unsigned long long id,
54 const char *newCategory) {
56 throw gs::IOInvalidArgument(
57 "In gs::AbsArchive::copyItem: "
58 "origin archive is not readable");
61 throw gs::IOInvalidArgument(
62 "In gs::AbsArchive::copyItem: "
63 "origin and destination archives are the same");
66 throw gs::IOInvalidArgument(
67 "In gs::AbsArchive::copyItem: "
68 "destination archive is not writable");
69 std::shared_ptr<const CatalogEntry>
entry(catalogEntry(
id));
71 throw gs::IOInvalidArgument(
72 "In gs::AbsArchive::copyItem: no item "
73 "in the archive with the given id");
77 std::istream &is = inputStream(
id, &sz);
81 std::ostream &os = ar.outputStream();
82 std::streampos
base = os.tellp();
83 std::ostream &compressed = ar.compressedStream(os);
86 unsigned long long len;
90 len =
entry->itemLength();
94 "In gs::AbsArchive::copyItem: "
95 "input stream failure");
96 if (compressed.fail())
98 "In gs::AbsArchive::copyItem: "
99 "output stream failure");
100 const unsigned compressCode = ar.flushCompressedRecord(compressed);
102 throw IOWriteFailure(
103 "In gs::AbsArchive::copyItem: "
104 "failed to transfer compressed data");
107 std::streamoff off = os.tellp() -
base;
108 const long long delta = off;
121 const unsigned long long id2 = ar.addToCatalog(
record, compressCode,
delta);
123 throw IOWriteFailure(
124 "In gs::AbsArchive::copyItem: "
125 "failed to add catalog entry");
126 ar.lastItemId_ =
id2;
127 ar.lastItemLength_ =
delta;
133 std::ostringstream
err;
134 err <<
"In operator<<(gs::AbsArchive& ar, const gs::AbsRecord& record): "
135 <<
"failed to " << failedAction <<
" to the archive \"" << ar.name() <<
"\" for item with type \""
136 <<
record.type().name() <<
"\", name \"" <<
record.name() <<
"\", and category \"" <<
record.category() <<
'"';
143 throw gs::IOInvalidArgument(
144 "In operator<<(gs::AbsArchive& ar, const gs::AbsRecord& record): "
145 "records can not be reused");
152 std::ostream &os = ar.outputStream();
153 std::streampos
base = os.tellp();
154 std::ostream &compressed = ar.compressedStream(os);
157 if (!
record.writeData(compressed))
160 const unsigned compressCode = ar.flushCompressedRecord(compressed);
165 std::streamoff off = os.tellp() -
base;
166 const long long delta = off;
170 const unsigned long long id = ar.addToCatalog(
record, compressCode,
delta);
180 ar.lastItemLength_ =
delta;