diff options
Diffstat (limited to 'akregator/src/mk4storage/metakit/src/persist.h')
-rw-r--r-- | akregator/src/mk4storage/metakit/src/persist.h | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/akregator/src/mk4storage/metakit/src/persist.h b/akregator/src/mk4storage/metakit/src/persist.h new file mode 100644 index 000000000..61ef261ee --- /dev/null +++ b/akregator/src/mk4storage/metakit/src/persist.h @@ -0,0 +1,127 @@ +// 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 |