mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
3e36eb230b
modified: storage/connect/array.cpp modified: storage/connect/array.h modified: storage/connect/blkfil.cpp modified: storage/connect/blkfil.h modified: storage/connect/block.h modified: storage/connect/colblk.cpp modified: storage/connect/colblk.h modified: storage/connect/csort.h modified: storage/connect/filamvct.cpp modified: storage/connect/filter.cpp modified: storage/connect/filter.h modified: storage/connect/global.h modified: storage/connect/json.h modified: storage/connect/plgdbsem.h modified: storage/connect/plgdbutl.cpp modified: storage/connect/tabcol.cpp modified: storage/connect/tabcol.h modified: storage/connect/tabdos.cpp modified: storage/connect/tabdos.h modified: storage/connect/tabjson.cpp modified: storage/connect/table.cpp modified: storage/connect/tabodbc.cpp modified: storage/connect/tabodbc.h modified: storage/connect/tabsys.h modified: storage/connect/tabxml.h modified: storage/connect/value.cpp modified: storage/connect/value.h modified: storage/connect/xindex.cpp modified: storage/connect/xindex.h modified: storage/connect/xobject.cpp modified: storage/connect/xobject.h modified: storage/connect/xtable.h Set values as nullable when retrieving catalog info modified: storage/connect/jdbconn.cpp modified: storage/connect/mysql-test/connect/r/odbc_oracle.result modified: storage/connect/odbconn.cpp Change format of Jpath modified: storage/connect/json.cpp modified: storage/connect/jsonudf.cpp modified: storage/connect/mysql-test/connect/r/json.result modified: storage/connect/mysql-test/connect/r/json_udf.result modified: storage/connect/mysql-test/connect/r/json_udf_bin.result modified: storage/connect/mysql-test/connect/r/zip.result modified: storage/connect/mysql-test/connect/t/json.test modified: storage/connect/mysql-test/connect/t/json_udf.test modified: storage/connect/mysql-test/connect/t/json_udf_bin.test modified: storage/connect/mysql-test/connect/t/zip.test modified: storage/connect/tabjson.cpp modified: storage/connect/tabjson.h modified: storage/connect/tabmgo.cpp Change null representation from ??? to <null> modified: storage/connect/json.cpp Change the name of UDF that are equal to a native JSON function name modified: storage/connect/jsonudf.cpp modified: storage/connect/jsonudf.h modified: storage/connect/mysql-test/connect/t/json_udf.inc modified: storage/connect/mysql-test/connect/t/json_udf2.inc Fix bug in making JSON project info modified: storage/connect/mongofam.cpp Fix COMPUTE when one argument is null modified: storage/connect/value.cpp Value is null only when nullable modified: storage/connect/value.h
185 lines
5.2 KiB
C++
185 lines
5.2 KiB
C++
/******************************************************************/
|
|
/* Implementation of XML document processing using PdbXML. */
|
|
/* Author: Olivier Bertrand 2007-2017 */
|
|
/******************************************************************/
|
|
#include "my_global.h"
|
|
#include "global.h"
|
|
#include "plgdbsem.h"
|
|
#include "block.h"
|
|
#include "plgxml.h"
|
|
|
|
#if !defined(DOMDOC_SUPPORT)
|
|
PXDOC GetDomDoc(PGLOBAL g, char *nsl, char *nsdf,
|
|
char *enc, PFBLOCK fp)
|
|
{
|
|
strcpy(g->Message, MSG(DOM_NOT_SUPP));
|
|
return NULL;
|
|
} // end of GetDomDoc
|
|
#endif // !DOMDOC_SUPPORT
|
|
|
|
#ifndef LIBXML2_SUPPORT
|
|
PXDOC GetLibxmlDoc(PGLOBAL g, char *nsl, char *nsdf,
|
|
char *enc, PFBLOCK fp)
|
|
{
|
|
strcpy(g->Message, "libxml2 not supported");
|
|
return NULL;
|
|
} // end of GetLibxmlDoc
|
|
#endif // LIBXML2_SUPPORT
|
|
|
|
/******************************************************************/
|
|
/* XMLDOCUMENT constructor. */
|
|
/******************************************************************/
|
|
XMLDOCUMENT::XMLDOCUMENT(char *nsl, char *nsdf, char *enc)
|
|
{
|
|
#if defined(ZIP_SUPPORT)
|
|
zip = NULL;
|
|
#else // !ZIP_SUPPORT
|
|
zip = false;
|
|
#endif // !ZIP_SUPPORT
|
|
Namespaces = NULL;
|
|
Encoding = enc;
|
|
Nslist = nsl;
|
|
DefNs = nsdf;
|
|
} // end of XMLDOCUMENT constructor
|
|
|
|
/******************************************************************/
|
|
/* Initialize zipped file processing. */
|
|
/******************************************************************/
|
|
bool XMLDOCUMENT::InitZip(PGLOBAL g, PCSZ entry)
|
|
{
|
|
#if defined(ZIP_SUPPORT)
|
|
bool mul = (entry) ? strchr(entry, '*') || strchr(entry, '?') : false;
|
|
zip = new(g) UNZIPUTL(entry, mul);
|
|
return zip == NULL;
|
|
#else // !ZIP_SUPPORT
|
|
sprintf(g->Message, MSG(NO_FEAT_SUPPORT), "ZIP");
|
|
return true;
|
|
#endif // !ZIP_SUPPORT
|
|
} // end of InitZip
|
|
|
|
/******************************************************************/
|
|
/* Make the namespace structure list. */
|
|
/******************************************************************/
|
|
char* XMLDOCUMENT::GetMemDoc(PGLOBAL g, char *fn)
|
|
{
|
|
#if defined(ZIP_SUPPORT)
|
|
return (zip->OpenTable(g, MODE_ANY, fn)) ? NULL : zip->memory;
|
|
#else // !ZIP_SUPPORT
|
|
return NULL;
|
|
#endif // !ZIP_SUPPORT
|
|
} // end of GetMemDoc
|
|
|
|
/******************************************************************/
|
|
/* Make the namespace structure list. */
|
|
/******************************************************************/
|
|
bool XMLDOCUMENT::MakeNSlist(PGLOBAL g)
|
|
{
|
|
char *prefix, *href, *next = Nslist;
|
|
PNS nsp, *ppns = &Namespaces;
|
|
|
|
while (next) {
|
|
// Skip spaces
|
|
while ((*next) == ' ')
|
|
next++;
|
|
|
|
if ((*next) == '\0')
|
|
break;
|
|
|
|
// Find prefix
|
|
prefix = next;
|
|
next = strchr(next, '=');
|
|
|
|
if (next == NULL) {
|
|
strcpy(g->Message, MSG(BAS_NS_LIST));
|
|
return true;
|
|
} // endif next
|
|
|
|
*(next++) = '\0';
|
|
|
|
// Find href
|
|
href = next;
|
|
next = strchr(next, ' ');
|
|
|
|
if (next != NULL)
|
|
*(next++) = '\0';
|
|
|
|
// Allocate and link NS structure
|
|
nsp = (PNS)PlugSubAlloc(g, NULL, sizeof(NS));
|
|
nsp->Next = NULL;
|
|
nsp->Prefix = prefix;
|
|
nsp->Uri = href;
|
|
*ppns = nsp;
|
|
ppns = &nsp->Next;
|
|
} // endwhile next
|
|
|
|
return false;
|
|
} // end of MakeNSlist
|
|
|
|
/******************************************************************/
|
|
/* Close ZIP file. */
|
|
/******************************************************************/
|
|
void XMLDOCUMENT::CloseZip(void)
|
|
{
|
|
#if defined(ZIP_SUPPORT)
|
|
if (zip) {
|
|
zip->close();
|
|
zip = NULL;
|
|
} // endif zip
|
|
#endif // ZIP_SUPPORT
|
|
} // end of CloseZip
|
|
|
|
/******************************************************************/
|
|
/* XMLNODE constructor. */
|
|
/******************************************************************/
|
|
XMLNODE::XMLNODE(PXDOC dp)
|
|
{
|
|
Doc = dp;
|
|
Next = NULL;
|
|
Children = NULL;
|
|
Buf = NULL;
|
|
Len = -1;
|
|
} // end of XMLNODE constructor
|
|
|
|
/******************************************************************/
|
|
/* Attach new node at the end of this node children list. */
|
|
/******************************************************************/
|
|
PXNODE XMLNODE::NewChild(PXNODE ncp)
|
|
{
|
|
PXNODE np, *pnp = &Children;
|
|
|
|
for (np = *pnp; np; np = np->Next)
|
|
pnp = &np->Next;
|
|
|
|
*pnp = np;
|
|
return ncp;
|
|
} // end of NewChild
|
|
|
|
/******************************************************************/
|
|
/* Delete a node from this node children list. */
|
|
/******************************************************************/
|
|
void XMLNODE::Delete(PXNODE dnp)
|
|
{
|
|
PXNODE *pnp = &Children;
|
|
|
|
for (PXNODE np = *pnp; np; np = np->Next)
|
|
if (np == dnp) {
|
|
*pnp = dnp->Next;
|
|
break;
|
|
} else
|
|
pnp = &np->Next;
|
|
|
|
} // end of Delete
|
|
|
|
/******************************************************************/
|
|
/* Store a string in Buf, enventually reallocating it. */
|
|
/******************************************************************/
|
|
char *XMLNODE::BufAlloc(PGLOBAL g, const char *p, int n)
|
|
{
|
|
if (Len < n) {
|
|
Len = n;
|
|
Buf = (char*)PlugSubAlloc(g, NULL, n + 1);
|
|
} // endif Len
|
|
|
|
*Buf = '\0';
|
|
return strncat(Buf, p, n);
|
|
} // end of BufAlloc
|