00001 #include "CondCore/ORA/interface/Exception.h"
00002 #include "OraDatabaseSchema.h"
00003
00004 #include <memory>
00005
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
01368
01369
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