📄 mitab_priv.h
字号:
int m_nCurIndexEntry;
TABRawBinBlock *m_poDataBlock;
int m_numEntriesInNode;
GInt32 m_nPrevNodePtr;
GInt32 m_nNextNodePtr;
int GotoNodePtr(GInt32 nNewNodePtr);
GInt32 ReadIndexEntry(int nEntryNo, GByte *pKeyValue);
int IndexKeyCmp(GByte *pKeyValue, int nEntryNo);
int InsertEntry(GByte *pKeyValue, GInt32 nRecordNo,
GBool bInsertAfterCurChild=FALSE,
GBool bMakeNewEntryCurChild=FALSE);
int SetNodeBufferDirectly(int numEntries, GByte *pBuf,
int nCurIndexEntry=0,
TABINDNode *poCurChild=NULL);
public:
TABINDNode(TABAccess eAccessMode = TABRead);
~TABINDNode();
int InitNode(FILE *fp, int nBlockPtr,
int nKeyLength, int nSubTreeDepth, GBool bUnique,
TABBinBlockManager *poBlockMgr=NULL,
TABINDNode *poParentNode=NULL,
int nPrevNodePtr=0, int nNextNodePtr=0);
int SetFieldType(TABFieldType eType);
TABFieldType GetFieldType() {return m_eFieldType;};
void SetUnique(GBool bUnique){m_bUnique = bUnique;};
GBool IsUnique() {return m_bUnique;};
int GetKeyLength() {return m_nKeyLength;};
int GetSubTreeDepth() {return m_nSubTreeDepth;};
GInt32 GetNodeBlockPtr() {return m_nCurDataBlockPtr;};
int GetNumEntries() {return m_numEntriesInNode;};
int GetMaxNumEntries() {return (512-12)/(m_nKeyLength+4);};
GInt32 FindFirst(GByte *pKeyValue);
GInt32 FindNext(GByte *pKeyValue);
int CommitToFile();
int AddEntry(GByte *pKeyValue, GInt32 nRecordNo,
GBool bAddInThisNodeOnly=FALSE,
GBool bInsertAfterCurChild=FALSE,
GBool bMakeNewEntryCurChild=FALSE);
int SplitNode();
int SplitRootNode();
GByte* GetNodeKey();
int UpdateCurChildEntry(GByte *pKeyValue, GInt32 nRecordNo);
int UpdateSplitChild(GByte *pKeyValue1, GInt32 nRecordNo1,
GByte *pKeyValue2, GInt32 nRecordNo2,
int nNewCurChildNo /* 1 or 2 */);
int SetNodeBlockPtr(GInt32 nThisNodePtr);
int SetPrevNodePtr(GInt32 nPrevNodePtr);
int SetNextNodePtr(GInt32 nNextNodePtr);
#ifdef DEBUG
void Dump(FILE *fpOut = NULL);
#endif
};
/*---------------------------------------------------------------------
* class TABINDFile
*
* Class to handle table field index (.IND) files... we use this
* class as the main entry point to open and search the table field indexes.
* Note that .IND files are supported for read access only.
*--------------------------------------------------------------------*/
class TABINDFile
{
private:
char *m_pszFname;
FILE *m_fp;
TABAccess m_eAccessMode;
TABBinBlockManager m_oBlockManager;
int m_numIndexes;
TABINDNode **m_papoIndexRootNodes;
GByte **m_papbyKeyBuffers;
int ValidateIndexNo(int nIndexNumber);
int ReadHeader();
int WriteHeader();
public:
TABINDFile();
~TABINDFile();
int Open(const char *pszFname, const char *pszAccess,
GBool bTestOpenNoError=FALSE);
int Close();
int GetNumIndexes() {return m_numIndexes;};
int SetIndexFieldType(int nIndexNumber, TABFieldType eType);
int SetIndexUnique(int nIndexNumber, GBool bUnique=TRUE);
GByte *BuildKey(int nIndexNumber, GInt32 nValue);
GByte *BuildKey(int nIndexNumber, const char *pszStr);
GByte *BuildKey(int nIndexNumber, double dValue);
GInt32 FindFirst(int nIndexNumber, GByte *pKeyValue);
GInt32 FindNext(int nIndexNumber, GByte *pKeyValue);
int CreateIndex(TABFieldType eType, int nFieldSize);
int AddEntry(int nIndexNumber, GByte *pKeyValue, GInt32 nRecordNo);
#ifdef DEBUG
void Dump(FILE *fpOut = NULL);
#endif
};
/*---------------------------------------------------------------------
* class TABDATFile
*
* Class to handle Read/Write operation on .DAT files... the .DAT file
* contains the table of attribute field values.
*--------------------------------------------------------------------*/
class TABDATFile
{
private:
char *m_pszFname;
FILE *m_fp;
TABAccess m_eAccessMode;
TABTableType m_eTableType;
TABRawBinBlock *m_poHeaderBlock;
int m_numFields;
TABDATFieldDef *m_pasFieldDef;
TABRawBinBlock *m_poRecordBlock;
int m_nBlockSize;
int m_nRecordSize;
int m_nCurRecordId;
GBool m_bCurRecordDeletedFlag;
GInt32 m_numRecords;
GInt32 m_nFirstRecordPtr;
GBool m_bWriteHeaderInitialized;
int InitWriteHeader();
int WriteHeader();
// We know that character strings are limited to 254 chars in MapInfo
// Using a buffer pr. class instance to avoid threading issues with the library
char m_szBuffer[256];
public:
TABDATFile();
~TABDATFile();
int Open(const char *pszFname, const char *pszAccess,
TABTableType eTableType =TABTableNative);
int Close();
int GetNumFields();
TABFieldType GetFieldType(int nFieldId);
int GetFieldWidth(int nFieldId);
int GetFieldPrecision(int nFieldId);
int ValidateFieldInfoFromTAB(int iField, const char *pszName,
TABFieldType eType,
int nWidth, int nPrecision);
int AddField(const char *pszName, TABFieldType eType,
int nWidth, int nPrecision=0);
GInt32 GetNumRecords();
TABRawBinBlock *GetRecordBlock(int nRecordId);
GBool IsCurrentRecordDeleted() { return m_bCurRecordDeletedFlag;};
int CommitRecordToFile();
const char *ReadCharField(int nWidth);
GInt32 ReadIntegerField(int nWidth);
GInt16 ReadSmallIntField(int nWidth);
double ReadFloatField(int nWidth);
double ReadDecimalField(int nWidth);
const char *ReadLogicalField(int nWidth);
const char *ReadDateField(int nWidth);
const char *ReadTimeField(int nWidth);
const char *ReadDateTimeField(int nWidth);
int WriteCharField(const char *pszValue, int nWidth,
TABINDFile *poINDFile, int nIndexNo);
int WriteIntegerField(GInt32 nValue,
TABINDFile *poINDFile, int nIndexNo);
int WriteSmallIntField(GInt16 nValue,
TABINDFile *poINDFile, int nIndexNo);
int WriteFloatField(double dValue,
TABINDFile *poINDFile, int nIndexNo);
int WriteDecimalField(double dValue, int nWidth, int nPrecision,
TABINDFile *poINDFile, int nIndexNo);
int WriteLogicalField(const char *pszValue,
TABINDFile *poINDFile, int nIndexNo);
int WriteDateField(const char *pszValue,
TABINDFile *poINDFile, int nIndexNo);
int WriteTimeField(const char *pszValue,
TABINDFile *poINDFile, int nIndexNo);
int WriteDateTimeField(const char *pszValue,
TABINDFile *poINDFile, int nIndexNo);
#ifdef DEBUG
void Dump(FILE *fpOut = NULL);
#endif
};
/*---------------------------------------------------------------------
* class TABRelation
*
* Class that maintains a relation between 2 tables through a field
* in each table (the SQL "where table1.field1=table2.field2" found in
* TABView datasets).
*
* An instance of this class is used to read data records from the
* combined tables as if they were a single one.
*--------------------------------------------------------------------*/
class TABRelation
{
private:
/* Information about the main table.
*/
TABFile *m_poMainTable;
char *m_pszMainFieldName;
int m_nMainFieldNo;
/* Information about the related table.
* NOTE: The related field MUST be indexed.
*/
TABFile *m_poRelTable;
char *m_pszRelFieldName;
int m_nRelFieldNo;
TABINDFile *m_poRelINDFileRef;
int m_nRelFieldIndexNo;
int m_nUniqueRecordNo;
/* Main and Rel table field map:
* For each field in the source tables, -1 means that the field is not
* selected, and a value >=0 is the index of this field in the combined
* FeatureDefn
*/
int *m_panMainTableFieldMap;
int *m_panRelTableFieldMap;
OGRFeatureDefn *m_poDefn;
void ResetAllMembers();
GByte *BuildFieldKey(TABFeature *poFeature, int nFieldNo,
TABFieldType eType, int nIndexNo);
public:
TABRelation();
~TABRelation();
int Init(const char *pszViewName,
TABFile *poMainTable, TABFile *poRelTable,
const char *pszMainFieldName,
const char *pszRelFieldName,
char **papszSelectedFields);
int CreateRelFields();
OGRFeatureDefn *GetFeatureDefn() {return m_poDefn;};
TABFieldType GetNativeFieldType(int nFieldId);
TABFeature *GetFeature(int nFeatureId);
int SetFeature(TABFeature *poFeature, int nFeatureId=-1);
int SetFeatureDefn(OGRFeatureDefn *poFeatureDefn,
TABFieldType *paeMapInfoNativeFieldTypes=NULL);
int AddFieldNative(const char *pszName, TABFieldType eMapInfoType,
int nWidth=0, int nPrecision=0,
GBool bIndexed=FALSE, GBool bUnique=FALSE);
int SetFieldIndexed(int nFieldId);
GBool IsFieldIndexed(int nFieldId);
GBool IsFieldUnique(int nFieldId);
const char *GetMainFieldName() {return m_pszMainFieldName;};
const char *GetRelFieldName() {return m_pszRelFieldName;};
};
/*---------------------------------------------------------------------
* class MIDDATAFile
*
* Class to handle a file pointer with a copy of the latest readed line
*
*--------------------------------------------------------------------*/
class MIDDATAFile
{
public:
MIDDATAFile();
~MIDDATAFile();
int Open(const char *pszFname, const char *pszAccess);
int Close();
const char *GetLine();
const char *GetLastLine();
int Rewind();
void SaveLine(const char *pszLine);
const char *GetSavedLine();
void WriteLine(const char*, ...);
GBool IsValidFeature(const char *pszString);
// Translation information
void SetTranslation(double, double, double, double);
double GetXTrans(double);
double GetYTrans(double);
double GetXMultiplier(){return m_dfXMultiplier;}
const char *GetDelimiter(){return m_pszDelimiter;}
void SetDelimiter(const char *pszDelimiter){m_pszDelimiter=pszDelimiter;}
void SetEof(GBool bEof);
GBool GetEof();
private:
FILE *m_fp;
const char *m_pszDelimiter;
// Set limit for the length of a line
#define MIDMAXCHAR 10000
char m_szLastRead[MIDMAXCHAR];
char m_szSavedLine[MIDMAXCHAR];
char *m_pszFname;
TABAccess m_eAccessMode;
double m_dfXMultiplier;
double m_dfYMultiplier;
double m_dfXDisplacement;
double m_dfYDisplacement;
GBool m_bEof;
};
/*=====================================================================
Function prototypes
=====================================================================*/
TABRawBinBlock *TABCreateMAPBlockFromFile(FILE *fpSrc, int nOffset,
int nSize = 512,
GBool bHardBlockSize = TRUE,
TABAccess eAccessMode = TABRead);
#endif /* _MITAB_PRIV_H_INCLUDED_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -