You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
3.0 KiB
128 lines
3.0 KiB
// persist.h --
|
|
// $Id$
|
|
// This is part of Metakit, see http://www.equi4.com/metakit/
|
|
|
|
/** @file
|
|
* Definition of the core file management classes
|
|
*/
|
|
|
|
#ifndef __PERSIST_H__
|
|
#define __PERSIST_H__
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Declarations in this file
|
|
|
|
class c4_SaveContext; // wraps file commits
|
|
class c4_Persist; // persistent table storage
|
|
|
|
class c4_Allocator; // not defined here
|
|
class c4_Column; // not defined here
|
|
class c4_Differ; // not defined here
|
|
class c4_FileMark; // not defined here
|
|
class c4_Strategy; // not defined here
|
|
class c4_HandlerSeq; // not defined here
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
class c4_SaveContext
|
|
{
|
|
c4_Strategy& _strategy;
|
|
c4_Column* _walk;
|
|
c4_Differ* _differ;
|
|
|
|
c4_Allocator* _space;
|
|
c4_Allocator* _cleanup;
|
|
c4_Allocator* _nextSpace;
|
|
|
|
bool _preflight;
|
|
bool _fullScan;
|
|
int _mode;
|
|
|
|
c4_DWordArray _newPositions;
|
|
int _nextPosIndex;
|
|
|
|
t4_byte* _bufPtr;
|
|
t4_byte* _curr;
|
|
t4_byte* _limit;
|
|
t4_byte _buffer [512];
|
|
|
|
public:
|
|
c4_SaveContext (c4_Strategy& strategy_, bool fullScan_, int mode_,
|
|
c4_Differ* differ_, c4_Allocator* space_);
|
|
~c4_SaveContext ();
|
|
|
|
void SaveIt(c4_HandlerSeq& root_, c4_Allocator** spacePtr_,
|
|
c4_Bytes& rootWalk_);
|
|
|
|
void StoreValue(t4_i32 v_);
|
|
bool CommitColumn(c4_Column& col_);
|
|
void CommitSequence(c4_HandlerSeq& seq_, bool selfDesc_);
|
|
|
|
c4_Column* SetWalkBuffer(c4_Column* walk_);
|
|
bool IsFlipped() const;
|
|
|
|
bool Serializing() const;
|
|
void AllocDump(const char*, bool =false);
|
|
|
|
private:
|
|
void FlushBuffer();
|
|
void Write(const void* buf_, int len_);
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
class c4_Persist
|
|
{
|
|
c4_Allocator* _space;
|
|
c4_Strategy& _strategy;
|
|
c4_HandlerSeq* _root;
|
|
c4_Differ* _differ;
|
|
c4_Bytes _rootWalk;
|
|
bool (c4_Persist::*_fCommit) (bool);
|
|
int _mode;
|
|
bool _owned;
|
|
|
|
// used for on-the-fly conversion of old-format datafiles
|
|
t4_byte* _oldBuf;
|
|
const t4_byte* _oldCurr;
|
|
const t4_byte* _oldLimit;
|
|
t4_i32 _oldSeek;
|
|
|
|
int OldRead(t4_byte* buf_, int len_);
|
|
|
|
public:
|
|
c4_Persist (c4_Strategy&, bool owned_, int mode_);
|
|
~c4_Persist ();
|
|
|
|
c4_HandlerSeq& Root() const;
|
|
void SetRoot(c4_HandlerSeq* root_);
|
|
c4_Strategy& Strategy() const;
|
|
|
|
bool AutoCommit(bool =true);
|
|
void DoAutoCommit();
|
|
|
|
bool SetAside(c4_Storage& aside_);
|
|
c4_Storage* GetAside() const;
|
|
|
|
bool Commit(bool full_);
|
|
bool Rollback(bool full_);
|
|
|
|
bool LoadIt(c4_Column& walk_);
|
|
void LoadAll();
|
|
|
|
t4_i32 LookupAside(int id_);
|
|
void ApplyAside(int id_, c4_Column& col_);
|
|
|
|
void OccupySpace(t4_i32 pos_, t4_i32 len_);
|
|
|
|
t4_i32 FetchOldValue();
|
|
void FetchOldLocation(c4_Column& col_);
|
|
|
|
static c4_HandlerSeq* Load(c4_Stream*);
|
|
static void Save(c4_Stream*, c4_HandlerSeq& root_);
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#endif
|