CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_2_9/src/CondCore/ORA/src/PoolDatabaseSchema.cc

Go to the documentation of this file.
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 // externals
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   // Create the entry in the table if it does not exist.
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   // first lookup in the cache for the built in sequences...
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   // otherwise, look up into the regular sequence table.
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   // nothing to do in the db if the sequence is in the cache...
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   // Increment the oid in the database as well
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; //POOL starts counting from 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     // containers non-homogeneous are ignored.
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; //POOL starts counting from 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 ; //POOL starts counting from 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; //POOL starts counting from 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   // check the order: column order has to be swapped!
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   // re-ordering by scope
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     // reversing the columns
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   // rebuilding + adding class elements  
00872   int eid = 0;
00873   for( std::set<std::string>::const_iterator iEl = topElements.begin();
00874        iEl != topElements.end(); ++iEl ){
00875     // adding the class elements...
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     // rebuilding extending the scope...
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   // first update the version table
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   // then update the element tables
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   // Remove all rows in the tables with the version.
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   // not implemented for the moment
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; //POOL starts counting from 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   // not implemented for the moment
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; //POOL starts counting from 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   // not implemented for the moment
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; //POOL starts counting from 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     // in POOL db this will be only possible for top level classes (not for dependencies)
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   // not implemented for the moment
01094   return false;
01095 }
01096 
01097 void ora::PoolMappingSchema::insertClassVersion( const std::string&, //className
01098                                                  const std::string& classVersion,
01099                                                  const std::string&, //classId
01100                                                  int, // dependencyIndex,
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; // is it fine ???
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