LoggingHandler<DataObj, ParamObj>

dtl


LoggingHandler<DataObj, ParamObj>

Category: functors Component type: concept

Description

A LoggingHandler is an IOHandler function object that is called when exceptions are thrown in DB_iterator operations. This handler simply logs the exceptions that are passed to it and tells the caller to suppress the error (dtl_ios_base::SUPPRESS_ERROR). LoggingHandler is the default handler for a DBView.

Definition

Defined in the DBView.h header file.

Associated types

AlwaysThrowsHandler, IOHandler.

The following nested struct is defined.:

	// log entry describing exception information including stringified exception and relevant DataObj and ParamObj
	struct LoggedTriple
	{
		string errmsg; // message describing the exception thrown - usually the stringified exception
		DataObj dataObj; // DataObj relevant to the exception thrown
		ParamObj paramObj; // ParamObj relevant to the exception thrown

		LoggedTriple() : errmsg(""), dataObj(), paramObj() { }

		LoggedTriple(const string &msg, const DataObj &data, const ParamObj &param) :
		  errmsg(msg), dataObj(data), paramObj(param) { }
	};
 

Example:

// Example Code Using LoggingHandler on a DBView

// test of failed SelValidate() when reading data
void TestBadSelValidate()
{
 	vector<Example> results;

	// construct view
	// DBView<Example> is actually DBView<Example, 
	// DefaultParamObj<Example> > thanks to the default 
	// argument to the DBView template

	// use our bad BCA which references a nonexistent column name in DB_EXAMPLE
	DBView<Example>
		view("DB_EXAMPLE", BCAExampleObj(),
		"WHERE INT_VALUE BETWEEN (?) AND (?) AND "
		"STRING_VALUE = (?) OR EXAMPLE_DATE < (?) ORDER BY EXAMPLE_LONG",
		BPAExampleObj(), BadSelValidate());

	view.set_io_handler(LoggingHandler<Example>());

	// loop through query results and add them to our vector
	// in this loop, read_it.GetLastCount() records read from DB

	DBView<Example>::select_iterator read_it = view.begin();

	// set parameter values for the WHERE clause in our SQL query
	read_it.Params().lowIntValue = 2;
	read_it.Params().highIntValue = 8;
	read_it.Params().strValue = "Example";
	
	TIMESTAMP_STRUCT paramDate = {2000, 1, 1, 0, 0, 0, 0};
	read_it.Params().dateValue = paramDate;

	for ( ; read_it != view.end(); read_it++)
	{
		try
		{
		  // note that the read_iterator::GetLastCount()  is incremented in operator++()
		  // remember that the record is fetched and thus the count incremented
		  // before operator*() is applied to the read_iterator

		  cout << "Reading element #" << read_it.GetLastCount() << endl;
		  
		  cout << "read_it->exampleInt = " << read_it->exampleInt << endl;
		  cout << "read_it->exampleStr = " << read_it->exampleStr << endl;
		  
		  results.push_back(*read_it);
		}
		catch (RootException &ex)
		{
		  cout << "Caught Exception!!!!" << endl;
		  cout << ex.what() << endl;
		}
	}

	LoggingHandler<Example> handler = 
		read_it.get_io_handler((LoggingHandler<Example> *) NULL);

	typedef LoggingHandler<Example>::LoggedTriple LoggedTriple;

	vector<LoggedTriple> errors = handler.GetLog();

	for (vector<LoggedTriple>::iterator log_it = errors.begin(); log_it != errors.end();
			log_it++)
	{
		LoggedTriple error = *log_it;

		cout << "Error msg = " << error.errmsg << endl;
		cout << "Example = " << error.dataObj << endl;
	}

}

// Example Code Using LoggingHandler on an IndexedDBView

const TIMESTAMP_STRUCT then = {2000, 12, 15, 0, 0, 0, 0};

