/*
* This file is part of rasdaman community.
*
* Rasdaman community is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Rasdaman community is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with rasdaman community. If not, see .
*
* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann /
rasdaman GmbH.
*
* For more information please see
* or contact Peter Baumann via .
/
/**
* SOURCE: test_extbmarkint.cc
*
* MODULE: mddmgr
*
* PURPOSE:
* Extends the objects created by the test of areas of interest tiling
* rasodmg/test/test_int1 (the resulting objects have 5000 frames more
* than the original ones ).
* Needed because rasodmg doens't support updating of MDDobjects
* at the time this was created.
*
*
* COMMENTS:
* none
*
*/
#define TEST_PROTECTED
#define TEST_PRIVATE
#include
#include
#include "ulongtype.hh"
#include "mddmgr/persmddcoll.hh"
#include "mddmgr/persmddobj.hh"
#include "mddmgr/perstile.hh"
#include "mddmgr/persmddcolliter.hh"
#include "adminif.hh"
#include "databaseif.hh"
#include "transactionif.hh"
#include "oidif.hh"
#include "raslib/rminit.hh"
#include "typefactory.hh"
#include "mddif/dbmddobj.hh"
#include "mddif/dbmddcoll.hh"
#include "mddbasetype.hh"
#include "mdddomaintype.hh"
#include "settype.hh"
/*
Global Variables
*/
extern char* myExecArgv0 = "";
RMINITGLOBALS('C')
static char* O2DBName;
char *collName;
char defaultCollName[]= "ObjsContainer";
TransactionIf ta;
/*
Functions
*/
// 2 - Populate collection with MDD objects
static void testConstructors( OId o,
int numberFramesTile,
int f, // first frame
int n ); // number frames
// 3 - Retrieves an MDD collection with name cn and prints contents:
static void testAccessing( char* cn );
/*************************************************************
* Function name.: int main( int argc, char** argv)
*
* Arguments.....:
* argc: number of arguments given to program
* argv: array of char* with arguments
* Return value..: exit status
* Description...: none
************************************************************/
int
main( int argc, char** argv)
{
// variables representing O2 database, ta and session
DatabaseIf database;
if( argc < 2 ) {
cout << "Usage: test_extbmarkint [collName] [oid] [frames] " << endl;
return -1;
}
O2DBName = strdup( argv[1] );
if ( argc >= 3 ) collName = strdup( argv[2] );
else
collName = defaultCollName;
int numberFramesTile = 3; // 9
OId o( double( 2)); //
if( argc >= 4 )
{
int oid;
o = OId( double( atoi( argv[3] )));
cout << "OId " << o << endl;
}
if( argc >= 5 )
{
numberFramesTile = atoi( argv[4] );
cout << "Number of frames per tile "<< numberFramesTile << endl;
}
// don't forget to initialize before using AdminIf!
myExecArgv0 = argv[0];
AdminIf* myAdmin = AdminIf::instance();
// connect to the database
cout << "Connecting to database " << O2DBName
<< "..." << endl;
int errorDBOpen;
try{
errorDBOpen = database.open( O2DBName );
}
catch( ...)
{
cout << "Caught Exception " << endl;
errorDBOpen = -6;
}
if ( errorDBOpen < 0 )
{
cout << "Database doesn't exist. Create it new ... " << endl;
cout << "Creating new database " << O2DBName
<< "..." << endl;
database.create( O2DBName, "TestSMSchema" );
cout << "Connecting to database " << O2DBName
<< "..." << endl;
try{
errorDBOpen = database.open( O2DBName );
}
catch(...)
{
errorDBOpen = -6;
}
}
if ( errorDBOpen < 0 )
{
cout << "Failed at opening newly created database " << errorDBOpen << endl;
cout << "Exiting " << endl;
return errorDBOpen;
}
char c;
unsigned totalNumberFrames = 200; /* 2000 */
// The first 2000 frames
for( int i = 0; i < totalNumberFrames ; i+= numberFramesTile*30 )
{
ta.begin( &database );
cout << endl << "Populate collection " << i << " ..." << endl;
int numberFrames = numberFramesTile*30;
if ( i+numberFrames > totalNumberFrames ) numberFrames = totalNumberFrames-i;
testConstructors( o, numberFramesTile, i, numberFrames );
/*
cout <<"Transaction abort (A/a) or commit (default)? ";
cin >> c;
if ( c == 'A' || c == 'a' )
{
ta.abort( );
cout <<"End of Transaction Abort..."< lastFrame ) numberFrames = lastFrame-i;
testConstructors( o, numberFramesTile, i, numberFrames );
/*
cout <<"Transaction abort (A/a) or commit (default)? ";
cin >> c;
if ( c == 'A' || c == 'a' )
{
ta.abort( );
cout <<"End of Transaction Abort..."<getCellType( )->getSize( );
cout << "currDom " << accessedObj->getCurrentDomain( ) << endl;
accessedObj->printStatus();
EOId eoid;
if ( accessedObj->getEOId( &eoid ) ==0 )
cout <<"EOId: " << eoid;
cout << endl << endl;
mddType = accessedObj->getCellType( );
r_Minterval firstTile( 3 );
firstTile << r_Sinterval( long ( 0 ), long ( numberFramesTile-1 ) )
<< r_Sinterval( long ( 0 ), long ( 79 ) )
<< r_Sinterval( long ( 0 ), long ( 119 ) );
r_Minterval secondTile( 3 );
secondTile << r_Sinterval( long ( 0 ) , long ( numberFramesTile-1 ) )
<< r_Sinterval( long ( 80 ), long ( 159 ) )
<< r_Sinterval( long ( 0 ) , long ( 119 ) );
for ( int j = f; j < f+n ; j+=numberFramesTile )
{
r_Minterval dom1 = firstTile;
r_Minterval dom2 = secondTile;
r_Point desl( (r_Range) j, 0, 0 );
dom1.translate( desl );
dom2.translate( desl );
if ( dom1[0].high( ) >= f+n )
{
dom1[0].set_high( long( f+n-1) );
dom2[0].set_high( long( f+n-1) );
}
cout << "dom1" << dom1 << " dom2 " << dom2
<< " type " << mddType->getTypeName( ) << endl;
int sz1 = dom1.cell_count( ) * typeSize;
char* cells1 = new char[sz1];
PersTile* tile1 = new PersTile( dom1, mddType, cells1);
accessedObj->insertTile(tile1);
int sz2 = dom2.cell_count( ) * typeSize;
char* cells2 = new char[sz2];
PersTile* tile2 = new PersTile( dom2, mddType, cells2 );
accessedObj->insertTile(tile2);
// accessedObj->printStatus( );
}
delete accessedObj;
}
catch ( r_Error& errObj)
{
cout << "Error caught when opening object" << endl;
}
}
/*************************************************************
* Function......: testAccessing( char* cn )
************************************************************/
static void testAccessing( char* cn )
{
PersMDDObj* accessedObj;
cout << "....testAccessing collection "<< cn << endl;
try{
PersMDDColl objsSet( cn );
// To test PersMDDColl::printStatus( )
// objsSet.printStatus( );
// To test PersMDDObj::printStatus( ), MDDCollIter::createIterator( ) and
// MDDCollIter methods :
cout << "Iterating through the collection with PersMDDCollIter " << endl;
MDDCollIter* objsIt = objsSet.createIterator( );
for( int i = 1 ; objsIt->notDone( ); i++, objsIt->advance( ))
{
cout << i<<". MDD object in set:" << endl;
accessedObj = (PersMDDObj*) objsIt->getElement();
accessedObj->printStatus();
EOId eoid;
if ( accessedObj->getEOId( &eoid ) ==0 )
cout <<"EOId: " << eoid;
}
delete objsIt;
objsSet.releaseAll( );
}
catch ( r_Error& errObj)
{
cout <<"Error caught ................."<< endl;
}
}