00001 #include "CondCore/ORA/interface/Exception.h"
00002 #include "CondCore/ORA/interface/PoolToken.h"
00003 #include "PoolDatabaseSchema.h"
00004 #include "MappingRules.h"
00005 #include "MappingElement.h"
00006
00007 #include <memory>
00008
00009 #include "RelationalAccess/ISchema.h"
00010 #include "RelationalAccess/ITable.h"
00011 #include "RelationalAccess/IQuery.h"
00012 #include "RelationalAccess/ICursor.h"
00013 #include "RelationalAccess/TableDescription.h"
00014 #include "RelationalAccess/ITablePrivilegeManager.h"
00015 #include "RelationalAccess/ITableDataEditor.h"
00016 #include "RelationalAccess/IBulkOperation.h"
00017 #include "CoralBase/Attribute.h"
00018
00019 namespace ora {
00020 }
00021
00022 std::string ora::PoolMainTable::version(){
00023 static std::string s_version("POOL");
00024 return s_version;
00025 }
00026
00027 std::string ora::PoolMainTable::tableName(){
00028 static std::string s_name("POOL_RSS_DB");
00029 return s_name;
00030 }
00031
00032 ora::PoolMainTable::PoolMainTable( coral::ISchema& dbSchema ):
00033 IMainTable( dbSchema ){
00034 }
00035
00036 ora::PoolMainTable::~PoolMainTable(){
00037 }
00038
00039 void ora::PoolMainTable::setParameter( const std::string&,
00040 const std::string& ){
00041 }
00042
00043 bool ora::PoolMainTable::getParameters( std::map<std::string,std::string>& dest){
00044 dest.insert(std::make_pair( IMainTable::versionParameterName(), version() ) );
00045 return true;
00046 }
00047
00048 std::string ora::PoolMainTable::schemaVersion(){
00049 return poolSchemaVersion();
00050 }
00051
00052 std::string ora::PoolMainTable::name(){
00053 return tableName();
00054 }
00055
00056 bool ora::PoolMainTable::exists(){
00057 return schema().existsTable( tableName() );
00058 }
00059
00060 void ora::PoolMainTable::create(){
00061 if( schema().existsTable( tableName() )){
00062 throwException( "POOL database main table already exists in this schema.",
00063 "PoolMainTable::create");
00064 }
00065 throwException( "POOL database cannot be created.","PoolMainTable::create");
00066 }
00067
00068 void ora::PoolMainTable::drop(){
00069 schema().dropIfExistsTable( tableName() );
00070 }
00071
00072 std::string ora::PoolSequenceTable::tableName(){
00073 static std::string s_name("POOL_RSS_SEQ");
00074 return s_name;
00075 }
00076
00077 std::string ora::PoolSequenceTable::sequenceNameColumn(){
00078 static std::string s_column("NAME");
00079 return s_column;
00080 }
00081
00082 std::string ora::PoolSequenceTable::sequenceValueColumn(){
00083 static std::string s_column("VALUE");
00084 return s_column;
00085 }
00086
00087 ora::PoolSequenceTable::PoolSequenceTable( coral::ISchema& schema ):
00088 ISequenceTable( schema),
00089 m_dbCache( 0 ){
00090 }
00091
00092 ora::PoolSequenceTable::~PoolSequenceTable(){
00093 }
00094
00095 void ora::PoolSequenceTable::init( PoolDbCache& dbCache ){
00096 m_dbCache = &dbCache;
00097 }
00098
00099 bool
00100 ora::PoolSequenceTable::add( const std::string& sequenceName ){
00101
00102 coral::AttributeList insertData;
00103 insertData.extend<std::string>(sequenceNameColumn());
00104 insertData.extend<int>(sequenceValueColumn());
00105 coral::AttributeList::iterator iAttribute = insertData.begin();
00106 iAttribute->data< std::string >() = sequenceName;
00107 ++iAttribute;
00108 iAttribute->data< int >() = 0;
00109 schema().tableHandle( tableName() ).dataEditor().insertRow( insertData );
00110 return true;
00111 }
00112
00113 bool
00114 ora::PoolSequenceTable::getLastId( const std::string& sequenceName,
00115 int& lastId ) {
00116 if(!m_dbCache){
00117 throwException("Sequence Table handle has not been initialized.","PoolSequenceTable::getLastId");
00118 }
00119
00120
00121 std::map<std::string,PoolDbCacheData*>& seq = m_dbCache->sequences();
00122 std::map<std::string,PoolDbCacheData*>::iterator iS = seq.find( sequenceName );
00123 if( iS != seq.end()){
00124 if( iS->second->m_nobjWr == 0 ) return false;
00125 lastId = iS->second->m_nobjWr-1;
00126 return true;
00127 }
00128
00129
00130 std::auto_ptr< coral::IQuery > query( schema().tableHandle( tableName() ).newQuery() );
00131 query->limitReturnedRows( 1, 0 );
00132 query->addToOutputList( sequenceValueColumn() );
00133 query->defineOutputType( sequenceValueColumn(), coral::AttributeSpecification::typeNameForType<int>() );
00134 query->setForUpdate();
00135 std::string whereClause( sequenceNameColumn() + " = :" + sequenceNameColumn() );
00136 coral::AttributeList rowData;
00137 rowData.extend<std::string>(sequenceNameColumn());
00138 rowData.begin()->data< std::string >() = sequenceName;
00139 query->setCondition( whereClause, rowData );
00140 coral::ICursor& cursor = query->execute();
00141 if ( cursor.next() ) {
00142 lastId = cursor.currentRow().begin()->data<int >();
00143 return true;
00144 }
00145 return false;
00146 }
00147
00148 void ora::PoolSequenceTable::sinchronize( const std::string& sequenceName,
00149 int lastValue ){
00150 if(!m_dbCache){
00151 throwException("Sequence Table handle has not been initialized.","PoolSequenceTable::sinchronize");
00152 }
00153
00154 std::map<std::string,PoolDbCacheData*>& seq = m_dbCache->sequences();
00155 std::map<std::string,PoolDbCacheData*>::iterator iS = seq.find( sequenceName );
00156 if( iS != seq.end()){
00157 iS->second->m_nobjWr = lastValue+1;
00158 return;
00159 }
00160
00161 coral::AttributeList updateData;
00162 updateData.extend<std::string>(sequenceNameColumn());
00163 updateData.extend<int>(sequenceValueColumn());
00164 std::string setClause( sequenceValueColumn() + " = :" + sequenceValueColumn() );
00165 std::string whereClause( sequenceNameColumn() + " = :" + sequenceNameColumn() );
00166
00167 coral::AttributeList::iterator iAttribute = updateData.begin();
00168 iAttribute->data< std::string >() = sequenceName;
00169 ++iAttribute;
00170 iAttribute->data< int >() = lastValue;
00171 schema().tableHandle( tableName() ).dataEditor().updateRows( setClause,whereClause,updateData );
00172 }
00173
00174 void ora::PoolSequenceTable::erase( const std::string& sequenceName ){
00175 coral::AttributeList whereData;
00176 whereData.extend<std::string>(sequenceNameColumn());
00177 whereData[ sequenceNameColumn() ].data<std::string>() = sequenceName;
00178 std::string whereClause( sequenceNameColumn() + " = :" + sequenceNameColumn() );
00179 schema().tableHandle( tableName() ).dataEditor().deleteRows( whereClause, whereData );
00180 }
00181
00182 std::string ora::PoolSequenceTable::name(){
00183 return tableName();
00184 }
00185
00186 bool ora::PoolSequenceTable::exists(){
00187 if(!m_dbCache){
00188 throwException("Sequence Table handle has not been initialized.","PoolSequenceTable::exists");
00189 }
00190
00191 return schema().existsTable( tableName() );
00192 }
00193
00194 void ora::PoolSequenceTable::create(){
00195 if( schema().existsTable( tableName() )){
00196 throwException( "POOL database sequence table already exists in this schema.",
00197 "PoolSequenceTable::create");
00198 }
00199 throwException( "POOL database cannot be created.","PoolSequenceTable::create");
00200 }
00201
00202 void ora::PoolSequenceTable::drop(){
00203 schema().dropIfExistsTable( tableName() );
00204 }
00205
00206 std::string ora::PoolMappingVersionTable::tableName(){
00207 static std::string s_table("POOL_OR_MAPPING_VERSIONS");
00208 return s_table;
00209 }
00210
00211 std::string ora::PoolMappingVersionTable::mappingVersionColumn(){
00212 static std::string s_col("MAPPING_VERSION");
00213 return s_col;
00214 }
00215
00216 std::string ora::PoolMappingVersionTable::containerNameColumn(){
00217 static std::string s_col("CONTAINER_ID");
00218 return s_col;
00219 }
00220
00221 ora::PoolMappingVersionTable::PoolMappingVersionTable( coral::ISchema& dbSchema ):
00222 IDatabaseTable( dbSchema ){
00223 }
00224
00225 ora::PoolMappingVersionTable::~PoolMappingVersionTable(){
00226 }
00227
00228 std::string ora::PoolMappingVersionTable::name(){
00229 return tableName();
00230 }
00231
00232 bool ora::PoolMappingVersionTable::exists(){
00233 return schema().existsTable( tableName() );
00234 }
00235
00236 void ora::PoolMappingVersionTable::create(){
00237 if( schema().existsTable( tableName() )){
00238 throwException( "POOL database mapping version table already exists in this schema.",
00239 "PoolMappingVersionTable::create");
00240 }
00241 throwException( "POOL database cannot be created.","PoolMappingVersionTable::create");
00242 }
00243
00244 void ora::PoolMappingVersionTable::drop(){
00245 schema().dropIfExistsTable( tableName() );
00246 }
00247
00248 std::string ora::PoolMappingElementTable::tableName(){
00249 static std::string s_table("POOL_OR_MAPPING_ELEMENTS");
00250 return s_table;
00251 }
00252
00253 std::string ora::PoolMappingElementTable::mappingVersionColumn(){
00254 static std::string s_col("MAPPING_VERSION");
00255 return s_col;
00256 }
00257
00258 std::string ora::PoolMappingElementTable::elementIdColumn(){
00259 static std::string s_col("ELEMENT_ID");
00260 return s_col;
00261 }
00262
00263 std::string ora::PoolMappingElementTable::elementTypeColumn(){
00264 static std::string s_col("ELEMENT_TYPE");
00265 return s_col;
00266 }
00267
00268 std::string ora::PoolMappingElementTable::scopeNameColumn(){
00269 static std::string s_col("VARIABLE_SCOPE");
00270 return s_col;
00271 }
00272
00273 std::string ora::PoolMappingElementTable::variableNameColumn(){
00274 static std::string s_col("VARIABLE_NAME");
00275 return s_col;
00276 }
00277
00278 std::string ora::PoolMappingElementTable::variableParIndexColumn(){
00279 static std::string s_col("VARIABLE_PAR_INDEX");
00280 return s_col;
00281 }
00282
00283 std::string ora::PoolMappingElementTable::variableTypeColumn(){
00284 static std::string s_col("VARIABLE_TYPE");
00285 return s_col;
00286 }
00287
00288 std::string ora::PoolMappingElementTable::tableNameColumn(){
00289 static std::string s_col("TABLE_NAME");
00290 return s_col;
00291 }
00292
00293 std::string ora::PoolMappingElementTable::columnNameColumn(){
00294 static std::string s_col("COLUMN_NAME");
00295 return s_col;
00296 }
00297
00298 ora::PoolMappingElementTable::PoolMappingElementTable( coral::ISchema& dbSchema ):
00299 IDatabaseTable( dbSchema ){
00300 }
00301
00302 ora::PoolMappingElementTable::~PoolMappingElementTable(){
00303 }
00304
00305 std::string ora::PoolMappingElementTable::name(){
00306 return tableName();
00307 }
00308
00309 bool ora::PoolMappingElementTable::exists(){
00310 return schema().existsTable( tableName() );
00311 }
00312
00313 void ora::PoolMappingElementTable::create(){
00314 if( schema().existsTable( tableName() )){
00315 throwException( "POOL database mapping element table already exists in this schema.",
00316 "PoolMappingElementTable::create");
00317 }
00318 throwException( "POOL database cannot be created.","PoolMappingElementTable::create");
00319 }
00320
00321 void ora::PoolMappingElementTable::drop(){
00322 schema().dropIfExistsTable( tableName() );
00323 }
00324
00325 ora::PoolDbCacheData::PoolDbCacheData():
00326 m_id( 0 ),
00327 m_name("" ),
00328 m_className("" ),
00329 m_mappingVersion( "" ),
00330 m_nobjWr( 0 ){
00331 }
00332
00333 ora::PoolDbCacheData::PoolDbCacheData( int id,
00334 const std::string& name,
00335 const std::string& className,
00336 const std::string& mappingVersion,
00337 unsigned int nobjWr ):
00338 m_id( id ),
00339 m_name( name ),
00340 m_className( className ),
00341 m_mappingVersion( mappingVersion ),
00342 m_nobjWr( nobjWr ){
00343 }
00344
00345 ora::PoolDbCacheData::~PoolDbCacheData(){
00346 }
00347
00348 ora::PoolDbCacheData::PoolDbCacheData( const ora::PoolDbCacheData& rhs ):
00349 m_id( rhs.m_id ),
00350 m_name( rhs.m_name ),
00351 m_className( rhs.m_className ),
00352 m_mappingVersion( rhs.m_mappingVersion ),
00353 m_nobjWr( rhs.m_nobjWr ){
00354 }
00355
00356 ora::PoolDbCacheData& ora::PoolDbCacheData::operator=( const ora::PoolDbCacheData& rhs ){
00357 m_id = rhs.m_id;
00358 m_name = rhs.m_name;
00359 m_className = rhs.m_className;
00360 m_mappingVersion = rhs.m_mappingVersion;
00361 m_nobjWr = rhs.m_nobjWr;
00362 return *this;
00363 }
00364
00365 ora::PoolDbCache::PoolDbCache():
00366 m_databaseData(),
00367 m_mappingData(),
00368 m_idMap(),
00369 m_sequences(){
00370 m_databaseData.m_nobjWr = 1;
00371 m_mappingData.m_nobjWr = 1;
00372 }
00373
00374 ora::PoolDbCache::~PoolDbCache(){
00375 }
00376
00377 void ora::PoolDbCache::add( int id, const PoolDbCacheData& data ){
00378 std::map<int,PoolDbCacheData >::iterator iData = m_idMap.insert( std::make_pair( id, data )).first;
00379 std::map<std::string,PoolDbCacheData*>::iterator iS = m_sequences.find( MappingRules::sequenceNameForContainerId() );
00380 if( iS == m_sequences.end() ){
00381 throwException( "ContainerId Sequence is empty","PoolDbCache::add");
00382 }
00383 if( id > (int)iS->second->m_nobjWr ){
00384 iS->second->m_nobjWr = id;
00385 }
00386 m_sequences.insert( std::make_pair( MappingRules::sequenceNameForContainer( data.m_name ),&iData->second ) );
00387 }
00388
00389 const std::string& ora::PoolDbCache::nameById( int id ){
00390 PoolDbCacheData& data = find( id );
00391 return data.m_name;
00392 }
00393
00394 int ora::PoolDbCache::idByName( const std::string& name ){
00395 int ret = -1;
00396 for(std::map<int,PoolDbCacheData >::const_iterator iData = m_idMap.begin();
00397 iData != m_idMap.end(); iData++ ){
00398 if( iData->second.m_name == name ){
00399 ret = iData->first;
00400 break;
00401 }
00402 }
00403 return ret;
00404 }
00405
00406 ora::PoolDbCacheData& ora::PoolDbCache::find( int id ){
00407 std::map<int,PoolDbCacheData >::iterator iC = m_idMap.find( id );
00408 if( iC == m_idMap.end() ){
00409 throwException("Container has not been found in the cache.","PoolDbCache::find");
00410 }
00411 return iC->second;
00412 }
00413
00414 void ora::PoolDbCache::remove( int id ){
00415 std::string name = find( id ).m_name;
00416 m_sequences.erase( MappingRules::sequenceNameForContainer( name ) );
00417 m_idMap.erase( id );
00418 }
00419
00420 std::map<std::string,ora::PoolDbCacheData*>& ora::PoolDbCache::sequences(){
00421 return m_sequences;
00422 }
00423
00424 void ora::PoolDbCache::clear(){
00425 m_sequences.clear();
00426 m_idMap.clear();
00427 m_sequences.insert(std::make_pair( MappingRules::sequenceNameForContainerId(), &m_databaseData ) );
00428 m_sequences.insert(std::make_pair( MappingRules::sequenceNameForMapping(), &m_mappingData ) );
00429 }
00430
00431 std::string ora::PoolContainerHeaderTable::tableName(){
00432 static std::string s_name("POOL_RSS_CONTAINERS");
00433 return s_name;
00434 }
00435
00436
00437 std::string ora::PoolContainerHeaderTable::containerIdColumn(){
00438 static std::string s_column("CONTAINER_ID");
00439 return s_column;
00440 }
00441
00442
00443 std::string ora::PoolContainerHeaderTable::containerNameColumn(){
00444 static std::string s_column("CONTAINER_NAME");
00445 return s_column;
00446 }
00447
00448 std::string ora::PoolContainerHeaderTable::containerTypeColumn(){
00449 static std::string s_column("CONTAINER_TYPE");
00450 return s_column;
00451 }
00452
00453 std::string ora::PoolContainerHeaderTable::tableNameColumn(){
00454 static std::string s_column("TABLE_NAME");
00455 return s_column;
00456 }
00457
00458 std::string ora::PoolContainerHeaderTable::classNameColumn(){
00459 static std::string s_column("CLASS_NAME");
00460 return s_column;
00461 }
00462
00463 std::string ora::PoolContainerHeaderTable::baseMappingVersionColumn(){
00464 static std::string s_column("MAPPING_VERSION");
00465 return s_column;
00466 }
00467
00468 std::string ora::PoolContainerHeaderTable::numberOfWrittenObjectsColumn(){
00469 static std::string s_column("NUMBER_OF_WRITTEN_OBJECTS");
00470 return s_column;
00471 }
00472
00473 std::string ora::PoolContainerHeaderTable::numberOfDeletedObjectsColumn(){
00474 static std::string s_column("NUMBER_OF_DELETED_OBJECTS");
00475 return s_column;
00476 }
00477
00478 std::string ora::PoolContainerHeaderTable::homogeneousContainerType(){
00479 static std::string s_type("Homogeneous");
00480 return s_type;
00481 }
00482
00483 ora::PoolContainerHeaderTable::PoolContainerHeaderTable( coral::ISchema& dbSchema ):
00484 IContainerHeaderTable(dbSchema),
00485 m_dbCache( 0 ){
00486 }
00487
00488 ora::PoolContainerHeaderTable::~PoolContainerHeaderTable(){
00489 }
00490
00491 void ora::PoolContainerHeaderTable::init( PoolDbCache& dbCache ){
00492 m_dbCache = &dbCache;
00493 }
00494
00495 bool ora::PoolContainerHeaderTable::getContainerData( std::map<std::string,
00496 ora::ContainerHeaderData>& dest ){
00497 if(!m_dbCache){
00498 throwException("Container Table handle has not been initialized.","PoolContainerHeaderTable::getContainerData");
00499 }
00500 bool ret = false;
00501 m_dbCache->clear();
00502 coral::ITable& containerTable = schema().tableHandle( tableName() );
00503 std::auto_ptr<coral::IQuery> query( containerTable.newQuery());
00504 coral::AttributeList outputBuffer;
00505 outputBuffer.extend<int>( containerIdColumn() );
00506 outputBuffer.extend<std::string>( containerNameColumn() );
00507 outputBuffer.extend<std::string>( classNameColumn() );
00508 outputBuffer.extend<std::string>( baseMappingVersionColumn() );
00509 outputBuffer.extend<unsigned int>( numberOfWrittenObjectsColumn() );
00510 outputBuffer.extend<unsigned int>( numberOfDeletedObjectsColumn() );
00511 query->defineOutput( outputBuffer );
00512 query->addToOutputList( containerIdColumn() );
00513 query->addToOutputList( containerNameColumn() );
00514 query->addToOutputList( classNameColumn() );
00515 query->addToOutputList( baseMappingVersionColumn() );
00516 query->addToOutputList( numberOfWrittenObjectsColumn() );
00517 query->addToOutputList( numberOfDeletedObjectsColumn() );
00518 std::stringstream condition;
00519 condition << containerTypeColumn()<<" = :"<<containerTypeColumn();
00520 coral::AttributeList condData;
00521 condData.extend<std::string>( containerTypeColumn() );
00522 condData[ containerTypeColumn() ].data<std::string>()=homogeneousContainerType();
00523 query->setCondition( condition.str(), condData );
00524 coral::ICursor& cursor = query->execute();
00525 while ( cursor.next() ) {
00526 ret = true;
00527 const coral::AttributeList& row = cursor.currentRow();
00528 int containerId = row[ containerIdColumn() ].data< int >() - 1;
00529 std::string containerName = row[ containerNameColumn()].data< std::string >();
00530 std::string className = row[ classNameColumn()].data< std::string >();
00531 std::string baseMappingVersion = row[ baseMappingVersionColumn()].data< std::string >();
00532 unsigned int numberOfWrittenObjects = row[ numberOfWrittenObjectsColumn()].data< unsigned int >();
00533 unsigned int numberOfDeletedObjects = row[ numberOfDeletedObjectsColumn()].data< unsigned int >();
00534
00535 dest.insert( std::make_pair( containerName, ContainerHeaderData( containerId, className,
00536 numberOfWrittenObjects-numberOfDeletedObjects ) )) ;
00537 m_dbCache->add( containerId, PoolDbCacheData(containerId, containerName, className, baseMappingVersion, numberOfWrittenObjects) );
00538 }
00539 return ret;
00540 }
00541
00542 void ora::PoolContainerHeaderTable::addContainer( int containerId,
00543 const std::string& containerName,
00544 const std::string& className ){
00570 throwException( "Cannot create new Containers into POOL database.","PoolContainerHeaderTable::addContainer");
00571 }
00572
00573 void ora::PoolContainerHeaderTable::removeContainer( int id ){
00574 if(!m_dbCache){
00575 throwException("Container Table handle has not been initialized.","PoolContainerHeaderTable::removeContainer");
00576 }
00577 m_dbCache->remove( id );
00578 std::stringstream whereClause;
00579 whereClause << containerIdColumn() << "= :" <<containerIdColumn();
00580 coral::AttributeList whereData;
00581 whereData.extend< int >( containerIdColumn() );
00582 whereData.begin()->data< int >() = id + 1;
00583 coral::ITable& containerTable = schema().tableHandle( tableName() );
00584 containerTable.dataEditor().deleteRows(whereClause.str(),whereData);
00585 }
00586
00587 bool ora::PoolContainerHeaderTable::lockContainer( int id, ContainerHeaderData& dest ){
00588 bool ret = false;
00589 coral::ITable& containerTable = schema().tableHandle( tableName() );
00590 std::auto_ptr<coral::IQuery> query( containerTable.newQuery());
00591 query->addToOutputList( classNameColumn() );
00592 query->defineOutputType( classNameColumn() , coral::AttributeSpecification::typeNameForType<std::string>() );
00593 query->addToOutputList( numberOfWrittenObjectsColumn() );
00594 query->defineOutputType( numberOfWrittenObjectsColumn(), coral::AttributeSpecification::typeNameForType<unsigned int>() );
00595 query->addToOutputList( numberOfDeletedObjectsColumn() );
00596 query->defineOutputType( numberOfDeletedObjectsColumn(), coral::AttributeSpecification::typeNameForType<unsigned int>() );
00597 std::stringstream whereClause;
00598 whereClause << containerIdColumn() << "= :" <<containerIdColumn();
00599 coral::AttributeList whereData;
00600 whereData.extend<int>( containerIdColumn() );
00601 whereData.begin()->data<int>() = id +1 ;
00602 query->setCondition( whereClause.str(), whereData );
00603 query->setForUpdate();
00604 coral::ICursor& cursor = query->execute();
00605 if( cursor.next() ) {
00606 ret = true;
00607 const coral::AttributeList& row = cursor.currentRow();
00608 dest.id = id;
00609 dest.className = row[ classNameColumn()].data< std::string >();
00610 unsigned int numberOfWrittenObjects = row[ numberOfWrittenObjectsColumn()].data< unsigned int >();
00611 unsigned int numberOfDeletedObjects = row[ numberOfDeletedObjectsColumn()].data< unsigned int >();
00612 dest.numberOfObjects = numberOfWrittenObjects-numberOfDeletedObjects;
00613 }
00614 return ret;
00615 }
00616
00617 void ora::PoolContainerHeaderTable::incrementNumberOfObjects( int containerId ){
00618 throwException( "Operation not supported into POOL database.","PoolContainerHeaderTable::incrementNumberOfObjects");
00619 }
00620
00621 void ora::PoolContainerHeaderTable::decrementNumberOfObjects( int containerId ){
00622 throwException( "Operation not supported into POOL database.","PoolContainerHeaderTable::decrementNumberOfObjects");
00623 }
00624
00625 void ora::PoolContainerHeaderTable::updateNumberOfObjects( const std::map<int,unsigned int>& numberOfObjectsForContainerIds ){
00626 if( numberOfObjectsForContainerIds.size() ){
00627
00628 if(!m_dbCache){
00629 throwException("Container Table handle has not been initialized.","PoolContainerHeaderTable::updateNumberOfObjects");
00630 }
00631
00632 std::stringstream whereClause;
00633 whereClause << containerIdColumn() << " = :" <<containerIdColumn();
00634 std::stringstream setClause;
00635 setClause << numberOfWrittenObjectsColumn()<< " = :"<<numberOfWrittenObjectsColumn();
00636 setClause << " , "<< numberOfDeletedObjectsColumn()<< " = :"<<numberOfDeletedObjectsColumn();
00637 coral::AttributeList updateData;
00638 updateData.extend<unsigned int>( numberOfWrittenObjectsColumn() );
00639 updateData.extend<unsigned int>( numberOfDeletedObjectsColumn() );
00640 updateData.extend<int>( containerIdColumn() );
00641
00642 coral::ITable& containerTable = schema().tableHandle( tableName() );
00643 std::auto_ptr<coral::IBulkOperation> bulkUpdate( containerTable.dataEditor().bulkUpdateRows( setClause.str(), whereClause.str(), updateData,(int)numberOfObjectsForContainerIds.size()+1));
00644
00645 for( std::map<int,unsigned int>::const_iterator iCont = numberOfObjectsForContainerIds.begin();
00646 iCont != numberOfObjectsForContainerIds.end(); ++iCont ){
00647
00648 PoolDbCacheData& contData = m_dbCache->find( iCont->first );
00649 unsigned int nwrt = contData.m_nobjWr;
00650 unsigned int ndel = nwrt-iCont->second;
00651
00652 updateData[containerIdColumn()].data<int>() = iCont->first + 1;
00653 updateData[numberOfWrittenObjectsColumn()].data<unsigned int>() = nwrt;
00654 updateData[numberOfDeletedObjectsColumn()].data<unsigned int>() = ndel;
00655 bulkUpdate->processNextIteration();
00656
00657 }
00658 bulkUpdate->flush();
00659 }
00660 }
00661
00662 std::string ora::PoolContainerHeaderTable::name(){
00663 return tableName();
00664 }
00665
00666 bool ora::PoolContainerHeaderTable::exists(){
00667 return schema().existsTable( tableName() );
00668 }
00669
00670 void ora::PoolContainerHeaderTable::create(){
00671 if( schema().existsTable( tableName() )){
00672 throwException( "POOL database container header table already exists in this schema.",
00673 "PoolContainerHeaderTable::create");
00674 }
00675 throwException( "POOL database cannot be created.","PoolContainerHeaderTable::create");
00676 }
00677
00678 void ora::PoolContainerHeaderTable::drop(){
00679 schema().dropIfExistsTable( tableName() );
00680 }
00681
00682 std::string ora::PoolClassVersionTable::tableName(){
00683 static std::string s_table("POOL_OR_CLASS_VERSIONS");
00684 return s_table;
00685 }
00686
00687 std::string ora::PoolClassVersionTable::classVersionColumn(){
00688 static std::string s_col("CLASS_VERSION");
00689 return s_col;
00690 }
00691
00692 std::string ora::PoolClassVersionTable::containerNameColumn(){
00693 static std::string s_col("CONTAINER_ID");
00694 return s_col;
00695
00696 }
00697
00698 std::string ora::PoolClassVersionTable::mappingVersionColumn(){
00699 static std::string s_col("MAPPING_VERSION");
00700 return s_col;
00701 }
00702
00703 ora::PoolClassVersionTable::PoolClassVersionTable( coral::ISchema& dbSchema ):
00704 IDatabaseTable( dbSchema ){
00705 }
00706
00707 ora::PoolClassVersionTable::~PoolClassVersionTable(){
00708 }
00709
00710 std::string ora::PoolClassVersionTable::name(){
00711 return tableName();
00712 }
00713
00714 bool ora::PoolClassVersionTable::exists(){
00715 return schema().existsTable( tableName() );
00716 }
00717
00718 void ora::PoolClassVersionTable::create(){
00719 if( schema().existsTable( tableName() )){
00720 throwException( "POOL database class version table already exists in this schema.",
00721 "PoolClassVersionTable::create");
00722 }
00723 throwException( "POOL database cannot be created.","PoolClassVersionTable::create");
00724 }
00725
00726 void ora::PoolClassVersionTable::drop(){
00727 schema().dropIfExistsTable( tableName() );
00728 }
00729
00730 namespace ora {
00731 std::string mappingTypeFromPool( const std::string& mappingType ){
00732 if( mappingType == "PoolArray" ) return MappingElement::OraArrayMappingElementType();
00733 return mappingType;
00734 }
00735
00736 std::string variableNameFromPool( const std::string& variableName ){
00737 size_t ind = variableName.find("pool::PVector");
00738 if( ind != std::string::npos ){
00739 return "ora::PVector"+variableName.substr(13);
00740 }
00741 return variableName;
00742 }
00743 }
00744
00745 std::string ora::PoolMappingSchema::emptyScope(){
00746 static std::string s_scope(" ");
00747 return s_scope;
00748 }
00749
00750 ora::PoolMappingSchema::PoolMappingSchema( coral::ISchema& dbSchema ):
00751 m_schema( dbSchema ),
00752 m_dbCache( 0 ){
00753 }
00754
00755 ora::PoolMappingSchema::~PoolMappingSchema(){
00756 }
00757
00758 void ora::PoolMappingSchema::init( PoolDbCache& dbCache ){
00759 m_dbCache = &dbCache;
00760 }
00761
00762 bool ora::PoolMappingSchema::getVersionList( std::set<std::string>& dest ){
00763 bool ret = false;
00764 std::auto_ptr<coral::IQuery> query( m_schema.tableHandle( PoolMappingVersionTable::tableName() ).newQuery() );
00765 query->addToOutputList( PoolMappingVersionTable::mappingVersionColumn() );
00766 coral::ICursor& cursor = query->execute();
00767 while ( cursor.next() ) {
00768 ret = true;
00769 const coral::AttributeList& currentRow = cursor.currentRow();
00770 std::string mappingVersion = currentRow[ PoolMappingVersionTable::mappingVersionColumn()].data<std::string>();
00771 dest.insert( mappingVersion );
00772 }
00773 return ret;
00774 }
00775
00776 namespace ora {
00777
00778 void rebuildPoolMapping( const std::string& scope, const std::string& extraScope, const std::map<std::string, std::vector<MappingRawElement> >& elementsByScope, ora::MappingRawData& dest, int& counter ){
00779 std::map<std::string, std::vector<MappingRawElement> >::const_iterator iSc = elementsByScope.find( scope );
00780 if( iSc != elementsByScope.end() ){
00781 for( std::vector<MappingRawElement>::const_iterator iMap = iSc->second.begin();
00782 iMap != iSc->second.end(); ++iMap ){
00783 MappingRawElement& elem = dest.addElement( counter ) = *iMap;
00784 elem.scopeName = extraScope+"::"+iMap->scopeName;
00785 counter++;
00786 rebuildPoolMapping( scope+"::"+iMap->variableName, extraScope, elementsByScope, dest, counter );
00787 }
00788 }
00789 }
00790 }
00791
00792 bool ora::PoolMappingSchema::getMapping( const std::string& version,
00793 ora::MappingRawData& dest ){
00794 bool ret = false;
00795 coral::ITable& mappingTable = m_schema.tableHandle( PoolMappingElementTable::tableName() );
00796 std::auto_ptr<coral::IQuery> query(mappingTable.newQuery());
00797 coral::AttributeList outputBuffer;
00798 outputBuffer.extend<std::string>( PoolMappingElementTable::elementTypeColumn() );
00799 outputBuffer.extend<std::string>( PoolMappingElementTable::scopeNameColumn() );
00800 outputBuffer.extend<std::string>( PoolMappingElementTable::variableNameColumn() );
00801 outputBuffer.extend<std::string>( PoolMappingElementTable::variableTypeColumn() );
00802 outputBuffer.extend<std::string>( PoolMappingElementTable::tableNameColumn() );
00803 outputBuffer.extend<std::string>( PoolMappingElementTable::columnNameColumn() );
00804 query->defineOutput( outputBuffer );
00805 query->addToOutputList( PoolMappingElementTable::elementTypeColumn() );
00806 query->addToOutputList( PoolMappingElementTable::scopeNameColumn() );
00807 query->addToOutputList( PoolMappingElementTable::variableNameColumn() );
00808 query->addToOutputList( PoolMappingElementTable::variableTypeColumn() );
00809 query->addToOutputList( PoolMappingElementTable::tableNameColumn() );
00810 query->addToOutputList( PoolMappingElementTable::columnNameColumn() );
00811 std::ostringstream condition;
00812 condition << PoolMappingElementTable::mappingVersionColumn()<<"= :"<< PoolMappingElementTable::mappingVersionColumn();
00813 coral::AttributeList condData;
00814 condData.extend<std::string>( PoolMappingElementTable::mappingVersionColumn() );
00815 coral::AttributeList::iterator iAttribute = condData.begin();
00816 iAttribute->data< std::string >() = version;
00817 query->setCondition( condition.str(), condData );
00818 query->addToOrderList( PoolMappingElementTable::scopeNameColumn() );
00819 query->addToOrderList( PoolMappingElementTable::variableNameColumn() );
00820
00821 query->addToOrderList( PoolMappingElementTable::variableParIndexColumn() );
00822 coral::ICursor& cursor = query->execute();
00823 std::set<std::string> topElements;
00824 std::map<std::string,MappingRawElement> elementsByVarName;
00825 while ( cursor.next() ) {
00826 ret = true;
00827 const coral::AttributeList& currentRow = cursor.currentRow();
00828 std::string scope = currentRow[ PoolMappingElementTable::scopeNameColumn() ].data<std::string>();
00829 std::string varName = currentRow[ PoolMappingElementTable::variableNameColumn() ].data<std::string>();
00830 std::string elemId = scope+"::"+varName;
00831 std::map<std::string,MappingRawElement>::iterator iE = elementsByVarName.find( elemId );
00832 if( iE == elementsByVarName.end() ) {
00833 iE = elementsByVarName.insert( std::make_pair( elemId, MappingRawElement())).first;
00834 MappingRawElement& elem = iE->second;
00835 elem.elementType = mappingTypeFromPool( currentRow[ PoolMappingElementTable::elementTypeColumn() ].data<std::string>() );
00836 elem.scopeName = scope;
00837 elem.variableName = variableNameFromPool( varName );
00838 elem.variableType = currentRow[ PoolMappingElementTable::variableTypeColumn() ].data<std::string>();
00839 elem.tableName = currentRow[ PoolMappingElementTable::tableNameColumn() ].data<std::string>();
00840 if(elem.scopeName == emptyScope()) {
00841 if( elem.elementType == MappingElement::objectMappingElementType() ){
00842 if( topElements.find( elemId ) == topElements.end() ){
00843 topElements.insert( elemId );
00844 }
00845 }
00846 }
00847 }
00848 iE->second.columns.push_back( currentRow[ PoolMappingElementTable::columnNameColumn() ].data<std::string>() );
00849 }
00850
00851 std::map<std::string, std::vector<MappingRawElement> > elementsByScope;
00852 for( std::map<std::string,MappingRawElement>::iterator iEl = elementsByVarName.begin();
00853 iEl != elementsByVarName.end(); ++iEl ){
00854
00855 std::vector<std::string> reverseCols;
00856 for( std::vector<std::string>::reverse_iterator iR = iEl->second.columns.rbegin();
00857 iR != iEl->second.columns.rend(); ++iR ){
00858 reverseCols.push_back( *iR );
00859 }
00860 iEl->second.columns = reverseCols;
00861 std::string scope = iEl->second.scopeName;
00862 if( scope != emptyScope() ){
00863 std::map<std::string, std::vector<MappingRawElement> >::iterator iS = elementsByScope.find( scope );
00864 if( iS == elementsByScope.end() ){
00865 elementsByScope.insert( std::make_pair( scope, std::vector<MappingRawElement>(1,iEl->second ) ));
00866 } else {
00867 iS->second.push_back( iEl->second );
00868 }
00869 }
00870 }
00871
00872 int eid = 0;
00873 for( std::set<std::string>::const_iterator iEl = topElements.begin();
00874 iEl != topElements.end(); ++iEl ){
00875
00876 std::map<std::string,MappingRawElement>::iterator iE = elementsByVarName.find( *iEl );
00877 MappingRawElement classElement = iE->second;
00878 classElement.elementType = MappingElement::classMappingElementType();
00879 classElement.scopeName = MappingRawElement::emptyScope();
00880 dest.addElement( eid ) = classElement;
00881 eid++;
00882 MappingRawElement firstElement = iE->second;
00883 firstElement.scopeName = iE->second.variableName;
00884 dest.addElement( eid ) = firstElement;
00885 eid++;
00886
00887 rebuildPoolMapping( iE->second.variableName, iE->second.variableName, elementsByScope, dest, eid );
00888 }
00889 return ret;
00890 }
00891
00892 void ora::PoolMappingSchema::storeMapping( const MappingRawData& mapping ){
00893
00894 coral::ITable& mappingVersionTable = m_schema.tableHandle( PoolMappingVersionTable::tableName() );
00895 coral::AttributeList rowBuffer;
00896 rowBuffer.extend< std::string >( PoolMappingVersionTable::mappingVersionColumn() );
00897 rowBuffer[ PoolMappingVersionTable::mappingVersionColumn() ].data<std::string>()= mapping.version;
00898 mappingVersionTable.dataEditor().insertRow( rowBuffer );
00899
00900
00901 coral::ITable& mappingElementTable = m_schema.tableHandle( PoolMappingElementTable::tableName() );
00902 coral::AttributeList dataBuffer;
00903 dataBuffer.extend< std::string >( PoolMappingElementTable::mappingVersionColumn() );
00904 dataBuffer.extend< std::string >( PoolMappingElementTable::elementIdColumn() );
00905 dataBuffer.extend< std::string >( PoolMappingElementTable::elementTypeColumn() );
00906 dataBuffer.extend< std::string >( PoolMappingElementTable::scopeNameColumn() );
00907 dataBuffer.extend< std::string >( PoolMappingElementTable::variableNameColumn() );
00908 dataBuffer.extend< unsigned int >( PoolMappingElementTable::variableParIndexColumn() );
00909 dataBuffer.extend< std::string >( PoolMappingElementTable::variableTypeColumn() );
00910 dataBuffer.extend< std::string >( PoolMappingElementTable::tableNameColumn() );
00911 dataBuffer.extend< std::string >( PoolMappingElementTable::columnNameColumn() );
00912 dataBuffer[ PoolMappingElementTable::mappingVersionColumn() ].data<std::string>()= mapping.version;
00913
00914 for( std::map < int, MappingRawElement >::const_iterator iElem = mapping.elements.begin();
00915 iElem != mapping.elements.end(); iElem++ ){
00916 for( size_t iParamIndex = 0; iParamIndex < iElem->second.columns.size(); iParamIndex++ ){
00917 std::stringstream elemIdx;
00918 elemIdx << iElem->first;
00919 std::string scopeName = iElem->second.scopeName;
00920 if( scopeName == MappingRawElement::emptyScope() ) scopeName = std::string(" ");
00921 dataBuffer[ PoolMappingElementTable::elementIdColumn() ].data<std::string>() = elemIdx.str();
00922 dataBuffer[ PoolMappingElementTable::elementTypeColumn()].data<std::string>()= iElem->second.elementType;
00923 dataBuffer[ PoolMappingElementTable::scopeNameColumn() ].data<std::string>()= scopeName;
00924 dataBuffer[ PoolMappingElementTable::variableNameColumn() ].data<std::string>()= iElem->second.variableName;
00925 dataBuffer[ PoolMappingElementTable::variableParIndexColumn() ].data<unsigned int>() = iParamIndex;
00926 dataBuffer[ PoolMappingElementTable::variableTypeColumn() ].data<std::string>()= iElem->second.variableType;
00927 dataBuffer[ PoolMappingElementTable::tableNameColumn() ].data<std::string>()= iElem->second.tableName;
00928 dataBuffer[ PoolMappingElementTable::columnNameColumn() ].data<std::string>()= iElem->second.columns[iParamIndex];
00929 mappingElementTable.dataEditor().insertRow( dataBuffer );
00930 }
00931 }
00932 }
00933
00934 void ora::PoolMappingSchema::removeMapping( const std::string& version ){
00935
00936 coral::AttributeList whereData;
00937 whereData.extend<std::string>( PoolMappingVersionTable::mappingVersionColumn() );
00938 whereData.begin()->data<std::string>() = version;
00939
00940 std::string condition = PoolMappingVersionTable::mappingVersionColumn() + " = :" + PoolMappingVersionTable::mappingVersionColumn();
00941 m_schema.tableHandle( PoolClassVersionTable::tableName() ).dataEditor().deleteRows( condition, whereData );
00942 m_schema.tableHandle( PoolMappingElementTable::tableName() ).dataEditor().deleteRows( condition, whereData );
00943 m_schema.tableHandle( PoolMappingVersionTable::tableName() ).dataEditor().deleteRows( condition, whereData );
00944 }
00945
00946 bool ora::PoolMappingSchema::getContainerTableMap( std::map<std::string, int>&){
00947
00948 return false;
00949 }
00950
00951 bool ora::PoolMappingSchema::getMappingVersionListForContainer( int containerId,
00952 std::set<std::string>& dest,
00953 bool onlyDependency ){
00954 bool ret = false;
00955 std::auto_ptr<coral::IQuery> query( m_schema.newQuery() );
00956 query->addToTableList( PoolClassVersionTable::tableName(), "T0" );
00957 query->addToTableList( PoolContainerHeaderTable::tableName(), "T1" );
00958 query->addToTableList( PoolMappingElementTable::tableName(), "T2" );
00959 query->addToOutputList( "T0."+PoolClassVersionTable::mappingVersionColumn() );
00960 query->setDistinct();
00961 std::ostringstream condition;
00962 condition <<"T0."<<PoolClassVersionTable::containerNameColumn()<<" = "<<"T1."<<PoolContainerHeaderTable::containerNameColumn();
00963 condition <<" AND T0."<<PoolClassVersionTable::mappingVersionColumn()<<" = "<<"T2."<<PoolMappingElementTable::mappingVersionColumn();
00964 condition <<" AND T1."<<PoolContainerHeaderTable::containerIdColumn()<<" =:"<<PoolContainerHeaderTable::containerIdColumn();
00965 coral::AttributeList condData;
00966 condData.extend< int >( PoolContainerHeaderTable::containerIdColumn() );
00967 condData[ PoolContainerHeaderTable::containerIdColumn() ].data< int >() = containerId + 1;
00968 if( onlyDependency ){
00969 condition <<" AND T2."<<PoolMappingElementTable::elementTypeColumn() <<" = :"<<PoolMappingElementTable::elementTypeColumn();
00970 condData.extend< std::string >( PoolMappingElementTable::elementTypeColumn() );
00971 condData[PoolMappingElementTable::elementTypeColumn() ].data<std::string>() = MappingElement::dependencyMappingElementType();
00972 }
00973 query->setCondition(condition.str(),condData);
00974 coral::ICursor& cursor = query->execute();
00975 while ( cursor.next() ) {
00976 ret = true;
00977 const coral::AttributeList& currentRow = cursor.currentRow();
00978 std::string mappingVersion = currentRow[ "T0."+PoolClassVersionTable::mappingVersionColumn() ].data<std::string>();
00979 dest.insert( mappingVersion );
00980 }
00981 return ret;
00982 }
00983
00984
00985 bool ora::PoolMappingSchema::getDependentClassesInContainerMapping( int,
00986 std::set<std::string>& ){
00987
00988 return false;
00989 }
00990
00991 bool ora::PoolMappingSchema::getClassVersionListForMappingVersion( const std::string& mappingVersion,
00992 std::set<std::string>& destination ){
00993
00994 bool ret = false;
00995 coral::ITable& classVersionTable = m_schema.tableHandle( PoolClassVersionTable::tableName() );
00996 std::auto_ptr<coral::IQuery> query( classVersionTable.newQuery() );
00997 query->setDistinct();
00998 query->addToOutputList( PoolClassVersionTable::classVersionColumn() );
00999 std::ostringstream condition;
01000 condition <<PoolClassVersionTable::mappingVersionColumn()<<" =:"<<PoolClassVersionTable::mappingVersionColumn();
01001 coral::AttributeList condData;
01002 condData.extend<std::string>(PoolClassVersionTable::mappingVersionColumn());
01003 condData[ PoolClassVersionTable::mappingVersionColumn() ].data< std::string >() = mappingVersion;
01004 query->setCondition(condition.str(),condData);
01005 coral::ICursor& cursor = query->execute();
01006 while ( cursor.next() ) {
01007 ret = true;
01008 const coral::AttributeList& currentRow = cursor.currentRow();
01009 std::string classVersion = currentRow[ PoolClassVersionTable::classVersionColumn() ].data<std::string>();
01010 destination.insert( classVersion );
01011 }
01012 return ret;
01013 }
01014
01015 bool ora::PoolMappingSchema::getClassVersionListForContainer( int containerId,
01016 std::map<std::string,std::string>& versionMap ){
01017
01018 bool ret = false;
01019 std::auto_ptr<coral::IQuery> query( m_schema.newQuery() );
01020 query->addToTableList( PoolClassVersionTable::tableName(), "T0" );
01021 query->addToTableList( PoolContainerHeaderTable::tableName(), "T1" );
01022 query->addToOutputList( "T0."+PoolClassVersionTable::classVersionColumn() );
01023 query->addToOutputList( "T0."+PoolClassVersionTable::mappingVersionColumn() );
01024 query->setDistinct();
01025 std::ostringstream condition;
01026 condition <<"T0."<<PoolClassVersionTable::containerNameColumn()<<" = "<<"T1."<<PoolContainerHeaderTable::containerNameColumn();
01027 condition <<" AND T1."<<PoolContainerHeaderTable::containerIdColumn()<<" =:"<<PoolContainerHeaderTable::containerIdColumn();
01028 coral::AttributeList condData;
01029 condData.extend< int >( PoolContainerHeaderTable::containerIdColumn() );
01030 condData[ PoolContainerHeaderTable::containerIdColumn() ].data< int >() = containerId + 1;
01031 query->setCondition(condition.str(),condData);
01032 coral::ICursor& cursor = query->execute();
01033 while ( cursor.next() ) {
01034 ret = true;
01035 const coral::AttributeList& currentRow = cursor.currentRow();
01036 std::string classVersion = currentRow[ "T0."+PoolClassVersionTable::classVersionColumn() ].data<std::string>();
01037 std::string mappingVersion = currentRow[ "T0."+PoolClassVersionTable::mappingVersionColumn() ].data<std::string>();
01038 versionMap.insert( std::make_pair(classVersion, mappingVersion ) );
01039 }
01040 return ret;
01041 }
01042
01043 bool ora::PoolMappingSchema::getMappingVersionListForTable( const std::string&,
01044 std::set<std::string>& ){
01045
01046 return false;
01047 }
01048
01049 bool ora::PoolMappingSchema::selectMappingVersion( const std::string& classId,
01050 int containerId,
01051 std::string& destination ){
01052 bool ret = false;
01053 destination.clear();
01054
01055 std::pair<bool,std::string> isBaseId = MappingRules::classNameFromBaseId( classId );
01056 if( !isBaseId.first ){
01057 std::auto_ptr<coral::IQuery> query( m_schema.newQuery() );
01058 query->addToTableList( PoolClassVersionTable::tableName(), "T0" );
01059 query->addToTableList( PoolContainerHeaderTable::tableName(), "T1" );
01060 query->addToOutputList( "T0."+PoolClassVersionTable::mappingVersionColumn() );
01061 std::ostringstream condition;
01062 condition <<"T0."<<PoolClassVersionTable::containerNameColumn()<<" = "<<"T1."<<PoolContainerHeaderTable::containerNameColumn();
01063 condition << " AND T0."<<PoolClassVersionTable::classVersionColumn() << " =:" <<PoolClassVersionTable::classVersionColumn();
01064 condition << " AND T1."<<PoolContainerHeaderTable::containerIdColumn() << " =:" <<PoolContainerHeaderTable::containerIdColumn();
01065 coral::AttributeList condData;
01066 condData.extend<std::string>( PoolClassVersionTable::classVersionColumn() );
01067 condData.extend<int>( PoolContainerHeaderTable::containerIdColumn() );
01068 coral::AttributeList::iterator iAttribute = condData.begin();
01069 iAttribute->data< std::string >() = MappingRules::classVersionFromId( classId );
01070 ++iAttribute;
01071 iAttribute->data< int >() = containerId + 1;
01072 query->setCondition( condition.str(), condData );
01073 coral::ICursor& cursor = query->execute();
01074 while ( cursor.next() ) {
01075 ret = true;
01076 const coral::AttributeList& currentRow = cursor.currentRow();
01077 destination = currentRow["T0."+PoolClassVersionTable::mappingVersionColumn()].data<std::string>();
01078 }
01079 } else {
01080 PoolDbCacheData& containerData = m_dbCache->find( containerId );
01081
01082 if( containerData.m_className == isBaseId.second ){
01083 destination = containerData.m_mappingVersion;
01084 ret = true;
01085 }
01086 }
01087
01088 return ret;
01089 }
01090
01091 bool ora::PoolMappingSchema::containerForMappingVersion( const std::string&,
01092 int& ){
01093
01094 return false;
01095 }
01096
01097 void ora::PoolMappingSchema::insertClassVersion( const std::string&,
01098 const std::string& classVersion,
01099 const std::string&,
01100 int,
01101 int containerId,
01102 const std::string& mappingVersion ){
01103 if(!m_dbCache){
01104 throwException("MappingSchema handle has not been initialized.","PoolMappingSchema::insertClassVersion");
01105 }
01106
01107 coral::ITable& classVersionTable = m_schema.tableHandle( PoolClassVersionTable::tableName() );
01108 coral::AttributeList inputData;
01109 inputData.extend<std::string>( PoolClassVersionTable::mappingVersionColumn());
01110 inputData.extend<std::string>( PoolClassVersionTable::classVersionColumn());
01111 inputData.extend<std::string>( PoolClassVersionTable::containerNameColumn());
01112
01113 std::string containerName = m_dbCache->nameById( containerId );
01114 coral::AttributeList::iterator iInAttr = inputData.begin();
01115 iInAttr->data< std::string >() = mappingVersion;
01116 ++iInAttr;
01117 iInAttr->data< std::string >() = classVersion;
01118 ++iInAttr;
01119 iInAttr->data< std::string >() = containerName;
01120 classVersionTable.dataEditor().insertRow( inputData );
01121 }
01122
01123 void ora::PoolMappingSchema::setMappingVersion( const std::string& classId,
01124 int containerId,
01125 const std::string& mappingVersion ){
01126 if(!m_dbCache){
01127 throwException("MappingSchema handle has not been initialized.","PoolMappingSchema::setMappingVersion");
01128 }
01129 coral::ITable& classVersionTable = m_schema.tableHandle( PoolClassVersionTable::tableName() );
01130 coral::AttributeList inputData;
01131 inputData.extend<std::string>( PoolClassVersionTable::mappingVersionColumn());
01132 inputData.extend<std::string>( PoolClassVersionTable::classVersionColumn());
01133 inputData.extend<std::string>( PoolClassVersionTable::containerNameColumn());
01134 std::string classVersion = MappingRules::classVersionFromId( classId );
01135 std::string containerName = m_dbCache->nameById( containerId );
01136 coral::AttributeList::iterator iInAttr = inputData.begin();
01137 iInAttr->data< std::string >() = mappingVersion;
01138 ++iInAttr;
01139 iInAttr->data< std::string >() = classVersion;
01140 ++iInAttr;
01141 iInAttr->data< std::string >() = containerName;
01142 std::string setClause = PoolClassVersionTable::mappingVersionColumn()+" =:"+ PoolClassVersionTable::mappingVersionColumn();
01143 std::string whereClause = PoolClassVersionTable::classVersionColumn()+" =:"+ PoolClassVersionTable::classVersionColumn()+" AND "+
01144 PoolClassVersionTable::containerNameColumn()+" =:"+ PoolClassVersionTable::containerNameColumn();
01145 classVersionTable.dataEditor().updateRows( setClause,whereClause, inputData );
01146 }
01147
01148 std::string& ora::CondMetadataTable::tableName(){
01149 static std::string s_name("METADATA");
01150 return s_name;
01151 }
01152
01153 std::string& ora::CondMetadataTable::objectNameColumn(){
01154 static std::string s_column("NAME");
01155 return s_column;
01156 }
01157
01158 std::string& ora::CondMetadataTable::tokenColumn(){
01159 static std::string s_column("TOKEN");
01160 return s_column;
01161 }
01162
01163 std::string& ora::CondMetadataTable::timetypeColumn(){
01164 static std::string s_column("TIMETYPE");
01165 return s_column;
01166 }
01167
01168 ora::CondMetadataTable::CondMetadataTable( coral::ISchema& dbSchema,
01169 PoolDbCache& dbCache ):
01170 INamingServiceTable( dbSchema ),
01171 m_dbCache( dbCache ){
01172 }
01173
01174 ora::CondMetadataTable::~CondMetadataTable(){
01175 }
01176
01177 void ora::CondMetadataTable::setObjectName( const std::string& name,
01178 int contId, int itemId ){
01179 coral::AttributeList dataToInsert;
01180 dataToInsert.extend<std::string>( objectNameColumn() );
01181 dataToInsert.extend<std::string>( tokenColumn());
01182 dataToInsert.extend<int>( timetypeColumn());
01183 ora::PoolDbCacheData& contData = m_dbCache.find( contId );
01184 std::string token = cond::writeToken( contData.m_name, contId, itemId, contData.m_className );
01185 dataToInsert[ objectNameColumn() ].data<std::string>() = name;
01186 dataToInsert[ tokenColumn() ].data<std::string>() = token;
01187 dataToInsert[ timetypeColumn() ].data<int>() = -1;
01188 coral::ITable& containerTable = schema().tableHandle( tableName() );
01189 containerTable.dataEditor().insertRow( dataToInsert );
01190 }
01191
01192 bool ora::CondMetadataTable::eraseObjectName( const std::string& name ){
01193 coral::AttributeList whereData;
01194 whereData.extend<std::string>( objectNameColumn() );
01195 whereData.begin()->data<std::string>() = name;
01196 std::string condition = objectNameColumn() + " = :" + objectNameColumn();
01197 return schema().tableHandle( tableName() ).dataEditor().deleteRows( condition, whereData )>0;
01198 }
01199
01200 bool ora::CondMetadataTable::eraseAllNames(){
01201 std::string condition("");
01202 coral::AttributeList whereData;
01203 return schema().tableHandle( tableName() ).dataEditor().deleteRows( condition, whereData )>0;
01204 }
01205
01206 bool ora::CondMetadataTable::getObjectByName( const std::string& name,
01207 std::pair<int,int>& destination ){
01208 bool ret = false;
01209 coral::ITable& containerTable = schema().tableHandle( tableName() );
01210 std::auto_ptr<coral::IQuery> query( containerTable.newQuery());
01211 coral::AttributeList outputBuffer;
01212 outputBuffer.extend<std::string>( tokenColumn() );
01213 query->defineOutput( outputBuffer );
01214 query->addToOutputList( tokenColumn() );
01215 std::ostringstream condition;
01216 condition << objectNameColumn()<<"= :"<< objectNameColumn();
01217 coral::AttributeList condData;
01218 condData.extend<std::string>( objectNameColumn() );
01219 coral::AttributeList::iterator iAttribute = condData.begin();
01220 iAttribute->data< std::string >() = name;
01221 query->setCondition( condition.str(), condData );
01222 coral::ICursor& cursor = query->execute();
01223 while ( cursor.next() ) {
01224 ret = true;
01225 const coral::AttributeList& row = cursor.currentRow();
01226 std::string token = row[ tokenColumn() ].data< std::string >();
01227 std::pair<std::string,int> tokData = cond::parseToken( token );
01228 destination.first = m_dbCache.idByName( tokData.first );
01229 destination.second = tokData.second;
01230 }
01231 return ret;
01232 }
01233
01234 bool ora::CondMetadataTable::getNamesForObject( int contId,
01235 int itemId,
01236 std::vector<std::string>& destination ){
01237 bool ret = false;
01238 coral::ITable& containerTable = schema().tableHandle( tableName() );
01239 std::auto_ptr<coral::IQuery> query( containerTable.newQuery());
01240 coral::AttributeList outputBuffer;
01241 outputBuffer.extend<std::string>( objectNameColumn() );
01242 query->defineOutput( outputBuffer );
01243 query->addToOutputList( objectNameColumn() );
01244 std::ostringstream condition;
01245 condition << tokenColumn()<<"= :"<< tokenColumn();
01246 ora::PoolDbCacheData& contData = m_dbCache.find( contId );
01247 std::string token = cond::writeToken( contData.m_name, contId, itemId, contData.m_className );
01248 coral::AttributeList condData;
01249 condData.extend<std::string>( tokenColumn() );
01250 coral::AttributeList::iterator iAttribute = condData.begin();
01251 iAttribute->data< std::string >() = token;
01252 query->setCondition( condition.str(), condData );
01253 coral::ICursor& cursor = query->execute();
01254 while ( cursor.next() ) {
01255 ret = true;
01256 const coral::AttributeList& row = cursor.currentRow();
01257 std::string name = row[ objectNameColumn() ].data< std::string >();
01258 destination.push_back( name );
01259 }
01260 return ret;
01261 }
01262
01263 bool ora::CondMetadataTable::getNamesForContainer( int contId,
01264 std::vector<std::string>& destination ){
01265
01266 bool ret = false;
01267 coral::ITable& containerTable = schema().tableHandle( tableName() );
01268 std::auto_ptr<coral::IQuery> query( containerTable.newQuery());
01269 coral::AttributeList outputBuffer;
01270 outputBuffer.extend<std::string>( objectNameColumn() );
01271 query->defineOutput( outputBuffer );
01272 query->addToOutputList( objectNameColumn() );
01273 std::ostringstream condition;
01274 condition << tokenColumn()<<" LIKE :"<< tokenColumn();
01275 ora::PoolDbCacheData& contData = m_dbCache.find( contId );
01276 std::string tokenFragment = cond::writeTokenContainerFragment( contData.m_name, contData.m_className )+"%";
01277 coral::AttributeList condData;
01278 condData.extend<std::string>( tokenColumn() );
01279 coral::AttributeList::iterator iAttribute = condData.begin();
01280 iAttribute->data< std::string >() = tokenFragment;
01281 query->setCondition( condition.str(), condData );
01282 coral::ICursor& cursor = query->execute();
01283 while ( cursor.next() ) {
01284 ret = true;
01285 const coral::AttributeList& row = cursor.currentRow();
01286 std::string name = row[ objectNameColumn() ].data< std::string >();
01287 destination.push_back( name );
01288 }
01289 return ret;
01290 }
01291
01292 bool ora::CondMetadataTable::getAllNames( std::vector<std::string>& destination ){
01293
01294 bool ret = false;
01295 coral::ITable& containerTable = schema().tableHandle( tableName() );
01296 std::auto_ptr<coral::IQuery> query( containerTable.newQuery());
01297 coral::AttributeList outputBuffer;
01298 outputBuffer.extend<std::string>( objectNameColumn() );
01299 query->defineOutput( outputBuffer );
01300 query->addToOutputList( objectNameColumn() );
01301 coral::ICursor& cursor = query->execute();
01302 while ( cursor.next() ) {
01303 ret = true;
01304 const coral::AttributeList& row = cursor.currentRow();
01305 std::string name = row[ objectNameColumn() ].data< std::string >();
01306 destination.push_back( name );
01307 }
01308 return ret;
01309 }
01310
01311 std::string ora::CondMetadataTable::name(){
01312 return tableName();
01313 }
01314
01315 bool ora::CondMetadataTable::exists(){
01316 return schema().existsTable( tableName() );
01317 }
01318
01319 void ora::CondMetadataTable::create(){
01320 if( schema().existsTable( tableName() )){
01321 throwException( "Metadata table already exists in this schema.",
01322 "CondMetadataTable::create");
01323 }
01324 throwException( "Cond Metadata table cannot be created.","CondMetadataTable::create");
01325 }
01326
01327 void ora::CondMetadataTable::drop(){
01328 if( !schema().existsTable( tableName() )){
01329 throwException( "Metadata table does not exists in this schema.",
01330 "CondMetadataTable::drop");
01331 }
01332 throwException( "Cond Metadata table cannot be dropped.","CondMetadataTable::drop");
01333 }
01334
01335 bool ora::PoolDatabaseSchema::existsMainTable( coral::ISchema& dbSchema ){
01336 PoolMainTable tmp( dbSchema );
01337 return tmp.exists();
01338 }
01339
01340 ora::PoolDatabaseSchema::PoolDatabaseSchema( coral::ISchema& dbSchema ):
01341 IDatabaseSchema( dbSchema ),
01342 m_schema( dbSchema ),
01343 m_dbCache(),
01344 m_mainTable( dbSchema ),
01345 m_sequenceTable( dbSchema ),
01346 m_mappingVersionTable( dbSchema ),
01347 m_mappingElementTable( dbSchema ),
01348 m_containerHeaderTable( dbSchema ),
01349 m_classVersionTable( dbSchema ),
01350 m_mappingSchema( dbSchema ),
01351 m_metadataTable( dbSchema, m_dbCache ){
01352 m_sequenceTable.init( m_dbCache );
01353 m_containerHeaderTable.init( m_dbCache );
01354 m_mappingSchema.init( m_dbCache );
01355 }
01356
01357 ora::PoolDatabaseSchema::~PoolDatabaseSchema(){
01358 }
01359
01360 bool ora::PoolDatabaseSchema::exists(){
01361 if(!m_mainTable.exists()){
01362 return false;
01363 }
01364
01365 if(!m_sequenceTable.exists() ||
01366 !m_mappingVersionTable.exists() ||
01367 !m_mappingElementTable.exists() ||
01368 !m_containerHeaderTable.exists() ||
01369 !m_classVersionTable.exists()){
01370 throwException( "POOL database is corrupted..",
01371 "PoolDatabaseSchema::exists");
01372 }
01373 if( !m_metadataTable.exists()){
01374 throwException( "Metadata table has not been found.",
01375 "PoolDatabaseSchema::exists");
01376 }
01377 return true;
01378 }
01379
01380 void ora::PoolDatabaseSchema::create( const std::string& ){
01381 throwException( "POOL database cannot be created.","PoolDatabaseSchema::create");
01382 }
01383
01384 void ora::PoolDatabaseSchema::drop(){
01385 m_classVersionTable.drop();
01386 m_mappingElementTable.drop();
01387 m_sequenceTable.drop();
01388 m_containerHeaderTable.drop();
01389 m_mappingVersionTable.drop();
01390 m_mainTable.drop();
01391 }
01392
01393 void ora::PoolDatabaseSchema::setAccessPermission( const std::string& principal,
01394 bool forWrite ){
01395 m_mainTable.setAccessPermission( principal, forWrite );
01396 m_sequenceTable.setAccessPermission( principal, forWrite );
01397 m_mappingVersionTable.setAccessPermission( principal, forWrite );
01398 m_mappingElementTable.setAccessPermission( principal, forWrite );
01399 m_containerHeaderTable.setAccessPermission( principal, forWrite );
01400 m_classVersionTable.setAccessPermission( principal, forWrite );
01401 m_metadataTable.setAccessPermission( principal, forWrite );
01402 }
01403
01404 ora::IMainTable& ora::PoolDatabaseSchema::mainTable(){
01405 return m_mainTable;
01406 }
01407
01408 ora::ISequenceTable& ora::PoolDatabaseSchema::sequenceTable(){
01409 return m_sequenceTable;
01410 }
01411
01412 ora::IDatabaseTable& ora::PoolDatabaseSchema::mappingVersionTable(){
01413 return m_mappingVersionTable;
01414 }
01415
01416 ora::IDatabaseTable& ora::PoolDatabaseSchema::mappingElementTable(){
01417 return m_mappingElementTable;
01418 }
01419
01420 ora::IContainerHeaderTable& ora::PoolDatabaseSchema::containerHeaderTable(){
01421 return m_containerHeaderTable;
01422 }
01423
01424 ora::IDatabaseTable& ora::PoolDatabaseSchema::classVersionTable(){
01425 return m_classVersionTable;
01426 }
01427
01428 ora::IMappingSchema& ora::PoolDatabaseSchema::mappingSchema(){
01429 return m_mappingSchema;
01430 }
01431
01432 ora::INamingServiceTable& ora::PoolDatabaseSchema::namingServiceTable(){
01433 return m_metadataTable;
01434 }
01435
01436