// Example of using an IndexDBView to try to insert Example objects and print out
// any errors that occurred
void IndexedViewExample()
{
	typedef DBView<Example, ParamObjExample> DBV;

	DBV view("DB_EXAMPLE", DefaultBCA<Example>(), 
	  "WHERE INT_VALUE BETWEEN (?) AND (?) OR "
	  "STRING_VALUE = (?) OR EXAMPLE_DATE <= (?) ORDER BY EXAMPLE_LONG",
	  BPAExampleObj());

	view.set_io_handler(LoggingHandler<Example, ParamObjExample>());

	IndexedDBView<DBV> indexed_view(view, "PrimaryIndex; STRING_VALUE; UNIQUE AlternateIndex; EXAMPLE_LONG, 
		EXAMPLE_DATE", BOUND, USE_ALL_FIELDS, cb_ptr_fun(SetParamsExample));
   		

	try
	{

	// Insert new items into the container
	pair<IndexedDBView<DBV>::iterator, bool> ins_pr;

	ins_pr = indexed_view.insert(Example(459, "Unique String #1", 3.4, 1, date_criteria));

	cout << "insertion succeded = " << (ins_pr.second == true ? "true": "false") << endl;

	ins_pr = indexed_view.insert(Example(311, "", 3.99, 91, then)); // should fail on InsValidate()
   
	cout << "insertion succeded = " << (ins_pr.second == true ? "true": "false") << endl;
	
	ins_pr = indexed_view.insert(Example(222, "Positron", -34.77, 29, then)); // should fail (ditto)
	
	cout << "insertion succeded = " << (ins_pr.second == true ? "true": "false") << endl;
	}
	
	catch (...)
	{
	typedef LoggingHandler<Example, ParamObjExample>::LoggedTriple LoggedTriple;
 
	// retrieve the LoggingHandler object from the IndexedDBView
	LoggingHandler<Example, ParamObjExample> log_handler = 
		indexed_view.get_io_handler((LoggingHandler<Example, ParamObjExample> *) NULL);

	// the log is a vector of (error message, DataObj, ParamObj) triples,
	// (error message, Example object, ParamObjExample object) in this case
	// the error itself along with the relevant DataObj and ParamObj that resulted with
	// the error
	vector<LoggedTriple> error_log = log_handler.GetLog();

	// nothing to do if no errors occurred
	if (error_log.empty())
		return;

	cout << "*** Error Log in IndexedViewExample(): " << error_log.size() << " errors recorded! ***"
	     << endl;

	// print out the errors
	for (vector<LoggedTriple>::const_iterator log_it = error_log.begin(); 
		log_it != error_log.end(); log_it++)
	{
	   cout << "*** Error Log Entry ***" << endl;
	   cout << "* error message *" << endl;
	   cout << (*log_it).errmsg << endl;
	   cout << "* relevant Example object *" << endl;
	   cout << (*log_it).dataObj << endl;
	}

	}	
}

Public Base Classes

None.

Template parameters

Parameter Description Default
DataObj The value type of objects in a DBView.  
ParamObj The type of object used to specify the postfix parameters to the DBView. DefaultParamObj<DataObj> 

 

Notation

X A type that is a model of LoggingHandler
a Object of type X

Expression semantics

Name Expression Precondition Semantics Postcondition
Default constructor
X a()
  Construct the function object.  
Copy constructor
X a(constX &b)
  Copy construct the LoggingHandler.  
Assignment Operator X operator=(const X &b)   Assign the LoggingHandler.  
Log exception operator
dtl_ios_base::MeansOfRecovery operator()(RootException &ex, dtl_ios_base &base, DataObj &data, ParamObj &params)
  This operator takes references to the thrown RootException object, the dtl_ios_base (iterator) which threw, and the DataObj and ParamObj relevant to the exception. Logs the exception to the vector of LoggedTriple's and then tells the iterator to suppress the error (dtl_ios_base::SUPPRESS_ERROR).  
Get copy of exception log
vector<LoggedTriple> GetLog() const
  Returns the logged exceptions as a vector of LoggedTriple's. Note that all copies of this handler share the same error log vector.  

 

See also

AlwaysThrowsHandler, IOHandler, DBView, IndexedDBView


[DTL Home]

Copyright © 2002, Michael Gradman and Corwin Joy.

Permission to use, copy, modify, distribute and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appears in all copies and that both that copyright notice and this permission notice appear in supporting documentation. Corwin Joy and Michael Gradman make no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty.

This site written using the ORB. [The ORB]

1