CMS 3D CMS Logo

Classes | Functions
conddblib Namespace Reference

Classes

class  _Col
 
class  Connection
 
class  DbRef
 
class  Enum
 
class  EnumMetaclass
 
class  GlobalTag
 
class  GlobalTagMap
 
class  IOV
 
class  Payload
 
class  RunInfo
 
class  Synchronization
 
class  Tag
 
class  TagLog
 
class  TimeType
 

Functions

def _exists (session, primary_key, value)
 
def _getCMSFrontierConnectionString (database)
 
def _getCMSSQLAlchemyConnectionString (technology, service, schema_name)
 
def _inserted_before (timestamp)
 
def connect (url, authPath=None, verbose=0)
 
def fq_col (schema, table, column)
 
def fq_name (schema_name, table_name)
 
def getPayload (session, hash)
 
def getSchema (tp)
 
def getSessionOnMasterDB (session1, session2)
 
def hash (data)
 
def listObject (session, name, snapshot=None)
 
def make_dbtype (backendName, schemaName, baseType)
 
def make_url (database='pro', read_only=True)
 

Detailed Description

CMS Conditions DB Python library.

Function Documentation

def conddblib._exists (   session,
  primary_key,
  value 
)
private

Definition at line 576 of file conddblib.py.

References KineDebug3.count(), and ALCARECOTkAlBeamHalo_cff.filter.

Referenced by listObject().

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 
def _exists(session, primary_key, value)
Definition: conddblib.py:576
def conddblib._getCMSFrontierConnectionString (   database)
private

Definition at line 466 of file conddblib.py.

References communicate(), and digi_MixPreMix_cfi.strip.

Referenced by _getCMSSQLAlchemyConnectionString().

467  import subprocess
468  return subprocess.Popen(['cmsGetFnConnect', 'frontier://%s' % database], stdout = subprocess.PIPE).communicate()[0].strip()
469 
def _getCMSFrontierConnectionString(database)
Definition: conddblib.py:466
static void * communicate(void *obj)
Definition: DQMNet.cc:1251
def conddblib._getCMSSQLAlchemyConnectionString (   technology,
  service,
  schema_name 
)
private

Definition at line 470 of file conddblib.py.

References _getCMSFrontierConnectionString().

Referenced by make_url().

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
def _getCMSFrontierConnectionString(database)
Definition: conddblib.py:466
def _getCMSSQLAlchemyConnectionString(technology, service, schema_name)
Definition: conddblib.py:470
def conddblib._inserted_before (   timestamp)
private
To be used inside filter().

Definition at line 587 of file conddblib.py.

Referenced by listObject().

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 
def _inserted_before(timestamp)
Definition: conddblib.py:587
def conddblib.connect (   url,
  authPath = None,
  verbose = 0 
)
Returns a Connection instance to the CMS Condition DB.

See database_help for the description of the database parameter.

The verbosity level is as follows:

    0 = No output (default).
    1 = SQL statements issued, including their parameters.
    2 = In addition, results of the queries (all rows and the column headers).

Definition at line 524 of file conddblib.py.

References harvestTrackValidationPlots.str.

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 
def connect(url, authPath=None, verbose=0)
Definition: conddblib.py:524
def conddblib.fq_col (   schema,
  table,
  column 
)

Definition at line 209 of file conddblib.py.

Referenced by make_dbtype().

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 
def fq_col(schema, table, column)
Definition: conddblib.py:209
def conddblib.fq_name (   schema_name,
  table_name 
)

Definition at line 191 of file conddblib.py.

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 
def fq_name(schema_name, table_name)
Definition: conddblib.py:191
def conddblib.getPayload (   session,
  hash 
)

Definition at line 639 of file conddblib.py.

References ALCARECOTkAlBeamHalo_cff.filter.

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
643 
def getPayload(session, hash)
Definition: conddblib.py:639
def conddblib.getSchema (   tp)

Definition at line 249 of file conddblib.py.

Referenced by conddblib.Connection.is_valid().

249 def getSchema(tp):
250  if tp.__table_args__ is not None:
251  return tp.__table_args__['schema']
252  return None
253 
def getSchema(tp)
Definition: conddblib.py:249
def conddblib.getSessionOnMasterDB (   session1,
  session2 
)

Definition at line 444 of file conddblib.py.

References make_url().

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
def getSessionOnMasterDB(session1, session2)
Definition: conddblib.py:444
def make_url(database='pro', read_only=True)
Definition: conddblib.py:478
def conddblib.hash (   data)

Definition at line 82 of file conddblib.py.

82 def hash(data):
83  return hashlib.sha1(data).hexdigest()
84 
85 
86 # Constants
def hash(data)
Definition: conddblib.py:82
def conddblib.listObject (   session,
  name,
  snapshot = None 
)

Definition at line 600 of file conddblib.py.

References _exists(), _inserted_before(), Vispa.Plugins.EdmBrowser.EdmDataAccessor.all(), ALCARECOTkAlBeamHalo_cff.filter, reco.get(), join(), and hitfit.scalar().

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 
def listObject(session, name, snapshot=None)
Definition: conddblib.py:600
static std::string join(char **cmd)
Definition: RemoteFile.cc:18
def _inserted_before(timestamp)
Definition: conddblib.py:587
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
def conddblib.make_dbtype (   backendName,
  schemaName,
  baseType 
)

Definition at line 215 of file conddblib.py.

References fq_col().

Referenced by conddblib.Connection.get_dbtype().

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 
def make_dbtype(backendName, schemaName, baseType)
Definition: conddblib.py:215
def fq_col(schema, table, column)
Definition: conddblib.py:209
def conddblib.make_url (   database = 'pro',
  read_only = True 
)

Definition at line 478 of file conddblib.py.

References _getCMSSQLAlchemyConnectionString().

Referenced by getSessionOnMasterDB().

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 
def make_url(database='pro', read_only=True)
Definition: conddblib.py:478
def _getCMSSQLAlchemyConnectionString(technology, service, schema_name)
Definition: conddblib.py:470