mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
41acc81f4d
Import complex XML from multiple files in MariaDB Some row results are missing and replaced by the last file one. Thats because Nx and Sx column members are not reset when changing file. modified: storage/connect/tabxml.cpp modified: storage/connect/tabxml.h
273 lines
12 KiB
C++
273 lines
12 KiB
C++
/*************** Tabxml H Declares Source Code File (.H) ***************/
|
|
/* Name: TABXML.H Version 1.7 */
|
|
/* */
|
|
/* (C) Copyright to the author Olivier BERTRAND 2007-2016 */
|
|
/* */
|
|
/* This file contains the XML table classes declares. */
|
|
/***********************************************************************/
|
|
typedef class XMLDEF *PXMLDEF;
|
|
typedef class TDBXML *PTDBXML;
|
|
typedef class XMLCOL *PXMLCOL;
|
|
|
|
DllExport PQRYRES XMLColumns(PGLOBAL, char *, char *, PTOS, bool);
|
|
|
|
/* --------------------------- XML classes --------------------------- */
|
|
|
|
/***********************************************************************/
|
|
/* XML table. */
|
|
/***********************************************************************/
|
|
class DllExport XMLDEF : public TABDEF { /* Logical table description */
|
|
friend class TDBXML;
|
|
friend class TDBXCT;
|
|
friend PQRYRES XMLColumns(PGLOBAL, char*, char*, PTOS, bool);
|
|
public:
|
|
// Constructor
|
|
XMLDEF(void);
|
|
|
|
// Implementation
|
|
virtual const char *GetType(void) {return "XML";}
|
|
|
|
// Methods
|
|
virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff);
|
|
virtual PTDB GetTable(PGLOBAL g, MODE m);
|
|
|
|
protected:
|
|
// Members
|
|
PCSZ Fn; /* Path/Name of corresponding file */
|
|
char *Encoding; /* New XML table file encoding */
|
|
char *Tabname; /* Name of Table node */
|
|
char *Rowname; /* Name of first level nodes */
|
|
char *Colname; /* Name of second level nodes */
|
|
char *Mulnode; /* Name of multiple node */
|
|
char *XmlDB; /* Name of XML DB node */
|
|
char *Nslist; /* List of namespaces to register */
|
|
char *DefNs; /* Dummy name of default namespace */
|
|
char *Attrib; /* Table node attributes */
|
|
char *Hdattr; /* Header node attributes */
|
|
PCSZ Entry; /* Zip entry name or pattern */
|
|
int Coltype; /* Default column type */
|
|
int Limit; /* Limit of multiple values */
|
|
int Header; /* n first rows are header rows */
|
|
bool Xpand; /* Put multiple tags in several rows */
|
|
bool Usedom; /* True: DOM, False: libxml2 */
|
|
bool Zipped; /* True: Zipped XML file(s) */
|
|
bool Mulentries; /* True: multiple entries in zip file*/
|
|
bool Skip; /* Skip null columns */
|
|
}; // end of XMLDEF
|
|
|
|
#if defined(INCLUDE_TDBXML)
|
|
#include "m_ctype.h"
|
|
|
|
/***********************************************************************/
|
|
/* This is the class declaration for the simple XML tables. */
|
|
/***********************************************************************/
|
|
class DllExport TDBXML : public TDBASE {
|
|
friend class XMLCOL;
|
|
friend class XMULCOL;
|
|
friend class XPOSCOL;
|
|
friend PQRYRES XMLColumns(PGLOBAL, char*, char*, PTOS, bool);
|
|
public:
|
|
// Constructor
|
|
TDBXML(PXMLDEF tdp);
|
|
TDBXML(PTDBXML tdbp);
|
|
|
|
// Implementation
|
|
virtual AMT GetAmType(void) {return TYPE_AM_XML;}
|
|
virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBXML(this);}
|
|
|
|
// Methods
|
|
virtual PTDB Clone(PTABS t);
|
|
virtual int GetRecpos(void);
|
|
virtual int GetProgCur(void) {return N;}
|
|
virtual PCSZ GetFile(PGLOBAL g) {return Xfile;}
|
|
virtual void SetFile(PGLOBAL g, PCSZ fn) {Xfile = fn;}
|
|
virtual void ResetDB(void) {N = 0;}
|
|
virtual void ResetSize(void) {MaxSize = -1;}
|
|
virtual int RowNumber(PGLOBAL g, bool b = false);
|
|
int LoadTableFile(PGLOBAL g, char *filename);
|
|
bool Initialize(PGLOBAL g);
|
|
bool SetTabNode(PGLOBAL g);
|
|
void SetNodeAttr(PGLOBAL g, char *attr, PXNODE node);
|
|
bool CheckRow(PGLOBAL g, bool b);
|
|
|
|
// Database routines
|
|
virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n);
|
|
virtual PCOL InsertSpecialColumn(PCOL colp);
|
|
//virtual int GetMaxSame(PGLOBAL g) {return (Xpand) ? Limit : 1;}
|
|
virtual int Cardinality(PGLOBAL g);
|
|
virtual int GetMaxSize(PGLOBAL g);
|
|
//virtual bool NeedIndexing(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 CheckWrite(PGLOBAL g) {Checked = true; return 0;}
|
|
virtual const CHARSET_INFO *data_charset();
|
|
|
|
protected:
|
|
// Members
|
|
PXDOC Docp;
|
|
PXNODE Root;
|
|
PXNODE Curp;
|
|
PXNODE DBnode;
|
|
PXNODE TabNode;
|
|
PXNODE RowNode;
|
|
PXNODE ColNode;
|
|
PXLIST Nlist;
|
|
PXLIST Clist;
|
|
PFBLOCK To_Xb; // Pointer to XML file block
|
|
PCOL Colp; // The multiple column
|
|
bool Changed; // After Update, Insert or Delete
|
|
bool Checked; // After Update check pass
|
|
bool NextSame; // Same next row
|
|
bool Xpand; // Put multiple tags in several rows
|
|
bool NewRow; // True when inserting a new row
|
|
bool Hasnod; // True if rows have subnodes
|
|
bool Write; // True for Insert and Update
|
|
bool Usedom; // True for DOM, False for libxml2
|
|
bool Bufdone; // True when column buffers allocated
|
|
bool Nodedone; // True when column nodes allocated
|
|
bool Void; // True if the file does not exist
|
|
bool Zipped; // True if Zipped XML file(s)
|
|
bool Mulentries; // True if multiple entries in zip file
|
|
PCSZ Xfile; // The XML file
|
|
char *Enc; // New XML table file encoding
|
|
char *Tabname; // Name of Table node
|
|
char *Rowname; // Name of first level nodes
|
|
char *Colname; // Name of second level nodes
|
|
char *Mulnode; // Name of multiple node
|
|
char *XmlDB; // Name of XML DB node
|
|
char *Nslist; // List of namespaces to register
|
|
char *DefNs; // Dummy name of default namespace
|
|
char *Attrib; // Table node attribut(s)
|
|
char *Hdattr; // Header node attribut(s)
|
|
PCSZ Entry; // Zip entry name or pattern
|
|
int Coltype; // Default column type
|
|
int Limit; // Limit of multiple values
|
|
int Header; // n first rows are header rows
|
|
int Multiple; // If multiple files
|
|
int Nrow; // The table cardinality
|
|
int Irow; // The current row index
|
|
int Nsub; // The current subrow index
|
|
int N; // The current Rowid
|
|
}; // end of class TDBXML
|
|
|
|
/***********************************************************************/
|
|
/* Class XMLCOL: XDB table access method column descriptor. */
|
|
/***********************************************************************/
|
|
class XMLCOL : public COLBLK {
|
|
friend class TDBXML;
|
|
public:
|
|
// Constructors
|
|
XMLCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am = "XML");
|
|
XMLCOL(XMLCOL *colp, PTDB tdbp); // Constructor used in copy process
|
|
|
|
// Implementation
|
|
virtual int GetAmType(void) {return TYPE_AM_XML;}
|
|
virtual void SetTo_Val(PVAL valp) {To_Val = valp;}
|
|
bool ParseXpath(PGLOBAL g, bool mode);
|
|
|
|
// Methods
|
|
virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check);
|
|
virtual void ReadColumn(PGLOBAL g);
|
|
virtual void WriteColumn(PGLOBAL g);
|
|
bool AllocBuf(PGLOBAL g, bool mode);
|
|
void AllocNodes(PGLOBAL g, PXDOC dp);
|
|
|
|
protected:
|
|
//xmlNodePtr SelectSingleNode(xmlNodePtr node, char *name);
|
|
|
|
// Default constructor not to be used
|
|
XMLCOL(void) : COLBLK(1) {}
|
|
|
|
// Members
|
|
PXLIST Nl;
|
|
PXLIST Nlx;
|
|
PXNODE ColNode;
|
|
PXNODE ValNode;
|
|
PXNODE Cxnp;
|
|
PXNODE Vxnp;
|
|
PXATTR Vxap;
|
|
PXATTR AttNode;
|
|
PTDBXML Tdbp;
|
|
char *Valbuf; // To the node value buffer
|
|
char *Xname; // The node or attribute name
|
|
char* *Nodes; // The intermediate nodes
|
|
int Type; // 0: Attribute, 1: Tag, 2: position
|
|
int Nod; // The number of intermediate nodes
|
|
int Inod; // Index of multiple node
|
|
int Rank; // Position
|
|
bool Mul; // true for multiple column
|
|
bool Checked; // Was checked while Updating
|
|
int Long; // Buffer length
|
|
int Nx; // The last read row
|
|
int Sx; // The last read sub-row
|
|
int N; // The number of (multiple) values
|
|
PVAL To_Val; // To value used for Update/Insert
|
|
}; // end of class XMLCOL
|
|
|
|
/***********************************************************************/
|
|
/* Derived class XMLCOLX: used to replace a multiple XMLCOL by the */
|
|
/* derived class XMULCOL that has specialize read and write functions.*/
|
|
/* Note: this works only if the members of the derived class are the */
|
|
/* same than the ones of the original class (NO added members). */
|
|
/***********************************************************************/
|
|
class XMLCOLX : public XMLCOL {
|
|
public:
|
|
// Fake operator new used to change a filter into a derived filter
|
|
void * operator new(size_t size, PXMLCOL colp) {return colp;}
|
|
#if !defined(__BORLANDC__)
|
|
// Avoid warning C4291 by defining a matching dummy delete operator
|
|
void operator delete(void *, size_t size) {}
|
|
void operator delete(void *, PXMLCOL) {}
|
|
#endif
|
|
}; // end of class XMLCOLX
|
|
|
|
/***********************************************************************/
|
|
/* Class XMULCOL: XML table access method multiple column descriptor. */
|
|
/***********************************************************************/
|
|
class XMULCOL : public XMLCOLX {
|
|
public:
|
|
// The constructor must restore Value because XOBJECT has a void
|
|
// constructor called by default that set Value to NULL
|
|
XMULCOL(PVAL valp) {Value = valp; Mul = true;}
|
|
|
|
// Methods
|
|
virtual void ReadColumn(PGLOBAL g);
|
|
virtual void WriteColumn(PGLOBAL g);
|
|
}; // end of class XMULCOL
|
|
|
|
/***********************************************************************/
|
|
/* Class XPOSCOL: XML table column accessed by position. */
|
|
/***********************************************************************/
|
|
class XPOSCOL : public XMLCOLX {
|
|
public:
|
|
// The constructor must restore Value because XOBJECT has a void
|
|
// constructor called by default that set Value to NULL
|
|
XPOSCOL(PVAL valp) {Value = valp;}
|
|
|
|
// Methods
|
|
virtual void ReadColumn(PGLOBAL g);
|
|
virtual void WriteColumn(PGLOBAL g);
|
|
}; // end of class XPOSCOL
|
|
|
|
/***********************************************************************/
|
|
/* This is the class declaration for the XML catalog table. */
|
|
/***********************************************************************/
|
|
class TDBXCT : public TDBCAT {
|
|
public:
|
|
// Constructor
|
|
TDBXCT(PXMLDEF tdp);
|
|
|
|
protected:
|
|
// Specific routines
|
|
virtual PQRYRES GetResult(PGLOBAL g);
|
|
|
|
// Members
|
|
PTOS Topt;
|
|
char *Db;
|
|
char *Tabn;
|
|
}; // end of class TDBXCT
|
|
|
|
#endif // INCLUDE_TDBXML
|