// ------------------------------- //
// -------- Start of File -------- //
// ------------------------------- //
// ----------------------------------------------------------- //
// C++ Header File Name: persist.hpp 
// Compiler Used: MSVC40, DJGPP 2.7.2.1, GCC 2.7.2.1, HP CPP 10.24
// Produced By: Doug Gaer    
// File Creation Date: 09/18/1997  
// Date Last Modified: 10/08/1998
// Copyright (c) 1997 Douglas M. Gaer
// ----------------------------------------------------------- // 
// ---------- Include File Description and Details  ---------- // 
// ----------------------------------------------------------- // 
/*
The VBD C++ classes are copyright (c) 1997, by Douglas M. Gaer.
All those who put this code or its derivatives in a commercial
product MUST mention this copyright in their documentation for
users of the products in which this code or its derivative
classes are used. Otherwise, you have the freedom to redistribute
verbatim copies of this source code, adapt it to your specific
needs, or improve the code and release your improvements to the
public provided that the modified files carry prominent notices
stating that you changed the files and the date of any change.

THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND.
THE ENTIRE RISK OF THE QUALITY AND PERFORMANCE OF THIS SOFTWARE
IS WITH YOU. SHOULD ANY ELEMENT OF THIS SOFTWARE PROVE DEFECTIVE,
YOU WILL ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR, OR
CORRECTION.

The (P)ersistent base class is used to define the interface 
that makes the object persistent. 

Changes: 
================================================================
01/20/1998 - Added overloaded versions of the StringFileLength(),
WriteString(), and ReadString() functions used to operate on
low level c strings.
Added by: Doug Gaer

02/04/1998: Added pure virtual functions Delete() and Remove.
These functions must be defined in the derived class.
Added by: Doug Gaer

02/04/1998: Modifed DeleteObject and RemoveObject functions to
work with the Delete() and Remove() functions defined in the
derived class.
Changed by: Doug Gaer

02/04/1998: Added new functions to work with index files.
Added by: Doug Gaer

09/21/1998: Changed null_byte in all versions of WriteString()
to 0 instead of '\0' because the null character is not a valid
binary number.
Changed by: Doug Gaer

10/02/1998: Modified WriteObjHeader(), ReadObjHeader(),
WriteString(), and ReadString() functions to use the
current file address as a default argument.
Changed by: Doug Gaer

10/09/1998: Modified the AddKey() and RemoveKey() functions to
flush the Btree cache after each insertion or deletion by
default.
Changed by: Doug Gaer
================================================================
*/
// ----------------------------------------------------------- //   
#ifndef __PERSIST_HPP
#define __PERSIST_HPP

#include "pod.hpp"

// (O)bject (H)eader (8 bytes total)
struct ObjectHeader
{
  INT32 ClassID;    // Class Identification number (4 bytes)
  FAU ObjectID;     // Object Identification number (4 bytes)
};

// (P)ersistent base class
class Persistent
{
public:
  Persistent(POD *DB) { Connect(DB); objectaddress = 0; }
  Persistent(const POD *DB) { Connect(DB); objectaddress = 0; }
  Persistent() { pod = 0; } 

private:
  Persistent(const Persistent &ob) { } // Disallow coping
  void operator=(const Persistent &ob) { } // Disallow assignment
  
protected: // Derived class interface
  virtual INT32 GetClassID() const = 0;
  virtual const char *GetClassName() = 0;
  virtual FAU Write() = 0;
  virtual void Read(FAU Address) = 0;
  virtual FAU Find() = 0;
  virtual __UWORD__ ObjectLength() = 0;
  virtual FAU GetObjectAddress() = 0;
  virtual void SetObjectAddress(FAU addr) = 0;

  // 02/04/1998: Added to work with index files
  virtual FAU Delete() = 0; // Mark object deleted keeping data intact
  virtual FAU Remove() = 0; // Permanently remove object from data file 
  
public:
  // Override these functions only if an index file is used
  virtual int CompareIndex();
  virtual int RebuildIndexFile(const char *fname);
  
protected:
  void WriteObjHeader(const ObjectHeader &oh, FAU addr = CurrAddress);
  void ReadObjHeader(ObjectHeader &oh, FAU addr = CurrAddress);
  void Connect(POD *DB); // Connects persistent class to open database
  void Connect(const POD *DB);
  __UWORD__ StringFileLength(const UString &s); // Length of string in file
  __UWORD__ StringFileLength(const char *s);
  __UWORD__ StringFileLength(char *s); 
  void WriteString(const UString &s, FAU addr = CurrAddress);
  void WriteString(const char *s, FAU addr = CurrAddress);
  void WriteString(char *s, FAU addr = CurrAddress);
  void ReadString(UString &s, FAU addr = CurrAddress);
  char *ReadString(FAU addr = CurrAddress);

protected: // Index file functions
  int AddKey(EntryKey &key, int flush = 1);
  int Persistent::FindKey(EntryKey &key, int full_search = 0);
  int Persistent::RemoveKey(EntryKey &key, int flush = 1);
  
public: // User interface
  FAU AddObject(int find = 1);
  void ReadObject(FAU addr) { Read(addr); }
  FAU FindObject() { return Find(); }
  FAU ObjectAddress(int find = 1);
  void DeleteObject(FAU addr);
  void RemoveObject(FAU addr);
  
  // 02/04/1998: These functions have been modified to
  // work with index files. The Delete() and Remove()
  // functions must be defined in the derived class.
  FAU DeleteObject() { return Delete(); }
  FAU RemoveObject() { return Remove(); }

public: // Index file functions
  int UsingIndex() { return pod->UsingIndex(); }
  int UsingIndex() const { return pod->UsingIndex(); }
  int RebuildIndex() { return pod->RebuildIndex(); }
  int RebuildIndex() const { return pod->RebuildIndex(); }
  
protected:
  POD *pod;
  FAU objectaddress;
};

#endif // __PERSIST_HPP
// ----------------------------------------------------------- // 
// ------------------------------- //
// --------- End of File --------- //
// ------------------------------- //
