CMS 3D CMS Logo

Classes | Functions
conddblib Namespace Reference

Classes

class  _Col
 
class  BoostRunMap
 
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  TagMetadata
 
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 591 of file conddblib.py.

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

Referenced by listObject().

591 def _exists(session, primary_key, value):
592  ret = None
593  try:
594  ret = session.query(primary_key).\
595  filter(primary_key == value).\
596  count() != 0
597  except sqlalchemy.exc.OperationalError:
598  pass
599 
600  return ret
601 
def _exists(session, primary_key, value)
Definition: conddblib.py:591
def conddblib._getCMSFrontierConnectionString (   database)
private

Definition at line 481 of file conddblib.py.

References communicate(), and digitizers_cfi.strip.

Referenced by _getCMSSQLAlchemyConnectionString().

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

Definition at line 485 of file conddblib.py.

References _getCMSFrontierConnectionString().

Referenced by make_url().

485 def _getCMSSQLAlchemyConnectionString(technology,service,schema_name):
486  if technology == 'frontier':
487  import urllib
488  return '%s://@%s/%s' % ('oracle+frontier', urllib.quote_plus(_getCMSFrontierConnectionString(service)), schema_name )
489  elif technology == 'oracle':
490  return '%s://%s@%s' % (technology, schema_name, service)
491 
492 # Entry point
def _getCMSFrontierConnectionString(database)
Definition: conddblib.py:481
def _getCMSSQLAlchemyConnectionString(technology, service, schema_name)
Definition: conddblib.py:485
def conddblib._inserted_before (   timestamp)
private
To be used inside filter().

Definition at line 602 of file conddblib.py.

Referenced by listObject().

602 def _inserted_before(timestamp):
603  '''To be used inside filter().
604  '''
605 
606  if timestamp is None:
607  # XXX: Returning None does not get optimized (skipped) by SQLAlchemy,
608  # and returning True does not work in Oracle (generates "and 1"
609  # which breaks Oracle but not SQLite). For the moment just use
610  # this dummy condition.
611  return sqlalchemy.literal(True) == sqlalchemy.literal(True)
612 
613  return conddb.IOV.insertion_time <= _parse_timestamp(timestamp)
614 
def _inserted_before(timestamp)
Definition: conddblib.py:602
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 539 of file conddblib.py.

References str.

539 def connect(url, authPath=None, verbose=0):
540  '''Returns a Connection instance to the CMS Condition DB.
541 
542  See database_help for the description of the database parameter.
543 
544  The verbosity level is as follows:
545 
546  0 = No output (default).
547  1 = SQL statements issued, including their parameters.
548  2 = In addition, results of the queries (all rows and the column headers).
549  '''
550 
551  if url.drivername == 'oracle':
552  if url.username is None:
553  logging.error('Could not resolve the username for the connection %s. Please provide a connection in the format oracle://[user]:[pass]@[host]' %url )
554  raise Exception('Connection format error: %s' %url )
555  if url.password is None:
556  if authPath is None:
557  if authPathEnvVar in os.environ:
558  authPath = os.environ[authPathEnvVar]
559  authFile = None
560  if authPath is not None:
561  authFile = os.path.join(authPath,'.netrc')
562  if authFile is not None:
563  entryKey = url.host.lower()+"/"+url.username.lower()
564  logging.debug('Looking up credentials for %s in file %s ' %(entryKey,authFile) )
565  import netrc
566  params = netrc.netrc( authFile ).authenticators(entryKey)
567  if params is not None:
568  (username, account, password) = params
569  url.password = password
570  else:
571  msg = 'The entry %s has not been found in the .netrc file.' %entryKey
572  raise TypeError(msg)
573  else:
574  import getpass
575  pwd = getpass.getpass('Password for %s: ' % str(url))
576  if pwd is None or pwd == '':
577  pwd = getpass.getpass('Password for %s: ' % str(url))
578  if pwd is None or pwd == '':
579  raise Exception('Empty password provided, bailing out...')
580  url.password = pwd
581 
582  if verbose >= 1:
583  logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
584 
585  if verbose >= 2:
586  logging.getLogger('sqlalchemy.engine').setLevel(logging.DEBUG)
587 
588  return Connection(url)
589 
590 
def connect(url, authPath=None, verbose=0)
Definition: conddblib.py:539
#define str(s)
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 654 of file conddblib.py.

References ALCARECOTkAlBeamHalo_cff.filter.

654 def getPayload(session, hash):
655  # get payload from DB:
656  data, payloadType = session.query(Payload.data, Payload.object_type).filter(Payload.hash == hash).one()
657  return data
658 
def getPayload(session, hash)
Definition: conddblib.py:654
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 459 of file conddblib.py.

References make_url().

