CMS 3D CMS Logo

conddblib.py
Go to the documentation of this file.
1 '''CMS Conditions DB Python library.
2 '''
3 
4 __author__ = 'Miguel Ojeda'
5 __copyright__ = 'Copyright 2013, CERN'
6 __credits__ = ['Giacomo Govi', 'Miguel Ojeda', 'Andreas Pfeiffer']
7 __license__ = 'Unknown'
8 __maintainer__ = 'Giacomo Govi'
9 __email__ = 'mojedasa@cern.ch'
10 
11 
12 import os
13 import hashlib
14 import logging
15 
16 import sqlalchemy
17 import sqlalchemy.ext.declarative
18 
19 authPathEnvVar = 'COND_AUTH_PATH'
20 schema_name = 'CMS_CONDITIONS'
21 dbuser_name = 'cms_conditions'
22 dbreader_user_name = 'cms_cond_general_r'
23 dbwriter_user_name = 'cms_cond_general_w'
24 devdbwriter_user_name = 'cms_test_conditions'
25 logger = logging.getLogger(__name__)
26 
27 # frontier services
28 PRO ='PromptProd'
29 ARC ='FrontierArc'
30 INT ='FrontierInt'
31 DEV ='FrontierPrep'
32 # oracle read only services
33 ORAPRO = 'cms_orcon_adg'
34 ORAARC = 'cmsarc_lb'
35 # oracle masters
36 ORAINT = 'cms_orcoff_int'
37 ORADEV = 'cms_orcoff_prep'
38 ONLINEORAPRO = 'cms_orcon_prod'
39 ONLINEORAINT = 'cmsintr_lb'
40 
41 # Set initial level to WARN. This so that log statements don't occur in
42 # the absense of explicit logging being enabled.
43 if logger.level == logging.NOTSET:
44  logger.setLevel(logging.WARN)
45 
46 
47 class EnumMetaclass(type):
48  def __init__(cls, name, bases, dct):
49  cls._members = sorted([member for member in dir(cls) if not member.startswith('_')])
50  cls._map = dict([(member, getattr(cls, member)) for member in cls._members])
51  cls._reversemap = dict([(value, key) for (key, value) in cls._map.items()])
52  super(EnumMetaclass, cls).__init__(name, bases, dct)
53 
54  def __len__(cls):
55  return len(cls._members)
56 
57  def __getitem__(cls, key):
58  '''Returns the value for this key (if the key is an integer,
59  the value is the nth member from the sorted members list).
60  '''
61 
62  if isinstance(key, int):
63  # for tuple() and list()
64  key = cls._members[key]
65  return cls._map[key]
66 
67  def __call__(cls, value):
68  '''Returns the key for this value.
69  '''
70 
71  return cls._reversemap[value]
72 
73 
74 class Enum(object):
75  '''A la PEP 435, simplified.
76  '''
77 
78  __metaclass__ = EnumMetaclass
79 
80 
81 # Utility functions
82 def hash(data):
83  return hashlib.sha1(data).hexdigest()
84 
85 
86 # Constants
87 empty_label = '-'
88 
89 name_length = 100
90 description_length = 4000
91 hash_length = len(hash(''))
92 
93 web_experts_email = 'cms-cond-dev@cern.ch'
94 offline_db_experts_email = 'cms-offlinedb-exp@cern.ch'
95 offline_db_experts_phone = '+41 22 76 70817, or 70817 from CERN; check https://twiki.cern.ch/twiki/bin/viewauth/CMS/DBShifterHelpPage if it does not work; availability depends on the state of the LHC'
96 
97 contact_help = 'If you need assistance, please write an email to %s and %s. If you need immediate/urgent assistance, you can call the Offline DB expert on call (%s).' % (offline_db_experts_email, web_experts_email, offline_db_experts_phone)
98 database_help = '''
99  The database parameter (--db) refers to the database where the tool
100  will connect to read all the data. By default, the production account
101  (through Frontier) will be used.
102 
103  In subcommands which take a source and a destination, --db always refers to
104  the source, and --destdb to the destination. For both of them the following
105  rules apply.
106 
107  The database parameter can be an official alias, a filename or any
108  valid SQLAlchemy URL.
109 
110  The official aliases are the following strings (first column):
111 
112  Alias Level Database RO/RW Notes
113  ------------ ----------- ------------- ---------- -------------------------------
114 
115  pro Production Frontier (ADG) read-only Default.
116  arc Archive Frontier read-only
117  int Integration Frontier read-only
118  dev Development Frontier read-only
119  boost Production Frontier read-only
120  boostprep Development Frontier read-only
121 
122  orapro Production Oracle (ADG) read-only Password required.
123  oraarc Archive Oracle read-only Password required.
124  oraint Integration Oracle read-write Password required.
125  oradev Development Oracle read-write Password required.
126 
127  onlineorapro Production Oracle read-write Password required. Online only.
128  onlineoraint Online Int Oracle read-write Password required. Online only.
129 
130  Most of the time, if you are a regular user, you will want to read/copy
131  conditions from the Frontier production account. Therefore, you can omit
132  the --db parameter, unless you want to read from somewhere else,
133  e.g. from your local SQLite file.
134 
135  In addition, the parameter may be a filename (path) pointing to a local
136  SQLite file, e.g.
137 
138  file.db
139  relative/path/to/file.db
140  /absolute/path/to/file.db
141 
142  Finally, any valid SQLAlchemy URL can be used. This allows full
143  flexibility in cases where it may be needed, e.g.
144 
145  sqlite:// In-memory, volatile SQLite DB.
146  oracle://user@devdb11 Your private Oracle DB in devdb11 [*]
147 
148  [*] See https://account.cern.ch/ -> Services for more information
149  on personal Oracle accounts.
150 
151  For the official aliases, the password will be asked automatically
152  interactively. The same applies for Oracle URLs where the password
153  was not provided inside it, e.g.:
154 
155  oracle://user@devdb11 The tool will prompt you for the password.
156  oracle://user:pass@devdb11 Password inlined. [+]
157 
158  [+] Caution: Never write passwords in command-line parameters in
159  multi-user machines (e.g. lxplus), since other users can see them
160  in the process table (e.g. ps).
161 
162  This means that both the official aliases and the filenames are shortcuts
163  to the full SQLAlchemy URL equivalents, e.g. the following are the same:
164 
165  relative/path/to/file.db === sqlite:///relative/path/to/file.db
166  /absolute/path/to/file.db === sqlite:////absolute/path/to/file.db
167 '''
168 
170  any = 'any'
171  validation = 'validation'
172  mc = 'mc'
173  runmc = 'runmc'
174  hlt = 'hlt'
175  express = 'express'
176  prompt = 'prompt'
177  pcl = 'pcl'
178  offline = 'offline'
179 
180 class TimeType(Enum):
181  run = 'Run'
182  time = 'Time'
183  lumi = 'Lumi'
184  hash = 'Hash'
185  user = 'User'
186 
187 
188 # Schema definition
189 _Base = sqlalchemy.ext.declarative.declarative_base()
190 
191 def fq_name( schema_name, table_name ):
192  name = table_name
193  if schema_name is not None:
194  name = '%s.%s' %(schema_name, table_name)
195  return name
196 
197 db_models = {}
198 
199 class _Col(Enum):
200  nullable = 0
201  notNull = 1
202  pk = 2
203 
204 class DbRef:
205  def __init__(self,refType, refColumn):
206  self.rtype = refType
207  self.rcol = refColumn
208 
209 def fq_col( schema, table, column ):
210  fqn = '%s.%s' %(table, column)
211  if schema is not None:
212  fqn = '%s.%s' %(schema,fqn)
213  return fqn
214 
215 def make_dbtype( backendName, schemaName, baseType ):
216  members = {}
217  deps_reg = set()
218  dbtype_name = '%s_%s' %(baseType.__name__,backendName)
219  members['__tablename__'] = baseType.__tablename__
220  members['__table_args__'] = None
221  if schemaName is not None:
222  members['__table_args__'] = {'schema': schemaName }
223  for k,v in baseType.columns.items():
224  if isinstance(v[0],DbRef):
225  refColDbt = v[0].rtype.columns[v[0].rcol][0]
226  pk = (True if v[1]==_Col.pk else False)
227  if v[1]==_Col.pk:
228  members[k] = sqlalchemy.Column(refColDbt,sqlalchemy.ForeignKey(fq_col(schemaName,v[0].rtype.__tablename__,v[0].rcol)),primary_key=True)
229  else:
230  nullable = (False if v[1] == _Col.notNull else True)
231  members[k] = sqlalchemy.Column(refColDbt,sqlalchemy.ForeignKey(fq_col(schemaName,v[0].rtype.__tablename__,v[0].rcol)),nullable=nullable)
232  if v[0].rtype.__name__ not in deps_reg:
233  deps_reg.add(v[0].rtype.__name__)
234  reftype_name = '%s_%s' %(v[0].rtype.__name__,backendName)
235  members[(v[0].rtype.__name__).lower()] = sqlalchemy.orm.relationship(reftype_name)
236  else:
237  if v[1]==_Col.pk:
238  members[k] = sqlalchemy.Column(v[0],primary_key=True)
239  else:
240  nullable = (True if v[1]==_Col.nullable else False)
241  members[k] = sqlalchemy.Column(v[0],nullable=nullable)
242  dbType = type(dbtype_name,(_Base,),members)
243 
244  if backendName not in db_models.keys():
245  db_models[backendName] = {}
246  db_models[backendName][baseType.__name__] = dbType
247  return dbType
248 
249 def getSchema(tp):
250  if tp.__table_args__ is not None:
251  return tp.__table_args__['schema']
252  return None
253 
254 class Tag:
255  __tablename__ = 'TAG'
256  columns = { 'name': (sqlalchemy.String(name_length),_Col.pk),
257  'time_type': (sqlalchemy.Enum(*tuple(TimeType)),_Col.notNull),
258  'object_type': (sqlalchemy.String(name_length),_Col.notNull),
259  'synchronization': (sqlalchemy.Enum(*tuple(Synchronization)),_Col.notNull),
260  'description': (sqlalchemy.String(description_length),_Col.notNull),
261  'last_validated_time':(sqlalchemy.BIGINT,_Col.notNull),
262  'end_of_validity':(sqlalchemy.BIGINT,_Col.notNull),
263  'insertion_time':(sqlalchemy.TIMESTAMP,_Col.notNull),
264  'modification_time':(sqlalchemy.TIMESTAMP,_Col.notNull) }
265 
266 
267 class Payload:
268  __tablename__ = 'PAYLOAD'
269  columns = { 'hash': (sqlalchemy.CHAR(hash_length),_Col.pk),
270  'object_type': (sqlalchemy.String(name_length),_Col.notNull),
271  'data': (sqlalchemy.BLOB,_Col.notNull),
272  'streamer_info':(sqlalchemy.BLOB,_Col.notNull),
273  'version':(sqlalchemy.String(20),_Col.notNull),
274  'insertion_time':(sqlalchemy.TIMESTAMP,_Col.notNull) }
275 
276 
277 class IOV:
278  __tablename__ = 'IOV'
279  columns = { 'tag_name':(DbRef(Tag,'name'),_Col.pk),
280  'since':(sqlalchemy.BIGINT,_Col.pk),
281  'insertion_time':(sqlalchemy.TIMESTAMP,_Col.pk),
282  'payload_hash':(DbRef(Payload,'hash'),_Col.notNull) }
283 
284 
285 class GlobalTag:
286  __tablename__ = 'GLOBAL_TAG'
287  columns = { 'name':(sqlalchemy.String(name_length),_Col.pk),
288  'validity': (sqlalchemy.BIGINT,_Col.notNull),
289  'description':(sqlalchemy.String(description_length),_Col.notNull),
290  'release':(sqlalchemy.String(name_length),_Col.notNull),
291  'insertion_time':(sqlalchemy.TIMESTAMP,_Col.notNull),
292  'snapshot_time':(sqlalchemy.TIMESTAMP,_Col.notNull) }
293 
295  __tablename__ = 'GLOBAL_TAG_MAP'
296  columns = { 'global_tag_name':(DbRef(GlobalTag,'name'),_Col.pk),
297  'record':(sqlalchemy.String(name_length),_Col.pk),
298  'label':(sqlalchemy.String(name_length),_Col.pk),
299  'tag_name':(DbRef(Tag,'name'),_Col.notNull) }
300 
301 
302 
303 class TagLog:
304  __tablename__ = 'TAG_LOG'
305  columns = { 'tag_name':(DbRef(Tag,'name'),_Col.pk),
306  'event_time':(sqlalchemy.TIMESTAMP,_Col.pk),
307  'action':(sqlalchemy.String(100),_Col.pk),
308  'user_name':(sqlalchemy.String(100),_Col.notNull),
309  'host_name':(sqlalchemy.String(100),_Col.notNull),
310  'command':(sqlalchemy.String(500),_Col.notNull),
311  'user_text':(sqlalchemy.String(4000),_Col.notNull) }
312 
313 class RunInfo:
314  __tablename__ = 'RUN_INFO'
315  columns = { 'run_number':(sqlalchemy.BIGINT,_Col.pk),
316  'start_time':(sqlalchemy.TIMESTAMP,_Col.notNull),
317  'end_time':(sqlalchemy.TIMESTAMP,_Col.notNull) }
318 
319 
320 # CondDB object
322 
323  def __init__(self, url):
324  # Workaround to avoid creating files if not present.
325  # Python's sqlite3 module does not use sqlite3_open_v2(),
326  # and therefore we cannot disable SQLITE_OPEN_CREATE.
327  # Only in the case of creating a new database we skip the check.
328  if url.drivername == 'sqlite':
329 
330  self.engine = sqlalchemy.create_engine(url)
331 
332  enabled_foreign_keys = self.engine.execute('pragma foreign_keys').scalar()
333  supports_foreign_keys = enabled_foreign_keys is not None
334  if not supports_foreign_keys:
335  logger.warning('Your SQLite database does not support foreign keys, so constraints will not be checked. Please upgrade.')
336  elif not enabled_foreign_keys:
337  self.engine.execute('pragma foreign_keys = on')
338 
339  else:
340  self.engine = sqlalchemy.create_engine(url)
341 
342  self._session = sqlalchemy.orm.scoped_session(sqlalchemy.orm.sessionmaker(bind=self.engine))
343 
344  self._is_frontier = url.drivername == 'oracle+frontier'
345  self._is_oracle = url.drivername == 'oracle'
346  self._is_sqlite = url.drivername == 'sqlite'
347 
348  self._is_read_only = self._is_frontier or url.host in {
349  'cms_orcon_adg',
350  'cmsarc_lb',
351  }
352 
353  self._is_official = self._is_frontier or url.host in {
354  'cms_orcon_adg',
355  'cmsarc_lb',
356  'cms_orcoff_int',
357  'cms_orcoff_prep',
358  'cms_orcon_prod',
359  'cmsintr_lb',
360  }
361  self._url = url
362  self._backendName = ('sqlite' if self._is_sqlite else 'oracle' )
363  self._schemaName = ( None if self._is_sqlite else schema_name )
364  logging.debug(' ... using db "%s", schema "%s"' % (url, self._schemaName) )
365  logging.debug('Loading db types...')
366  self.get_dbtype(Tag).__name__
367  self.get_dbtype(Payload)
368  self.get_dbtype(IOV)
369  self.get_dbtype(TagLog)
370  self.get_dbtype(GlobalTag)
371  self.get_dbtype(GlobalTagMap)
372  self.get_dbtype(RunInfo)
373  self._is_valid = self.is_valid()
374 
375  def get_dbtype(self,theType):
376  basename = theType.__name__
377  if self._backendName not in db_models.keys() or basename not in db_models[self._backendName].keys():
378  return make_dbtype( self._backendName, self._schemaName, theType )
379  else:
380  return db_models[self._backendName][basename]
381 
382  def session(self):
383  s = self._session()
384  s.get_dbtype = self.get_dbtype
385  s._is_sqlite = self._is_sqlite
386  s._url = self._url
387  return s
388 
389  @property
390  def metadata(self):
391  return _Base.metadata
392 
393  @property
394  def is_frontier(self):
395  return self._is_frontier
396 
397  @property
398  def is_oracle(self):
399  return self._is_oracle
400 
401  @property
402  def is_sqlite(self):
403  return self._is_sqlite
404 
405  @property
406  def is_read_only(self):
407  return self._is_read_only
408 
409  @property
410  def is_official(self):
411  return self._is_official
412 
413  def is_valid(self):
414  '''Tests whether the current DB looks like a valid CMS Conditions one.
415  '''
416  engine_connection = self.engine.connect()
417  # temporarely avoid the check on the GT tables - there are releases in use where C++ does not create these tables.
418  _Tag = self.get_dbtype(Tag)
419  _IOV = self.get_dbtype(IOV)
420  _Payload = self.get_dbtype(Payload)
421  ret = all([self.engine.dialect.has_table(engine_connection, table.__tablename__,getSchema(table)) for table in [_Tag, _IOV, _Payload]])
422  engine_connection.close()
423  return ret
424 
425  def init(self, drop=False):
426  '''Initializes a database.
427  '''
428  logging.info('Initializing database...')
429  if drop:
430  logging.debug('Dropping tables...')
431  self.metadata.drop_all(self.engine)
432  self._is_valid = False
433  else:
434  if not self._is_valid:
435  logging.debug('Creating tables...')
436  self.get_dbtype(Tag).__table__.create(bind = self.engine)
437  self.get_dbtype(Payload).__table__.create(bind = self.engine)
438  self.get_dbtype(IOV).__table__.create(bind = self.engine)
439  self.get_dbtype(TagLog).__table__.create(bind = self.engine)
440  self.get_dbtype(GlobalTag).__table__.create(bind = self.engine)
441  self.get_dbtype(GlobalTagMap).__table__.create(bind = self.engine)
442  self._is_valid = True
443 
444 def getSessionOnMasterDB( session1, session2 ):
445  key = '%s/%s'
446  sessiondict = { }
447  sessiondict[key %(session1._url.drivername,session1._url.host)] = session1
448  sessiondict[key %(session2._url.drivername,session2._url.host)] = session2
449  masterkey = key %('oracle',ONLINEORAPRO)
450  if masterkey in sessiondict.keys():
451  return sessiondict[masterkey]
452  adgkey = key %('oracle',ORAPRO)
453  if adgkey in sessiondict.keys():
454  return sessiondict[adgkey]
455  frontierkey = key %('frontier',PRO)
456  if frontierkey in sessiondict.keys():
457  return sessiondict[frontierkey]
458  # default case: frontier on pro
459  conn = Connection(make_url())
460  session = conn.session()
461  # is it required?
462  session._conn = conn
463  return session
464 
465 # Connection helpers
467  import subprocess
468  return subprocess.Popen(['cmsGetFnConnect', 'frontier://%s' % database], stdout = subprocess.PIPE).communicate()[0].strip()
469 
470 def _getCMSSQLAlchemyConnectionString(technology,service,schema_name):
471  if technology == 'frontier':
472  import urllib
473  return '%s://@%s/%s' % ('oracle+frontier', urllib.quote_plus(_getCMSFrontierConnectionString(service)), schema_name )
474  elif technology == 'oracle':
475  return '%s://%s@%s' % (technology, schema_name, service)
476 
477 # Entry point
478 def make_url(database='pro',read_only = True):
479  if database.startswith('sqlite:') or database.startswith('sqlite_file:'):
480  ignore, database = database.split(':',1)
481 
482  if ':' in database and '://' not in database: # check if we really got a shortcut like "pro:<schema>" (and not a url like proto://...), if so, disentangle
483  database, schema = database.split(':')
484 
485  officialdbs = {
486  # frontier
487  'pro' : ('frontier','PromptProd', { 'R': schema_name }, ),
488  'arc' : ('frontier','FrontierArc', { 'R': schema_name }, ),
489  'int' : ('frontier','FrontierInt', { 'R': schema_name }, ),
490  'dev' : ('frontier','FrontierPrep', { 'R': schema_name }, ),
491  # oracle adg
492  'orapro': ('oracle', 'cms_orcon_adg', { 'R': dbreader_user_name }, ),
493  'oraarc': ('oracle', 'cmsarc_lb', { 'R': dbreader_user_name }, ),
494  # oracle masters
495  'oraint': ('oracle', 'cms_orcoff_int', { 'R': dbreader_user_name,
496  'W': dbwriter_user_name }, ),
497  'oradev': ('oracle', 'cms_orcoff_prep', { 'R': dbreader_user_name,
498  'W': devdbwriter_user_name }, ),
499  'onlineorapro': ('oracle', 'cms_orcon_prod', { 'R': dbreader_user_name,
500  'W': dbwriter_user_name }, ),
501  'onlineoraint': ('oracle', 'cmsintr_lb', { 'R': dbreader_user_name,
502  'W': dbwriter_user_name }, ),
503  }
504 
505  if database in officialdbs.keys():
506  key = ('R' if read_only else 'W')
507  mapping = officialdbs[database]
508  tech = mapping[0]
509  service = mapping[1]
510  schema_dict = mapping[2]
511  if key in schema_dict.keys():
512  database = _getCMSSQLAlchemyConnectionString(tech,service,schema_dict[key])
513  else:
514  raise Exception("Read-only database %s://%s cannot be accessed in update mode." %(tech,service))
515 
516  logging.debug('connection string set to "%s"' % database)
517 
518  try:
519  url = sqlalchemy.engine.url.make_url(database)
520  except sqlalchemy.exc.ArgumentError:
521  url = sqlalchemy.engine.url.make_url('sqlite:///%s' % database)
522  return url
523 
524 def connect(url, authPath=None, verbose=0):
525  '''Returns a Connection instance to the CMS Condition DB.
526 
527  See database_help for the description of the database parameter.
528 
529  The verbosity level is as follows:
530 
531  0 = No output (default).
532  1 = SQL statements issued, including their parameters.
533  2 = In addition, results of the queries (all rows and the column headers).
534  '''
535 
536  if url.drivername == 'oracle':
537  if url.username is None:
538  logging.error('Could not resolve the username for the connection %s. Please provide a connection in the format oracle://[user]:[pass]@[host]' %url )
539  raise Exception('Connection format error: %s' %url )
540  if url.password is None:
541  if authPath is None:
542  if authPathEnvVar in os.environ:
543  authPath = os.environ[authPathEnvVar]
544  authFile = None
545  if authPath is not None:
546  authFile = os.path.join(authPath,'.netrc')
547  if authFile is not None:
548  entryKey = url.host.lower()+"/"+url.username.lower()
549  logging.debug('Looking up credentials for %s in file %s ' %(entryKey,authFile) )
550  import netrc
551  params = netrc.netrc( authFile ).authenticators(entryKey)
552  if params is not None:
553  (username, account, password) = params
554  url.password = password
555  else:
556  msg = 'The entry %s has not been found in the .netrc file.' %entryKey
557  raise TypeError(msg)
558  else:
559  import getpass
560  pwd = getpass.getpass('Password for %s: ' % str(url))
561  if pwd is None or pwd == '':
562  pwd = getpass.getpass('Password for %s: ' % str(url))
563  if pwd is None or pwd == '':
564  raise Exception('Empty password provided, bailing out...')
565  url.password = pwd
566 
567  if verbose >= 1:
568  logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
569 
570  if verbose >= 2:
571  logging.getLogger('sqlalchemy.engine').setLevel(logging.DEBUG)
572 
573  return Connection(url)
574 
575 
576 def _exists(session, primary_key, value):
577  ret = None
578  try:
579  ret = session.query(primary_key).\
580  filter(primary_key == value).\
581  count() != 0
582  except sqlalchemy.exc.OperationalError:
583  pass
584 
585  return ret
586 
587 def _inserted_before(timestamp):
588  '''To be used inside filter().
589  '''
590 
591  if timestamp is None:
592  # XXX: Returning None does not get optimized (skipped) by SQLAlchemy,
593  # and returning True does not work in Oracle (generates "and 1"
594  # which breaks Oracle but not SQLite). For the moment just use
595  # this dummy condition.
596  return sqlalchemy.literal(True) == sqlalchemy.literal(True)
597 
598  return conddb.IOV.insertion_time <= _parse_timestamp(timestamp)
599 
600 def listObject(session, name, snapshot=None):
601 
602  is_tag = _exists(session, Tag.name, name)
603  result = {}
604  if is_tag:
605  result['type'] = 'Tag'
606  result['name'] = session.query(Tag).get(name).name
607  result['timeType'] = session.query(Tag.time_type).\
608  filter(Tag.name == name).\
609  scalar()
610 
611  result['iovs'] = session.query(IOV.since, IOV.insertion_time, IOV.payload_hash, Payload.object_type).\
612  join(IOV.payload).\
613  filter(
614  IOV.tag_name == name,
615  _inserted_before(snapshot),
616  ).\
617  order_by(IOV.since.desc(), IOV.insertion_time.desc()).\
618  from_self().\
619  order_by(IOV.since, IOV.insertion_time).\
620  all()
621 
622  try:
623  is_global_tag = _exists(session, GlobalTag.name, name)
624  if is_global_tag:
625  result['type'] = 'GlobalTag'
626  result['name'] = session.query(GlobalTag).get(name)
627  result['tags'] = session.query(GlobalTagMap.record, GlobalTagMap.label, GlobalTagMap.tag_name).\
628  filter(GlobalTagMap.global_tag_name == name).\
629  order_by(GlobalTagMap.record, GlobalTagMap.label).\
630  all()
631  except sqlalchemy.exc.OperationalError:
632  sys.stderr.write("No table for GlobalTags found in DB.\n\n")
633 
634  if not is_tag and not is_global_tag:
635  raise Exception('There is no tag or global tag named %s in the database.' % name)
636 
637  return result
638 
639 def getPayload(session, hash):
640  # get payload from DB:
641  data, payloadType = session.query(Payload.data, Payload.object_type).filter(Payload.hash == hash).one()
642  return data
def __getitem__(cls, key)
Definition: conddblib.py:57
def init(self, drop=False)
Definition: conddblib.py:425
def listObject(session, name, snapshot=None)
Definition: conddblib.py:600
def getPayload(session, hash)
Definition: conddblib.py:639
def is_valid(self)
Definition: conddblib.py:413
def metadata(self)
Definition: conddblib.py:390
def getSessionOnMasterDB(session1, session2)
Definition: conddblib.py:444
def is_oracle(self)
Definition: conddblib.py:398
def __init__(self, url)
Definition: conddblib.py:323
def _getCMSFrontierConnectionString(database)
Definition: conddblib.py:466
def is_sqlite(self)
Definition: conddblib.py:402
static void * communicate(void *obj)
Definition: DQMNet.cc:1251
def make_url(database='pro', read_only=True)
Definition: conddblib.py:478
def is_read_only(self)
Definition: conddblib.py:406
def make_dbtype(backendName, schemaName, baseType)
Definition: conddblib.py:215
def is_frontier(self)
Definition: conddblib.py:394
def fq_col(schema, table, column)
Definition: conddblib.py:209
def hash(data)
Definition: conddblib.py:82
def fq_name(schema_name, table_name)
Definition: conddblib.py:191
def getSchema(tp)
Definition: conddblib.py:249
static std::string join(char **cmd)
Definition: RemoteFile.cc:18
def __init__(cls, name, bases, dct)
Definition: conddblib.py:48
def connect(url, authPath=None, verbose=0)
Definition: conddblib.py:524
def __call__(cls, value)
Definition: conddblib.py:67
def _getCMSSQLAlchemyConnectionString(technology, service, schema_name)
Definition: conddblib.py:470
def get_dbtype(self, theType)
Definition: conddblib.py:375
dbl *** dir
Definition: mlp_gen.cc:35
def is_official(self)
Definition: conddblib.py:410
def _inserted_before(timestamp)
Definition: conddblib.py:587
def __init__(self, refType, refColumn)
Definition: conddblib.py:205
T get(const Candidate &c)
Definition: component.h:55
def _exists(session, primary_key, value)
Definition: conddblib.py:576
double scalar(const CLHEP::HepGenMatrix &m)
Return the matrix as a scalar. Raise an assertion if the matris is not .
Definition: matutil.cc:183