ATLAS Offline Software
Loading...
Searching...
No Matches
DataHeaderCnv_p6.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
9
13#include <climits>
14#include <algorithm>
15
17
18static_assert(std::is_nothrow_move_constructible<DataHeaderCnv_p6>::value);
19
20//______________________________________________________________________________
21bool DataHeaderCnv_p6::persToElem( const DataHeader_p6* pers, unsigned p_idx,
22 DataHeaderElement* trans, const DataHeaderForm_p6& form,
23 bool sameForm ) const
24{
25 int obj_idx = pers->m_shortElements[p_idx];
26 if( obj_idx == INT32_MIN ) return true;
27
28 Token& token = trans->m_token;
29 unsigned db_idx = 0;
30 unsigned long long oid2 = 0;
31 if( obj_idx >= 0 ) {
32 db_idx = pers->m_commonDbIndex;
33 oid2 = pers->m_commonOID2;
34 } else {
35 const FullElement &full_el = pers->m_fullElements[ -1 - obj_idx ];
36 db_idx = full_el.dbIdx;
37 obj_idx = full_el.objIdx;
38 oid2 = full_el.oid2;
39 }
40
41 if( form.sizeDb() > db_idx ) {
42 // Append DbGuid
43 token.setDb( form.getDbGuid( db_idx ) );
44 token.setTechnology( form.getDbTech( db_idx ) );
45 }
46 if( form.sizeObj() > (size_t)obj_idx ) {
47 token.setOid( Token::OID_t( form.getObjOid1(obj_idx), oid2) );
48
49 if (!sameForm) {
50 // If the form hasn't changed, these should all be the same ---
51 // so don't need to copy them again.
52 token.setCont( form.getObjContainer( obj_idx ) );
53 // Append ClassId
54 token.setClassID( form.getObjClassId(obj_idx) );
55 // StoreGate
56 trans->m_key = form.getObjKey( obj_idx );
57 trans->m_alias = form.getObjAlias( obj_idx );
58 trans->m_pClid = form.getObjType( obj_idx );
59 trans->m_clids = form.getObjSymLinks( obj_idx );
60 trans->m_hashes = form.getObjHashes( obj_idx );
61
62 if (!std::ranges::is_sorted (trans->m_alias)) {
63 // Should really be sorted, but just in case...
64 std::ranges::sort (trans->m_alias);
65 auto ret = std::ranges::unique (trans->m_alias);
66 trans->m_alias.erase (ret.begin(), ret.end());
67 }
68 }
69 }
70 return form.sizeDb() > db_idx and form.sizeObj() > (size_t)obj_idx;
71}
72
73//______________________________________________________________________________
75 const DataHeaderForm_p6& form,
76 const Token* dhToken ) const
77{
78 DataHeader* trans = m_dhQueue.get();
79 const unsigned int provSize = pers->m_provenanceSize;
80 // DataHeaders with a self Reference at the end have the list longer by 1 element
81 int selfRefSizeCorrection = (form.version() == DataHeaderForm_p6::DHverFormRef? 1 : 0);
82 size_t nelts = pers->m_shortElements.size() - provSize;
83 bool sameForm = false;
84 if (!pers->dhFormToken().empty() &&
85 pers->dhFormToken() == trans->dhFormToken() &&
86 trans->m_inputDataHeader.size() == provSize &&
87 trans->m_dataHeader.size() == nelts)
88 {
89 sameForm = true;
90 }
91 else {
92 trans->setDhFormToken (pers->dhFormToken());
93 trans->m_inputDataHeader.resize(provSize);
94 trans->m_dataHeader.resize( nelts );
95 }
96
97 // convert all elements - transient vectors need to have the right sizes
98 unsigned i = 0;
99 for( auto& elem : trans->m_dataHeader ) {
100 persToElem( pers, i++, &elem, form, sameForm );
101 // Last entry is the self-reference, which is handled below.
102 if (i == nelts - selfRefSizeCorrection) break;
103 }
104 for( auto& elem : trans->m_inputDataHeader ) {
105 persToElem( pers, i++, &elem, form, sameForm );
106 }
107 // Add the self reference
108 if (selfRefSizeCorrection > 0) {
109 auto& elem = trans->m_dataHeader.back();
110 // convert the self ref that was stored at the end of the element list
111 persToElem( pers, i++, &elem, form, sameForm );
112
113 if( elem.getToken()->contID().find("DataHeader") == std::string::npos ) {
114 // discard wrong element
115 trans->m_dataHeader.pop_back();
116 }
117 }
119 trans->setEvtRefTokenStr( dhToken->toString() );
120 return trans;
121}
122
123
124//______________________________________________________________________________
126 DataHeader_p6* pers,
127 DataHeaderForm_p6& form) const
128{
129 // Translate PoolToken
130 const Token *token = trans->getToken();
131 if( !token ) {
132 // store marker for NO Token
133 pers->m_shortElements.push_back( INT32_MIN );
134 } else {
135 // Database GUID & Technology
136 DataHeaderForm_p6::DbRecord db_rec( token->dbID(), token->technology() );
137 unsigned db_idx = form.insertDb( db_rec );
138 // StoreGate Type/Key & persistent Class GUID
139 DataHeaderForm_p6::ObjRecord transObj( token->classID(), token->contID(), trans->m_key,
140 trans->m_pClid, token->oid().first );
141 unsigned obj_idx = form.insertObj(transObj, trans->m_alias, m_SGAliasFiltering,
142 trans->m_clids, trans->m_hashes);
143 unsigned long long oid2 = token->oid().second;
144
145 // first element sets the common DB
146 if( pers->m_shortElements.empty() ) {
147 // first element - set the common DB and OID2 values
148 pers->m_commonDbIndex = db_idx;
149 pers->m_commonOID2 = oid2;
150 }
151 if( db_idx == pers->m_commonDbIndex && oid2 == pers->m_commonOID2 ) {
152 // Can use short DH element
153 pers->m_shortElements.push_back( obj_idx );
154 } else {
155 // need to use full DH element
156 // store the index (as negative) to the full element in the short vector
157 pers->m_shortElements.push_back( -1 - pers->m_fullElements.size() );
158 pers->m_fullElements.push_back( FullElement(oid2, db_idx, obj_idx) );
159 }
160 }
161}
162
163//______________________________________________________________________________
165{
166 DataHeader_p6* pers = new DataHeader_p6();
167 const unsigned int provSize = trans->m_inputDataHeader.size();
168 pers->m_provenanceSize = provSize;
169
170 pers->m_shortElements.reserve( provSize + trans->m_dataHeader.size() );
171 form.resize(provSize + trans->m_dataHeader.size() + 1);
172 for( const auto& transElem: trans->m_dataHeader ) {
173 elemToPers( &transElem, pers, form );
174 }
175 for( const auto& transElem: trans->m_inputDataHeader ) {
176 elemToPers( &transElem, pers, form );
177 }
178 return pers;
179}
180
181//______________________________________________________________________________
183 const std::string& key, const std::string& tokstr,
184 DataHeaderForm_p6& form ) const
185{
186 Token token;
187 token.fromString( tokstr );
188 DataHeaderElement tEle(ClassID_traits<DataHeader>::ID(), key, std::move(token));
189 elemToPers( &tEle, pers, form );
190}
DataHeader_p6::FullElement FullElement
This file contains the class definition for DataHeaderCnv_p6.
This file contains the class definition for the DataHeader and DataHeaderElement classes.
This file contains the class definitions for the DataHeader_p6 and DataHeaderForm_p6.
void insertDHRef(DataHeader_p6 *pers_dh, const std::string &key, const std::string &dh_tokstr, DataHeaderForm_p6 &dh_form) const
insert DH self reference as one of the DHElements. Contains the stream Key
void elemToPers(const DataHeaderElement *trans, DataHeader_p6 *pers, DataHeaderForm_p6 &form) const
convert single DH element to persistent represenation
DataHeader_p6 * createPersistent(const DataHeader *transObj, DataHeaderForm_p6 &form) const
DataHeader * createTransient(const DataHeader_p6 *persObj, const DataHeaderForm_p6 &form, const Token *dhToken) const
bool persToElem(const DataHeader_p6 *pers, unsigned p_idx, DataHeaderElement *trans, const DataHeaderForm_p6 &form, bool sameForm) const
restore single DH element from persistent represenation return false if p_idx is out of bounds for th...
This class provides a persistent form for the TransientAddress.
Definition DataHeader.h:37
CLID m_pClid
primary ClassID.
Definition DataHeader.h:105
std::string m_key
string with StoreGate key.
Definition DataHeader.h:109
std::vector< std::string > m_alias
vector of StoreGate alias string.
Definition DataHeader.h:111
const Token * getToken() const
std::vector< CLID > m_clids
vector of unsigned long to store ClassID's for symlinked container.
Definition DataHeader.h:107
std::vector< sgkey_t > m_hashes
hash table for ElementLink host container keys.
Definition DataHeader.h:115
Token m_token
Transient address token.
Definition DataHeader.h:113
This class provides storage for the constant fields of the persistent DataHeader class.
const std::string & getObjKey(unsigned int index) const
unsigned int getDbTech(unsigned int index) const
const Guid & getObjClassId(unsigned int index) const
std::size_t sizeObj() const
unsigned int insertDb(const DbRecord &rec)
long long getObjOid1(unsigned int index) const
Guid getDbGuid(unsigned int index) const
const std::string & getObjContainer(unsigned int index) const
void resize(unsigned int size)
std::size_t sizeDb() const
unsigned int getObjType(unsigned int index) const
unsigned version() const
const std::vector< sgkey_t > & getObjHashes(unsigned int index) const
const std::vector< unsigned int > & getObjSymLinks(unsigned int index) const
unsigned int insertObj(const ObjRecord &rec, const std::vector< std::string > &alias=std::vector< std::string >(), bool doAliasFiletering=true, const std::vector< unsigned int > &symLinks=std::vector< unsigned int >(), const std::vector< sgkey_t > &hashes=std::vector< sgkey_t >())
const std::vector< std::string > & getObjAlias(unsigned int index) const
This class provides a persistent representation for the DataHeader class.
unsigned m_commonDbIndex
common DB entry index used by all short DH elements
const std::string & dhFormToken() const
std::vector< int > m_shortElements
std::vector< FullElement > m_fullElements
unsigned long long m_commonOID2
unsigned int m_provenanceSize
This class provides the layout for summary information stored for data written to POOL.
Definition DataHeader.h:123
void setDhFormToken(const std::string &formToken)
void setStatus(statusFlag status)
Set StatusFlag enum for DataHeader.
void setEvtRefTokenStr(const std::string &tokenStr)
const std::string & dhFormToken() const
Form token, to be able to tell when the form changes.
std::vector< DataHeaderElement > m_inputDataHeader
vector with DataHeaderElement to upstream DataHeader ("Provenance").
Definition DataHeader.h:211
std::vector< DataHeaderElement > m_dataHeader
vector with DataHeaderElement to "DataObject".
Definition DataHeader.h:209
This class provides a token that identifies in a unique way objects on the persistent storage.
Definition Token.h:21
Token & setCont(const std::string &cnt)
Set container name.
Definition Token.h:71
Token & setDb(const Guid &db)
Set database name.
Definition Token.h:66
const std::string & contID() const
Access container identifier.
Definition Token.h:69
const Guid & classID() const
Access database identifier.
Definition Token.h:73
Token & setClassID(const Guid &cl_id)
Access database identifier.
Definition Token.h:75
virtual const std::string toString() const
Retrieve the string representation of the token.
Definition Token.cxx:134
int technology() const
Access technology type.
Definition Token.h:77
Token & setOid(const OID_t &oid)
Set object identifier.
Definition Token.h:85
Token & setTechnology(int t)
Set technology type.
Definition Token.h:79
const OID_t & oid() const
Access object identifier.
Definition Token.h:81
Token & fromString(const std::string_view from)
Build from the string representation of a token.
Definition Token.cxx:147
const Guid & dbID() const
Access database identifier.
Definition Token.h:64
unsigned long long oid2