459 def getSessionOnMasterDB( session1, session2 ):
460  key = '%s/%s'
461  sessiondict = { }
462  sessiondict[key %(session1._url.drivername,session1._url.host)] = session1
463  sessiondict[key %(session2._url.drivername,session2._url.host)] = session2
464  masterkey = key %('oracle',ONLINEORAPRO)
465  if masterkey in sessiondict.keys():
466  return sessiondict[masterkey]
467  adgkey = key %('oracle',ORAPRO)
468  if adgkey in sessiondict.keys():
469  return sessiondict[adgkey]
470  frontierkey = key %('frontier',PRO)
471  if frontierkey in sessiondict.keys():
472  return sessiondict[frontierkey]
473  # default case: frontier on pro
474  conn = Connection(make_url())
475  session = conn.session()
476  # is it required?
477  session._conn = conn
478  return session
479 
480 # Connection helpers
def getSessionOnMasterDB(session1, session2)
Definition: conddblib.py:459
def make_url(database='pro', read_only=True)
Definition: conddblib.py:493
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 615 of file conddblib.py.

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

615 def listObject(session, name, snapshot=None):
616 
617  is_tag = _exists(session, Tag.name, name)
618  result = {}
619  if is_tag:
620  result['type'] = 'Tag'
621  result['name'] = session.query(Tag).get(name).name
622  result['timeType'] = session.query(Tag.time_type).\
623  filter(Tag.name == name).\
624  scalar()
625 
626  result['iovs'] = session.query(IOV.since, IOV.insertion_time, IOV.payload_hash, Payload.object_type).\
627  join(IOV.payload).\
628  filter(
629  IOV.tag_name == name,
630  _inserted_before(snapshot),
631  ).\
632  order_by(IOV.since.desc(), IOV.insertion_time.desc()).\
633  from_self().\
634  order_by(IOV.since, IOV.insertion_time).\
635  all()
636 
637  try:
638  is_global_tag = _exists(session, GlobalTag.name, name)
639  if is_global_tag:
640  result['type'] = 'GlobalTag'
641  result['name'] = session.query(GlobalTag).get(name)
642  result['tags'] = session.query(GlobalTagMap.record, GlobalTagMap.label, GlobalTagMap.tag_name).\
643  filter(GlobalTagMap.global_tag_name == name).\
644  order_by(GlobalTagMap.record, GlobalTagMap.label).\
645  all()
646  except sqlalchemy.exc.OperationalError:
647  sys.stderr.write("No table for GlobalTags found in DB.\n\n")
648 
649  if not is_tag and not is_global_tag:
650  raise Exception('There is no tag or global tag named %s in the database.' % name)
651 
652  return result
653 
def listObject(session, name, snapshot=None)
Definition: conddblib.py:615
static std::string join(char **cmd)
Definition: RemoteFile.cc:18
def _inserted_before(timestamp)
Definition: conddblib.py:602
T get(const Candidate &c)
Definition: component.h:55
def _exists(session, primary_key, value)
Definition: conddblib.py:591
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 493 of file conddblib.py.

References _getCMSSQLAlchemyConnectionString().

Referenced by getSessionOnMasterDB().

493 def make_url(database='pro',read_only = True):
494  if database.startswith('sqlite:') or database.startswith('sqlite_file:'):
495  ignore, database = database.split(':',1)
496 
497  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
498  database, schema = database.split(':')
499 
500  officialdbs = {
501  # frontier
502  'pro' : ('frontier','PromptProd', { 'R': schema_name }, ),
503  'arc' : ('frontier','FrontierArc', { 'R': schema_name }, ),
504  'int' : ('frontier','FrontierInt', { 'R': schema_name }, ),
505  'dev' : ('frontier','FrontierPrep', { 'R': schema_name }, ),
506  # oracle adg
507  'orapro': ('oracle', 'cms_orcon_adg', { 'R': dbreader_user_name }, ),
508  'oraarc': ('oracle', 'cmsarc_lb', { 'R': dbreader_user_name }, ),
509  # oracle masters
510  'oraint': ('oracle', 'cms_orcoff_int', { 'R': dbreader_user_name,
511  'W': dbwriter_user_name }, ),
512  'oradev': ('oracle', 'cms_orcoff_prep', { 'R': dbreader_user_name,
513  'W': devdbwriter_user_name }, ),
514  'onlineorapro': ('oracle', 'cms_orcon_prod', { 'R': dbreader_user_name,
515  'W': dbwriter_user_name }, ),
516  'onlineoraint': ('oracle', 'cmsintr_lb', { 'R': dbreader_user_name,
517  'W': dbwriter_user_name }, ),
518  }
519 
520  if database in officialdbs.keys():
521  key = ('R' if read_only else 'W')
522  mapping = officialdbs[database]
523  tech = mapping[0]
524  service = mapping[1]
525  schema_dict = mapping[2]
526  if key in schema_dict.keys():
527  database = _getCMSSQLAlchemyConnectionString(tech,service,schema_dict[key])
528  else:
529  raise Exception("Read-only database %s://%s cannot be accessed in update mode." %(tech,service))
530 
531  logging.debug('connection string set to "%s"' % database)
532 
533  try:
534  url = sqlalchemy.engine.url.make_url(database)
535  except sqlalchemy.exc.ArgumentError:
536  url = sqlalchemy.engine.url.make_url('sqlite:///%s' % database)
537  return url
538 
def make_url(database='pro', read_only=True)
Definition: conddblib.py:493
def _getCMSSQLAlchemyConnectionString(technology, service, schema_name)
Definition: conddblib.py:485