00001 #include "CondCore/IOVService/interface/IOVProxy.h"
00002 #include "CondCore/DBCommon/interface/TypedRef.h"
00003 #include "CondCore/DBCommon/interface/Time.h"
00004 #include "CondCore/DBCommon/interface/ClassInfoLoader.h"
00005
00006 #include "IOV.h"
00007
00008
00009
00010 namespace cond {
00011
00012 namespace impl {
00013 struct IOVImpl {
00014 IOVImpl(cond::PoolTransaction& db,
00015 const std::string & token,
00016 bool nolib) :
00017 pooldb(db){
00018 db.start(true);
00019 iov = cond::TypedRef<cond::IOV>(db,token);
00020 if (iov->iov.empty() || nolib) return;
00021
00022 std::string ptok = iov->iov.front().second;
00023 db.commit();
00024 cond::reflexTypeByToken(ptok);
00025 db.start(true);
00026 iov = cond::TypedRef<cond::IOV>(db,token);
00027 }
00028 ~IOVImpl(){
00029 pooldb.commit();
00030 }
00031 cond::PoolTransaction & pooldb;
00032 cond::TypedRef<cond::IOV> iov;
00033 };
00034
00035 }
00036
00037
00038 IOVProxy::IterHelp::IterHelp(impl::IOVImpl & impl) :
00039 iov(*impl.iov), elem(&impl.pooldb){}
00040
00041
00042 void IOVElement::set(IOV const & v, int i) {
00043 m_since = (i==0) ? v.firstsince : v.iov[i-1].first+1;
00044 m_till = v.iov[i].first;
00045 m_token = v.iov[i].second;
00046 }
00047
00048
00049
00050 IOVProxy::IOVProxy() : m_low(0), m_high(0){}
00051
00052 IOVProxy::~IOVProxy() {}
00053
00054 IOVProxy::IOVProxy(cond::PoolTransaction& db,
00055 const std::string & token, bool nolib) :
00056 m_iov(new impl::IOVImpl(db,token,nolib)), m_low(0), m_high(size()){}
00057
00058
00059 void IOVProxy::setRange(cond::Time_t since, cond::Time_t till) const {
00060 m_low=iov().find(since)-iov().iov.begin();
00061 m_high=iov().find(till)-iov().iov.begin();
00062 m_high=std::min(m_high+1,size());
00063 }
00064
00065 void IOVProxy::head(int n) const {
00066 m_high = std::min(m_low+n,m_high);
00067 }
00068
00069 void IOVProxy::tail(int n) const {
00070 m_low = std::max(m_high-n,m_low);
00071 }
00072
00073
00074
00075 int IOVProxy::size() const {
00076 return iov().iov.size();
00077 }
00078
00079 IOV const & IOVProxy::iov() const {
00080 return *(*m_iov).iov;
00081 }
00082
00083 TimeType IOVProxy::timetype() const {
00084 return (TimeType)(iov().timetype);
00085 }
00086
00087 }