|
Boost : |
From: Scott Woods (scottw_at_[hidden])
Date: 2003-05-25 18:04:27
Hi,
Is anyone interested in a persistence mechanism? Rather than dumping a bunch
of doc+code and finding that its just inappropriate, here is some summary
stuff.
Technique uses info available in a variant to manage the type-safe transfer
of
data between an application and some external storage. It can be
characterized
as a replacement for the windows registry or unix profiles. The technique
has
following properties;
* generic - load and save operations are templates
* portable - library and data are not platform dependent
* standard types - bool, integer, float, string, etc
* complex types - fixed dimension arrays and variable dimension vectors
* user-defined types - records (a set of members of any type)
Simplest usage involves "hand-forming" the variants. This is a bit
long-winded
(and error-prone) so a "compiler" has been developed. This accepts a
"schema"
conforming to a grammer and outputs a set of C++ classes (cpp and header).
The application can then derive application classes.
Given an application class "alarm_monitor" the schema might look like;
record sensor_signal { // Generated by raising the signal on an alarm
sensor
time when // Instant of detection
string line // Expanded text
void detail[]
}
record monitor_store { // Persisted image of a monitored sensor
integer number // Unique id
integer status // Currently
sensor_signal log[] // Rolling log of signals
integer ring_count // Signal count since last ringing transition
}
The application would derive "alarm_monitor" from "monitor_store" and a
minimal
ctor might look like;
alarm_monitor::alarm_monitor( const alarm_sensor &sensor ) :
{
try
{
// Recover the previously saved image of "this"
typed_load_file file( sensor.name );
load( file.begin(), *this );
}
catch( typed_memory_not_found & )
{
// No previous image. Set the members of "this"
// to reasonable defaults and save an image
number = sensor.number;
status = monitor_ready;
ring_count = 0;
log.clear();
typed_save_file file( sensor.name );
save( file.begin(), *this );
}
// Resume normal operation
}
Hope this is enough info. Code is currently getting a good workout (part of
beta
in a 24x7, server-type product). Example above is "para-phrased" to keep it
short and to remove some confusing coding standards.
Thanks,
Scott
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk