/*
* 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_error.cc
*
* MODULE: raslib
*
* PURPOSE:
*
* Test program to test class r_Error and its subclasses.
*
*
* COMMENTS:
*
************************************************************/
#include
#include
#include "raslib/error.hh"
#include "raslib/rminit.hh"
RMINITGLOBALS('C')
int main()
{
cout << endl << "0. reading from errortxts table ----------------------------------" << endl;
try
{
throw r_Error( 10000 );
}
catch( r_Error &err )
{
cout << err.what() << endl;
}
cout << endl << "1. Throwing r_Error() -------------------------------------------" << endl;
try
{
throw r_Error();
}
catch( r_Error &err )
{
cout << err.what() << endl;
}
cout << endl << "2. Throwing r_Error( r_Error::r_Error_DatabaseUnknown ) ---------" << endl;
try
{
throw r_Error( r_Error::r_Error_DatabaseUnknown );
}
catch( r_Error &err )
{
cout << err.what() << endl;
}
cout << endl << "3. Throwing r_Eno_interval() ------------------------------------" << endl;
try
{
throw r_Eno_interval();
}
catch( r_Error &err )
{
cout << err.what() << endl;
}
cout << endl << "4. Throwing r_Eindex_violation( 10, 20, 25 ) --------------------" << endl;
try
{
throw r_Eindex_violation( 10, 20, 25 );
}
catch( r_Error &err )
{
cout << err.what() << endl;
}
cout << endl << "5. Throwing r_Edim_mismatch( 2, 3 ) -----------------------------" << endl;
try
{
throw r_Edim_mismatch( 2, 3 );
}
catch( r_Error &err )
{
cout << err.what() << endl;
}
cout << endl << "6. Throwing r_Einit_overflow() ----------------------------------" << endl;
try
{
throw r_Einit_overflow();
}
catch( r_Error &err )
{
cout << err.what() << endl;
}
cout << endl << "7. Throwing r_Eno_cell() ----------------------------------------" << endl;
try
{
throw r_Eno_cell();
}
catch( r_Error &err )
{
cout << err.what() << endl;
}
cout << endl << "8. Throwing r_Equery_execution_failed( 99, 5, 7, 'SELECT' ) -----" << endl;
try
{
throw r_Equery_execution_failed( 99, 5, 7, "SELECT" );
}
catch( r_Error &err )
{
cout << err.what() << endl;
}
cout << endl << "8. Testing r_Ebase_dbms ------------------------------------------" << endl;
cout << endl << "8.1 Throwing (4711, 'This is a test') ----------------------------" << endl;
try
{
throw r_Ebase_dbms( 4711, "This is a test" );
}
catch( r_Error &err )
{
cout << "Output of what() catching an r_Error &err" << endl;
cout << err.what() << endl;
}
try
{
throw r_Ebase_dbms( 4711, "This is a test" );
}
catch( r_Ebase_dbms &err )
{
cout << "Output of what() catching an r_Ebase_dbms &err" << endl;
cout << err.what() << endl;
}
cout << endl << "8.2 Testing serialisation of r_Ebase_dbms ------------------------" << endl;
char* serialErr;
try
{
throw r_Ebase_dbms( 4711, "This is a test" );
}
catch( r_Error &err )
{
serialErr = err.serialiseError();
cout << "serialised form: " << serialErr << endl;
}
try
{
cout << "Throwing error constructed from serialised form." << endl;
r_Error* testErr = r_Error::getAnyError(serialErr);
// for some strange reason a simple throw(*testErr) does not work here. It does not work
// if an r_Ebase_dbms is caught (core dump), it works if an r_Error is caught. Hmm, makes
// some sense since *r_Error is not polymorphic anymore. But it should not core dump.
// Well strange, but like this it works and this will be done only once in clientcomm.cc.
if(testErr->get_errorno () == 206) {
r_Ebase_dbms correctErr(*(r_Ebase_dbms*)testErr);
delete testErr;
throw correctErr;
}
else
cout << "Unexpected error read from serialised representation." << endl;
}
catch( r_Ebase_dbms &err )
{
cout << "Output of what() catching an r_Ebase_dbms &err" << endl;
cout << err.what() << endl;
}
try
{
cout << "Throwing error constructed from serialised form." << endl;
r_Error* testErr = r_Error::getAnyError(serialErr);
if(testErr->get_errorno () == 206) {
r_Ebase_dbms correctErr(*(r_Ebase_dbms*)testErr);
delete testErr;
throw correctErr;
}
else
cout << "Unexpected error read from serialised representation." << endl;
}
catch( r_Error &err )
{
cout << "Output of what() catching an r_Error &err" << endl;
cout << err.what() << endl;
}
cout << "Done" << endl;
free(serialErr);
cout << endl;
cout << "freeing error text table...";
freeTextTable();
cout << "ok." << endl;
cout << endl << "------------------------------------------------------------------" << endl;
return 0;
}