mirror of
https://github.com/MariaDB/server.git
synced 2025-02-01 11:31:51 +01:00
0219ac1e98
have been created by the last addition of new CONNECT features. The version previous to this one is a preliminary test version and should not be distributed. - Handle indexed UPDATE/DELETE. Previously this was just tested and an error message send when it could not be done. Now CONNECT can do it in all the cases. It is done by a MRR like tchnique by making a list of all update or delete to do, sort them, then execute them. modified: storage/connect/array.cpp storage/connect/array.h storage/connect/filamap.cpp storage/connect/filamap.h storage/connect/filamdbf.cpp 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/filamzip.cpp storage/connect/filamzip.h storage/connect/global.h storage/connect/ha_connect.cc storage/connect/ha_connect.h - Differenciate Cardinality that returns a true or estimated table size and GetMaxSize that return a value equal or greater than the table row number. This fixes the errors of non matching opt files. modified: storage/connect/connect.cc storage/connect/tabdos.cpp storage/connect/tabdos.h storage/connect/tabfix.cpp storage/connect/table.cpp storage/connect/tabmac.h storage/connect/tabmysql.cpp storage/connect/tabmysql.h storage/connect/tabodbc.cpp storage/connect/tabodbc.h storage/connect/tabpivot.h storage/connect/tabtbl.cpp storage/connect/tabtbl.h storage/connect/tabutil.cpp storage/connect/tabutil.h storage/connect/tabwmi.h storage/connect/xtable.h - Fix some errors and issues when making index and opt files. Erase opt and index files for void tables. Fix wrong calculation of Block and Last in MakeBlockValues. Invalidate indexes before making opt file. Fully handle blocked variable tables. Make opt file for blocked variable tables even when they have no optimised colums. modified: storage/connect/tabdos.cpp storage/connect/xindex.h - Fix some errors making index Return an error when the allocation is too small (should not really occur now that GetMaxSize is sure) Don't use XXROW index for DBF tables because of soft deleted lines. modified: storage/connect/xindex.cpp - Typo modified: storage/connect/macutil.cpp storage/connect/tabdos.h storage/connect/tabsys.cpp storage/connect/tabsys.h
256 lines
11 KiB
C++
256 lines
11 KiB
C++
/*************** TabDos H Declares Source Code File (.H) ***************/
|
|
/* Name: TABDOS.H Version 3.3 */
|
|
/* */
|
|
/* (C) Copyright to the author Olivier BERTRAND 1999-2014 */
|
|
/* */
|
|
/* This file contains the DOS classes declares. */
|
|
/***********************************************************************/
|
|
|
|
#ifndef __TABDOS_H
|
|
#define __TABDOS_H
|
|
|
|
#include "xtable.h" // Table base class declares
|
|
#include "colblk.h" // Column base class declares
|
|
#include "xindex.h"
|
|
#include "filter.h"
|
|
|
|
//pedef struct _tabdesc *PTABD; // For friend setting
|
|
typedef class TXTFAM *PTXF;
|
|
typedef class BLOCKFILTER *PBF;
|
|
typedef class BLOCKINDEX *PBX;
|
|
|
|
/***********************************************************************/
|
|
/* DOS table. */
|
|
/***********************************************************************/
|
|
class DllExport DOSDEF : public TABDEF { /* Logical table description */
|
|
friend class OEMDEF;
|
|
friend class TDBDOS;
|
|
friend class TDBFIX;
|
|
friend class TXTFAM;
|
|
friend class DBFBASE;
|
|
public:
|
|
// Constructor
|
|
DOSDEF(void);
|
|
|
|
// Implementation
|
|
virtual AMT GetDefType(void) {return TYPE_AM_DOS;}
|
|
virtual const char *GetType(void) {return "DOS";}
|
|
virtual PIXDEF GetIndx(void) {return To_Indx;}
|
|
virtual void SetIndx(PIXDEF xdp) {To_Indx = xdp;}
|
|
virtual bool IsHuge(void) {return Huge;}
|
|
PSZ GetFn(void) {return Fn;}
|
|
PSZ GetOfn(void) {return Ofn;}
|
|
void SetBlock(int block) {Block = block;}
|
|
int GetBlock(void) {return Block;}
|
|
int GetLast(void) {return Last;}
|
|
void SetLast(int last) {Last = last;}
|
|
int GetLrecl(void) {return Lrecl;}
|
|
void SetLrecl(int lrecl) {Lrecl = lrecl;}
|
|
bool GetPadded(void) {return Padded;}
|
|
bool GetEof(void) {return Eof;}
|
|
int GetBlksize(void) {return Blksize;}
|
|
int GetEnding(void) {return Ending;}
|
|
bool IsOptimized(void) {return (Optimized == 1);}
|
|
void SetOptimized(int opt) {Optimized = opt;}
|
|
void SetAllocBlks(int blks) {AllocBlks = blks;}
|
|
int GetAllocBlks(void) {return AllocBlks;}
|
|
int *GetTo_Pos(void) {return To_Pos;}
|
|
|
|
// Methods
|
|
virtual int Indexable(void)
|
|
{return (!Multiple && Compressed != 1) ? 1 : 0;}
|
|
virtual bool DeleteIndexFile(PGLOBAL g, PIXDEF pxdf);
|
|
virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff);
|
|
virtual PTDB GetTable(PGLOBAL g, MODE mode);
|
|
bool InvalidateIndex(PGLOBAL g);
|
|
bool GetOptFileName(PGLOBAL g, char *filename);
|
|
void RemoveOptValues(PGLOBAL g);
|
|
|
|
protected:
|
|
//virtual bool Erase(char *filename);
|
|
|
|
// Members
|
|
PSZ Fn; /* Path/Name of corresponding file */
|
|
PSZ Ofn; /* Base Path/Name of matching index files*/
|
|
PIXDEF To_Indx; /* To index definitions blocks */
|
|
RECFM Recfm; /* 0:VAR, 1:FIX, 2:BIN, 3:VCT, 6:DBF */
|
|
bool Mapped; /* 0: disk file, 1: memory mapped file */
|
|
bool Padded; /* true for padded table file */
|
|
bool Huge; /* true for files larger than 2GB */
|
|
bool Accept; /* true if wrong lines are accepted (DBF)*/
|
|
bool Eof; /* true if an EOF (0xA) character exists */
|
|
int *To_Pos; /* To array of block starting positions */
|
|
int Optimized; /* 0: No, 1:Yes, 2:Redo optimization */
|
|
int AllocBlks; /* Number of suballocated opt blocks */
|
|
int Compressed; /* 0: No, 1: gz, 2:zlib compressed file */
|
|
int Lrecl; /* Size of biggest record */
|
|
int AvgLen; /* Average size of records */
|
|
int Block; /* Number de blocks of FIX/VCT tables */
|
|
int Last; /* Number of elements of last block */
|
|
int Blksize; /* Size of padded blocks */
|
|
int Maxerr; /* Maximum number of bad records (DBF) */
|
|
int ReadMode; /* Specific to DBF */
|
|
int Ending; /* Length of end of lines */
|
|
}; // end of DOSDEF
|
|
|
|
/***********************************************************************/
|
|
/* This is the DOS/UNIX Access Method class declaration for files */
|
|
/* that are standard files with columns starting at fixed offset. */
|
|
/* The last column (and record) is of variable length. */
|
|
/***********************************************************************/
|
|
class DllExport TDBDOS : public TDBASE {
|
|
friend class XINDEX;
|
|
friend class DOSCOL;
|
|
friend class MAPCOL;
|
|
friend class TXTFAM;
|
|
friend class DOSFAM;
|
|
friend class VCTCOL;
|
|
friend RCODE CntDeleteRow(PGLOBAL, PTDB, bool);
|
|
public:
|
|
// Constructors
|
|
TDBDOS(PDOSDEF tdp, PTXF txfp);
|
|
TDBDOS(PGLOBAL g, PTDBDOS tdbp);
|
|
|
|
// Inline functions
|
|
inline void SetTxfp(PTXF txfp) {Txfp = txfp; Txfp->SetTdbp(this);}
|
|
inline PTXF GetTxfp(void) {return Txfp;}
|
|
inline char *GetLine(void) {return To_Line;}
|
|
inline int GetCurBlk(void) {return Txfp->GetCurBlk();}
|
|
inline void SetLine(char *toline) {To_Line = toline;}
|
|
inline void IncLine(int inc) {To_Line += inc;}
|
|
inline bool IsRead(void) {return Txfp->IsRead;}
|
|
inline PXOB *GetLink(void) {return To_Link;}
|
|
|
|
// Implementation
|
|
virtual AMT GetAmType(void) {return Txfp->GetAmType();}
|
|
virtual PSZ GetFile(PGLOBAL g) {return Txfp->To_File;}
|
|
virtual void SetFile(PGLOBAL g, PSZ fn) {Txfp->To_File = fn;}
|
|
virtual void SetAbort(bool b) {Abort = b;}
|
|
virtual RECFM GetFtype(void) {return Ftype;}
|
|
virtual bool SkipHeader(PGLOBAL g) {return false;}
|
|
virtual void RestoreNrec(void) {Txfp->SetNrec(1);}
|
|
virtual PTDB Duplicate(PGLOBAL g)
|
|
{return (PTDB)new(g) TDBDOS(g, this);}
|
|
|
|
// Methods
|
|
virtual PTDB CopyOne(PTABS t);
|
|
virtual void ResetDB(void) {Txfp->Reset();}
|
|
virtual bool IsUsingTemp(PGLOBAL g);
|
|
virtual void ResetSize(void) {MaxSize = Cardinal = -1;}
|
|
virtual int ResetTableOpt(PGLOBAL g, bool dop, bool dox);
|
|
virtual int MakeBlockValues(PGLOBAL g);
|
|
virtual bool SaveBlockValues(PGLOBAL g);
|
|
virtual bool GetBlockValues(PGLOBAL g);
|
|
virtual PBF InitBlockFilter(PGLOBAL g, PFIL filp);
|
|
//virtual PBX InitBlockIndex(PGLOBAL g);
|
|
virtual int TestBlock(PGLOBAL g);
|
|
virtual void PrintAM(FILE *f, char *m);
|
|
|
|
// Database routines
|
|
virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n);
|
|
virtual char *GetOpenMode(PGLOBAL g, char *opmode) {return NULL;}
|
|
virtual int GetFileLength(PGLOBAL g) {return Txfp->GetFileLength(g);}
|
|
virtual int GetProgMax(PGLOBAL g);
|
|
virtual int GetProgCur(void);
|
|
//virtual int GetAffectedRows(void) {return Txfp->GetDelRows();}
|
|
virtual int GetRecpos(void) {return Txfp->GetPos();}
|
|
virtual bool SetRecpos(PGLOBAL g, int recpos)
|
|
{return Txfp->SetPos(g, recpos);}
|
|
virtual int RowNumber(PGLOBAL g, bool b = false);
|
|
virtual int Cardinality(PGLOBAL g);
|
|
virtual int GetMaxSize(PGLOBAL g);
|
|
virtual bool OpenDB(PGLOBAL g);
|
|
virtual int ReadDB(PGLOBAL g);
|
|
virtual int WriteDB(PGLOBAL g);
|
|
virtual int DeleteDB(PGLOBAL g, int irc);
|
|
virtual void CloseDB(PGLOBAL g);
|
|
virtual int ReadBuffer(PGLOBAL g) {return Txfp->ReadBuffer(g);}
|
|
|
|
// Specific routine
|
|
virtual int EstimatedLength(PGLOBAL g);
|
|
|
|
// Optimization routines
|
|
virtual int MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add);
|
|
bool InitialyzeIndex(PGLOBAL g, PIXDEF xdp);
|
|
void ResetBlockFilter(PGLOBAL g);
|
|
bool GetDistinctColumnValues(PGLOBAL g, int nrec);
|
|
|
|
protected:
|
|
PBF CheckBlockFilari(PGLOBAL g, PXOB *arg, int op, bool *cnv);
|
|
|
|
// Members
|
|
PTXF Txfp; // To the File access method class
|
|
//PBX To_BlkIdx; // To index test block
|
|
PBF To_BlkFil; // To evaluation block filter
|
|
PFIL SavFil; // Saved hidden filter
|
|
char *To_Line; // Points to current processed line
|
|
bool Abort; // TRUE when aborting UPDATE/DELETE
|
|
int Lrecl; // Logical Record Length
|
|
int AvgLen; // Logical Record Average Length
|
|
//int Xeval; // BlockTest return value
|
|
int Beval; // BlockEval return value
|
|
}; // end of class TDBDOS
|
|
|
|
/***********************************************************************/
|
|
/* Class DOSCOL: DOS access method column descriptor. */
|
|
/* This A.M. is used for text file tables under operating systems */
|
|
/* DOS, OS2, UNIX, WIN16 and WIN32. */
|
|
/***********************************************************************/
|
|
class DllExport DOSCOL : public COLBLK {
|
|
friend class TDBDOS;
|
|
friend class TDBFIX;
|
|
public:
|
|
// Constructors
|
|
DOSCOL(PGLOBAL g, PCOLDEF cdp, PTDB tp, PCOL cp, int i, PSZ am = "DOS");
|
|
DOSCOL(DOSCOL *colp, PTDB tdbp); // Constructor used in copy process
|
|
|
|
// Implementation
|
|
virtual int GetAmType(void) {return TYPE_AM_DOS;}
|
|
virtual void SetTo_Val(PVAL valp) {To_Val = valp;}
|
|
virtual int GetClustered(void) {return Clustered;}
|
|
virtual int IsClustered(void) {return (Clustered &&
|
|
((PDOSDEF)(((PTDBDOS)To_Tdb)->To_Def))->IsOptimized());}
|
|
virtual int IsSorted(void) {return Sorted;}
|
|
virtual PVBLK GetMin(void) {return Min;}
|
|
virtual PVBLK GetMax(void) {return Max;}
|
|
virtual int GetNdv(void) {return Ndv;}
|
|
virtual int GetNbm(void) {return Nbm;}
|
|
virtual PVBLK GetBmap(void) {return Bmap;}
|
|
virtual PVBLK GetDval(void) {return Dval;}
|
|
|
|
// Methods
|
|
virtual bool VarSize(void);
|
|
virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check);
|
|
virtual void ReadColumn(PGLOBAL g);
|
|
virtual void WriteColumn(PGLOBAL g);
|
|
virtual void Print(PGLOBAL g, FILE *, uint);
|
|
|
|
protected:
|
|
virtual bool SetMinMax(PGLOBAL g);
|
|
virtual bool SetBitMap(PGLOBAL g);
|
|
bool CheckSorted(PGLOBAL g);
|
|
bool AddDistinctValue(PGLOBAL g);
|
|
|
|
// Default constructor not to be used
|
|
DOSCOL(void) {}
|
|
|
|
// Members
|
|
PVBLK Min; // Array of block min values
|
|
PVBLK Max; // Array of block max values
|
|
PVBLK Bmap; // Array of block bitmap values
|
|
PVBLK Dval; // Array of column distinct values
|
|
PVAL To_Val; // To value used for Update/Insert
|
|
PVAL OldVal; // The previous value of the object.
|
|
char *Buf; // Buffer used in read/write operations
|
|
char Dsp; // The decimal separator
|
|
bool Ldz; // True if field contains leading zeros
|
|
bool Nod; // True if no decimal point
|
|
int Dcm; // Last Dcm digits are decimals
|
|
int Deplac; // Offset in dos_buf
|
|
int Clustered; // 0:No 1:Yes
|
|
int Sorted; // 0:No 1:Asc (2:Desc - NIY)
|
|
int Ndv; // Number of distinct values
|
|
int Nbm; // Number of uint in bitmap
|
|
}; // end of class DOSCOL
|
|
|
|
#endif // __TABDOS_H
|