CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
OnlineDBOutputService.cc
Go to the documentation of this file.
3 #include <curl/curl.h>
4 //
5 
6 static size_t getHtmlCallback(void* contents, size_t size, size_t nmemb, void* ptr) {
7  // Cast ptr to std::string pointer and append contents to that string
8  ((std::string*)ptr)->append((char*)contents, size * nmemb);
9  return size * nmemb;
10 }
11 
12 bool getInfoFromService(const std::string& urlString, std::string& info) {
13  CURL* curl;
14  CURLcode res;
15  std::string htmlBuffer;
16  char errbuf[CURL_ERROR_SIZE];
17 
18  curl = curl_easy_init();
19  bool ret = false;
20  if (curl) {
21  struct curl_slist* chunk = nullptr;
22  chunk = curl_slist_append(chunk, "content-type:document/plain");
23  curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
24  curl_easy_setopt(curl, CURLOPT_URL, urlString.c_str());
25  curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, getHtmlCallback);
26  curl_easy_setopt(curl, CURLOPT_WRITEDATA, &htmlBuffer);
27  curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf);
28  res = curl_easy_perform(curl);
29  if (CURLE_OK == res) {
30  info = htmlBuffer;
31  ret = true;
32  } else {
33  size_t len = strlen(errbuf);
34  fprintf(stderr, "\nlibcurl: (%d) ", res);
35  if (len)
36  fprintf(stderr, "%s%s", errbuf, ((errbuf[len - 1] != '\n') ? "\n" : ""));
37  else
38  fprintf(stderr, "%s\n", curl_easy_strerror(res));
39  }
40  curl_easy_cleanup(curl);
41  }
42  return ret;
43 }
44 
45 namespace cond {
46 
48  cond::Time_t lastLumiProcessed = cond::time::MIN_VAL;
49  std::ifstream lastLumiFile(fileName);
50  if (lastLumiFile) {
51  lastLumiFile >> lastLumiProcessed;
52  } else {
53  throw Exception(std::string("Can't access lastLumi file ") + fileName);
54  }
55  return lastLumiProcessed;
56  }
57 
59  cond::Time_t lastLumiProcessed = cond::time::MIN_VAL;
60  std::string info("");
61  if (!getInfoFromService(omsServiceUrl, info))
62  throw Exception("Can't get data from OMS Service.");
63  std::istringstream sinfo(info);
64  std::string srun;
65  if (!std::getline(sinfo, srun, ',')) {
66  throw Exception("Can't get run runmber info from OMS Service.");
67  }
68  std::string slumi;
69  if (!std::getline(sinfo, slumi, ',')) {
70  throw Exception("Can't get lumi id from OMS Service.");
71  }
72  unsigned int run = std::stoul(srun);
73  unsigned int lumi = std::stoul(slumi);
74  lastLumiProcessed = cond::time::lumiTime(run, lumi);
75  return lastLumiProcessed;
76  }
77 
78 } // namespace cond
79 
82  : PoolDBOutputService(iConfig, iAR),
83  m_runNumber(iConfig.getUntrackedParameter<unsigned long long>("runNumber", 1)),
84  m_latencyInLumisections(iConfig.getUntrackedParameter<unsigned int>("latency", 1)),
85  m_omsServiceUrl(iConfig.getUntrackedParameter<std::string>("omsServiceUrl", "")),
86  m_preLoadConnectionString(iConfig.getUntrackedParameter<std::string>("preLoadConnectionString", "")),
87  m_frontierKey(iConfig.getUntrackedParameter<std::string>("frontierKey", "")),
88  m_debug(iConfig.getUntrackedParameter<bool>("debugLogging", false)) {
89  if (m_omsServiceUrl.empty()) {
90  m_lastLumiFile = iConfig.getUntrackedParameter<std::string>("lastLumiFile", "");
91  }
92 }
93 
95 
97  cond::Time_t lastLumiProcessed = cond::time::MIN_VAL;
98  std::string info("");
99  if (!m_omsServiceUrl.empty()) {
100  lastLumiProcessed = cond::getLastLumiFromOMS(m_omsServiceUrl);
101  logger().logInfo() << "Last lumi: " << lastLumiProcessed
102  << " Current run: " << cond::time::unpack(lastLumiProcessed).first
103  << " lumi id:" << cond::time::unpack(lastLumiProcessed).second;
104  } else {
105  if (!m_lastLumiFile.empty()) {
106  lastLumiProcessed = cond::getLatestLumiFromFile(m_lastLumiFile);
107  auto upkTime = cond::time::unpack(lastLumiProcessed);
108  logger().logInfo() << "Last lumi: " << lastLumiProcessed << " Current run: " << upkTime.first
109  << " lumi id:" << upkTime.second;
110  } else {
111  lastLumiProcessed = cond::time::lumiTime(m_runNumber, 1);
112  }
113  }
114  return lastLumiProcessed;
115 }
116 
118  cond::persistency::Session session = getReadOnlyCache(targetTime);
119  cond::persistency::TransactionScope transaction(session.transaction());
120  transaction.start(true);
122  auto iov = proxy.getInterval(targetTime);
123  transaction.commit();
124  return iov;
125 }
126 
128  std::stringstream transId;
129  transId << targetTime;
130  if (!m_frontierKey.empty()) {
131  transId << "_" << m_frontierKey;
132  }
133  return PoolDBOutputService::newReadOnlySession(m_preLoadConnectionString, transId.str());
134 }
persistency::Exception Exception
Definition: Exception.h:25
T getUntrackedParameter(std::string const &, T const &) const
tuple ret
prodAgent to be discontinued
static const TGPicture * info(bool iBackgroundIsBlack)
tuple logger
Definition: conddblib.py:25
cond::Time_t getLastLumiFromOMS(const std::string &omsServiceUrl)
const Time_t MIN_VAL(0)
tuple recordName
Definition: align_cfg.py:66
Transaction & transaction()
Definition: Session.cc:52
std::string tag(const std::string &recordName)
unsigned long long Time_t
Definition: Time.h:14
Time_t lumiTime(unsigned int run, unsigned int lumiId)
Definition: Time.cc:54
OnlineDBOutputService(const edm::ParameterSet &iConfig, edm::ActivityRegistry &iAR)
cond::Iov_t preLoadIov(const std::string &recordName, cond::Time_t targetTime)
cond::Time_t getLatestLumiFromFile(const std::string &fileName)
void start(bool readOnly=true)
Definition: Session.cc:236
cond::Iov_t getInterval(cond::Time_t time)
Definition: IOVProxy.cc:327
list lumi
Definition: dqmdumpme.py:53
IOVProxy readIov(const std::string &tag)
Definition: Session.cc:63
bool getInfoFromService(const std::string &urlString, std::string &info)
cond::persistency::Session newReadOnlySession(const std::string &connectionString, const std::string &transactionId)
cond::persistency::Session getReadOnlyCache(cond::Time_t targetTime)
static size_t getHtmlCallback(void *contents, size_t size, size_t nmemb, void *ptr)
tuple size
Write out results.
cond::UnpackedTime unpack(cond::Time_t iValue)