File indexing completed on 2024-04-06 12:01:28
0001 #include "CondCore/CondDB/interface/Exception.h"
0002 #include "CondCore/CondDB/interface/Auth.h"
0003 #include "Utilities/OpenSSL/interface/openssl_init.h"
0004 #include "IOVSchema.h"
0005
0006 namespace cond {
0007
0008 namespace persistency {
0009
0010 cond::Hash makeHash(const std::string& objectType, const cond::Binary& data) {
0011 cms::openssl_init();
0012 EVP_MD_CTX* mdctx = EVP_MD_CTX_new();
0013 const EVP_MD* md = EVP_get_digestbyname("SHA1");
0014 if (!EVP_DigestInit_ex(mdctx, md, nullptr)) {
0015 throwException("SHA1 initialization error.", "IOVSchema::makeHash");
0016 }
0017 if (!EVP_DigestUpdate(mdctx, objectType.c_str(), objectType.size())) {
0018 throwException("SHA1 processing error (1).", "IOVSchema::makeHash");
0019 }
0020 if (!EVP_DigestUpdate(mdctx, data.data(), data.size())) {
0021 throwException("SHA1 processing error (2).", "IOVSchema::makeHash");
0022 }
0023 unsigned char hash[EVP_MAX_MD_SIZE];
0024 unsigned int md_len = 0;
0025 if (!EVP_DigestFinal_ex(mdctx, hash, &md_len)) {
0026 throwException("SHA1 finalization error.", "IOVSchema::makeHash");
0027 }
0028 EVP_MD_CTX_free(mdctx);
0029 char tmp[EVP_MAX_MD_SIZE * 2 + 1];
0030
0031 if (md_len > 20) {
0032 md_len = 20;
0033 }
0034 for (unsigned int i = 0; i < md_len; i++) {
0035 ::sprintf(&tmp[i * 2], "%02x", hash[i]);
0036 }
0037 tmp[md_len * 2] = 0;
0038 return tmp;
0039 }
0040
0041 TAG::Table::Table(coral::ISchema& schema) : m_schema(schema) {
0042 if (exists()) {
0043 std::set<std::string> columns;
0044 int ncols = m_schema.tableHandle(tname).description().numberOfColumns();
0045 for (int i = 0; i < ncols; i++)
0046 columns.insert(m_schema.tableHandle(tname).description().columnDescription(i).name());
0047 m_isProtectable = columns.count(PROTECTION_CODE::name);
0048 }
0049 }
0050
0051 bool TAG::Table::Table::exists() { return existsTable(m_schema, tname); }
0052
0053 void TAG::Table::create() {
0054 if (exists()) {
0055 throwException("TAG table already exists in this schema.", "TAG::Table::create");
0056 }
0057 TableDescription<NAME,
0058 TIME_TYPE,
0059 OBJECT_TYPE,
0060 SYNCHRONIZATION,
0061 END_OF_VALIDITY,
0062 DESCRIPTION,
0063 LAST_VALIDATED_TIME,
0064 INSERTION_TIME,
0065 MODIFICATION_TIME,
0066 PROTECTION_CODE>
0067 descr(tname);
0068 descr.setPrimaryKey<NAME>();
0069 createTable(m_schema, descr.get());
0070 m_isProtectable = true;
0071 }
0072
0073 bool TAG::Table::select(const std::string& name) {
0074 Query<NAME> q(m_schema);
0075 q.addCondition<NAME>(name);
0076 for (auto row : q) {
0077 }
0078
0079 return q.retrievedRows();
0080 }
0081
0082 bool TAG::Table::select(const std::string& name,
0083 cond::TimeType& timeType,
0084 std::string& objectType,
0085 cond::SynchronizationType& synchronizationType,
0086 cond::Time_t& endOfValidity,
0087 cond::Time_t& lastValidatedTime,
0088 int& protectionCode) {
0089 if (isProtectable()) {
0090 Query<TIME_TYPE, OBJECT_TYPE, SYNCHRONIZATION, END_OF_VALIDITY, LAST_VALIDATED_TIME, PROTECTION_CODE> q(
0091 m_schema);
0092 q.addCondition<NAME>(name);
0093 for (const auto& row : q)
0094 std::tie(timeType, objectType, synchronizationType, endOfValidity, lastValidatedTime, protectionCode) = row;
0095 return q.retrievedRows();
0096 } else {
0097 Query<TIME_TYPE, OBJECT_TYPE, SYNCHRONIZATION, END_OF_VALIDITY, LAST_VALIDATED_TIME> q(m_schema);
0098 q.addCondition<NAME>(name);
0099 for (const auto& row : q)
0100 std::tie(timeType, objectType, synchronizationType, endOfValidity, lastValidatedTime) = row;
0101 protectionCode = 0;
0102
0103 return q.retrievedRows();
0104 }
0105 }
0106
0107 bool TAG::Table::getMetadata(const std::string& name,
0108 std::string& description,
0109 boost::posix_time::ptime& insertionTime,
0110 boost::posix_time::ptime& modificationTime) {
0111 Query<DESCRIPTION, INSERTION_TIME, MODIFICATION_TIME> q(m_schema);
0112 q.addCondition<NAME>(name);
0113 for (const auto& row : q)
0114 std::tie(description, insertionTime, modificationTime) = row;
0115 return q.retrievedRows();
0116 }
0117
0118 void TAG::Table::insert(const std::string& name,
0119 cond::TimeType timeType,
0120 const std::string& objectType,
0121 cond::SynchronizationType synchronizationType,
0122 cond::Time_t endOfValidity,
0123 const std::string& description,
0124 cond::Time_t lastValidatedTime,
0125 const boost::posix_time::ptime& insertionTime) {
0126 if (isProtectable()) {
0127 RowBuffer<NAME,
0128 TIME_TYPE,
0129 OBJECT_TYPE,
0130 SYNCHRONIZATION,
0131 END_OF_VALIDITY,
0132 DESCRIPTION,
0133 LAST_VALIDATED_TIME,
0134 INSERTION_TIME,
0135 MODIFICATION_TIME,
0136 PROTECTION_CODE>
0137 dataToInsert(std::tie(name,
0138 timeType,
0139 objectType,
0140 synchronizationType,
0141 endOfValidity,
0142 description,
0143 lastValidatedTime,
0144 insertionTime,
0145 insertionTime,
0146 cond::auth::COND_DBTAG_NO_PROTECTION_CODE));
0147 insertInTable(m_schema, tname, dataToInsert.get());
0148 } else {
0149 RowBuffer<NAME,
0150 TIME_TYPE,
0151 OBJECT_TYPE,
0152 SYNCHRONIZATION,
0153 END_OF_VALIDITY,
0154 DESCRIPTION,
0155 LAST_VALIDATED_TIME,
0156 INSERTION_TIME,
0157 MODIFICATION_TIME>
0158 dataToInsert(std::tie(name,
0159 timeType,
0160 objectType,
0161 synchronizationType,
0162 endOfValidity,
0163 description,
0164 lastValidatedTime,
0165 insertionTime,
0166 insertionTime));
0167 insertInTable(m_schema, tname, dataToInsert.get());
0168 }
0169 }
0170
0171 void TAG::Table::update(const std::string& name,
0172 cond::SynchronizationType synchronizationType,
0173 cond::Time_t& endOfValidity,
0174 cond::Time_t lastValidatedTime,
0175 const boost::posix_time::ptime& updateTime) {
0176 UpdateBuffer buffer;
0177 buffer.setColumnData<SYNCHRONIZATION, END_OF_VALIDITY, LAST_VALIDATED_TIME, MODIFICATION_TIME>(
0178 std::tie(synchronizationType, endOfValidity, lastValidatedTime, updateTime));
0179 buffer.addWhereCondition<NAME>(name);
0180 updateTable(m_schema, tname, buffer);
0181 }
0182
0183 void TAG::Table::updateMetadata(const std::string& name,
0184 const std::string& description,
0185 const boost::posix_time::ptime& updateTime) {
0186 UpdateBuffer buffer;
0187 buffer.setColumnData<DESCRIPTION, MODIFICATION_TIME>(std::tie(description, updateTime));
0188 buffer.addWhereCondition<NAME>(name);
0189 updateTable(m_schema, tname, buffer);
0190 }
0191
0192 void TAG::Table::updateValidity(const std::string& name,
0193 cond::Time_t lastValidatedTime,
0194 const boost::posix_time::ptime& updateTime) {
0195 UpdateBuffer buffer;
0196 buffer.setColumnData<LAST_VALIDATED_TIME, MODIFICATION_TIME>(std::tie(lastValidatedTime, updateTime));
0197 buffer.addWhereCondition<NAME>(name);
0198 updateTable(m_schema, tname, buffer);
0199 }
0200
0201 void TAG::Table::setProtectionCode(const std::string& name, int code) {
0202 if (!isProtectable()) {
0203 throwException("Tag in this schema are not protectable.", "TAG::Table::create");
0204 }
0205 Query<PROTECTION_CODE> q(m_schema);
0206 q.addCondition<NAME>(name);
0207 int newCode = 0;
0208 for (const auto& row : q)
0209 std::tie(newCode) = row;
0210 newCode |= code;
0211 UpdateBuffer buffer;
0212 buffer.setColumnData<PROTECTION_CODE>(std::tie(newCode));
0213 buffer.addWhereCondition<NAME>(name);
0214 updateTable(m_schema, tname, buffer);
0215 }
0216
0217 void TAG::Table::unsetProtectionCode(const std::string& name, int code) {
0218 if (!isProtectable()) {
0219 throwException("Tag in this schema are not protectable.", "TAG::Table::unsetProtectionCode");
0220 }
0221 Query<PROTECTION_CODE> q(m_schema);
0222 q.addCondition<NAME>(name);
0223 int presentCode = 0;
0224 for (const auto& row : q)
0225 std::tie(presentCode) = row;
0226 int newCode = presentCode & (~code);
0227 UpdateBuffer buffer;
0228 buffer.setColumnData<PROTECTION_CODE>(std::tie(newCode));
0229 buffer.addWhereCondition<NAME>(name);
0230 updateTable(m_schema, tname, buffer);
0231 }
0232
0233 IOV::Table::Table(coral::ISchema& schema) : m_schema(schema) {}
0234
0235 bool IOV::Table::exists() { return existsTable(m_schema, tname); }
0236
0237 void IOV::Table::create() {
0238 if (exists()) {
0239 throwException("IOV table already exists in this schema.", "IOV::Schema::create");
0240 }
0241
0242 TableDescription<TAG_NAME, SINCE, PAYLOAD_HASH, INSERTION_TIME> descr(tname);
0243 descr.setPrimaryKey<TAG_NAME, SINCE, INSERTION_TIME>();
0244 descr.setForeignKey<TAG_NAME, TAG::NAME>("TAG_NAME_FK");
0245 descr.setForeignKey<PAYLOAD_HASH, PAYLOAD::HASH>("PAYLOAD_HASH_FK");
0246 createTable(m_schema, descr.get());
0247 }
0248
0249 size_t IOV::Table::getGroups(const std::string& tag,
0250 const boost::posix_time::ptime& snapshotTime,
0251 unsigned long long gSize,
0252 std::vector<cond::Time_t>& groups) {
0253 Query<SINCE_GROUP> q(m_schema, true);
0254 q.addCondition<TAG_NAME>(tag);
0255 if (!snapshotTime.is_not_a_date_time()) {
0256 q.addCondition<INSERTION_TIME>(snapshotTime, "<=");
0257 }
0258 q.groupBy(SINCE_GROUP::group(gSize));
0259 q.addOrderClause<SINCE_GROUP>();
0260 for (auto row : q) {
0261 groups.push_back(std::get<0>(row));
0262 }
0263 return q.retrievedRows();
0264 }
0265
0266 size_t IOV::Table::select(const std::string& tag,
0267 cond::Time_t lowerSinceGroup,
0268 cond::Time_t upperSinceGroup,
0269 const boost::posix_time::ptime& snapshotTime,
0270 std::vector<std::tuple<cond::Time_t, cond::Hash> >& iovs) {
0271 Query<SINCE, PAYLOAD_HASH> q(m_schema);
0272 q.addCondition<TAG_NAME>(tag);
0273 if (lowerSinceGroup > 0)
0274 q.addCondition<SINCE>(lowerSinceGroup, ">=");
0275 if (upperSinceGroup < cond::time::MAX_VAL)
0276 q.addCondition<SINCE>(upperSinceGroup, "<");
0277 if (!snapshotTime.is_not_a_date_time()) {
0278 q.addCondition<INSERTION_TIME>(snapshotTime, "<=");
0279 }
0280 q.addOrderClause<SINCE>();
0281 q.addOrderClause<INSERTION_TIME>(false);
0282 size_t initialSize = iovs.size();
0283 for (auto row : q) {
0284
0285 if (iovs.size() - initialSize && std::get<0>(iovs.back()) == std::get<0>(row))
0286 continue;
0287 iovs.push_back(row);
0288 }
0289 return iovs.size() - initialSize;
0290 }
0291
0292 bool IOV::Table::getLastIov(const std::string& tag,
0293 const boost::posix_time::ptime& snapshotTime,
0294 cond::Time_t& since,
0295 cond::Hash& hash) {
0296 Query<SINCE, PAYLOAD_HASH> q(m_schema);
0297 q.addCondition<TAG_NAME>(tag);
0298 if (!snapshotTime.is_not_a_date_time()) {
0299 q.addCondition<INSERTION_TIME>(snapshotTime, "<=");
0300 }
0301 q.addOrderClause<SINCE>(false);
0302 q.addOrderClause<INSERTION_TIME>(false);
0303 q.limitReturnedRows(1);
0304 for (auto row : q) {
0305 since = std::get<0>(row);
0306 hash = std::get<1>(row);
0307 return true;
0308 }
0309 return false;
0310 }
0311
0312 bool IOV::Table::getSize(const std::string& tag, const boost::posix_time::ptime& snapshotTime, size_t& size) {
0313 Query<SEQUENCE_SIZE> q(m_schema);
0314 q.addCondition<TAG_NAME>(tag);
0315 if (!snapshotTime.is_not_a_date_time()) {
0316 q.addCondition<INSERTION_TIME>(snapshotTime, "<=");
0317 }
0318 for (auto row : q) {
0319 size = std::get<0>(row);
0320 return true;
0321 }
0322 return false;
0323 }
0324
0325 bool IOV::Table::getRange(const std::string& tag,
0326 cond::Time_t begin,
0327 cond::Time_t end,
0328 const boost::posix_time::ptime& snapshotTime,
0329 std::vector<std::tuple<cond::Time_t, cond::Hash> >& iovs) {
0330 Query<MAX_SINCE> q0(m_schema);
0331 q0.addCondition<TAG_NAME>(tag);
0332 q0.addCondition<SINCE>(begin, "<=");
0333 if (!snapshotTime.is_not_a_date_time()) {
0334 q0.addCondition<INSERTION_TIME>(snapshotTime, "<=");
0335 }
0336 cond::Time_t lower_since = 0;
0337 for (auto row : q0) {
0338 lower_since = std::get<0>(row);
0339 }
0340 if (!lower_since)
0341 return false;
0342 Query<SINCE, PAYLOAD_HASH> q1(m_schema);
0343 q1.addCondition<TAG_NAME>(tag);
0344 q1.addCondition<SINCE>(lower_since, ">=");
0345 if (!snapshotTime.is_not_a_date_time()) {
0346 q1.addCondition<INSERTION_TIME>(snapshotTime, "<=");
0347 }
0348 q1.addCondition<SINCE>(end, "<=");
0349 q1.addOrderClause<SINCE>();
0350 q1.addOrderClause<INSERTION_TIME>(false);
0351 size_t initialSize = iovs.size();
0352 for (auto row : q1) {
0353
0354 if (iovs.size() - initialSize && std::get<0>(iovs.back()) == std::get<0>(row))
0355 continue;
0356 iovs.push_back(row);
0357 }
0358 return iovs.size() - initialSize;
0359 }
0360
0361 void IOV::Table::insertOne(const std::string& tag,
0362 cond::Time_t since,
0363 cond::Hash payloadHash,
0364 const boost::posix_time::ptime& insertTimeStamp) {
0365 RowBuffer<TAG_NAME, SINCE, PAYLOAD_HASH, INSERTION_TIME> dataToInsert(
0366 std::tie(tag, since, payloadHash, insertTimeStamp));
0367 insertInTable(m_schema, tname, dataToInsert.get());
0368 }
0369
0370 void IOV::Table::insertMany(
0371 const std::string& tag,
0372 const std::vector<std::tuple<cond::Time_t, cond::Hash, boost::posix_time::ptime> >& iovs) {
0373 BulkInserter<TAG_NAME, SINCE, PAYLOAD_HASH, INSERTION_TIME> inserter(m_schema, tname);
0374 for (auto row : iovs)
0375 inserter.insert(std::tuple_cat(std::tie(tag), row));
0376 inserter.flush();
0377 }
0378
0379 void IOV::Table::eraseOne(const std::string& tag, cond::Time_t since, cond::Hash payloadId) {
0380 DeleteBuffer buffer;
0381 buffer.addWhereCondition<TAG_NAME>(tag);
0382 buffer.addWhereCondition<SINCE>(since);
0383 buffer.addWhereCondition<PAYLOAD_HASH>(payloadId);
0384 deleteFromTable(m_schema, tname, buffer);
0385 }
0386
0387 void IOV::Table::eraseMany(const std::string& tag, const std::vector<std::tuple<cond::Time_t, cond::Hash> >& iovs) {
0388 BulkDeleter<TAG_NAME, SINCE, PAYLOAD_HASH> deleter(m_schema, tname);
0389 for (auto iov : iovs)
0390 deleter.erase(std::tuple_cat(std::tie(tag), iov));
0391 deleter.flush();
0392 }
0393
0394 void IOV::Table::erase(const std::string& tag) {
0395 DeleteBuffer buffer;
0396 buffer.addWhereCondition<TAG_NAME>(tag);
0397 deleteFromTable(m_schema, tname, buffer);
0398 }
0399
0400 TAG_LOG::Table::Table(coral::ISchema& schema) : m_schema(schema) {}
0401
0402 bool TAG_LOG::Table::exists() { return existsTable(m_schema, tname); }
0403
0404 void TAG_LOG::Table::create() {
0405 if (exists()) {
0406 throwException("TAG_LOG table already exists in this schema.", "TAG_LOG::create");
0407 }
0408 TableDescription<TAG_NAME, EVENT_TIME, USER_NAME, HOST_NAME, COMMAND, ACTION, USER_TEXT> descr(tname);
0409 descr.setPrimaryKey<TAG_NAME, EVENT_TIME, ACTION>();
0410 descr.setForeignKey<TAG_NAME, TAG::NAME>("TAG_NAME_FK");
0411 createTable(m_schema, descr.get());
0412 }
0413
0414 void TAG_LOG::Table::insert(const std::string& tag,
0415 const boost::posix_time::ptime& eventTime,
0416 const std::string& userName,
0417 const std::string& hostName,
0418 const std::string& command,
0419 const std::string& action,
0420 const std::string& userText) {
0421 RowBuffer<TAG_NAME, EVENT_TIME, USER_NAME, HOST_NAME, COMMAND, ACTION, USER_TEXT> dataToInsert(
0422 std::tie(tag, eventTime, userName, hostName, command, action, userText));
0423 insertInTable(m_schema, tname, dataToInsert.get());
0424 }
0425
0426 TAG_AUTHORIZATION::Table::Table(coral::ISchema& schema) : m_schema(schema) {}
0427
0428 bool TAG_AUTHORIZATION::Table::exists() { return existsTable(m_schema, tname); }
0429
0430 void TAG_AUTHORIZATION::Table::create() {
0431 if (exists()) {
0432 throwException("TAG_AUTHORIZATION table already exists in this schema.", "TAG_AUTHORIZATION::create");
0433 }
0434 TableDescription<TAG_NAME, ACCESS_TYPE, CREDENTIAL, CREDENTIAL_TYPE> descr(tname);
0435 descr.setPrimaryKey<TAG_NAME, CREDENTIAL, CREDENTIAL_TYPE>();
0436 descr.setForeignKey<TAG_NAME, TAG::NAME>("TAG_NAME_FK");
0437 createTable(m_schema, descr.get());
0438 }
0439
0440 bool TAG_AUTHORIZATION::Table::getAccessPermission(const std::string& tagName,
0441 const std::string& credential,
0442 int credentialType,
0443 int accessType) {
0444 Query<ACCESS_TYPE> q(m_schema);
0445 q.addCondition<TAG_NAME>(tagName);
0446 q.addCondition<CREDENTIAL>(credential);
0447 q.addCondition<CREDENTIAL_TYPE>(credentialType);
0448 int allowedAccess = 0;
0449 for (auto row : q) {
0450 allowedAccess = std::get<0>(row);
0451 }
0452 return allowedAccess & accessType;
0453 }
0454
0455 void TAG_AUTHORIZATION::Table::setAccessPermission(const std::string& tagName,
0456 const std::string& credential,
0457 int credentialType,
0458 int accessType) {
0459 RowBuffer<TAG_NAME, ACCESS_TYPE, CREDENTIAL, CREDENTIAL_TYPE> dataToInsert(
0460 std::tie(tagName, accessType, credential, credentialType));
0461 insertInTable(m_schema, tname, dataToInsert.get());
0462 }
0463
0464 void TAG_AUTHORIZATION::Table::removeAccessPermission(const std::string& tagName,
0465 const std::string& credential,
0466 int credentialType) {
0467 DeleteBuffer buffer;
0468 buffer.addWhereCondition<TAG_NAME>(tagName);
0469 buffer.addWhereCondition<CREDENTIAL>(credential);
0470 buffer.addWhereCondition<CREDENTIAL_TYPE>(credentialType);
0471 deleteFromTable(m_schema, tname, buffer);
0472 }
0473
0474 void TAG_AUTHORIZATION::Table::removeEntriesForCredential(const std::string& credential, int credentialType) {
0475 DeleteBuffer buffer;
0476 buffer.addWhereCondition<CREDENTIAL>(credential);
0477 buffer.addWhereCondition<CREDENTIAL_TYPE>(credentialType);
0478 deleteFromTable(m_schema, tname, buffer);
0479 }
0480
0481 PAYLOAD::Table::Table(coral::ISchema& schema) : m_schema(schema) {}
0482
0483 bool PAYLOAD::Table::exists() { return existsTable(m_schema, tname); }
0484
0485 void PAYLOAD::Table::create() {
0486 if (exists()) {
0487 throwException("Payload table already exists in this schema.", "PAYLOAD::Schema::create");
0488 }
0489
0490 TableDescription<HASH, OBJECT_TYPE, DATA, STREAMER_INFO, VERSION, INSERTION_TIME> descr(tname);
0491 descr.setPrimaryKey<HASH>();
0492 createTable(m_schema, descr.get());
0493 }
0494
0495 bool PAYLOAD::Table::select(const cond::Hash& payloadHash) {
0496 Query<HASH> q(m_schema);
0497 q.addCondition<HASH>(payloadHash);
0498 for (auto row : q) {
0499 }
0500
0501 return q.retrievedRows();
0502 }
0503
0504 bool PAYLOAD::Table::getType(const cond::Hash& payloadHash, std::string& objectType) {
0505 Query<OBJECT_TYPE> q(m_schema);
0506 q.addCondition<HASH>(payloadHash);
0507 for (auto row : q) {
0508 objectType = std::get<0>(row);
0509 }
0510
0511 return q.retrievedRows();
0512 }
0513
0514 bool PAYLOAD::Table::select(const cond::Hash& payloadHash,
0515 std::string& objectType,
0516 cond::Binary& payloadData,
0517 cond::Binary& streamerInfoData) {
0518 Query<DATA, STREAMER_INFO, OBJECT_TYPE> q(m_schema);
0519 q.addCondition<HASH>(payloadHash);
0520 for (const auto& row : q) {
0521 std::tie(payloadData, streamerInfoData, objectType) = row;
0522 }
0523 return q.retrievedRows();
0524 }
0525
0526 bool PAYLOAD::Table::insert(const cond::Hash& payloadHash,
0527 const std::string& objectType,
0528 const cond::Binary& payloadData,
0529 const cond::Binary& streamerInfoData,
0530 const boost::posix_time::ptime& insertionTime) {
0531 std::string version("dummy");
0532 cond::Binary sinfoData(streamerInfoData);
0533 if (!sinfoData.size())
0534 sinfoData.copy(std::string("0"));
0535 RowBuffer<HASH, OBJECT_TYPE, DATA, STREAMER_INFO, VERSION, INSERTION_TIME> dataToInsert(
0536 std::tie(payloadHash, objectType, payloadData, sinfoData, version, insertionTime));
0537 bool failOnDuplicate = false;
0538 return insertInTable(m_schema, tname, dataToInsert.get(), failOnDuplicate);
0539 }
0540
0541 cond::Hash PAYLOAD::Table::insertIfNew(const std::string& payloadObjectType,
0542 const cond::Binary& payloadData,
0543 const cond::Binary& streamerInfoData,
0544 const boost::posix_time::ptime& insertionTime) {
0545 cond::Hash payloadHash = makeHash(payloadObjectType, payloadData);
0546
0547 if (!select(payloadHash)) {
0548 insert(payloadHash, payloadObjectType, payloadData, streamerInfoData, insertionTime);
0549 }
0550 return payloadHash;
0551 }
0552
0553 IOVSchema::IOVSchema(coral::ISchema& schema)
0554 : m_tagTable(schema),
0555 m_iovTable(schema),
0556 m_tagLogTable(schema),
0557 m_tagAccessPermissionTable(schema),
0558 m_payloadTable(schema) {}
0559
0560 bool IOVSchema::exists() {
0561 if (!m_tagTable.exists())
0562 return false;
0563 if (!m_payloadTable.exists())
0564 return false;
0565 if (!m_iovTable.exists())
0566 return false;
0567 return true;
0568 }
0569
0570 bool IOVSchema::create() {
0571 bool created = false;
0572 if (!exists()) {
0573 m_tagTable.create();
0574 m_payloadTable.create();
0575 m_iovTable.create();
0576 m_tagLogTable.create();
0577 m_tagAccessPermissionTable.create();
0578 created = true;
0579 }
0580 return created;
0581 }
0582
0583 ITagTable& IOVSchema::tagTable() { return m_tagTable; }
0584
0585 IIOVTable& IOVSchema::iovTable() { return m_iovTable; }
0586
0587 ITagLogTable& IOVSchema::tagLogTable() { return m_tagLogTable; }
0588
0589 ITagAccessPermissionTable& IOVSchema::tagAccessPermissionTable() {
0590 if (!m_tagTable.isProtectable()) {
0591 throwException("Tag in this schema are not protectable.", "IOVSchema::tagAccessPermissionTable");
0592 }
0593 return m_tagAccessPermissionTable;
0594 }
0595
0596 IPayloadTable& IOVSchema::payloadTable() { return m_payloadTable; }
0597
0598 }
0599 }