mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 04:22:27 +01:00
3a69c854c5
them sorted by file position. Firstly a new value is stored in indexes to know if they are sorted, preventing to do the sorting when it is not needed. Secondly, almost all in now done in connect instead of being done by the different file access method classes. This pepares the future use of temporary files for all table types and also fix the bug that was occuring when partially using a multi-column index because of false MRR like call of position followed by unsorted rnd_pos no more using indexing. modified: storage/connect/connect.cc storage/connect/filamap.cpp storage/connect/filamap.h storage/connect/filamdbf.cpp storage/connect/filamdbf.h storage/connect/filamfix.cpp storage/connect/filamfix.h storage/connect/filamtxt.cpp storage/connect/filamtxt.h storage/connect/filamvct.cpp storage/connect/filamvct.h storage/connect/tabdos.cpp storage/connect/tabdos.h storage/connect/tabfix.h storage/connect/tabfmt.cpp storage/connect/tabfmt.h storage/connect/xindex.cpp storage/connect/xindex.h storage/connect/xtable.h
211 lines
8.7 KiB
C++
211 lines
8.7 KiB
C++
/************** FilAMTxt H Declares Source Code File (.H) **************/
|
|
/* Name: FILAMTXT.H Version 1.3 */
|
|
/* */
|
|
/* (C) Copyright to the author Olivier BERTRAND 2005-2014 */
|
|
/* */
|
|
/* 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 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 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;}
|
|
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 g) {return false;}
|
|
virtual void ResetBuffer(PGLOBAL g) {}
|
|
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
|
|
PSZ 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
|
|
|
|
#endif // __FILAMTXT_H
|