CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_4_5_patch3/src/CondCore/ORA/src/OraDatabaseSchema.cc

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