/***************** FilAmDbf H Declares Source Code File (.H) ****************/
/*  Name: filamdbf.h    Version 1.4                                         */
/*                                                                          */
/*  (C) Copyright to the author Olivier BERTRAND          2005-2014         */
/*                                                                          */
/*  This file contains the DBF file access method classes declares.         */
/****************************************************************************/

#ifndef __FILAMDBF_H
#define __FILAMDBF_H

#include "filamfix.h"
#include "filamap.h"

typedef class DBFBASE *PDBF;
typedef class DBFFAM  *PDBFFAM;
typedef class DBMFAM  *PDBMFAM;

/****************************************************************************/
/*  Functions used externally.                                              */
/****************************************************************************/
PQRYRES DBFColumns(PGLOBAL g, PCSZ dp, PCSZ fn, PTOS tiop, bool info);

/****************************************************************************/
/*  This is the base class for dBASE file access methods.                   */
/****************************************************************************/
class DllExport DBFBASE {
 public:
  // Constructors
  DBFBASE(PDOSDEF tdp);
  DBFBASE(PDBF txfp);

  // Implementation
  int  ScanHeader(PGLOBAL g, PCSZ fname, int lrecl, int *rlen, PCSZ defpath);

 protected:
  // Default constructor, not to be used
  DBFBASE(void) = default;

  // Members
  int  Records;                     /*  records in the file                 */
  bool Accept;                      /*  true if bad lines are accepted      */
  int  Nerr;                        /*  Number of bad records               */
  int  Maxerr;                      /*  Maximum number of bad records       */
  int  ReadMode;                    /*  1: ALL 2: DEL 0: NOT DEL            */
  }; // end of class DBFBASE

/****************************************************************************/
/*  This is the DOS/UNIX Access Method class declaration for DBase files.   */
/****************************************************************************/
class DllExport DBFFAM : public FIXFAM, public DBFBASE {
 public:
  // Constructors
  DBFFAM(PDOSDEF tdp) : FIXFAM(tdp), DBFBASE(tdp) {}
  DBFFAM(PDBFFAM txfp) : FIXFAM(txfp), DBFBASE((PDBF)txfp) {}

  // Implementation
  virtual AMT  GetAmType(void) {return TYPE_AM_DBF;}
  virtual PTXF Duplicate(PGLOBAL g)
                {return (PTXF)new(g) DBFFAM(this);}

  // Methods
  virtual int  GetNerr(void) {return Nerr;}
  virtual int  Cardinality(PGLOBAL g);
  virtual bool OpenTableFile(PGLOBAL g);
  virtual bool AllocateBuffer(PGLOBAL g);
  virtual void ResetBuffer(PGLOBAL g);
  virtual int  ReadBuffer(PGLOBAL g);
  virtual int  DeleteRecords(PGLOBAL g, int irc);
  virtual void CloseTableFile(PGLOBAL g, bool abort);
  virtual void Rewind(void);

 protected:
  virtual bool CopyHeader(PGLOBAL g);
//virtual int  InitDelete(PGLOBAL g, int fpos, int spos);

  // Members
  }; // end of class DBFFAM

/****************************************************************************/
/*  This is the DOS/UNIX Access Method class declaration for DBase files    */
/*  using file mapping to access the file.                                  */
/****************************************************************************/
class DllExport DBMFAM : public MPXFAM, public DBFBASE {
 public:
  // Constructors
  DBMFAM(PDOSDEF tdp) : MPXFAM(tdp), DBFBASE(tdp) {}
  DBMFAM(PDBMFAM txfp) : MPXFAM(txfp), DBFBASE((PDBF)txfp) {}

  // Implementation
  virtual AMT  GetAmType(void) {return TYPE_AM_DBF;}
  virtual PTXF Duplicate(PGLOBAL g)
                {return (PTXF)new(g) DBMFAM(this);}
  virtual  int  GetDelRows(void);

  // Methods
  virtual int  GetNerr(void) {return Nerr;}
  virtual int  Cardinality(PGLOBAL g);
  virtual bool AllocateBuffer(PGLOBAL g);
  virtual int  ReadBuffer(PGLOBAL g);
  virtual int  DeleteRecords(PGLOBAL g, int irc);
  virtual void Rewind(void);

 protected:
  // Members
  }; // end of class DBFFAM

#endif // __FILAMDBF_H
