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.
151 lines
4.4 KiB
151 lines
4.4 KiB
// handler.h --
|
|
// $Id$
|
|
// This is part of Metakit, the homepage is http://www.equi4.com/metakit/
|
|
|
|
/** @file
|
|
* Definition of the main handler classes
|
|
*/
|
|
|
|
#ifndef __HANDLER_H__
|
|
#define __HANDLER_H__
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Declarations in this file
|
|
|
|
class c4_Handler; // data representation handler
|
|
|
|
// class c4_Sequence;
|
|
class c4_HandlerSeq; // a sequence built from handlers
|
|
|
|
class c4_Column; // not defined here
|
|
class c4_Field; // not defined here
|
|
class c4_Persist; // not defined here
|
|
class c4_SaveContext; // not defined here
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
class c4_Handler
|
|
{
|
|
c4_Property _property;
|
|
|
|
public:
|
|
c4_Handler (const c4_Property& _prop);
|
|
//: Constructor (this is an abstract base class).
|
|
virtual ~c4_Handler ();
|
|
|
|
virtual void Define(int, const t4_byte**);
|
|
//: Called when the corresponding table has been fully defined.
|
|
virtual void FlipBytes();
|
|
//: Called to reverse the internal byte order of foreign data.
|
|
virtual void Commit(c4_SaveContext& ar_);
|
|
//: Commit the associated column(s) to file.
|
|
virtual void OldDefine(char, c4_Persist&);
|
|
|
|
const c4_Property& Property() const;
|
|
//: Returns the property associated with this handler.
|
|
int PropId() const;
|
|
//: Returns the id of the property associated with this handler.
|
|
|
|
void ClearBytes(c4_Bytes& buf_) const;
|
|
//: Returns the default value for items of this type.
|
|
|
|
virtual int ItemSize(int index_) = 0;
|
|
//: Return width of specified data item.
|
|
void GetBytes(int index_, c4_Bytes& buf_, bool copySmall_ =false);
|
|
//: Used for backward compatibility, should probably be tqreplaced.
|
|
virtual const void* Get(int index_, int& length_) = 0;
|
|
//: Retrieves the data item at the specified index.
|
|
virtual void Set(int index_, const c4_Bytes& buf_) = 0;
|
|
//: Stores a new data item at the specified index.
|
|
|
|
int Compare(int index_, const c4_Bytes& buf_);
|
|
//: Compares an entry with a specified data item.
|
|
|
|
virtual void Insert(int index_, const c4_Bytes& buf_, int count_) = 0;
|
|
//: Inserts 1 or more data items at the specified index.
|
|
virtual void Remove(int index_, int count_) = 0;
|
|
//: Removes 1 or more data items at the specified index.
|
|
void Move(int from_, int to_);
|
|
//: Move a data item to another position.
|
|
|
|
virtual c4_Column* GetNthMemoCol(int index_, bool alloc_ =false);
|
|
//: Special access to underlying data of memo entries
|
|
|
|
virtual bool IsPersistent() const;
|
|
//: True if this handler might do I/O to satisfy fetches
|
|
|
|
virtual void Unmapped();
|
|
//: Make sure this handler stops using file mappings
|
|
|
|
virtual bool HasSubview(int index_);
|
|
//: True if this subview has materialized into an object
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
class c4_HandlerSeq : public c4_Sequence
|
|
{
|
|
c4_PtrArray _handlers;
|
|
c4_Persist* _persist;
|
|
c4_Field* _field;
|
|
c4_HandlerSeq* _parent;
|
|
int _numRows;
|
|
|
|
public:
|
|
c4_HandlerSeq (c4_Persist*);
|
|
c4_HandlerSeq (c4_HandlerSeq& owner_, c4_Handler* handler_);
|
|
|
|
virtual int NumRows() const;
|
|
virtual void SetNumRows(int);
|
|
|
|
virtual int NumHandlers() const;
|
|
virtual c4_Handler& NthHandler(int) const;
|
|
virtual const c4_Sequence* HandlerContext(int) const;
|
|
virtual int AddHandler(c4_Handler*);
|
|
|
|
void DefineRoot();
|
|
void Restructure(c4_Field&, bool remove_);
|
|
void DetachFromParent();
|
|
void DetachFromStorage(bool full_);
|
|
void DetermineSpaceUsage();
|
|
|
|
c4_Field& Definition() const;
|
|
const char* Description();
|
|
c4_HandlerSeq& Parent() const;
|
|
virtual c4_Persist* Persist() const;
|
|
|
|
c4_Field& Field(int) const;
|
|
int NumFields() const;
|
|
char ColumnType(int index_) const;
|
|
bool IsNested(int) const;
|
|
|
|
void Prepare(const t4_byte** ptr_, bool selfDesc_);
|
|
void OldPrepare();
|
|
|
|
void FlipAllBytes();
|
|
void ExchangeEntries(int srcPos_, c4_HandlerSeq& dst_, int dstPos_);
|
|
|
|
c4_HandlerSeq& SubEntry(int, int) const;
|
|
|
|
c4_Field* FindField(const c4_Handler* handler_);
|
|
|
|
void UnmappedAll();
|
|
|
|
static void BuildMeta(int, int, c4_View&, const c4_Field&);
|
|
|
|
protected:
|
|
virtual c4_Handler* CreateHandler(const c4_Property&);
|
|
|
|
virtual ~c4_HandlerSeq ();
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#if q4_INLINE
|
|
#include "handler.inl"
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#endif
|