ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
Database
PersistentDataModelTPCnv
src
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
10
#include "
PersistentDataModel/DataHeader.h
"
11
#include "
PersistentDataModelTPCnv/DataHeader_p6.h
"
12
#include "
PersistentDataModelTPCnv/DataHeaderCnv_p6.h
"
13
#include <climits>
14
#include <algorithm>
15
16
using
FullElement
=
DataHeader_p6::FullElement
;
17
18
static_assert
(std::is_nothrow_move_constructible<DataHeaderCnv_p6>::value);
19
20
//______________________________________________________________________________
21
bool
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
//______________________________________________________________________________
74
DataHeader
*
DataHeaderCnv_p6::createTransient
(
const
DataHeader_p6
* pers,
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
}
118
trans->
setStatus
(
DataHeader::Input
);
119
trans->
setEvtRefTokenStr
( dhToken->
toString
() );
120
return
trans;
121
}
122
123
124
//______________________________________________________________________________
125
void
DataHeaderCnv_p6::elemToPers
(
const
DataHeaderElement
* trans,
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
//______________________________________________________________________________
164
DataHeader_p6
*
DataHeaderCnv_p6::createPersistent
(
const
DataHeader
* trans,
DataHeaderForm_p6
& form)
const
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
//______________________________________________________________________________
182
void
DataHeaderCnv_p6::insertDHRef
(
DataHeader_p6
* pers,
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
}
FullElement
DataHeader_p6::FullElement FullElement
Definition
DataHeaderCnv_p6.cxx:16
DataHeaderCnv_p6.h
This file contains the class definition for DataHeaderCnv_p6.
DataHeader.h
This file contains the class definition for the DataHeader and DataHeaderElement classes.
DataHeader_p6.h
This file contains the class definitions for the DataHeader_p6 and DataHeaderForm_p6.
DataHeaderCnv_p6::insertDHRef
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
Definition
DataHeaderCnv_p6.cxx:182
DataHeaderCnv_p6::elemToPers
void elemToPers(const DataHeaderElement *trans, DataHeader_p6 *pers, DataHeaderForm_p6 &form) const
convert single DH element to persistent represenation
Definition
DataHeaderCnv_p6.cxx:125
DataHeaderCnv_p6::createPersistent
DataHeader_p6 * createPersistent(const DataHeader *transObj, DataHeaderForm_p6 &form) const
Definition
DataHeaderCnv_p6.cxx:164
DataHeaderCnv_p6::createTransient
DataHeader * createTransient(const DataHeader_p6 *persObj, const DataHeaderForm_p6 &form, const Token *dhToken) const
Definition
DataHeaderCnv_p6.cxx:74
DataHeaderCnv_p6::m_SGAliasFiltering
bool m_SGAliasFiltering
Definition
DataHeaderCnv_p6.h:47
DataHeaderCnv_p6::persToElem
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...
Definition
DataHeaderCnv_p6.cxx:21
DataHeaderElement
This class provides a persistent form for the TransientAddress.
Definition
DataHeader.h:37
DataHeaderElement::m_pClid
CLID m_pClid
primary ClassID.
Definition
DataHeader.h:105
DataHeaderElement::m_key
std::string m_key
string with StoreGate key.
Definition
DataHeader.h:109
DataHeaderElement::m_alias
std::vector< std::string > m_alias
vector of StoreGate alias string.
Definition
DataHeader.h:111
DataHeaderElement::getToken
const Token * getToken() const
Definition
DataHeader.cxx:125
DataHeaderElement::m_clids
std::vector< CLID > m_clids
vector of unsigned long to store ClassID's for symlinked container.
Definition
DataHeader.h:107
DataHeaderElement::m_hashes
std::vector< sgkey_t > m_hashes
hash table for ElementLink host container keys.
Definition
DataHeader.h:115
DataHeaderElement::m_token
Token m_token
Transient address token.
Definition
DataHeader.h:113
DataHeaderForm_p6
This class provides storage for the constant fields of the persistent DataHeader class.
Definition
DataHeader_p6.h:26
DataHeaderForm_p6::getObjKey
const std::string & getObjKey(unsigned int index) const
Definition
DataHeader_p6.cxx:83
DataHeaderForm_p6::getDbTech
unsigned int getDbTech(unsigned int index) const
Definition
DataHeader_p6.cxx:36
DataHeaderForm_p6::getObjClassId
const Guid & getObjClassId(unsigned int index) const
Definition
DataHeader_p6.cxx:91
DataHeaderForm_p6::DHverFormRef
@ DHverFormRef
Definition
DataHeader_p6.h:49
DataHeaderForm_p6::sizeObj
std::size_t sizeObj() const
Definition
DataHeader_p6.cxx:75
DataHeaderForm_p6::insertDb
unsigned int insertDb(const DbRecord &rec)
Definition
DataHeader_p6.cxx:15
DataHeaderForm_p6::getObjOid1
long long getObjOid1(unsigned int index) const
Definition
DataHeader_p6.h:70
DataHeaderForm_p6::getDbGuid
Guid getDbGuid(unsigned int index) const
Definition
DataHeader_p6.cxx:32
DataHeaderForm_p6::getObjContainer
const std::string & getObjContainer(unsigned int index) const
Definition
DataHeader_p6.cxx:79
DataHeaderForm_p6::resize
void resize(unsigned int size)
Definition
DataHeader_p6.cxx:126
DataHeaderForm_p6::sizeDb
std::size_t sizeDb() const
Definition
DataHeader_p6.cxx:28
DataHeaderForm_p6::getObjType
unsigned int getObjType(unsigned int index) const
Definition
DataHeader_p6.cxx:87
DataHeaderForm_p6::version
unsigned version() const
Definition
DataHeader_p6.h:81
DataHeaderForm_p6::getObjHashes
const std::vector< sgkey_t > & getObjHashes(unsigned int index) const
Definition
DataHeader_p6.cxx:105
DataHeaderForm_p6::getObjSymLinks
const std::vector< unsigned int > & getObjSymLinks(unsigned int index) const
Definition
DataHeader_p6.cxx:100
DataHeaderForm_p6::insertObj
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 >())
Definition
DataHeader_p6.cxx:40
DataHeaderForm_p6::getObjAlias
const std::vector< std::string > & getObjAlias(unsigned int index) const
Definition
DataHeader_p6.cxx:95
DataHeader_p6
This class provides a persistent representation for the DataHeader class.
Definition
DataHeader_p6.h:111
DataHeader_p6::m_commonDbIndex
unsigned m_commonDbIndex
common DB entry index used by all short DH elements
Definition
DataHeader_p6.h:129
DataHeader_p6::dhFormToken
const std::string & dhFormToken() const
Definition
DataHeader_p6.cxx:137
DataHeader_p6::m_shortElements
std::vector< int > m_shortElements
Definition
DataHeader_p6.h:132
DataHeader_p6::m_fullElements
std::vector< FullElement > m_fullElements
Definition
DataHeader_p6.h:133
DataHeader_p6::m_commonOID2
unsigned long long m_commonOID2
Definition
DataHeader_p6.h:130
DataHeader_p6::m_provenanceSize
unsigned int m_provenanceSize
Definition
DataHeader_p6.h:134
DataHeader
This class provides the layout for summary information stored for data written to POOL.
Definition
DataHeader.h:123
DataHeader::setDhFormToken
void setDhFormToken(const std::string &formToken)
Definition
DataHeader.cxx:307
DataHeader::setStatus
void setStatus(statusFlag status)
Set StatusFlag enum for DataHeader.
Definition
DataHeader.cxx:229
DataHeader::setEvtRefTokenStr
void setEvtRefTokenStr(const std::string &tokenStr)
Definition
DataHeader.cxx:320
DataHeader::dhFormToken
const std::string & dhFormToken() const
Form token, to be able to tell when the form changes.
Definition
DataHeader.cxx:302
DataHeader::m_inputDataHeader
std::vector< DataHeaderElement > m_inputDataHeader
vector with DataHeaderElement to upstream DataHeader ("Provenance").
Definition
DataHeader.h:211
DataHeader::m_dataHeader
std::vector< DataHeaderElement > m_dataHeader
vector with DataHeaderElement to "DataObject".
Definition
DataHeader.h:209
DataHeader::Input
@ Input
Definition
DataHeader.h:125
Token
This class provides a token that identifies in a unique way objects on the persistent storage.
Definition
Token.h:22
Token::setCont
Token & setCont(const std::string &cnt)
Set container name.
Definition
Token.h:72
Token::setDb
Token & setDb(const Guid &db)
Set database name.
Definition
Token.h:67
Token::contID
const std::string & contID() const
Access container identifier.
Definition
Token.h:70
Token::classID
const Guid & classID() const
Access database identifier.
Definition
Token.h:74
Token::setClassID
Token & setClassID(const Guid &cl_id)
Access database identifier.
Definition
Token.h:76
Token::toString
const std::string toString() const
Retrieve the string representation of the token.
Definition
Token.cxx:135
Token::technology
int technology() const
Access technology type.
Definition
Token.h:78
Token::setOid
Token & setOid(const OID_t &oid)
Set object identifier.
Definition
Token.h:86
Token::setTechnology
Token & setTechnology(int t)
Set technology type.
Definition
Token.h:80
Token::oid
const OID_t & oid() const
Access object identifier.
Definition
Token.h:82
Token::fromString
Token & fromString(const std::string_view from)
Build from the string representation of a token.
Definition
Token.cxx:169
Token::dbID
const Guid & dbID() const
Access database identifier.
Definition
Token.h:65
ClassID_traits::ID
static constexpr CLID ID()
Definition
Control/AthenaKernel/AthenaKernel/ClassID_traits.h:44
DataHeaderForm_p6::DbRecord
Definition
DataHeader_p6.h:32
DataHeaderForm_p6::ObjRecord
Definition
DataHeader_p6.h:38
DataHeader_p6::FullElement
Definition
DataHeader_p6.h:115
DataHeader_p6::FullElement::objIdx
unsigned int objIdx
Definition
DataHeader_p6.h:120
DataHeader_p6::FullElement::oid2
unsigned long long oid2
Definition
DataHeader_p6.h:118
DataHeader_p6::FullElement::dbIdx
unsigned int dbIdx
Definition
DataHeader_p6.h:119
Token::OID_t
Definition
Token.h:25
Generated on
for ATLAS Offline Software by
1.17.0