dtl
Category: functors | Component type: concept |
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). AlwaysThrowsHandler is the default handler for a DBView.
Defined in the DBView.h header file.
AlwaysThrowsHandler, BulkFetchHandler, 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 ¶m) : errmsg(msg), dataObj(data), paramObj(param) { } };
// 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;
}
}
}
None.
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> |
X | A type that is a model of LoggingHandler |
a | Object of type X |
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 ¶ms) |
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. |
AlwaysThrowsHandler, BulkFetchHandler, IOHandler, DBView, IndexedDBView
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.