/************** FilAMTxt H Declares Source Code File (.H) **************/ /* Name: FILAMTXT.H Version 1.4 */ /* */ /* (C) Copyright to the author Olivier BERTRAND 2005-2020 */ /* */ /* This file contains the file access method classes declares. */ /***********************************************************************/ #ifndef __FILAMTXT_H #define __FILAMTXT_H #include "block.h" #include "array.h" typedef class TXTFAM *PTXF; typedef class DOSFAM *PDOSFAM; typedef class BLKFAM *PBLKFAM; typedef class BINFAM *PBINFAM; typedef class DOSDEF *PDOSDEF; typedef class TDBDOS *PTDBDOS; /***********************************************************************/ /* This is the base class for all file access method classes. */ /***********************************************************************/ class DllExport TXTFAM : public BLOCK { friend class TDBDOS; friend class TDBCSV; friend class TDBFIX; friend class TDBVCT; friend class TDBJSON; friend class DOSCOL; friend class BINCOL; friend class VCTCOL; public: // Constructor TXTFAM(PDOSDEF tdp); TXTFAM(PTXF txfp); // Implementation virtual AMT GetAmType(void) = 0; virtual int GetPos(void) = 0; virtual int GetNextPos(void) = 0; virtual PTXF Duplicate(PGLOBAL g) = 0; virtual bool GetUseTemp(void) {return false;} virtual int GetDelRows(void) {return DelRows;} PFBLOCK GetTo_Fb(void) {return To_Fb;} int GetCurBlk(void) {return CurBlk;} void SetTdbp(PTDBDOS tdbp) {Tdbp = tdbp;} int GetBlock(void) {return Block;} void SetBlkPos(int *bkp) {BlkPos = bkp;} void SetNrec(int n) {Nrec = n;} char *GetBuf(void) {return To_Buf;} int GetRows(void) {return Rows;} bool IsBlocked(void) {return Blocked;} // Methods virtual void Reset(void); virtual int GetFileLength(PGLOBAL g); virtual int Cardinality(PGLOBAL g); virtual int MaxBlkSize(PGLOBAL g, int s); virtual bool AllocateBuffer(PGLOBAL) {return false;} virtual void ResetBuffer(PGLOBAL) {} virtual int GetNerr(void) {return 0;} virtual int GetRowID(void) = 0; virtual bool RecordPos(PGLOBAL g) = 0; virtual bool SetPos(PGLOBAL g, int recpos) = 0; virtual int SkipRecord(PGLOBAL g, bool header) = 0; virtual bool OpenTableFile(PGLOBAL g) = 0; virtual bool DeferReading(void) {IsRead = false; return true;} virtual int ReadBuffer(PGLOBAL g) = 0; virtual int WriteBuffer(PGLOBAL g) = 0; virtual int DeleteRecords(PGLOBAL g, int irc) = 0; virtual void CloseTableFile(PGLOBAL g, bool abort) = 0; virtual void Rewind(void) = 0; virtual int InitDelete(PGLOBAL g, int fpos, int spos); bool AddListValue(PGLOBAL g, int type, void *val, PPARM *top); int StoreValues(PGLOBAL g, bool upd); int UpdateSortedRows(PGLOBAL g); int DeleteSortedRows(PGLOBAL g); protected: // Members PTDBDOS Tdbp; // To table class PCSZ To_File; // Points to table file name PFBLOCK To_Fb; // Pointer to file block PPARM To_Pos; // Pointer to position list PPARM To_Sos; // Pointer to start position list PPARM To_Upd; // Pointer to udated line list PARRAY Posar; // Pointer to position array PARRAY Sosar; // Pointer to start position array PARRAY Updar; // Pointer to udated lines array bool Placed; // true if Recpos was externally set bool IsRead; // false for deferred reading bool Blocked; // true if using blocked I/O char *To_Buf; // Points to I/O buffer void *DelBuf; // Buffer used to move lines in Delete int *BlkPos; // To array of block positions int BlkLen; // Current block length int Buflen; // Buffer length int Dbflen; // Delete buffer length int Rows; // Number of rows read so far int DelRows; // Number of deleted rows int Headlen; // Number of bytes in header int Lrecl; // Logical Record Length int Block; // Number of blocks in table int Last; // Number of elements of last block int Nrec; // Number of records in buffer int OldBlk; // Index of last read block int CurBlk; // Index of current block int CurNum; // Current buffer line number int ReadBlks; // Number of blocks read (selected) int Rbuf; // Number of lines read in buffer int Modif; // Number of modified lines in block int Blksize; // Size of padded blocks int Ending; // Length of line end int Fpos; // Position of last read record int Spos; // Start position for update/delete move int Tpos; // Target Position for delete move bool Padded; // true if fixed size blocks are padded bool Eof; // true if an EOF (0xA) character exists bool Abort; // To abort on error char *CrLf; // End of line character(s) }; // end of class TXTFAM /***********************************************************************/ /* This is the DOS/UNIX Access Method class declaration for standard */ /* text files with variable record format (DOS, CSV, FMT) */ /***********************************************************************/ class DllExport DOSFAM : public TXTFAM { public: // Constructor DOSFAM(PDOSDEF tdp); DOSFAM(PDOSFAM txfp); DOSFAM(PBLKFAM tdfp, PDOSDEF tdp); // Implementation virtual AMT GetAmType(void) {return TYPE_AM_DOS;} virtual bool GetUseTemp(void) {return UseTemp;} virtual int GetPos(void); virtual int GetNextPos(void); virtual PTXF Duplicate(PGLOBAL g) {return (PTXF)new(g) DOSFAM(this);} // Methods virtual void Reset(void); virtual int GetFileLength(PGLOBAL g); virtual int Cardinality(PGLOBAL g); virtual int MaxBlkSize(PGLOBAL g, int s); virtual bool AllocateBuffer(PGLOBAL g); virtual int GetRowID(void); virtual bool RecordPos(PGLOBAL g); virtual bool SetPos(PGLOBAL g, int recpos); virtual int SkipRecord(PGLOBAL g, bool header); virtual bool OpenTableFile(PGLOBAL g); virtual int ReadBuffer(PGLOBAL g); virtual int WriteBuffer(PGLOBAL g); virtual int DeleteRecords(PGLOBAL g, int irc); virtual void CloseTableFile(PGLOBAL g, bool abort); virtual void Rewind(void); protected: virtual bool OpenTempFile(PGLOBAL g); virtual bool MoveIntermediateLines(PGLOBAL g, bool *b); virtual int RenameTempFile(PGLOBAL g); virtual int InitDelete(PGLOBAL g, int fpos, int spos); // Members FILE *Stream; // Points to Dos file structure FILE *T_Stream; // Points to temporary file structure PFBLOCK To_Fbt; // Pointer to temp file block bool UseTemp; // True to use a temporary file in Upd/Del bool Bin; // True to force binary mode }; // end of class DOSFAM /***********************************************************************/ /* This is the DOS/UNIX Access Method class declaration for standard */ /* text files with variable record format (DOS, CSV, FMT) */ /***********************************************************************/ class DllExport BLKFAM : public DOSFAM { public: // Constructor BLKFAM(PDOSDEF tdp); BLKFAM(PBLKFAM txfp); // Implementation virtual AMT GetAmType(void) {return TYPE_AM_BLK;} virtual int GetPos(void); virtual int GetNextPos(void); virtual PTXF Duplicate(PGLOBAL g) {return (PTXF)new(g) BLKFAM(this);} // Methods virtual void Reset(void); virtual int Cardinality(PGLOBAL g); virtual int MaxBlkSize(PGLOBAL g, int s); virtual bool AllocateBuffer(PGLOBAL g); virtual int GetRowID(void); virtual bool RecordPos(PGLOBAL g); virtual bool SetPos(PGLOBAL g, int recpos); virtual int SkipRecord(PGLOBAL g, bool header); virtual int ReadBuffer(PGLOBAL g); virtual int WriteBuffer(PGLOBAL g); virtual void CloseTableFile(PGLOBAL g, bool abort); virtual void Rewind(void); protected: // Members char *CurLine; // Position of current line in buffer char *NxtLine; // Position of Next line in buffer char *OutBuf; // Buffer to write in temporary file bool Closing; // True when closing on Update }; // end of class BLKFAM /***********************************************************************/ /* This is the DOS/UNIX Access Method class declaration for binary */ /* files with variable record format (BJSON) */ /***********************************************************************/ class DllExport BINFAM : public DOSFAM { public: // Constructor BINFAM(PDOSDEF tdp) : DOSFAM(tdp) {Recsize = 0;} BINFAM(PBINFAM txfp) : DOSFAM(txfp) {Recsize = txfp->Recsize;} // Implementation virtual AMT GetAmType(void) {return TYPE_AM_BIN;} //virtual int GetPos(void); //virtual int GetNextPos(void); virtual PTXF Duplicate(PGLOBAL g) { return (PTXF)new(g) BINFAM(this); } // Methods //virtual void Reset(void) {TXTFAM::Reset();} //virtual int GetFileLength(PGLOBAL g); //virtual int Cardinality(PGLOBAL g); virtual int MaxBlkSize(PGLOBAL g, int s) {return s;} virtual bool AllocateBuffer(PGLOBAL g); //virtual int GetRowID(void); //virtual bool RecordPos(PGLOBAL g); //virtual bool SetPos(PGLOBAL g, int recpos); virtual int SkipRecord(PGLOBAL g, bool header) {return RC_OK;} //virtual bool OpenTableFile(PGLOBAL g); virtual int ReadBuffer(PGLOBAL g); virtual int WriteBuffer(PGLOBAL g); //virtual int DeleteRecords(PGLOBAL g, int irc); //virtual void CloseTableFile(PGLOBAL g, bool abort); //virtual void Rewind(void); //protected: //virtual int InitDelete(PGLOBAL g, int fpos, int spos); // Members size_t Recsize; // Length of last read or next written record }; // end of class BINFAM #endif // __FILAMTXT_H