summaryrefslogtreecommitdiffstats
path: root/akregator/src/mk4storage/metakit/src/persist.h
diff options
context:
space:
mode:
Diffstat (limited to 'akregator/src/mk4storage/metakit/src/persist.h')
-rw-r--r--akregator/src/mk4storage/metakit/src/persist.h127
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