ATLAS Offline Software
Loading...
Searching...
No Matches
DataHeaderCnv_p5.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
10
13#include "SGCore/sgkey_t.h"
14#include <algorithm>
15
17
18
19//______________________________________________________________________________
21 DataHeaderElement& trans,
22 const DataHeaderForm_p5& form,
23 unsigned int entry) const
24{
25 Token& token = trans.m_token;
26 std::vector<unsigned int>::const_iterator intIter = form.params(entry).begin();
27 unsigned int keyIdx = 0U, aliasNum = 0U, clidNum = 0U;
28// Translate PoolToken
29 if ((*intIter&0x0000FFFF) == 0) {
30 ++intIter;
31 keyIdx = *intIter; ++intIter;
32 aliasNum = *intIter; ++intIter;
33 clidNum = *intIter; ++intIter;
34 token.fromString(pers.m_token);
35 } else {
36 const unsigned int keyPos = (unsigned short)(*intIter>>16),
37 version = (unsigned short)(*intIter&0x0000FFFF); ++intIter;
38 const unsigned int guidIdx = (unsigned short)(*intIter>>16),
39 classIdx = (unsigned short)(*intIter&0x0000FFFF); ++intIter;
40 const unsigned int prefixIdx = (unsigned short)(*intIter>>16),
41 typeIdx = (unsigned short)(*intIter&0x0000FFFF); ++intIter;
42// Add Technology and Offsets
43 unsigned int tech = 514;
44 if (version&0x00000001U) {
45 tech = *intIter; ++intIter;
46 }
47 unsigned int oid1 = *intIter; ++intIter;
48 if (version&0x00000010U) {
49 keyIdx = *intIter; ++intIter;
50 aliasNum = *intIter; ++intIter;
51 clidNum = *intIter; ++intIter;
52 } else {
53 keyIdx = (*intIter>>16), aliasNum = ((*intIter&0x0000FFFF)>>8), clidNum = (*intIter&0x000000FF); ++intIter;
54 }
55// Append DbGuid
56 Guid guid(form.map()[guidIdx]);
57 token.setDb(guid);
58// Container name, may be optimized
59 std::string cntName;
60 if (prefixIdx > 0) {
61 cntName += form.map()[prefixIdx];
62 if (typeIdx > 0) {
63 cntName += form.map()[typeIdx];
64 }
65 }
66// Insert key
67 if (keyPos > 0) {
68 cntName += pers.m_token.substr(0, keyPos - 1) + form.map()[keyIdx] + pers.m_token.substr(keyPos - 1);
69 } else {
70 cntName += pers.m_token;
71 }
72 //token.setCont(cntName);
73// Append ClassId
74 Guid clid(form.map()[classIdx]);
75 token.setClassID(clid);
76 token.setTechnology(tech);
77 token.setOid(Token::OID_t(oid1, pers.m_oid2));
78 }
79
80 auto aliasBeg = form.map().begin() + keyIdx;
81 trans.m_key = *aliasBeg++;
82 trans.m_alias.clear();
83 trans.m_alias.assign (aliasBeg, aliasBeg+aliasNum);
84 if (!std::ranges::is_sorted (trans.m_alias)) {
85 // Should really be sorted, but just in case...
86 std::ranges::sort (trans.m_alias);
87 auto ret = std::ranges::unique (trans.m_alias);
88 trans.m_alias.erase (ret.begin(), ret.end());
89 }
90
91 trans.m_pClid = *intIter; ++intIter;
92 const std::vector<unsigned int>::const_iterator intLast = form.params(entry).end();
93 if (intIter+clidNum > intLast) {
94 clidNum = intLast - intIter;
95 }
96 trans.m_clids.assign (intIter, intIter+clidNum);
97 intIter += clidNum;
98 trans.m_hashes.clear();
99 for (; intIter != intLast; ++intIter) {
100 trans.m_hashes.push_back(*intIter);
101 }
102}
103//______________________________________________________________________________
106 DataHeaderForm_p5& form,
107 unsigned int entry) const {
108 unsigned int tech = 0U, oid1 = 0U;
109 unsigned short guidIdx = 0U, classIdx = 0U, prefixIdx = 0U, typeIdx = 0U, keyPos = 0U;
110// Translate PoolToken
111 if (trans.getToken() != 0) {
112// Database GUID
113 const std::string guid = trans.getToken()->dbID().toString();
114 for (std::vector<std::string>::const_iterator iter = form.map().begin(), last = form.map().end();
115 iter != last; ++iter, ++guidIdx) {
116 if (*iter == guid) break;
117 }
118 if (guidIdx == form.map().size()) {
119 form.insertMap(guid);
120 }
121// Class GUID
122 const std::string clid = trans.getToken()->classID().toString();
123 for (std::vector<std::string>::const_iterator iter = form.map().begin(), last = form.map().end();
124 iter != last; ++iter, ++classIdx) {
125 if (*iter == clid) break;
126 }
127 if (classIdx == form.map().size()) {
128 form.insertMap(clid);
129 }
130// Container name, can be optimized
131 pers.m_token = trans.getToken()->contID();
132// Get Prefix
133 std::string::size_type delim = pers.m_token.find_first_of("_/(");
134 if (delim != std::string::npos) {
135 const std::string persComp1 = pers.m_token.substr(0, delim + 1);
136 for (std::vector<std::string>::const_iterator iter = form.map().begin(), last = form.map().end();
137 iter != last; ++iter, ++prefixIdx) {
138 if (*iter == persComp1) break;
139 }
140 if (prefixIdx == form.map().size()) {
141 form.insertMap(persComp1);
142 }
143 pers.m_token = pers.m_token.substr(delim + 1);
144// Get TypeName
145// Check whether Key only is used for placement
146 if (!pers.m_token.starts_with( trans.m_key)) {
147 std::string::size_type delim = pers.m_token.find_first_of("/()");
148 if (delim != std::string::npos) {
149 const std::string persComp2 = pers.m_token.substr(0, delim + 1);
150 for (std::vector<std::string>::const_iterator iter = form.map().begin(), last = form.map().end();
151 iter != last; ++iter, ++typeIdx) {
152 if (*iter == persComp2) break;
153 }
154 if (typeIdx == form.map().size()) {
155 form.insertMap(persComp2);
156 }
157 pers.m_token = pers.m_token.substr(delim + 1);
158 } else if (pers.m_token == "DataHeader") {
159 for (std::vector<std::string>::const_iterator iter = form.map().begin(), last = form.map().end();
160 iter != last; ++iter, ++typeIdx) {
161 if (*iter == "DataHeader") break;
162 }
163 if (typeIdx == form.map().size()) {
164 form.insertMap("DataHeader");
165 }
166 pers.m_token.clear();
167 }
168 }
169 }
170 delim = pers.m_token.rfind(trans.m_key);
171 if (delim != std::string::npos) {
172 keyPos = delim + 1;
173 pers.m_token = pers.m_token.substr(0, delim) + pers.m_token.substr(delim + trans.m_key.size());
174 }
175 tech = trans.getToken()->technology();
176 oid1 = trans.getToken()->oid().first;
177 pers.m_oid2 = trans.getToken()->oid().second;
178 }
179 unsigned int version = 0x0000FFFFU;
180 if (tech == 514) {
181 version = version&0x0000FFFEU;
182 }
183 unsigned int keyIdx = form.map().size(), aliasNum = trans.m_alias.size(), clidNum = trans.m_clids.size();
184 if (keyIdx < 0x00010000U && aliasNum < 0x00000100U && clidNum < 0x00000100U) {
185 version = version&0x0000FFEFU;
186 }
187 form.insertParam((unsigned int)(keyPos) * 0x00010000U + version, entry);
188 form.insertParam((unsigned int)(guidIdx) * 0x00010000U + (unsigned int)(classIdx), entry);
189 form.insertParam((unsigned int)(prefixIdx) * 0x00010000U + (unsigned int)(typeIdx), entry);
190 if (version&0x00000001U) {
191 form.insertParam(tech, entry);
192 }
193 form.insertParam(oid1, entry);
194 if (version&0x00000010U) {
195 form.insertParam(keyIdx, entry);
196 form.insertParam(aliasNum, entry);
197 form.insertParam(clidNum, entry);
198 } else {
199 form.insertParam(keyIdx * 0x00010000U + aliasNum * 0x00000100U + clidNum, entry);
200 }
201 form.insertMap(trans.m_key);
202 for (const std::string& a : trans.m_alias) {
203 form.insertMap(a);
204 }
205 form.insertParam(trans.m_pClid, entry);
206 for (CLID clid : trans.m_clids) {
207 form.insertParam(clid, entry);
208 }
209 for (std::vector<SG::sgkey_t>::const_iterator iter = trans.m_hashes.begin(),
210 last = trans.m_hashes.end(); iter != last; ++iter) {
211 form.insertParam(SG::sgkeyShort (*iter), entry);
212 }
213}
214
216
217//______________________________________________________________________________
219 DataHeader& trans,
220 const DataHeaderForm_p5& dhForm) const
221{
222 unsigned int entry = 1;
223 const unsigned int provSize = dhForm.params(entry)[0];
224 trans.setDhFormToken (pers.dhFormToken());
225 trans.m_inputDataHeader.resize(provSize);
226 std::vector<DataHeaderElement>::iterator it = trans.m_inputDataHeader.begin();
227 std::vector<DataHeaderElement_p5>::const_iterator pit = pers.m_dataHeader.begin();
228 for (unsigned int i = 0U; i < provSize; ++i, ++it, ++pit) {
229 ++entry;
230 m_elemCnv.persToTrans(*pit, *it, dhForm, entry);
231 }
232 trans.m_dataHeader.resize(pers.m_dataHeader.size() - provSize);
233 it = trans.m_dataHeader.begin();
234 for (std::vector<DataHeaderElement_p5>::const_iterator last = pers.m_dataHeader.end();
235 pit != last; ++it, ++pit) {
236 ++entry;
237 m_elemCnv.persToTrans(*pit, *it, dhForm, entry);
238 }
240}
241//______________________________________________________________________________
243 DataHeader_p5& pers,
244 DataHeaderForm_p5& dhForm) const
245{
246 const unsigned int provSize = trans.m_inputDataHeader.size();
247 pers.m_dataHeader.resize(provSize + trans.m_dataHeader.size());
248 dhForm.resize(provSize + trans.m_dataHeader.size() + 2);
249 unsigned int entry = 1;
250 dhForm.insertParam(provSize, entry);
251 std::vector<DataHeaderElement_p5>::iterator pit = pers.m_dataHeader.begin();
252 for (std::vector<DataHeaderElement>::const_iterator it = trans.m_inputDataHeader.begin(),
253 last = trans.m_inputDataHeader.end(); it != last; ++it, ++pit) {
254 ++entry;
255 m_elemCnv.transToPers(*it, *pit, dhForm, entry);
256 }
257 for (std::vector<DataHeaderElement>::const_iterator it = trans.m_dataHeader.begin(),
258 last = trans.m_dataHeader.end(); it != last; ++it, ++pit) {
259 ++entry;
260 m_elemCnv.transToPers(*it, *pit, dhForm, entry);
261 }
262}
263//______________________________________________________________________________
265 DataHeaderForm_p5& dhForm,
266 const std::string& key,
267 const std::string& strToken) const
268{
269 Token token;
270 token.fromString(strToken);
271 DataHeaderElement tEle(ClassID_traits<DataHeader>::ID(), key, std::move(token));
273 unsigned int entry = dhForm.size() + 1;
274 m_elemCnv.transToPers(tEle, pEle, dhForm, entry);
275 pers.m_dataHeader.push_back(std::move(pEle));
276}
This file contains the class definition for the DataHeaderCnv_p5 and DataHeaderElementCnv_p5 classes.
This file contains the class definition for the DataHeader and DataHeaderElement classes.
uint32_t CLID
The Class ID type.
static Double_t a
void insertDHRef(DataHeader_p5 &pers, DataHeaderForm_p5 &dhForm, const std::string &key, const std::string &strToken) const
void transToPers(const DataHeader &trans, DataHeader_p5 &pers, DataHeaderForm_p5 &dhForm) const
void persToTrans(const DataHeader_p5 &pers, DataHeader &trans, const DataHeaderForm_p5 &dhForm) const
DataHeaderElementCnv_p5 m_elemCnv
void transToPers(const DataHeaderElement &trans, DataHeaderElement_p5 &pers, DataHeaderForm_p5 &form, unsigned int entry) const
void persToTrans(const DataHeaderElement_p5 &pers, DataHeaderElement &trans, const DataHeaderForm_p5 &form, unsigned int entry) const
This class provides a persistent representation for the DataHeaderElement class.
long long int m_oid2
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.
void insertParam(unsigned int param, unsigned int entry)
const std::vector< std::string > & map() const
void insertMap(const std::string &element)
const std::vector< unsigned int > & params(unsigned int entry) const
unsigned int size() const
void resize(unsigned int size)
This class provides a persistent representation for the DataHeader class.
std::vector< DataHeaderElement_p5 > m_dataHeader
const std::string & dhFormToken() const
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.
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 encapsulation of a GUID/UUID/CLSID/IID data structure (128 bit number).
Definition Guid.h:25
constexpr void toString(std::span< char, StrLen > buf, bool uppercase=true) const noexcept
Automatic conversion to string representation.
This class provides a token that identifies in a unique way objects on the persistent storage.
Definition Token.h:21
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
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
constexpr uint32_t sgkeyShort(const sgkey_t k)
Convert a sgkey to the 32-bit form used for older data.
Definition sgkey_t.h:85