The storage class uses a view, with additional functionality to be able to store and reload the data it contains (including nested subviews).

By default, data is loaded on demand, i.e. whenever data which has not yet been referenced is used for the first time. Loading is limited to the lifetime of this storage object, since the storage object carries the file descriptor with it that is needed to access the data file.

To save changes, call the Commit member. This is the only time that data is written to file - when using a read-only file simply avoid calling Commit.

The LoadFromStream and SaveToStream members can be used to serialize the contents of this storage row using only sequential I/O (no seeking, only read or write calls).

The data storage mechanism implementation provides fail-safe operation: if anything prevents Commit from completing its task, the last succesfully committed version of the saved data will be recovered on the next open. This also includes changes made to the table structure.

The following code creates a view with 1 row and stores it on file:

        c4_StringProp pName ("Name");
        c4_IntProp pAge ("Age");

        c4_Storage storage ("myfile.dat", true);
        c4_View myView = storage.GetAs("Musicians[Name:S,Age:I]");

        myView.Add(pName ["John Williams"] + pAge [43]);

        storage.Commit();

<if !private>
void AutoCommit ();
  Set storage up to always call Commit in the destructor

  <if !private>

bool Commit ();
  Flush pending changes to file right now

  <if !private>

c4_RowRef Contents () const;
  Give access to the stored data as a single row

  <if !private>

const char* Description (const char* name_ =0);
  Return a description of the view structure (default is all)

  <if !private>

c4_View GetAs (const char* description_);
  Get a named view, redefining it to match the given structure

  <if !private>

void Initialize (const char*, bool);

  <if !private>

void LoadFrom (c4_Stream& stream_);
  Load contents from the specified input stream

  <if !private>

bool Rollback ();
  Calling Rollback will cancel all uncommitted changes.

  <if !private>

c4_HandlerSeq& RootTable () const;
  Return the root table entry

  <if !private>

void SaveTo (c4_Stream& stream_);
  Save contents to the specified output stream

  <if !private>

void SetStructure (const char*);

  <if !private>

c4_View Store (const char* name_, const c4_View& view_);
  Attach a view using specified name in this storage object

  <if !private>

c4_Strategy& Strategy () const;
  Return the strategy object associated with this storage

  <if !private>

c4_ViewRef View (const char* name_);
  Get or set a named view in this storage object

  <if !private>

c4_Persist* _persist;

  <if !private>

c4_Storage ();
  Construct streaming-only storage object

  <if !private>

c4_Storage (c4_Strategy& strategy_, bool owned_ =false);
  Construct a storage using the specified strategy handler

  <if !private>

c4_Storage (const c4_Storage&);
  Copy constructor

  <if !private>

c4_Storage (const char* filename_, bool canModify_);
  Construct a storage object, keeping the current structure

  <if !private>

c4_Storage (const char* filename_, const char* description_);
  Construct a storage object for given file and format

  <if !private>

c4_Storage& operator= (const c4_Storage&);
  Assignment of storage implements reference semantics

  <if !private>

~c4_Storage ();
  Destructor, usually closes file, but does not commit by default

class c4_Storage