mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Fix gcc compiler warnings reported by Sergei
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
This commit is contained in:
@@ -18,10 +18,10 @@ SET(CONNECT_PLUGIN_DYNAMIC "connect")
|
||||
|
||||
SET(CONNECT_SOURCES
|
||||
ha_connect.cc connect.cc user_connect.cc mycat.cc
|
||||
fmdlex.c osutil.c plugutil.c rcmsg.c rcmsg.h
|
||||
fmdlex.c osutil.c rcmsg.c rcmsg.h
|
||||
array.cpp blkfil.cpp colblk.cpp csort.cpp
|
||||
filamap.cpp filamdbf.cpp filamfix.cpp filamgz.cpp filamtxt.cpp
|
||||
filter.cpp json.cpp jsonudf.cpp maputil.cpp myconn.cpp myutil.cpp plgdbutl.cpp
|
||||
filamap.cpp filamdbf.cpp filamfix.cpp filamgz.cpp filamtxt.cpp filter.cpp
|
||||
json.cpp jsonudf.cpp maputil.cpp myconn.cpp myutil.cpp plgdbutl.cpp plugutil.cpp
|
||||
reldef.cpp tabcol.cpp tabdos.cpp tabext.cpp tabfix.cpp tabfmt.cpp tabjson.cpp
|
||||
table.cpp tabmul.cpp tabmysql.cpp taboccur.cpp tabpivot.cpp tabsys.cpp tabtbl.cpp
|
||||
tabutil.cpp tabvir.cpp tabxcl.cpp valblk.cpp value.cpp xindex.cpp xobject.cpp
|
||||
@@ -291,6 +291,31 @@ IF(CONNECT_WITH_ZIP)
|
||||
add_definitions(-DZIP_SUPPORT -DNOCRYPT)
|
||||
ENDIF(CONNECT_WITH_ZIP)
|
||||
|
||||
#
|
||||
# MONGO (CMAKE NOT YET WORKING)
|
||||
#
|
||||
|
||||
#OPTION(CONNECT_WITH_MONGO "Compile CONNECT storage engine with MONGO support" ON)
|
||||
|
||||
#IF(CONNECT_WITH_MONGO)
|
||||
# IF(WIN32)
|
||||
# # Adding some typical places to search in
|
||||
# SET(PC_MONGO_INCLUDE_DIRS
|
||||
# C:/mongo-c-driver/include
|
||||
# D:/mongo-c-driver/include)
|
||||
# SET(PC_MONGO_LIBRARY_DIRS
|
||||
# C:/mongo-c-driver/lib
|
||||
# D:/mongo-c-driver/lib)
|
||||
# ENDIF(WIN32)
|
||||
# FIND_PACKAGE(libmongoc)
|
||||
# IF (MONGO_FOUND)
|
||||
# INCLUDE_DIRECTORIES(${MONGO_INCLUDE_DIR})
|
||||
# SET(MONGO_LIBRARY ${MONGO_LIBRARIES})
|
||||
# SET(CONNECT_SOURCES ${CONNECT_SOURCES} mongofam.cpp mongofam.h)
|
||||
# add_definitions(-DMONGO_SUPPORT)
|
||||
# ENDIF(MONGO_FOUND)
|
||||
#ENDIF(CONNECT_WITH_MONGO)
|
||||
|
||||
|
||||
#
|
||||
# XMAP
|
||||
@@ -310,6 +335,7 @@ MYSQL_ADD_PLUGIN(connect ${CONNECT_SOURCES}
|
||||
STORAGE_ENGINE
|
||||
COMPONENT connect-engine
|
||||
RECOMPILE_FOR_EMBEDDED
|
||||
# LINK_LIBRARIES ${ZLIB_LIBRARY} ${XML_LIBRARY} ${ICONV_LIBRARY} $(MONGO_LIBRARY)
|
||||
LINK_LIBRARIES ${ZLIB_LIBRARY} ${XML_LIBRARY} ${ICONV_LIBRARY}
|
||||
${ODBC_LIBRARY} ${JDBC_LIBRARY} ${IPHLPAPI_LIBRARY})
|
||||
|
||||
|
@@ -518,8 +518,8 @@ bool ARRAY::FilTest(PGLOBAL g, PVAL valp, OPVAL opc, int opm)
|
||||
vp = valp;
|
||||
|
||||
} else if (opc != OP_EXIST) {
|
||||
sprintf(g->Message, MSG(MISSING_ARG), opc);
|
||||
longjmp(g->jumper[g->jump_level], TYPE_ARRAY);
|
||||
sprintf(g->Message, MSG(MISSING_ARG), opc);
|
||||
throw TYPE_ARRAY;
|
||||
} else // OP_EXIST
|
||||
return Nval > 0;
|
||||
|
||||
@@ -681,15 +681,15 @@ void ARRAY::SetPrecision(PGLOBAL g, int p)
|
||||
{
|
||||
if (Vblp == NULL) {
|
||||
strcpy(g->Message, MSG(PREC_VBLP_NULL));
|
||||
longjmp(g->jumper[g->jump_level], TYPE_ARRAY);
|
||||
throw TYPE_ARRAY;
|
||||
} // endif Vblp
|
||||
|
||||
bool was = Vblp->IsCi();
|
||||
|
||||
if (was && !p) {
|
||||
strcpy(g->Message, MSG(BAD_SET_CASE));
|
||||
longjmp(g->jumper[g->jump_level], TYPE_ARRAY);
|
||||
} // endif Vblp
|
||||
throw TYPE_ARRAY;
|
||||
} // endif Vblp
|
||||
|
||||
if (was || !p)
|
||||
return;
|
||||
@@ -699,7 +699,7 @@ void ARRAY::SetPrecision(PGLOBAL g, int p)
|
||||
if (!was && Type == TYPE_STRING)
|
||||
// Must be resorted to eliminate duplicate strings
|
||||
if (Sort(g))
|
||||
longjmp(g->jumper[g->jump_level], TYPE_ARRAY);
|
||||
throw TYPE_ARRAY;
|
||||
|
||||
} // end of SetPrecision
|
||||
|
||||
@@ -973,18 +973,18 @@ int ARRAY::BlockTest(PGLOBAL, int opc, int opm,
|
||||
PSZ ARRAY::MakeArrayList(PGLOBAL g)
|
||||
{
|
||||
char *p, *tp;
|
||||
int i;
|
||||
int i;
|
||||
size_t z, len = 2;
|
||||
|
||||
if (Type == TYPE_LIST)
|
||||
return "(?" "?" "?)"; // To be implemented
|
||||
return (PSZ)("(?" "?" "?)"); // To be implemented
|
||||
|
||||
z = MY_MAX(24, GetTypeSize(Type, Len) + 4);
|
||||
tp = (char*)PlugSubAlloc(g, NULL, z);
|
||||
|
||||
for (i = 0; i < Nval; i++) {
|
||||
Value->SetValue_pvblk(Vblp, i);
|
||||
Value->Print(g, tp, z);
|
||||
Value->Prints(g, tp, z);
|
||||
len += strlen(tp);
|
||||
} // enfor i
|
||||
|
||||
@@ -996,7 +996,7 @@ PSZ ARRAY::MakeArrayList(PGLOBAL g)
|
||||
|
||||
for (i = 0; i < Nval;) {
|
||||
Value->SetValue_pvblk(Vblp, i);
|
||||
Value->Print(g, tp, z);
|
||||
Value->Prints(g, tp, z);
|
||||
strcat(p, tp);
|
||||
strcat(p, (++i == Nval) ? ")" : ",");
|
||||
} // enfor i
|
||||
@@ -1010,7 +1010,7 @@ PSZ ARRAY::MakeArrayList(PGLOBAL g)
|
||||
/***********************************************************************/
|
||||
/* Make file output of ARRAY contents. */
|
||||
/***********************************************************************/
|
||||
void ARRAY::Print(PGLOBAL g, FILE *f, uint n)
|
||||
void ARRAY::Printf(PGLOBAL g, FILE *f, uint n)
|
||||
{
|
||||
char m[64];
|
||||
int lim = MY_MIN(Nval,10);
|
||||
@@ -1027,25 +1027,25 @@ void ARRAY::Print(PGLOBAL g, FILE *f, uint n)
|
||||
if (Vblp)
|
||||
for (int i = 0; i < lim; i++) {
|
||||
Value->SetValue_pvblk(Vblp, i);
|
||||
Value->Print(g, f, n+4);
|
||||
Value->Printf(g, f, n+4);
|
||||
} // endfor i
|
||||
|
||||
} else
|
||||
fprintf(f, "%sVALLST: numval=%d\n", m, Nval);
|
||||
|
||||
} // end of Print
|
||||
} // end of Printf
|
||||
|
||||
/***********************************************************************/
|
||||
/* Make string output of ARRAY contents. */
|
||||
/***********************************************************************/
|
||||
void ARRAY::Print(PGLOBAL, char *ps, uint z)
|
||||
void ARRAY::Prints(PGLOBAL, char *ps, uint z)
|
||||
{
|
||||
if (z < 16)
|
||||
return;
|
||||
|
||||
sprintf(ps, "ARRAY: type=%d\n", Type);
|
||||
// More to be implemented later
|
||||
} // end of Print
|
||||
} // end of Prints
|
||||
|
||||
/* -------------------------- Class MULAR ---------------------------- */
|
||||
|
||||
|
@@ -56,8 +56,8 @@ class DllExport ARRAY : public XOBJECT, public CSORT { // Array descblock
|
||||
virtual bool Compare(PXOB) {assert(false); return false;}
|
||||
virtual bool SetFormat(PGLOBAL, FORMAT&) {assert(false); return false;}
|
||||
//virtual int CheckSpcCol(PTDB, int) {return 0;}
|
||||
virtual void Print(PGLOBAL g, FILE *f, uint n);
|
||||
virtual void Print(PGLOBAL g, char *ps, uint z);
|
||||
virtual void Printf(PGLOBAL g, FILE *f, uint n);
|
||||
virtual void Prints(PGLOBAL g, char *ps, uint z);
|
||||
// void Empty(void);
|
||||
void SetPrecision(PGLOBAL g, int p);
|
||||
bool AddValue(PGLOBAL g, PSZ sp);
|
||||
|
@@ -1,11 +1,11 @@
|
||||
/************* BlkFil C++ Program Source Code File (.CPP) **************/
|
||||
/* PROGRAM NAME: BLKFIL */
|
||||
/* ------------- */
|
||||
/* Version 2.5 */
|
||||
/* Version 2.6 */
|
||||
/* */
|
||||
/* COPYRIGHT: */
|
||||
/* ---------- */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2004-2015 */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2004-2017 */
|
||||
/* */
|
||||
/* WHAT THIS PROGRAM DOES: */
|
||||
/* ----------------------- */
|
||||
@@ -56,7 +56,7 @@ BLOCKFILTER::BLOCKFILTER(PTDBDOS tdbp, int op)
|
||||
/***********************************************************************/
|
||||
/* Make file output of BLOCKFILTER contents. */
|
||||
/***********************************************************************/
|
||||
void BLOCKFILTER::Print(PGLOBAL, FILE *f, uint n)
|
||||
void BLOCKFILTER::Printf(PGLOBAL, FILE *f, uint n)
|
||||
{
|
||||
char m[64];
|
||||
|
||||
@@ -65,15 +65,15 @@ void BLOCKFILTER::Print(PGLOBAL, FILE *f, uint n)
|
||||
|
||||
fprintf(f, "%sBLOCKFILTER: at %p opc=%d opm=%d result=%d\n",
|
||||
m, this, Opc, Opm, Result);
|
||||
} // end of Print
|
||||
} // end of Printf
|
||||
|
||||
/***********************************************************************/
|
||||
/* Make string output of BLOCKFILTER contents. */
|
||||
/***********************************************************************/
|
||||
void BLOCKFILTER::Print(PGLOBAL, char *ps, uint z)
|
||||
void BLOCKFILTER::Prints(PGLOBAL, char *ps, uint z)
|
||||
{
|
||||
strncat(ps, "BlockFilter(s)", z);
|
||||
} // end of Print
|
||||
} // end of Prints
|
||||
|
||||
|
||||
/* ---------------------- Class BLKFILLOG ---------------------------- */
|
||||
@@ -412,7 +412,7 @@ void BLKFILMR2::MakeValueBitmap(void)
|
||||
Void = !Bmp[N]; // There are no good values in the file
|
||||
|
||||
for (i = 0; i < N; i++) {
|
||||
Bxp[i] = ~0U;
|
||||
Bxp[i] = ~0;
|
||||
|
||||
if (noteq)
|
||||
Bmp[i] = Bxp[i];
|
||||
@@ -595,8 +595,8 @@ BLKFILIN::BLKFILIN(PGLOBAL g, PTDBDOS tdbp, int op, int opm, PXOB *xp)
|
||||
|
||||
if (Colp->GetResultType() != Type) {
|
||||
sprintf(g->Message, "BLKFILIN: %s", MSG(VALTYPE_NOMATCH));
|
||||
longjmp(g->jumper[g->jump_level], 99);
|
||||
} else if (Colp->GetValue()->IsCi())
|
||||
throw g->Message;
|
||||
} else if (Colp->GetValue()->IsCi())
|
||||
Arap->SetPrecision(g, 1); // Case insensitive
|
||||
|
||||
Sorted = Colp->IsSorted() > 0;
|
||||
@@ -708,7 +708,7 @@ void BLKFILIN2::MakeValueBitmap(void)
|
||||
Void = !Bmp[N]; // There are no good values in the file
|
||||
|
||||
for (i = 0; i < N; i++) {
|
||||
Bxp[i] = ~0U;
|
||||
Bxp[i] = ~0;
|
||||
|
||||
if (noteq) {
|
||||
Bmp[i] = Bxp[i];
|
||||
@@ -828,7 +828,7 @@ BLKFILIN2::BLKFILIN2(PGLOBAL g, PTDBDOS tdbp, int op, int opm, PXOB *xp)
|
||||
Bxp[i] |= btp;
|
||||
|
||||
for (N = i--; i >= 0; i--)
|
||||
Bxp[i] = ~0U;
|
||||
Bxp[i] = ~0;
|
||||
|
||||
break;
|
||||
} // endif Bmp
|
||||
@@ -995,7 +995,7 @@ int BLOCKINDEX::BlockEval(PGLOBAL g)
|
||||
/***********************************************************************/
|
||||
/* Make file output of BLOCKINDEX contents. */
|
||||
/***********************************************************************/
|
||||
void BLOCKINDEX::Print(PGLOBAL g, FILE *f, UINT n)
|
||||
void BLOCKINDEX::Printf(PGLOBAL g, FILE *f, UINT n)
|
||||
{
|
||||
char m[64];
|
||||
|
||||
@@ -1006,17 +1006,17 @@ void BLOCKINDEX::Print(PGLOBAL g, FILE *f, UINT n)
|
||||
m, this, Next, (Colp) ? Colp->GetName() : "Rowid", Kxp, Result);
|
||||
|
||||
if (Next)
|
||||
Next->Print(g, f, n);
|
||||
Next->Printf(g, f, n);
|
||||
|
||||
} // end of Print
|
||||
} // end of Printf
|
||||
|
||||
/***********************************************************************/
|
||||
/* Make string output of BLOCKINDEX contents. */
|
||||
/***********************************************************************/
|
||||
void BLOCKINDEX::Print(PGLOBAL g, char *ps, UINT z)
|
||||
void BLOCKINDEX::Prints(PGLOBAL g, char *ps, UINT z)
|
||||
{
|
||||
strncat(ps, "BlockIndex(es)", z);
|
||||
} // end of Print
|
||||
} // end of Prints
|
||||
|
||||
/* ------------------------------------------------------------------- */
|
||||
|
||||
|
@@ -27,8 +27,8 @@ class DllExport BLOCKFILTER : public BLOCK { /* Block Filter */
|
||||
// Methods
|
||||
virtual void Reset(PGLOBAL) = 0;
|
||||
virtual int BlockEval(PGLOBAL) = 0;
|
||||
virtual void Print(PGLOBAL g, FILE *f, uint n);
|
||||
virtual void Print(PGLOBAL g, char *ps, uint z);
|
||||
virtual void Printf(PGLOBAL g, FILE *f, uint n);
|
||||
virtual void Prints(PGLOBAL g, char *ps, uint z);
|
||||
|
||||
protected:
|
||||
BLOCKFILTER(void) {} // Standard constructor not to be used
|
||||
@@ -234,8 +234,8 @@ class DllExport BLOCKINDEX : public BLOCK { /* Indexing Test Block */
|
||||
// Methods
|
||||
void Reset(void);
|
||||
virtual int BlockEval(PGLOBAL);
|
||||
virtual void Print(PGLOBAL g, FILE *f, UINT n);
|
||||
virtual void Print(PGLOBAL g, char *ps, UINT z);
|
||||
virtual void Printf(PGLOBAL g, FILE *f, UINT n);
|
||||
virtual void Prints(PGLOBAL g, char *ps, UINT z);
|
||||
|
||||
protected:
|
||||
BLOCKINDEX(void) {} // Standard constructor not to be used
|
||||
|
@@ -44,8 +44,8 @@ class DllExport BLOCK {
|
||||
return (PlugSubAlloc(g, p, size));
|
||||
} // end of new
|
||||
|
||||
virtual void Print(PGLOBAL, FILE *, uint) {} // Produce file desc
|
||||
virtual void Print(PGLOBAL, char *, uint) {} // Produce string desc
|
||||
virtual void Printf(PGLOBAL, FILE *, uint) {} // Produce file desc
|
||||
virtual void Prints(PGLOBAL, char *, uint) {} // Produce string desc
|
||||
|
||||
#if !defined(__BORLANDC__)
|
||||
// Avoid warning C4291 by defining a matching dummy delete operator
|
||||
|
@@ -36,7 +36,7 @@ typedef struct _curtab {
|
||||
/* Defines the structure used to get column catalog info. */
|
||||
/***********************************************************************/
|
||||
typedef struct _colinfo {
|
||||
char *Name;
|
||||
PCSZ Name;
|
||||
int Type;
|
||||
int Offset;
|
||||
int Length;
|
||||
@@ -45,9 +45,9 @@ typedef struct _colinfo {
|
||||
int Scale;
|
||||
int Opt;
|
||||
int Freq;
|
||||
char *Remark;
|
||||
char *Datefmt;
|
||||
char *Fieldfmt;
|
||||
PCSZ Remark;
|
||||
PCSZ Datefmt;
|
||||
PCSZ Fieldfmt;
|
||||
ushort Flags; // Used by MariaDB CONNECT handlers
|
||||
} COLINFO, *PCOLINFO;
|
||||
|
||||
@@ -68,11 +68,9 @@ class DllExport CATALOG {
|
||||
bool GetDefHuge(void) {return DefHuge;}
|
||||
void SetDefHuge(bool b) {DefHuge = b;}
|
||||
char *GetCbuf(void) {return Cbuf;}
|
||||
//char *GetDataPath(void) {return (char*)DataPath;}
|
||||
|
||||
// Methods
|
||||
virtual void Reset(void) {}
|
||||
//virtual void SetDataPath(PGLOBAL g, const char *path) {}
|
||||
virtual bool CheckName(PGLOBAL, char*) {return true;}
|
||||
virtual bool ClearName(PGLOBAL, PSZ) {return true;}
|
||||
virtual PRELDEF MakeOneTableDesc(PGLOBAL, LPCSTR, LPCSTR) {return NULL;}
|
||||
@@ -102,7 +100,6 @@ class DllExport CATALOG {
|
||||
int Cblen; /* Length of suballoc. buffer */
|
||||
CURTAB Ctb; /* Used to enumerate tables */
|
||||
bool DefHuge; /* true: tables default to huge */
|
||||
//LPCSTR DataPath; /* Is the Path of DB data dir */
|
||||
}; // end of class CATALOG
|
||||
|
||||
#endif // __CATALOG__H
|
||||
|
@@ -195,10 +195,10 @@ int COLBLK::GetLengthEx(void)
|
||||
/* corresponding to this column and convert it to buffer type. */
|
||||
/***********************************************************************/
|
||||
void COLBLK::ReadColumn(PGLOBAL g)
|
||||
{
|
||||
{
|
||||
sprintf(g->Message, MSG(UNDEFINED_AM), "ReadColumn");
|
||||
longjmp(g->jumper[g->jump_level], TYPE_COLBLK);
|
||||
} // end of ReadColumn
|
||||
throw TYPE_COLBLK;
|
||||
} // end of ReadColumn
|
||||
|
||||
/***********************************************************************/
|
||||
/* WriteColumn: what this routine does is to access the last line */
|
||||
@@ -206,15 +206,15 @@ void COLBLK::ReadColumn(PGLOBAL g)
|
||||
/* corresponding to this column from the column buffer and type. */
|
||||
/***********************************************************************/
|
||||
void COLBLK::WriteColumn(PGLOBAL g)
|
||||
{
|
||||
{
|
||||
sprintf(g->Message, MSG(UNDEFINED_AM), "WriteColumn");
|
||||
longjmp(g->jumper[g->jump_level], TYPE_COLBLK);
|
||||
} // end of WriteColumn
|
||||
throw TYPE_COLBLK;
|
||||
} // end of WriteColumn
|
||||
|
||||
/***********************************************************************/
|
||||
/* Make file output of a column descriptor block. */
|
||||
/***********************************************************************/
|
||||
void COLBLK::Print(PGLOBAL, FILE *f, uint n)
|
||||
void COLBLK::Printf(PGLOBAL, FILE *f, uint n)
|
||||
{
|
||||
char m[64];
|
||||
int i;
|
||||
@@ -232,15 +232,15 @@ void COLBLK::Print(PGLOBAL, FILE *f, uint n)
|
||||
fprintf(f,
|
||||
" coluse=%04X status=%04X buftyp=%d value=%p name=%s\n",
|
||||
ColUse, Status, Buf_Type, Value, Name);
|
||||
} // end of Print
|
||||
} // end of Printf
|
||||
|
||||
/***********************************************************************/
|
||||
/* Make string output of a column descriptor block. */
|
||||
/***********************************************************************/
|
||||
void COLBLK::Print(PGLOBAL, char *ps, uint)
|
||||
void COLBLK::Prints(PGLOBAL, char *ps, uint)
|
||||
{
|
||||
sprintf(ps, "R%d.%s", To_Tdb->GetTdb_No(), Name);
|
||||
} // end of Print
|
||||
} // end of Prints
|
||||
|
||||
|
||||
/***********************************************************************/
|
||||
@@ -260,10 +260,10 @@ SPCBLK::SPCBLK(PCOLUMN cp)
|
||||
/* corresponding to this column from the column buffer and type. */
|
||||
/***********************************************************************/
|
||||
void SPCBLK::WriteColumn(PGLOBAL g)
|
||||
{
|
||||
{
|
||||
sprintf(g->Message, MSG(SPCOL_READONLY), Name);
|
||||
longjmp(g->jumper[g->jump_level], TYPE_COLBLK);
|
||||
} // end of WriteColumn
|
||||
throw TYPE_COLBLK;
|
||||
} // end of WriteColumn
|
||||
|
||||
/***********************************************************************/
|
||||
/* RIDBLK constructor for the ROWID special column. */
|
||||
@@ -377,7 +377,7 @@ PRTBLK::PRTBLK(PCOLUMN cp) : SPCBLK(cp)
|
||||
void PRTBLK::ReadColumn(PGLOBAL g)
|
||||
{
|
||||
if (Pname == NULL) {
|
||||
char *p;
|
||||
const char *p;
|
||||
|
||||
Pname = To_Tdb->GetDef()->GetStringCatInfo(g, "partname", "?");
|
||||
p = strrchr(Pname, '#');
|
||||
@@ -407,7 +407,7 @@ SIDBLK::SIDBLK(PCOLUMN cp) : SPCBLK(cp)
|
||||
void SIDBLK::ReadColumn(PGLOBAL)
|
||||
{
|
||||
//if (Sname == NULL) {
|
||||
Sname = (char*)To_Tdb->GetServer();
|
||||
Sname = To_Tdb->GetServer();
|
||||
Value->SetValue_psz(Sname);
|
||||
// } // endif Sname
|
||||
|
||||
|
@@ -72,8 +72,8 @@ class DllExport COLBLK : public XOBJECT {
|
||||
virtual void SetTo_Val(PVAL) {}
|
||||
virtual void ReadColumn(PGLOBAL g);
|
||||
virtual void WriteColumn(PGLOBAL g);
|
||||
virtual void Print(PGLOBAL g, FILE *, uint);
|
||||
virtual void Print(PGLOBAL g, char *, uint);
|
||||
virtual void Printf(PGLOBAL g, FILE *, uint);
|
||||
virtual void Prints(PGLOBAL g, char *, uint);
|
||||
virtual bool VarSize(void) {return false;}
|
||||
bool InitValue(PGLOBAL g);
|
||||
|
||||
@@ -154,7 +154,7 @@ class DllExport FIDBLK : public SPCBLK {
|
||||
virtual void ReadColumn(PGLOBAL g);
|
||||
|
||||
protected:
|
||||
PSZ Fn; // The current To_File of the table
|
||||
PCSZ Fn; // The current To_File of the table
|
||||
OPVAL Op; // The file part operator
|
||||
}; // end of class FIDBLK
|
||||
|
||||
@@ -178,7 +178,7 @@ class DllExport TIDBLK : public SPCBLK {
|
||||
TIDBLK(void) {}
|
||||
|
||||
// Members
|
||||
PSZ Tname; // The current table name
|
||||
PCSZ Tname; // The current table name
|
||||
}; // end of class TIDBLK
|
||||
|
||||
/***********************************************************************/
|
||||
@@ -201,7 +201,7 @@ class DllExport PRTBLK : public SPCBLK {
|
||||
PRTBLK(void) {}
|
||||
|
||||
// Members
|
||||
PSZ Pname; // The current partition name
|
||||
PCSZ Pname; // The current partition name
|
||||
}; // end of class PRTBLK
|
||||
|
||||
/***********************************************************************/
|
||||
@@ -224,7 +224,7 @@ class DllExport SIDBLK : public SPCBLK {
|
||||
SIDBLK(void) {}
|
||||
|
||||
// Members
|
||||
PSZ Sname; // The current server name
|
||||
PCSZ Sname; // The current server name
|
||||
}; // end of class SIDBLK
|
||||
|
||||
#endif // __COLBLK__H
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) Olivier Bertrand 2004 - 2015
|
||||
/* Copyright (C) Olivier Bertrand 2004 - 2017
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -15,10 +15,10 @@
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */
|
||||
|
||||
/***********************************************************************/
|
||||
/* Author Olivier BERTRAND bertrandop@gmail.com 2004-2015 */
|
||||
/* Author Olivier BERTRAND bertrandop@gmail.com 2004-2017 */
|
||||
/* */
|
||||
/* WHAT THIS PROGRAM DOES: */
|
||||
/* ----------------------- */
|
||||
/* WHAT THIS PROGRAM DOES: */
|
||||
/* ----------------------- */
|
||||
/* This program are the CONNECT general purpose semantic routines. */
|
||||
/***********************************************************************/
|
||||
#ifdef USE_PRAGMA_IMPLEMENTATION
|
||||
@@ -117,11 +117,10 @@ bool CntCheckDB(PGLOBAL g, PHC handler, const char *pathname)
|
||||
handler);
|
||||
|
||||
// Set the database path for this table
|
||||
handler->SetDataPath(g, pathname);
|
||||
if (handler->SetDataPath(g, pathname))
|
||||
return true;
|
||||
|
||||
if (dbuserp->Catalog) {
|
||||
// ((MYCAT *)dbuserp->Catalog)->SetHandler(handler); done later
|
||||
// ((MYCAT *)dbuserp->Catalog)->SetDataPath(g, pathname);
|
||||
return false; // Nothing else to do
|
||||
} // endif Catalog
|
||||
|
||||
@@ -138,9 +137,6 @@ bool CntCheckDB(PGLOBAL g, PHC handler, const char *pathname)
|
||||
if (!(dbuserp->Catalog= new MYCAT(handler)))
|
||||
return true;
|
||||
|
||||
//((MYCAT *)dbuserp->Catalog)->SetDataPath(g, pathname);
|
||||
//dbuserp->UseTemp= TMP_AUTO;
|
||||
|
||||
/*********************************************************************/
|
||||
/* All is correct. */
|
||||
/*********************************************************************/
|
||||
@@ -172,7 +168,7 @@ bool CntInfo(PGLOBAL g, PTDB tp, PXF info)
|
||||
|
||||
// info->mean_rec_length= tdbp->GetLrecl();
|
||||
info->mean_rec_length= 0;
|
||||
info->data_file_name= (b) ? NULL : tdbp->GetFile(g);
|
||||
info->data_file_name= (b) ? NULL : (char*)tdbp->GetFile(g);
|
||||
return true;
|
||||
} else {
|
||||
info->data_file_length= 0;
|
||||
@@ -188,49 +184,43 @@ bool CntInfo(PGLOBAL g, PTDB tp, PXF info)
|
||||
/* GetTDB: Get the table description block of a CONNECT table. */
|
||||
/***********************************************************************/
|
||||
PTDB CntGetTDB(PGLOBAL g, LPCSTR name, MODE mode, PHC h)
|
||||
{
|
||||
int rc;
|
||||
PTDB tdbp;
|
||||
PTABLE tabp;
|
||||
PDBUSER dup= PlgGetUser(g);
|
||||
volatile PCATLG cat= (dup) ? dup->Catalog : NULL; // Safe over longjmp
|
||||
{
|
||||
PTDB tdbp;
|
||||
PTABLE tabp;
|
||||
PDBUSER dup = PlgGetUser(g);
|
||||
volatile PCATLG cat = (dup) ? dup->Catalog : NULL; // Safe over longjmp
|
||||
|
||||
if (trace)
|
||||
printf("CntGetTDB: name=%s mode=%d cat=%p\n", name, mode, cat);
|
||||
if (trace)
|
||||
printf("CntGetTDB: name=%s mode=%d cat=%p\n", name, mode, cat);
|
||||
|
||||
if (!cat)
|
||||
return NULL;
|
||||
if (!cat)
|
||||
return NULL;
|
||||
|
||||
// Save stack and allocation environment and prepare error return
|
||||
if (g->jump_level == MAX_JUMP) {
|
||||
strcpy(g->Message, MSG(TOO_MANY_JUMPS));
|
||||
return NULL;
|
||||
} // endif jump_level
|
||||
try {
|
||||
// Get table object from the catalog
|
||||
tabp = new(g) XTAB(name);
|
||||
|
||||
if ((rc= setjmp(g->jumper[++g->jump_level])) != 0) {
|
||||
tdbp= NULL;
|
||||
goto err;
|
||||
} // endif rc
|
||||
if (trace)
|
||||
printf("CntGetTDB: tabp=%p\n", tabp);
|
||||
|
||||
// Get table object from the catalog
|
||||
tabp= new(g) XTAB(name);
|
||||
// Perhaps this should be made thread safe
|
||||
((MYCAT*)cat)->SetHandler(h);
|
||||
|
||||
if (trace)
|
||||
printf("CntGetTDB: tabp=%p\n", tabp);
|
||||
if (!(tdbp = cat->GetTable(g, tabp, mode)))
|
||||
printf("CntGetTDB: %s\n", g->Message);
|
||||
|
||||
// Perhaps this should be made thread safe
|
||||
((MYCAT*)cat)->SetHandler(h);
|
||||
} catch (int n) {
|
||||
if (trace)
|
||||
htrc("Exception %d: %s\n", n, g->Message);
|
||||
} catch (const char *msg) {
|
||||
strcpy(g->Message, msg);
|
||||
} // end catch
|
||||
|
||||
if (!(tdbp= cat->GetTable(g, tabp, mode)))
|
||||
printf("CntGetTDB: %s\n", g->Message);
|
||||
|
||||
err:
|
||||
if (trace)
|
||||
printf("Returning tdbp=%p mode=%d\n", tdbp, mode);
|
||||
|
||||
g->jump_level--;
|
||||
return tdbp;
|
||||
} // end of CntGetTDB
|
||||
} // end of CntGetTDB
|
||||
|
||||
/***********************************************************************/
|
||||
/* OPENTAB: Open a Table. */
|
||||
@@ -239,7 +229,7 @@ bool CntOpenTable(PGLOBAL g, PTDB tdbp, MODE mode, char *c1, char *c2,
|
||||
bool del, PHC)
|
||||
{
|
||||
char *p;
|
||||
int i, n, rc;
|
||||
int i, n;
|
||||
bool rcop= true;
|
||||
PCOL colp;
|
||||
//PCOLUMN cp;
|
||||
@@ -254,120 +244,116 @@ bool CntOpenTable(PGLOBAL g, PTDB tdbp, MODE mode, char *c1, char *c2,
|
||||
return true;
|
||||
} // endif tdbp
|
||||
|
||||
// Save stack and allocation environment and prepare error return
|
||||
if (g->jump_level == MAX_JUMP) {
|
||||
strcpy(g->Message, MSG(TOO_MANY_JUMPS));
|
||||
return true;
|
||||
} // endif jump_level
|
||||
try {
|
||||
if (!c1) {
|
||||
if (mode == MODE_INSERT)
|
||||
// Allocate all column blocks for that table
|
||||
tdbp->ColDB(g, NULL, 0);
|
||||
|
||||
if ((rc= setjmp(g->jumper[++g->jump_level])) != 0) {
|
||||
goto err;
|
||||
} // endif rc
|
||||
} else for (p = c1; *p; p += n) {
|
||||
// Allocate only used column blocks
|
||||
if (trace)
|
||||
printf("Allocating column %s\n", p);
|
||||
|
||||
if (!c1) {
|
||||
if (mode == MODE_INSERT)
|
||||
// Allocate all column blocks for that table
|
||||
tdbp->ColDB(g, NULL, 0);
|
||||
g->Message[0] = 0; // To check whether ColDB made an error message
|
||||
colp = tdbp->ColDB(g, p, 0);
|
||||
|
||||
} else for (p= c1; *p; p+= n) {
|
||||
// Allocate only used column blocks
|
||||
if (trace)
|
||||
printf("Allocating column %s\n", p);
|
||||
if (!colp && !(mode == MODE_INSERT && tdbp->IsSpecial(p))) {
|
||||
if (g->Message[0] == 0)
|
||||
sprintf(g->Message, MSG(COL_ISNOT_TABLE), p, tdbp->GetName());
|
||||
|
||||
g->Message[0] = 0; // To check whether ColDB made an error message
|
||||
colp= tdbp->ColDB(g, p, 0);
|
||||
throw 1;
|
||||
} // endif colp
|
||||
|
||||
if (!colp && !(mode == MODE_INSERT && tdbp->IsSpecial(p))) {
|
||||
if (g->Message[0] == 0)
|
||||
sprintf(g->Message, MSG(COL_ISNOT_TABLE), p, tdbp->GetName());
|
||||
n = strlen(p) + 1;
|
||||
} // endfor p
|
||||
|
||||
goto err;
|
||||
} // endif colp
|
||||
for (i = 0, colp = tdbp->GetColumns(); colp; i++, colp = colp->GetNext()) {
|
||||
if (colp->InitValue(g))
|
||||
throw 2;
|
||||
|
||||
n= strlen(p) + 1;
|
||||
} // endfor p
|
||||
if (mode == MODE_INSERT)
|
||||
// Allow type conversion
|
||||
if (colp->SetBuffer(g, colp->GetValue(), true, false))
|
||||
throw 3;
|
||||
|
||||
for (i= 0, colp= tdbp->GetColumns(); colp; i++, colp= colp->GetNext()) {
|
||||
if (colp->InitValue(g))
|
||||
goto err;
|
||||
colp->AddColUse(U_P); // For PLG tables
|
||||
} // endfor colp
|
||||
|
||||
if (mode == MODE_INSERT)
|
||||
// Allow type conversion
|
||||
if (colp->SetBuffer(g, colp->GetValue(), true, false))
|
||||
goto err;
|
||||
/*******************************************************************/
|
||||
/* In Update mode, the updated column blocks must be distinct from */
|
||||
/* the read column blocks. So make a copy of the TDB and allocate */
|
||||
/* its column blocks in mode write (required by XML tables). */
|
||||
/*******************************************************************/
|
||||
if (mode == MODE_UPDATE) {
|
||||
PTDBASE utp;
|
||||
|
||||
colp->AddColUse(U_P); // For PLG tables
|
||||
} // endfor colp
|
||||
if (!(utp = (PTDBASE)tdbp->Duplicate(g))) {
|
||||
sprintf(g->Message, MSG(INV_UPDT_TABLE), tdbp->GetName());
|
||||
throw 4;
|
||||
} // endif tp
|
||||
|
||||
/*********************************************************************/
|
||||
/* In Update mode, the updated column blocks must be distinct from */
|
||||
/* the read column blocks. So make a copy of the TDB and allocate */
|
||||
/* its column blocks in mode write (required by XML tables). */
|
||||
/*********************************************************************/
|
||||
if (mode == MODE_UPDATE) {
|
||||
PTDBASE utp;
|
||||
if (!c2)
|
||||
// Allocate all column blocks for that table
|
||||
utp->ColDB(g, NULL, 0);
|
||||
else for (p = c2; *p; p += n) {
|
||||
// Allocate only used column blocks
|
||||
colp = utp->ColDB(g, p, 0);
|
||||
n = strlen(p) + 1;
|
||||
} // endfor p
|
||||
|
||||
if (!(utp= (PTDBASE)tdbp->Duplicate(g))) {
|
||||
sprintf(g->Message, MSG(INV_UPDT_TABLE), tdbp->GetName());
|
||||
goto err;
|
||||
} // endif tp
|
||||
for (i = 0, colp = utp->GetColumns(); colp; i++, colp = colp->GetNext()) {
|
||||
if (colp->InitValue(g))
|
||||
throw 5;
|
||||
|
||||
if (!c2)
|
||||
// Allocate all column blocks for that table
|
||||
utp->ColDB(g, NULL, 0);
|
||||
else for (p= c2; *p; p+= n) {
|
||||
// Allocate only used column blocks
|
||||
colp= utp->ColDB(g, p, 0);
|
||||
n= strlen(p) + 1;
|
||||
} // endfor p
|
||||
if (colp->SetBuffer(g, colp->GetValue(), true, false))
|
||||
throw 6;
|
||||
|
||||
for (i= 0, colp= utp->GetColumns(); colp; i++, colp= colp->GetNext()) {
|
||||
if (colp->InitValue(g))
|
||||
goto err;
|
||||
} // endfor colp
|
||||
|
||||
if (colp->SetBuffer(g, colp->GetValue(), true, false))
|
||||
goto err;
|
||||
// Attach the updated columns list to the main table
|
||||
tdbp->SetSetCols(utp->GetColumns());
|
||||
} else if (tdbp && mode == MODE_INSERT)
|
||||
tdbp->SetSetCols(tdbp->GetColumns());
|
||||
|
||||
} // endfor colp
|
||||
// Now do open the physical table
|
||||
if (trace)
|
||||
printf("Opening table %s in mode %d tdbp=%p\n",
|
||||
tdbp->GetName(), mode, tdbp);
|
||||
|
||||
// Attach the updated columns list to the main table
|
||||
tdbp->SetSetCols(utp->GetColumns());
|
||||
} else if (tdbp && mode == MODE_INSERT)
|
||||
tdbp->SetSetCols(tdbp->GetColumns());
|
||||
//tdbp->SetMode(mode);
|
||||
|
||||
// Now do open the physical table
|
||||
if (trace)
|
||||
printf("Opening table %s in mode %d tdbp=%p\n",
|
||||
tdbp->GetName(), mode, tdbp);
|
||||
|
||||
//tdbp->SetMode(mode);
|
||||
|
||||
if (del/* && (tdbp->GetFtype() != RECFM_NAF*/) {
|
||||
// To avoid erasing the table when doing a partial delete
|
||||
// make a fake Next
|
||||
if (del/* && (tdbp->GetFtype() != RECFM_NAF*/) {
|
||||
// To avoid erasing the table when doing a partial delete
|
||||
// make a fake Next
|
||||
// PDOSDEF ddp= new(g) DOSDEF;
|
||||
// PTDB tp= new(g) TDBDOS(ddp, NULL);
|
||||
tdbp->SetNext((PTDB)1);
|
||||
dup->Check &= ~CHK_DELETE;
|
||||
} // endif del
|
||||
tdbp->SetNext((PTDB)1);
|
||||
dup->Check &= ~CHK_DELETE;
|
||||
} // endif del
|
||||
|
||||
|
||||
if (trace)
|
||||
printf("About to open the table: tdbp=%p\n", tdbp);
|
||||
if (trace)
|
||||
printf("About to open the table: tdbp=%p\n", tdbp);
|
||||
|
||||
if (mode != MODE_ANY && mode != MODE_ALTER) {
|
||||
if (tdbp->OpenDB(g)) {
|
||||
printf("%s\n", g->Message);
|
||||
goto err;
|
||||
} else
|
||||
tdbp->SetNext(NULL);
|
||||
if (mode != MODE_ANY && mode != MODE_ALTER) {
|
||||
if (tdbp->OpenDB(g)) {
|
||||
printf("%s\n", g->Message);
|
||||
throw 7;
|
||||
} else
|
||||
tdbp->SetNext(NULL);
|
||||
|
||||
} // endif mode
|
||||
} // endif mode
|
||||
|
||||
rcop= false;
|
||||
rcop = false;
|
||||
|
||||
} catch (int n) {
|
||||
if (trace)
|
||||
htrc("Exception %d: %s\n", n, g->Message);
|
||||
} catch (const char *msg) {
|
||||
strcpy(g->Message, msg);
|
||||
} // end catch
|
||||
|
||||
err:
|
||||
g->jump_level--;
|
||||
return rcop;
|
||||
} // end of CntOpenTable
|
||||
|
||||
@@ -387,50 +373,40 @@ bool CntRewindTable(PGLOBAL g, PTDB tdbp)
|
||||
/* Evaluate all columns after a record is read. */
|
||||
/***********************************************************************/
|
||||
RCODE EvalColumns(PGLOBAL g, PTDB tdbp, bool reset, bool mrr)
|
||||
{
|
||||
{
|
||||
RCODE rc= RC_OK;
|
||||
PCOL colp;
|
||||
|
||||
// Save stack and allocation environment and prepare error return
|
||||
if (g->jump_level == MAX_JUMP) {
|
||||
if (trace) {
|
||||
strcpy(g->Message, MSG(TOO_MANY_JUMPS));
|
||||
printf("EvalColumns: %s\n", g->Message);
|
||||
} // endif
|
||||
try {
|
||||
for (colp = tdbp->GetColumns(); rc == RC_OK && colp;
|
||||
colp = colp->GetNext()) {
|
||||
if (reset)
|
||||
colp->Reset();
|
||||
|
||||
return RC_FX;
|
||||
} // endif jump_level
|
||||
// Virtual columns are computed by MariaDB
|
||||
if (!colp->GetColUse(U_VIRTUAL) && (!mrr || colp->GetKcol()))
|
||||
if (colp->Eval(g))
|
||||
rc = RC_FX;
|
||||
|
||||
if (setjmp(g->jumper[++g->jump_level]) != 0) {
|
||||
if (trace)
|
||||
printf("Error reading columns: %s\n", g->Message);
|
||||
} // endfor colp
|
||||
|
||||
rc= RC_FX;
|
||||
goto err;
|
||||
} // endif rc
|
||||
} catch (int n) {
|
||||
if (trace)
|
||||
printf("Error %d reading columns: %s\n", n, g->Message);
|
||||
|
||||
for (colp= tdbp->GetColumns(); rc == RC_OK && colp;
|
||||
colp= colp->GetNext()) {
|
||||
if (reset)
|
||||
colp->Reset();
|
||||
rc = RC_FX;
|
||||
} catch (const char *msg) {
|
||||
strcpy(g->Message, msg);
|
||||
} // end catch
|
||||
|
||||
// Virtual columns are computed by MariaDB
|
||||
if (!colp->GetColUse(U_VIRTUAL) && (!mrr || colp->GetKcol()))
|
||||
if (colp->Eval(g))
|
||||
rc= RC_FX;
|
||||
|
||||
} // endfor colp
|
||||
|
||||
err:
|
||||
g->jump_level--;
|
||||
return rc;
|
||||
} // end of EvalColumns
|
||||
} // end of EvalColumns
|
||||
|
||||
/***********************************************************************/
|
||||
/* ReadNext: Read next record sequentially. */
|
||||
/***********************************************************************/
|
||||
RCODE CntReadNext(PGLOBAL g, PTDB tdbp)
|
||||
{
|
||||
{
|
||||
RCODE rc;
|
||||
|
||||
if (!tdbp)
|
||||
@@ -445,76 +421,66 @@ RCODE CntReadNext(PGLOBAL g, PTDB tdbp)
|
||||
((PTDBASE)tdbp)->ResetKindex(g, NULL);
|
||||
} // endif index
|
||||
|
||||
// Save stack and allocation environment and prepare error return
|
||||
if (g->jump_level == MAX_JUMP) {
|
||||
strcpy(g->Message, MSG(TOO_MANY_JUMPS));
|
||||
return RC_FX;
|
||||
} // endif jump_level
|
||||
try {
|
||||
// Do it now to avoid double eval when filtering
|
||||
for (PCOL colp = tdbp->GetColumns(); colp; colp = colp->GetNext())
|
||||
colp->Reset();
|
||||
|
||||
if ((setjmp(g->jumper[++g->jump_level])) != 0) {
|
||||
rc= RC_FX;
|
||||
goto err;
|
||||
} // endif rc
|
||||
do {
|
||||
if ((rc = (RCODE)tdbp->ReadDB(g)) == RC_OK)
|
||||
if (!ApplyFilter(g, tdbp->GetFilter()))
|
||||
rc = RC_NF;
|
||||
|
||||
// Do it now to avoid double eval when filtering
|
||||
for (PCOL colp= tdbp->GetColumns(); colp; colp= colp->GetNext())
|
||||
colp->Reset();
|
||||
} while (rc == RC_NF);
|
||||
|
||||
do {
|
||||
if ((rc= (RCODE)tdbp->ReadDB(g)) == RC_OK)
|
||||
if (!ApplyFilter(g, tdbp->GetFilter()))
|
||||
rc= RC_NF;
|
||||
if (rc == RC_OK)
|
||||
rc = EvalColumns(g, tdbp, false);
|
||||
|
||||
} while (rc == RC_NF);
|
||||
} catch (int) {
|
||||
rc = RC_FX;
|
||||
} catch (const char *msg) {
|
||||
strcpy(g->Message, msg);
|
||||
rc = RC_FX;
|
||||
} // end catch
|
||||
|
||||
if (rc == RC_OK)
|
||||
rc= EvalColumns(g, tdbp, false);
|
||||
|
||||
err:
|
||||
g->jump_level--;
|
||||
return rc;
|
||||
} // end of CntReadNext
|
||||
} // end of CntReadNext
|
||||
|
||||
/***********************************************************************/
|
||||
/* WriteRow: Insert a new row into a table. */
|
||||
/***********************************************************************/
|
||||
RCODE CntWriteRow(PGLOBAL g, PTDB tdbp)
|
||||
{
|
||||
RCODE rc;
|
||||
PCOL colp;
|
||||
//PTDBASE tp= (PTDBASE)tdbp;
|
||||
{
|
||||
RCODE rc;
|
||||
PCOL colp;
|
||||
//PTDBASE tp= (PTDBASE)tdbp;
|
||||
|
||||
if (!tdbp)
|
||||
return RC_FX;
|
||||
if (!tdbp)
|
||||
return RC_FX;
|
||||
|
||||
// Save stack and allocation environment and prepare error return
|
||||
if (g->jump_level == MAX_JUMP) {
|
||||
strcpy(g->Message, MSG(TOO_MANY_JUMPS));
|
||||
return RC_FX;
|
||||
} // endif jump_level
|
||||
try {
|
||||
// Store column values in table write buffer(s)
|
||||
for (colp = tdbp->GetSetCols(); colp; colp = colp->GetNext())
|
||||
if (!colp->GetColUse(U_VIRTUAL))
|
||||
colp->WriteColumn(g);
|
||||
|
||||
if (setjmp(g->jumper[++g->jump_level]) != 0) {
|
||||
printf("%s\n", g->Message);
|
||||
rc= RC_FX;
|
||||
goto err;
|
||||
} // endif rc
|
||||
if (tdbp->IsIndexed())
|
||||
// Index values must be sorted before updating
|
||||
rc = (RCODE)((PTDBDOS)tdbp)->GetTxfp()->StoreValues(g, true);
|
||||
else
|
||||
// Return result code from write operation
|
||||
rc = (RCODE)tdbp->WriteDB(g);
|
||||
|
||||
// Store column values in table write buffer(s)
|
||||
for (colp= tdbp->GetSetCols(); colp; colp= colp->GetNext())
|
||||
if (!colp->GetColUse(U_VIRTUAL))
|
||||
colp->WriteColumn(g);
|
||||
} catch (int n) {
|
||||
printf("Exception %d: %s\n", n, g->Message);
|
||||
rc = RC_FX;
|
||||
} catch (const char *msg) {
|
||||
strcpy(g->Message, msg);
|
||||
rc = RC_FX;
|
||||
} // end catch
|
||||
|
||||
if (tdbp->IsIndexed())
|
||||
// Index values must be sorted before updating
|
||||
rc= (RCODE)((PTDBDOS)tdbp)->GetTxfp()->StoreValues(g, true);
|
||||
else
|
||||
// Return result code from write operation
|
||||
rc= (RCODE)tdbp->WriteDB(g);
|
||||
|
||||
err:
|
||||
g->jump_level--;
|
||||
return rc;
|
||||
} // end of CntWriteRow
|
||||
return rc;
|
||||
} // end of CntWriteRow
|
||||
|
||||
/***********************************************************************/
|
||||
/* UpdateRow: Update a row into a table. */
|
||||
@@ -562,88 +528,78 @@ RCODE CntDeleteRow(PGLOBAL g, PTDB tdbp, bool all)
|
||||
/* CLOSETAB: Close a table. */
|
||||
/***********************************************************************/
|
||||
int CntCloseTable(PGLOBAL g, PTDB tdbp, bool nox, bool abort)
|
||||
{
|
||||
int rc= RC_OK;
|
||||
//TDBASE *tbxp= (PTDBASE)tdbp;
|
||||
{
|
||||
int rc = RC_OK;
|
||||
//TDBASE *tbxp= (PTDBASE)tdbp;
|
||||
|
||||
if (!tdbp)
|
||||
return rc; // Nothing to do
|
||||
else if (tdbp->GetUse() != USE_OPEN) {
|
||||
if (tdbp->GetAmType() == TYPE_AM_XML)
|
||||
tdbp->CloseDB(g); // Opened by GetMaxSize
|
||||
if (!tdbp)
|
||||
return rc; // Nothing to do
|
||||
else if (tdbp->GetUse() != USE_OPEN) {
|
||||
if (tdbp->GetAmType() == TYPE_AM_XML)
|
||||
tdbp->CloseDB(g); // Opened by GetMaxSize
|
||||
|
||||
return rc;
|
||||
} // endif !USE_OPEN
|
||||
return rc;
|
||||
} // endif !USE_OPEN
|
||||
|
||||
if (trace)
|
||||
printf("CntCloseTable: tdbp=%p mode=%d nox=%d abort=%d\n",
|
||||
tdbp, tdbp->GetMode(), nox, abort);
|
||||
if (trace)
|
||||
printf("CntCloseTable: tdbp=%p mode=%d nox=%d abort=%d\n",
|
||||
tdbp, tdbp->GetMode(), nox, abort);
|
||||
|
||||
if (tdbp->GetMode() == MODE_DELETE && tdbp->GetUse() == USE_OPEN) {
|
||||
if (tdbp->IsIndexed())
|
||||
rc= ((PTDBDOS)tdbp)->GetTxfp()->DeleteSortedRows(g);
|
||||
if (tdbp->GetMode() == MODE_DELETE && tdbp->GetUse() == USE_OPEN) {
|
||||
if (tdbp->IsIndexed())
|
||||
rc = ((PTDBDOS)tdbp)->GetTxfp()->DeleteSortedRows(g);
|
||||
|
||||
if (!rc)
|
||||
rc= tdbp->DeleteDB(g, RC_EF); // Specific A.M. delete routine
|
||||
if (!rc)
|
||||
rc = tdbp->DeleteDB(g, RC_EF); // Specific A.M. delete routine
|
||||
|
||||
} else if (tdbp->GetMode() == MODE_UPDATE && tdbp->IsIndexed())
|
||||
rc= ((PTDBDOX)tdbp)->Txfp->UpdateSortedRows(g);
|
||||
} else if (tdbp->GetMode() == MODE_UPDATE && tdbp->IsIndexed())
|
||||
rc = ((PTDBDOX)tdbp)->Txfp->UpdateSortedRows(g);
|
||||
|
||||
switch(rc) {
|
||||
case RC_FX:
|
||||
abort= true;
|
||||
break;
|
||||
case RC_INFO:
|
||||
PushWarning(g, tdbp);
|
||||
break;
|
||||
} // endswitch rc
|
||||
switch (rc) {
|
||||
case RC_FX:
|
||||
abort = true;
|
||||
break;
|
||||
case RC_INFO:
|
||||
PushWarning(g, tdbp);
|
||||
break;
|
||||
} // endswitch rc
|
||||
|
||||
// Prepare error return
|
||||
if (g->jump_level == MAX_JUMP) {
|
||||
strcpy(g->Message, MSG(TOO_MANY_JUMPS));
|
||||
rc= RC_FX;
|
||||
goto err;
|
||||
} // endif
|
||||
try {
|
||||
// This will close the table file(s) and also finalize write
|
||||
// operations such as Insert, Update, or Delete.
|
||||
tdbp->SetAbort(abort);
|
||||
tdbp->CloseDB(g);
|
||||
tdbp->SetAbort(false);
|
||||
|
||||
if ((rc = setjmp(g->jumper[++g->jump_level])) != 0) {
|
||||
rc= RC_FX;
|
||||
g->jump_level--;
|
||||
goto err;
|
||||
} // endif
|
||||
if (trace > 1)
|
||||
printf("Table %s closed\n", tdbp->GetName());
|
||||
|
||||
// This will close the table file(s) and also finalize write
|
||||
// operations such as Insert, Update, or Delete.
|
||||
tdbp->SetAbort(abort);
|
||||
tdbp->CloseDB(g);
|
||||
tdbp->SetAbort(false);
|
||||
g->jump_level--;
|
||||
if (!nox && tdbp->GetMode() != MODE_READ && tdbp->GetMode() != MODE_ANY) {
|
||||
if (trace > 1)
|
||||
printf("About to reset opt\n");
|
||||
|
||||
if (trace > 1)
|
||||
printf("Table %s closed\n", tdbp->GetName());
|
||||
if (!tdbp->IsRemote()) {
|
||||
// Make all the eventual indexes
|
||||
PTDBDOX tbxp = (PTDBDOX)tdbp;
|
||||
tbxp->ResetKindex(g, NULL);
|
||||
tbxp->SetKey_Col(NULL);
|
||||
rc = tbxp->ResetTableOpt(g, true, tbxp->GetDef()->Indexable() == 1);
|
||||
} // endif remote
|
||||
|
||||
//if (!((PTDBDOX)tdbp)->GetModified())
|
||||
// return 0;
|
||||
} // endif nox
|
||||
|
||||
if (nox || tdbp->GetMode() == MODE_READ || tdbp->GetMode() == MODE_ANY)
|
||||
return 0;
|
||||
} catch (int) {
|
||||
rc = RC_FX;
|
||||
} catch (const char *msg) {
|
||||
strcpy(g->Message, msg);
|
||||
rc = RC_FX;
|
||||
} // end catch
|
||||
|
||||
if (trace > 1)
|
||||
printf("About to reset opt\n");
|
||||
if (trace > 1)
|
||||
htrc("Done rc=%d\n", rc);
|
||||
|
||||
if (!tdbp->IsRemote()) {
|
||||
// Make all the eventual indexes
|
||||
PTDBDOX tbxp = (PTDBDOX)tdbp;
|
||||
tbxp->ResetKindex(g, NULL);
|
||||
tbxp->SetKey_Col(NULL);
|
||||
rc = tbxp->ResetTableOpt(g, true, tbxp->GetDef()->Indexable() == 1);
|
||||
} // endif remote
|
||||
|
||||
err:
|
||||
if (trace > 1)
|
||||
printf("Done rc=%d\n", rc);
|
||||
|
||||
return (rc == RC_OK || rc == RC_INFO) ? 0 : rc;
|
||||
} // end of CntCloseTable
|
||||
return (rc == RC_OK || rc == RC_INFO) ? 0 : rc;
|
||||
} // end of CntCloseTable
|
||||
|
||||
/***********************************************************************/
|
||||
/* Load and initialize the use of an index. */
|
||||
@@ -752,8 +708,9 @@ RCODE CntIndexRead(PGLOBAL g, PTDB ptdb, OPVAL op,
|
||||
sprintf(g->Message, MSG(TABLE_NO_INDEX), ptdb->GetName());
|
||||
return RC_FX;
|
||||
} else if (x == 2) {
|
||||
// Remote index
|
||||
if (op != OP_SAME && ptdb->ReadKey(g, op, kr))
|
||||
// Remote index. Only used in read mode
|
||||
if ((ptdb->GetMode() == MODE_READ || ptdb->GetMode() == MODE_READX)
|
||||
&& op != OP_SAME && ptdb->ReadKey(g, op, kr))
|
||||
return RC_FX;
|
||||
|
||||
goto rnd;
|
||||
|
@@ -49,8 +49,8 @@ class DllExport CSORT {
|
||||
public:
|
||||
// Methods
|
||||
int Qsort(PGLOBAL g, int n); /* Sort calling routine */
|
||||
//virtual void Print(PGLOBAL g, FILE *f, uint n);
|
||||
//virtual void Print(PGLOBAL g, char *ps, uint z);
|
||||
//virtual void Printf(PGLOBAL g, FILE *f, uint n);
|
||||
//virtual void Prints(PGLOBAL g, char *ps, uint z);
|
||||
#ifdef DEBTRACE
|
||||
int GetNcmp(void) {return num_comp;}
|
||||
#endif
|
||||
|
@@ -58,13 +58,15 @@ void CloseXMLFile(PGLOBAL g, PFBLOCK fp, bool all)
|
||||
if (xp && xp->Count > 1 && !all) {
|
||||
xp->Count--;
|
||||
} else if (xp && xp->Count > 0) {
|
||||
try {
|
||||
try {
|
||||
if (xp->Docp)
|
||||
xp->Docp->Release();
|
||||
|
||||
} catch(_com_error e) {
|
||||
sprintf(g->Message, "%s %s", MSG(COM_ERROR), e.Description());
|
||||
} catch(...) {}
|
||||
} catch(_com_error e) {
|
||||
char *p = _com_util::ConvertBSTRToString(e.Description());
|
||||
sprintf(g->Message, "%s %s", MSG(COM_ERROR), p);
|
||||
delete[] p;
|
||||
} catch(...) {}
|
||||
|
||||
CoUninitialize();
|
||||
xp->Count = 0;
|
||||
@@ -89,7 +91,7 @@ DOMDOC::DOMDOC(char *nsl, char *nsdf, char *enc, PFBLOCK fp)
|
||||
/******************************************************************/
|
||||
/* Initialize XML parser and check library compatibility. */
|
||||
/******************************************************************/
|
||||
bool DOMDOC::Initialize(PGLOBAL g, char *entry, bool zipped)
|
||||
bool DOMDOC::Initialize(PGLOBAL g, PCSZ entry, bool zipped)
|
||||
{
|
||||
if (zipped && InitZip(g, entry))
|
||||
return true;
|
||||
@@ -155,7 +157,7 @@ PFBLOCK DOMDOC::LinkXblock(PGLOBAL g, MODE m, int rc, char *fn)
|
||||
/******************************************************************/
|
||||
/* Create the XML node. */
|
||||
/******************************************************************/
|
||||
bool DOMDOC::NewDoc(PGLOBAL g, char *ver)
|
||||
bool DOMDOC::NewDoc(PGLOBAL g, PCSZ ver)
|
||||
{
|
||||
char buf[64];
|
||||
MSXML2::IXMLDOMProcessingInstructionPtr pip;
|
||||
@@ -490,9 +492,9 @@ PXATTR DOMNODE::GetAttribute(PGLOBAL g, char *name, PXATTR ap)
|
||||
/******************************************************************/
|
||||
/* Add a new element child node to this node and return it. */
|
||||
/******************************************************************/
|
||||
PXNODE DOMNODE::AddChildNode(PGLOBAL g, char *name, PXNODE np)
|
||||
PXNODE DOMNODE::AddChildNode(PGLOBAL g, PCSZ name, PXNODE np)
|
||||
{
|
||||
char *p, *pn;
|
||||
const char *p, *pn;
|
||||
// char *p, *pn, *epf, *pf = NULL;
|
||||
MSXML2::IXMLDOMNodePtr ep;
|
||||
// _bstr_t uri((wchar_t*)NULL);
|
||||
@@ -585,7 +587,7 @@ PXATTR DOMNODE::AddProperty(PGLOBAL g, char *name, PXATTR ap)
|
||||
/******************************************************************/
|
||||
/* Add a new text node to this node. */
|
||||
/******************************************************************/
|
||||
void DOMNODE::AddText(PGLOBAL g, char *txtp)
|
||||
void DOMNODE::AddText(PGLOBAL g, PCSZ txtp)
|
||||
{
|
||||
MSXML2::IXMLDOMTextPtr tp= Docp->createTextNode((_bstr_t)txtp);
|
||||
|
||||
|
@@ -37,9 +37,9 @@ class DOMDOC : public XMLDOCUMENT {
|
||||
virtual void SetNofree(bool b) {} // Only libxml2
|
||||
|
||||
// Methods
|
||||
virtual bool Initialize(PGLOBAL g, char *entry, bool zipped);
|
||||
virtual bool Initialize(PGLOBAL g, PCSZ entry, bool zipped);
|
||||
virtual bool ParseFile(PGLOBAL g, char *fn);
|
||||
virtual bool NewDoc(PGLOBAL g, char *ver);
|
||||
virtual bool NewDoc(PGLOBAL g, PCSZ ver);
|
||||
virtual void AddComment(PGLOBAL g, char *com);
|
||||
virtual PXNODE GetRoot(PGLOBAL g);
|
||||
virtual PXNODE NewRoot(PGLOBAL g, char *name);
|
||||
@@ -78,9 +78,9 @@ class DOMNODE : public XMLNODE {
|
||||
virtual PXLIST SelectNodes(PGLOBAL g, char *xp, PXLIST lp);
|
||||
virtual PXNODE SelectSingleNode(PGLOBAL g, char *xp, PXNODE np);
|
||||
virtual PXATTR GetAttribute(PGLOBAL g, char *name, PXATTR ap);
|
||||
virtual PXNODE AddChildNode(PGLOBAL g, char *name, PXNODE np);
|
||||
virtual PXNODE AddChildNode(PGLOBAL g, PCSZ name, PXNODE np);
|
||||
virtual PXATTR AddProperty(PGLOBAL g, char *name, PXATTR ap);
|
||||
virtual void AddText(PGLOBAL g, char *txtp);
|
||||
virtual void AddText(PGLOBAL g, PCSZ txtp);
|
||||
virtual void DeleteChild(PGLOBAL g, PXNODE dnp);
|
||||
|
||||
protected:
|
||||
|
@@ -301,10 +301,9 @@ int MAPFAM::SkipRecord(PGLOBAL g, bool header)
|
||||
PDBUSER dup = (PDBUSER)g->Activityp->Aptr;
|
||||
|
||||
// Skip this record
|
||||
while (*Mempos++ != '\n') ; // What about Unix ???
|
||||
|
||||
if (Mempos >= Top)
|
||||
return RC_EF;
|
||||
while (*Mempos++ != '\n') // What about Unix ???
|
||||
if (Mempos == Top)
|
||||
return RC_EF;
|
||||
|
||||
// Update progress information
|
||||
dup->ProgCur = GetPos();
|
||||
@@ -320,7 +319,7 @@ int MAPFAM::SkipRecord(PGLOBAL g, bool header)
|
||||
/***********************************************************************/
|
||||
int MAPFAM::ReadBuffer(PGLOBAL g)
|
||||
{
|
||||
int rc, len;
|
||||
int rc, len, n = 1;
|
||||
|
||||
// Are we at the end of the memory
|
||||
if (Mempos >= Top) {
|
||||
@@ -362,10 +361,14 @@ int MAPFAM::ReadBuffer(PGLOBAL g)
|
||||
Placed = false;
|
||||
|
||||
// Immediately calculate next position (Used by DeleteDB)
|
||||
while (*Mempos++ != '\n') ; // What about Unix ???
|
||||
while (*Mempos++ != '\n') // What about Unix ???
|
||||
if (Mempos == Top) {
|
||||
n = 0;
|
||||
break;
|
||||
} // endif Mempos
|
||||
|
||||
// Set caller line buffer
|
||||
len = (Mempos - Fpos) - 1;
|
||||
len = (Mempos - Fpos) - n;
|
||||
|
||||
// Don't rely on ENDING setting
|
||||
if (len > 0 && *(Mempos - 2) == '\r')
|
||||
@@ -619,7 +622,9 @@ int MBKFAM::ReadBuffer(PGLOBAL g)
|
||||
} // endif's
|
||||
|
||||
// Immediately calculate next position (Used by DeleteDB)
|
||||
while (*Mempos++ != '\n') ; // What about Unix ???
|
||||
while (*Mempos++ != '\n') // What about Unix ???
|
||||
if (Mempos == Top)
|
||||
break;
|
||||
|
||||
// Set caller line buffer
|
||||
len = (Mempos - Fpos) - Ending;
|
||||
|
@@ -128,7 +128,7 @@ typedef struct _descriptor {
|
||||
/* Moves file pointer to byte 32; fills buffer at buf with */
|
||||
/* first 32 bytes of file. */
|
||||
/****************************************************************************/
|
||||
static int dbfhead(PGLOBAL g, FILE *file, PSZ fn, DBFHEADER *buf)
|
||||
static int dbfhead(PGLOBAL g, FILE *file, PCSZ fn, DBFHEADER *buf)
|
||||
{
|
||||
char endmark[2];
|
||||
int dbc = 2, rc = RC_OK;
|
||||
@@ -186,7 +186,7 @@ static int dbfhead(PGLOBAL g, FILE *file, PSZ fn, DBFHEADER *buf)
|
||||
/* DBFColumns: constructs the result blocks containing the description */
|
||||
/* of all the columns of a DBF file that will be retrieved by #GetData. */
|
||||
/****************************************************************************/
|
||||
PQRYRES DBFColumns(PGLOBAL g, char *dp, const char *fn, bool info)
|
||||
PQRYRES DBFColumns(PGLOBAL g, PCSZ dp, PCSZ fn, bool info)
|
||||
{
|
||||
int buftyp[] = {TYPE_STRING, TYPE_SHORT, TYPE_STRING,
|
||||
TYPE_INT, TYPE_INT, TYPE_SHORT};
|
||||
@@ -393,7 +393,7 @@ DBFBASE::DBFBASE(DBFBASE *txfp)
|
||||
/* and header length. Set Records, check that Reclen is equal to lrecl and */
|
||||
/* return the header length or 0 in case of error. */
|
||||
/****************************************************************************/
|
||||
int DBFBASE::ScanHeader(PGLOBAL g, PSZ fn, int lrecl, int *rln, char *defpath)
|
||||
int DBFBASE::ScanHeader(PGLOBAL g, PCSZ fn, int lrecl, int *rln, PCSZ defpath)
|
||||
{
|
||||
int rc;
|
||||
char filename[_MAX_PATH];
|
||||
@@ -694,7 +694,7 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g)
|
||||
} // endif Headlen
|
||||
|
||||
/**************************************************************************/
|
||||
/* Position the file at the beginning of the data. */
|
||||
/* Position the file at the begining of the data. */
|
||||
/**************************************************************************/
|
||||
if (Tdbp->GetMode() == MODE_INSERT)
|
||||
rc = fseek(Stream, 0, SEEK_END);
|
||||
@@ -1034,7 +1034,7 @@ bool DBMFAM::AllocateBuffer(PGLOBAL g)
|
||||
} // endif Headlen
|
||||
|
||||
/**************************************************************************/
|
||||
/* Position the file at the beginning of the data. */
|
||||
/* Position the file at the begining of the data. */
|
||||
/**************************************************************************/
|
||||
Fpos = Mempos = Memory + Headlen;
|
||||
Top--; // Because of EOF marker
|
||||
|
@@ -19,7 +19,7 @@ typedef class DBMFAM *PDBMFAM;
|
||||
/****************************************************************************/
|
||||
/* Functions used externally. */
|
||||
/****************************************************************************/
|
||||
PQRYRES DBFColumns(PGLOBAL g, char *dp, const char *fn, bool info);
|
||||
PQRYRES DBFColumns(PGLOBAL g, PCSZ dp, PCSZ fn, bool info);
|
||||
|
||||
/****************************************************************************/
|
||||
/* This is the base class for dBASE file access methods. */
|
||||
@@ -31,7 +31,7 @@ class DllExport DBFBASE {
|
||||
DBFBASE(PDBF txfp);
|
||||
|
||||
// Implementation
|
||||
int ScanHeader(PGLOBAL g, PSZ fname, int lrecl, int *rlen, char *defpath);
|
||||
int ScanHeader(PGLOBAL g, PCSZ fname, int lrecl, int *rlen, PCSZ defpath);
|
||||
|
||||
protected:
|
||||
// Default constructor, not to be used
|
||||
|
@@ -761,7 +761,8 @@ bool BGXFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req)
|
||||
htrc("after write req=%d brc=%d nbw=%d\n", req, brc, nbw);
|
||||
|
||||
if (!brc || nbw != len) {
|
||||
char buf[256], *fn = (h == Hfile) ? To_File : "Tempfile";
|
||||
char buf[256];
|
||||
PCSZ fn = (h == Hfile) ? To_File : "Tempfile";
|
||||
|
||||
if (brc)
|
||||
strcpy(buf, MSG(BAD_BYTE_NUM));
|
||||
|
@@ -920,8 +920,8 @@ int ZLBFAM::GetFileLength(PGLOBAL g)
|
||||
/***********************************************************************/
|
||||
bool ZLBFAM::AllocateBuffer(PGLOBAL g)
|
||||
{
|
||||
char *msg;
|
||||
int n, zrc;
|
||||
PCSZ msg;
|
||||
int n, zrc;
|
||||
|
||||
#if 0
|
||||
if (!Optimized && Tdbp->NeedIndexing(g)) {
|
||||
|
@@ -1,11 +1,11 @@
|
||||
/*********** File AM Txt C++ Program Source Code File (.CPP) ***********/
|
||||
/* PROGRAM NAME: FILAMTXT */
|
||||
/* ------------- */
|
||||
/* Version 1.6 */
|
||||
/* Version 1.7 */
|
||||
/* */
|
||||
/* COPYRIGHT: */
|
||||
/* ---------- */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2005-2015 */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2005-2017 */
|
||||
/* */
|
||||
/* WHAT THIS PROGRAM DOES: */
|
||||
/* ----------------------- */
|
||||
@@ -71,8 +71,23 @@ TXTFAM::TXTFAM(PDOSDEF tdp)
|
||||
{
|
||||
Tdbp = NULL;
|
||||
To_Fb = NULL;
|
||||
To_File = tdp->Fn;
|
||||
Lrecl = tdp->Lrecl;
|
||||
|
||||
if (tdp) {
|
||||
To_File = tdp->Fn;
|
||||
Lrecl = tdp->Lrecl;
|
||||
Eof = tdp->Eof;
|
||||
Ending = tdp->Ending;
|
||||
} else {
|
||||
To_File = NULL;
|
||||
Lrecl = 0;
|
||||
Eof = false;
|
||||
#if defined(__WIN__)
|
||||
Ending = 2;
|
||||
#else
|
||||
Ending = 1;
|
||||
#endif
|
||||
} // endif tdp
|
||||
|
||||
Placed = false;
|
||||
IsRead = true;
|
||||
Blocked = false;
|
||||
@@ -103,8 +118,6 @@ TXTFAM::TXTFAM(PDOSDEF tdp)
|
||||
Blksize = 0;
|
||||
Fpos = Spos = Tpos = 0;
|
||||
Padded = false;
|
||||
Eof = tdp->Eof;
|
||||
Ending = tdp->Ending;
|
||||
Abort = false;
|
||||
CrLf = (char*)(Ending == 1 ? "\n" : "\r\n");
|
||||
} // end of TXTFAM standard constructor
|
||||
@@ -973,7 +986,7 @@ int DOSFAM::DeleteRecords(PGLOBAL g, int irc)
|
||||
|
||||
} else {
|
||||
/*****************************************************************/
|
||||
/* Move of eventual preceding lines is not required here. */
|
||||
/* Move of eventual preceding lines is not required here. */
|
||||
/* Set the target file as being the source file itself. */
|
||||
/* Set the future Tpos, and give Spos a value to block copying. */
|
||||
/*****************************************************************/
|
||||
@@ -1161,13 +1174,13 @@ int DOSFAM::RenameTempFile(PGLOBAL g)
|
||||
if (rename(filename, filetemp)) { // Save file for security
|
||||
sprintf(g->Message, MSG(RENAME_ERROR),
|
||||
filename, filetemp, strerror(errno));
|
||||
longjmp(g->jumper[g->jump_level], 51);
|
||||
} else if (rename(tempname, filename)) {
|
||||
throw 51;
|
||||
} else if (rename(tempname, filename)) {
|
||||
sprintf(g->Message, MSG(RENAME_ERROR),
|
||||
tempname, filename, strerror(errno));
|
||||
rc = rename(filetemp, filename); // Restore saved file
|
||||
longjmp(g->jumper[g->jump_level], 52);
|
||||
} else if (remove(filetemp)) {
|
||||
throw 52;
|
||||
} else if (remove(filetemp)) {
|
||||
sprintf(g->Message, MSG(REMOVE_ERROR),
|
||||
filetemp, strerror(errno));
|
||||
rc = RC_INFO; // Acceptable
|
||||
|
@@ -80,7 +80,7 @@ class DllExport TXTFAM : public BLOCK {
|
||||
protected:
|
||||
// Members
|
||||
PTDBDOS Tdbp; // To table class
|
||||
PSZ To_File; // Points to table file name
|
||||
PCSZ 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
|
||||
|
@@ -5,7 +5,7 @@
|
||||
/* */
|
||||
/* COPYRIGHT: */
|
||||
/* ---------- */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2005-2015 */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2005-2017 */
|
||||
/* */
|
||||
/* WHAT THIS PROGRAM DOES: */
|
||||
/* ----------------------- */
|
||||
@@ -143,9 +143,9 @@ int VCTFAM::GetFileLength(PGLOBAL g)
|
||||
{
|
||||
if (Split) {
|
||||
// Get the total file length
|
||||
char filename[_MAX_PATH];
|
||||
char *savfile = To_File;
|
||||
int i, len = 0;
|
||||
char filename[_MAX_PATH];
|
||||
PCSZ savfile = To_File;
|
||||
int i, len = 0;
|
||||
|
||||
// Initialize the array of file structures
|
||||
if (!Colfn) {
|
||||
@@ -313,8 +313,8 @@ int VCTFAM::Cardinality(PGLOBAL g)
|
||||
// and Last must be set from the file cardinality.
|
||||
// Only happens when called by sub classes.
|
||||
char filename[_MAX_PATH];
|
||||
PSZ savfn = To_File;
|
||||
int len, clen, card = -1;
|
||||
PCSZ savfn = To_File;
|
||||
int len, clen, card = -1;
|
||||
PCOLDEF cdp = Tdbp->GetDef()->GetCols();
|
||||
|
||||
if (!Colfn) {
|
||||
@@ -368,7 +368,7 @@ int VCTFAM::GetRowID(void)
|
||||
/***********************************************************************/
|
||||
/* VCT Create an empty file for Vector formatted tables. */
|
||||
/***********************************************************************/
|
||||
bool VCTFAM::MakeEmptyFile(PGLOBAL g, char *fn)
|
||||
bool VCTFAM::MakeEmptyFile(PGLOBAL g, PCSZ fn)
|
||||
{
|
||||
// Vector formatted file: this will create an empty file of the
|
||||
// required length if it does not exists yet.
|
||||
@@ -559,41 +559,42 @@ bool VCTFAM::AllocateBuffer(PGLOBAL g)
|
||||
/* Do initial action when inserting. */
|
||||
/***********************************************************************/
|
||||
bool VCTFAM::InitInsert(PGLOBAL g)
|
||||
{
|
||||
{
|
||||
bool rc = false;
|
||||
|
||||
// We come here in MODE_INSERT only
|
||||
if (Last == Nrec) {
|
||||
CurBlk = Block;
|
||||
CurNum = 0;
|
||||
AddBlock = !MaxBlk;
|
||||
} else {
|
||||
int rc;
|
||||
PVCTCOL cp = (PVCTCOL)Tdbp->GetColumns();
|
||||
|
||||
// The starting point must be at the end of file as for append.
|
||||
CurBlk = Block - 1;
|
||||
CurNum = Last;
|
||||
|
||||
// Prepare error return
|
||||
if (g->jump_level == MAX_JUMP) {
|
||||
strcpy(g->Message, MSG(TOO_MANY_JUMPS));
|
||||
return true;
|
||||
} // endif
|
||||
try {
|
||||
// Last block must be updated by new values
|
||||
for (; cp; cp = (PVCTCOL)cp->Next)
|
||||
cp->ReadBlock(g);
|
||||
|
||||
if ((rc = setjmp(g->jumper[++g->jump_level])) != 0) {
|
||||
g->jump_level--;
|
||||
return true;
|
||||
} // endif
|
||||
} catch (int n) {
|
||||
if (trace)
|
||||
htrc("Exception %d: %s\n", n, g->Message);
|
||||
rc = true;
|
||||
} catch (const char *msg) {
|
||||
strcpy(g->Message, msg);
|
||||
rc = true;
|
||||
} // end catch
|
||||
|
||||
// Last block must be updated by new values
|
||||
for (; cp; cp = (PVCTCOL)cp->Next)
|
||||
cp->ReadBlock(g);
|
||||
|
||||
g->jump_level--;
|
||||
} // endif Last
|
||||
|
||||
// We are not currently using a temporary file for Insert
|
||||
T_Stream = Stream;
|
||||
return false;
|
||||
if (!rc)
|
||||
// We are not currently using a temporary file for Insert
|
||||
T_Stream = Stream;
|
||||
|
||||
return rc;
|
||||
} // end of InitInsert
|
||||
|
||||
/***********************************************************************/
|
||||
@@ -878,8 +879,9 @@ int VCTFAM::DeleteRecords(PGLOBAL g, int irc)
|
||||
/***********************************************************************/
|
||||
bool VCTFAM::OpenTempFile(PGLOBAL g)
|
||||
{
|
||||
char *opmode, tempname[_MAX_PATH];
|
||||
bool rc = false;
|
||||
PCSZ opmode;
|
||||
char tempname[_MAX_PATH];
|
||||
bool rc = false;
|
||||
|
||||
/*********************************************************************/
|
||||
/* Open the temporary file, Spos is at the beginning of file. */
|
||||
@@ -1107,7 +1109,7 @@ void VCTFAM::CloseTableFile(PGLOBAL g, bool abort)
|
||||
} else if (AddBlock) {
|
||||
// Last block was not written
|
||||
rc = ResetTableSize(g, CurBlk, Nrec);
|
||||
longjmp(g->jumper[g->jump_level], 44);
|
||||
throw 44;
|
||||
} // endif
|
||||
|
||||
} else if (mode == MODE_UPDATE) {
|
||||
@@ -1527,8 +1529,8 @@ bool VCMFAM::AllocateBuffer(PGLOBAL g)
|
||||
/* Do initial action when inserting. */
|
||||
/***********************************************************************/
|
||||
bool VCMFAM::InitInsert(PGLOBAL g)
|
||||
{
|
||||
int rc;
|
||||
{
|
||||
bool rc = false;
|
||||
volatile PVCTCOL cp = (PVCTCOL)Tdbp->GetColumns();
|
||||
|
||||
// We come here in MODE_INSERT only
|
||||
@@ -1542,24 +1544,22 @@ bool VCMFAM::InitInsert(PGLOBAL g)
|
||||
CurNum = Last;
|
||||
} // endif Last
|
||||
|
||||
// Prepare error return
|
||||
if (g->jump_level == MAX_JUMP) {
|
||||
strcpy(g->Message, MSG(TOO_MANY_JUMPS));
|
||||
return true;
|
||||
} // endif
|
||||
try {
|
||||
// Initialize the column block pointer
|
||||
for (; cp; cp = (PVCTCOL)cp->Next)
|
||||
cp->ReadBlock(g);
|
||||
|
||||
if ((rc = setjmp(g->jumper[++g->jump_level])) != 0) {
|
||||
g->jump_level--;
|
||||
return true;
|
||||
} // endif
|
||||
} catch (int n) {
|
||||
if (trace)
|
||||
htrc("Exception %d: %s\n", n, g->Message);
|
||||
rc = true;
|
||||
} catch (const char *msg) {
|
||||
strcpy(g->Message, msg);
|
||||
rc = true;
|
||||
} // end catch
|
||||
|
||||
// Initialize the column block pointer
|
||||
for (; cp; cp = (PVCTCOL)cp->Next)
|
||||
cp->ReadBlock(g);
|
||||
|
||||
g->jump_level--;
|
||||
return false;
|
||||
} // end of InitInsert
|
||||
return rc;
|
||||
} // end of InitInsert
|
||||
|
||||
/***********************************************************************/
|
||||
/* Data Base write routine for VMP access method. */
|
||||
@@ -1998,7 +1998,7 @@ bool VECFAM::OpenTableFile(PGLOBAL g)
|
||||
/***********************************************************************/
|
||||
/* Open the file corresponding to one column. */
|
||||
/***********************************************************************/
|
||||
bool VECFAM::OpenColumnFile(PGLOBAL g, char *opmode, int i)
|
||||
bool VECFAM::OpenColumnFile(PGLOBAL g, PCSZ opmode, int i)
|
||||
{
|
||||
char filename[_MAX_PATH];
|
||||
PDBUSER dup = PlgGetUser(g);
|
||||
@@ -2503,7 +2503,7 @@ void VECFAM::CloseTableFile(PGLOBAL g, bool abort)
|
||||
if (wrc != RC_FX)
|
||||
rc = ResetTableSize(g, Block, Last);
|
||||
else
|
||||
longjmp(g->jumper[g->jump_level], 44);
|
||||
throw 44;
|
||||
|
||||
} else if (mode == MODE_UPDATE) {
|
||||
if (UseTemp && !InitUpdate && !Abort) {
|
||||
@@ -3143,7 +3143,8 @@ bool BGVFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req)
|
||||
htrc("after write req=%d brc=%d nbw=%d\n", req, brc, nbw);
|
||||
|
||||
if (!brc || nbw != len) {
|
||||
char buf[256], *fn = (h == Hfile) ? To_File : "Tempfile";
|
||||
char buf[256];
|
||||
PCSZ fn = (h == Hfile) ? To_File : "Tempfile";
|
||||
|
||||
if (brc)
|
||||
strcpy(buf, MSG(BAD_BYTE_NUM));
|
||||
@@ -3319,7 +3320,7 @@ bool BGVFAM::SetBlockInfo(PGLOBAL g)
|
||||
/***********************************************************************/
|
||||
/* VEC Create an empty file for new Vector formatted tables. */
|
||||
/***********************************************************************/
|
||||
bool BGVFAM::MakeEmptyFile(PGLOBAL g, char *fn)
|
||||
bool BGVFAM::MakeEmptyFile(PGLOBAL g, PCSZ fn)
|
||||
{
|
||||
// Vector formatted file this will create an empty file of the
|
||||
// required length if it does not exists yet.
|
||||
@@ -3329,7 +3330,7 @@ bool BGVFAM::MakeEmptyFile(PGLOBAL g, char *fn)
|
||||
PlugSetPath(filename, fn, Tdbp->GetPath());
|
||||
|
||||
#if defined(__WIN__)
|
||||
char *p;
|
||||
PCSZ p;
|
||||
DWORD rc;
|
||||
bool brc;
|
||||
LARGE_INTEGER of;
|
||||
@@ -4164,8 +4165,8 @@ void BGVFAM::CloseTableFile(PGLOBAL g, bool abort)
|
||||
} else if (AddBlock) {
|
||||
// Last block was not written
|
||||
rc = ResetTableSize(g, CurBlk, Nrec);
|
||||
longjmp(g->jumper[g->jump_level], 44);
|
||||
} // endif
|
||||
throw 44;
|
||||
} // endif
|
||||
|
||||
} else if (mode == MODE_UPDATE) {
|
||||
// Write back to file any pending modifications
|
||||
|
@@ -61,7 +61,7 @@ class DllExport VCTFAM : public FIXFAM {
|
||||
virtual bool WriteBlock(PGLOBAL g, PVCTCOL colp);
|
||||
|
||||
protected:
|
||||
virtual bool MakeEmptyFile(PGLOBAL g, char *fn);
|
||||
virtual bool MakeEmptyFile(PGLOBAL g, PCSZ fn);
|
||||
virtual bool OpenTempFile(PGLOBAL g);
|
||||
virtual bool MoveLines(PGLOBAL g) {return false;}
|
||||
virtual bool MoveIntermediateLines(PGLOBAL g, bool *b = NULL);
|
||||
@@ -160,7 +160,7 @@ class DllExport VECFAM : public VCTFAM {
|
||||
virtual bool MoveLines(PGLOBAL g);
|
||||
virtual bool MoveIntermediateLines(PGLOBAL g, bool *b = NULL);
|
||||
virtual int RenameTempFile(PGLOBAL g);
|
||||
bool OpenColumnFile(PGLOBAL g, char *opmode, int i);
|
||||
bool OpenColumnFile(PGLOBAL g, PCSZ opmode, int i);
|
||||
|
||||
// Members
|
||||
FILE* *Streams; // Points to Dos file structure array
|
||||
@@ -235,7 +235,7 @@ class BGVFAM : public VCTFAM {
|
||||
bool BigSeek(PGLOBAL g, HANDLE h, BIGINT pos, bool b = false);
|
||||
bool BigRead(PGLOBAL g, HANDLE h, void *inbuf, int req);
|
||||
bool BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req);
|
||||
virtual bool MakeEmptyFile(PGLOBAL g, char *fn);
|
||||
virtual bool MakeEmptyFile(PGLOBAL g, PCSZ fn);
|
||||
virtual bool OpenTempFile(PGLOBAL g);
|
||||
virtual bool MoveIntermediateLines(PGLOBAL g, bool *b = NULL);
|
||||
virtual bool CleanUnusedSpace(PGLOBAL g);
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/*********** File AM Zip C++ Program Source Code File (.CPP) ***********/
|
||||
/* PROGRAM NAME: FILAMZIP */
|
||||
/* ------------- */
|
||||
/* Version 1.1 */
|
||||
/* Version 1.3 */
|
||||
/* */
|
||||
/* COPYRIGHT: */
|
||||
/* ---------- */
|
||||
@@ -45,12 +45,12 @@
|
||||
|
||||
#define WRITEBUFFERSIZE (16384)
|
||||
|
||||
bool ZipLoadFile(PGLOBAL g, char *zfn, char *fn, char *entry, bool append, bool mul);
|
||||
bool ZipLoadFile(PGLOBAL g, PCSZ zfn, PCSZ fn, PCSZ entry, bool append, bool mul);
|
||||
|
||||
/***********************************************************************/
|
||||
/* Compress a file in zip when creating a table. */
|
||||
/***********************************************************************/
|
||||
static bool ZipFile(PGLOBAL g, ZIPUTIL *zutp, char *fn, char *entry, char *buf)
|
||||
static bool ZipFile(PGLOBAL g, ZIPUTIL *zutp, PCSZ fn, PCSZ entry, char *buf)
|
||||
{
|
||||
int rc = RC_OK, size_read, size_buf = WRITEBUFFERSIZE;
|
||||
FILE *fin;
|
||||
@@ -88,7 +88,7 @@ static bool ZipFile(PGLOBAL g, ZIPUTIL *zutp, char *fn, char *entry, char *buf)
|
||||
/***********************************************************************/
|
||||
/* Find and Compress several files in zip when creating a table. */
|
||||
/***********************************************************************/
|
||||
static bool ZipFiles(PGLOBAL g, ZIPUTIL *zutp, char *pat, char *buf)
|
||||
static bool ZipFiles(PGLOBAL g, ZIPUTIL *zutp, PCSZ pat, char *buf)
|
||||
{
|
||||
char filename[_MAX_PATH];
|
||||
int rc;
|
||||
@@ -203,7 +203,7 @@ static bool ZipFiles(PGLOBAL g, ZIPUTIL *zutp, char *pat, char *buf)
|
||||
/***********************************************************************/
|
||||
/* Load and Compress a file in zip when creating a table. */
|
||||
/***********************************************************************/
|
||||
bool ZipLoadFile(PGLOBAL g, char *zfn, char *fn, char *entry, bool append, bool mul)
|
||||
bool ZipLoadFile(PGLOBAL g, PCSZ zfn, PCSZ fn, PCSZ entry, bool append, bool mul)
|
||||
{
|
||||
char *buf;
|
||||
bool err;
|
||||
@@ -228,7 +228,7 @@ bool ZipLoadFile(PGLOBAL g, char *zfn, char *fn, char *entry, bool append, bool
|
||||
/***********************************************************************/
|
||||
/* Constructors. */
|
||||
/***********************************************************************/
|
||||
ZIPUTIL::ZIPUTIL(PSZ tgt)
|
||||
ZIPUTIL::ZIPUTIL(PCSZ tgt)
|
||||
{
|
||||
zipfile = NULL;
|
||||
target = tgt;
|
||||
@@ -269,7 +269,7 @@ void ZIPUTIL::getTime(tm_zip& tmZip)
|
||||
/* append: set true to append the zip file */
|
||||
/* return: true if open, false otherwise. */
|
||||
/***********************************************************************/
|
||||
bool ZIPUTIL::open(PGLOBAL g, char *filename, bool append)
|
||||
bool ZIPUTIL::open(PGLOBAL g, PCSZ filename, bool append)
|
||||
{
|
||||
if (!zipfile && !(zipfile = zipOpen64(filename,
|
||||
append ? APPEND_STATUS_ADDINZIP
|
||||
@@ -295,7 +295,7 @@ void ZIPUTIL::close()
|
||||
/***********************************************************************/
|
||||
/* OpenTableFile: Open a DOS/UNIX table file from a ZIP file. */
|
||||
/***********************************************************************/
|
||||
bool ZIPUTIL::OpenTable(PGLOBAL g, MODE mode, char *fn, bool append)
|
||||
bool ZIPUTIL::OpenTable(PGLOBAL g, MODE mode, PCSZ fn, bool append)
|
||||
{
|
||||
/*********************************************************************/
|
||||
/* The file will be compressed. */
|
||||
@@ -338,7 +338,7 @@ bool ZIPUTIL::OpenTable(PGLOBAL g, MODE mode, char *fn, bool append)
|
||||
/***********************************************************************/
|
||||
/* Add target in zip file. */
|
||||
/***********************************************************************/
|
||||
bool ZIPUTIL::addEntry(PGLOBAL g, char *entry)
|
||||
bool ZIPUTIL::addEntry(PGLOBAL g, PCSZ entry)
|
||||
{
|
||||
//?? we dont need the stinking time
|
||||
zip_fileinfo zi = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
@@ -382,10 +382,11 @@ void ZIPUTIL::closeEntry()
|
||||
/***********************************************************************/
|
||||
/* Constructors. */
|
||||
/***********************************************************************/
|
||||
UNZIPUTL::UNZIPUTL(PSZ tgt, bool mul)
|
||||
UNZIPUTL::UNZIPUTL(PCSZ tgt, bool mul)
|
||||
{
|
||||
zipfile = NULL;
|
||||
target = tgt;
|
||||
pwd = NULL;
|
||||
fp = NULL;
|
||||
memory = NULL;
|
||||
size = 0;
|
||||
@@ -401,6 +402,26 @@ UNZIPUTL::UNZIPUTL(PSZ tgt, bool mul)
|
||||
#endif
|
||||
} // end of UNZIPUTL standard constructor
|
||||
|
||||
UNZIPUTL::UNZIPUTL(PDOSDEF tdp)
|
||||
{
|
||||
zipfile = NULL;
|
||||
target = tdp->GetEntry();
|
||||
pwd = tdp->Pwd;
|
||||
fp = NULL;
|
||||
memory = NULL;
|
||||
size = 0;
|
||||
entryopen = false;
|
||||
multiple = tdp->GetMul();
|
||||
memset(fn, 0, sizeof(fn));
|
||||
|
||||
// Init the case mapping table.
|
||||
#if defined(__WIN__)
|
||||
for (int i = 0; i < 256; ++i) mapCaseTable[i] = toupper(i);
|
||||
#else
|
||||
for (int i = 0; i < 256; ++i) mapCaseTable[i] = i;
|
||||
#endif
|
||||
} // end of UNZIPUTL standard constructor
|
||||
|
||||
#if 0
|
||||
UNZIPUTL::UNZIPUTL(PZIPUTIL zutp)
|
||||
{
|
||||
@@ -418,8 +439,8 @@ UNZIPUTL::UNZIPUTL(PZIPUTIL zutp)
|
||||
/* This code is the copyright property of Alessandro Felice Cantatore. */
|
||||
/* http://xoomer.virgilio.it/acantato/dev/wildcard/wildmatch.html */
|
||||
/***********************************************************************/
|
||||
bool UNZIPUTL::WildMatch(PSZ pat, PSZ str) {
|
||||
PSZ s, p;
|
||||
bool UNZIPUTL::WildMatch(PCSZ pat, PCSZ str) {
|
||||
PCSZ s, p;
|
||||
bool star = FALSE;
|
||||
|
||||
loopStart:
|
||||
@@ -434,7 +455,7 @@ loopStart:
|
||||
if (!*++pat) return TRUE;
|
||||
goto loopStart;
|
||||
default:
|
||||
if (mapCaseTable[(uchar)*s] != mapCaseTable[(uchar)*p])
|
||||
if (mapCaseTable[(uint)*s] != mapCaseTable[(uint)*p])
|
||||
goto starCheck;
|
||||
break;
|
||||
} /* endswitch */
|
||||
@@ -453,7 +474,7 @@ starCheck:
|
||||
/* param: filename path and the filename of the zip file to open. */
|
||||
/* return: true if open, false otherwise. */
|
||||
/***********************************************************************/
|
||||
bool UNZIPUTL::open(PGLOBAL g, char *filename)
|
||||
bool UNZIPUTL::open(PGLOBAL g, PCSZ filename)
|
||||
{
|
||||
if (!zipfile && !(zipfile = unzOpen64(filename)))
|
||||
sprintf(g->Message, "Zipfile open error on %s", filename);
|
||||
@@ -543,7 +564,7 @@ int UNZIPUTL::nextEntry(PGLOBAL g)
|
||||
/***********************************************************************/
|
||||
/* OpenTableFile: Open a DOS/UNIX table file from a ZIP file. */
|
||||
/***********************************************************************/
|
||||
bool UNZIPUTL::OpenTable(PGLOBAL g, MODE mode, char *fn)
|
||||
bool UNZIPUTL::OpenTable(PGLOBAL g, MODE mode, PCSZ fn)
|
||||
{
|
||||
/*********************************************************************/
|
||||
/* The file will be decompressed into virtual memory. */
|
||||
@@ -581,7 +602,7 @@ bool UNZIPUTL::OpenTable(PGLOBAL g, MODE mode, char *fn)
|
||||
if (openEntry(g))
|
||||
return true;
|
||||
|
||||
if (size > 0) {
|
||||
if (size > 0) {
|
||||
/*******************************************************************/
|
||||
/* Link a Fblock. This make possible to automatically close it */
|
||||
/* in case of error g->jump. */
|
||||
@@ -612,6 +633,28 @@ bool UNZIPUTL::OpenTable(PGLOBAL g, MODE mode, char *fn)
|
||||
return false;
|
||||
} // end of OpenTableFile
|
||||
|
||||
/***********************************************************************/
|
||||
/* Insert only if the entry does not exist. */
|
||||
/***********************************************************************/
|
||||
bool UNZIPUTL::IsInsertOk(PGLOBAL g, PCSZ fn)
|
||||
{
|
||||
bool ok = true, b = open(g, fn);
|
||||
|
||||
if (!b) {
|
||||
if (!target || *target == 0) {
|
||||
unz_global_info64 ginfo;
|
||||
int err = unzGetGlobalInfo64(zipfile, &ginfo);
|
||||
|
||||
ok = !(err == UNZ_OK && ginfo.number_entry > 0);
|
||||
} else // Check if the target exist
|
||||
ok = (unzLocateFile(zipfile, target, 0) != UNZ_OK);
|
||||
|
||||
unzClose(zipfile);
|
||||
} // endif b
|
||||
|
||||
return ok;
|
||||
} // end of IsInsertOk
|
||||
|
||||
/***********************************************************************/
|
||||
/* Open target in zip file. */
|
||||
/***********************************************************************/
|
||||
@@ -625,18 +668,24 @@ bool UNZIPUTL::openEntry(PGLOBAL g)
|
||||
if (rc != UNZ_OK) {
|
||||
sprintf(g->Message, "unzGetCurrentFileInfo64 rc=%d", rc);
|
||||
return true;
|
||||
} else if ((rc = unzOpenCurrentFile(zipfile)) != UNZ_OK) {
|
||||
} else if ((rc = unzOpenCurrentFilePassword(zipfile, pwd)) != UNZ_OK) {
|
||||
sprintf(g->Message, "unzOpen fn=%s rc=%d", fn, rc);
|
||||
return true;
|
||||
} // endif rc
|
||||
|
||||
size = finfo.uncompressed_size;
|
||||
memory = new char[size + 1];
|
||||
|
||||
try {
|
||||
memory = new char[size + 1];
|
||||
} catch (...) {
|
||||
strcpy(g->Message, "Out of memory");
|
||||
return true;
|
||||
} // end try/catch
|
||||
|
||||
if ((rc = unzReadCurrentFile(zipfile, memory, size)) < 0) {
|
||||
sprintf(g->Message, "unzReadCurrentFile rc = %d", rc);
|
||||
unzCloseCurrentFile(zipfile);
|
||||
free(memory);
|
||||
delete[] memory;
|
||||
memory = NULL;
|
||||
entryopen = false;
|
||||
} else {
|
||||
@@ -661,7 +710,7 @@ void UNZIPUTL::closeEntry()
|
||||
} // endif entryopen
|
||||
|
||||
if (memory) {
|
||||
free(memory);
|
||||
delete[] memory;
|
||||
memory = NULL;
|
||||
} // endif memory
|
||||
|
||||
@@ -675,15 +724,17 @@ void UNZIPUTL::closeEntry()
|
||||
UNZFAM::UNZFAM(PDOSDEF tdp) : MAPFAM(tdp)
|
||||
{
|
||||
zutp = NULL;
|
||||
target = tdp->GetEntry();
|
||||
mul = tdp->GetMul();
|
||||
tdfp = tdp;
|
||||
//target = tdp->GetEntry();
|
||||
//mul = tdp->GetMul();
|
||||
} // end of UNZFAM standard constructor
|
||||
|
||||
UNZFAM::UNZFAM(PUNZFAM txfp) : MAPFAM(txfp)
|
||||
{
|
||||
zutp = txfp->zutp;
|
||||
target = txfp->target;
|
||||
mul = txfp->mul;
|
||||
tdfp = txfp->tdfp;
|
||||
//target = txfp->target;
|
||||
//mul = txfp->mul;
|
||||
} // end of UNZFAM copy constructor
|
||||
|
||||
/***********************************************************************/
|
||||
@@ -711,7 +762,13 @@ int UNZFAM::Cardinality(PGLOBAL g)
|
||||
int card = -1;
|
||||
int len = GetFileLength(g);
|
||||
|
||||
card = (len / (int)Lrecl) * 2; // Estimated ???
|
||||
if (len) {
|
||||
// Estimated ???
|
||||
card = (len / (int)Lrecl) * 2;
|
||||
card = card ? card : 10; // Lrecl can be too big
|
||||
} else
|
||||
card = 0;
|
||||
|
||||
return card;
|
||||
} // end of Cardinality
|
||||
|
||||
@@ -726,7 +783,7 @@ bool UNZFAM::OpenTableFile(PGLOBAL g)
|
||||
/*********************************************************************/
|
||||
/* Allocate the ZIP utility class. */
|
||||
/*********************************************************************/
|
||||
zutp = new(g) UNZIPUTL(target, mul);
|
||||
zutp = new(g) UNZIPUTL(tdfp);
|
||||
|
||||
// We used the file name relative to recorded datapath
|
||||
PlugSetPath(filename, To_File, Tdbp->GetPath());
|
||||
@@ -841,17 +898,19 @@ void UNZFAM::CloseTableFile(PGLOBAL g, bool)
|
||||
UZXFAM::UZXFAM(PDOSDEF tdp) : MPXFAM(tdp)
|
||||
{
|
||||
zutp = NULL;
|
||||
target = tdp->GetEntry();
|
||||
mul = tdp->GetMul();
|
||||
tdfp = tdp;
|
||||
//target = tdp->GetEntry();
|
||||
//mul = tdp->GetMul();
|
||||
//Lrecl = tdp->GetLrecl();
|
||||
} // end of UZXFAM standard constructor
|
||||
|
||||
UZXFAM::UZXFAM(PUZXFAM txfp) : MPXFAM(txfp)
|
||||
{
|
||||
zutp = txfp->zutp;
|
||||
target = txfp->target;
|
||||
mul = txfp->mul;
|
||||
//Lrecl = txfp->Lrecl;
|
||||
tdfp = txfp->tdfp;
|
||||
//target = txfp->target;
|
||||
//mul = txfp->mul;
|
||||
//Lrecl = txfp->Lrecl;
|
||||
} // end of UZXFAM copy constructor
|
||||
|
||||
/***********************************************************************/
|
||||
@@ -907,7 +966,7 @@ bool UZXFAM::OpenTableFile(PGLOBAL g)
|
||||
/* Allocate the ZIP utility class. */
|
||||
/*********************************************************************/
|
||||
if (!zutp)
|
||||
zutp = new(g)UNZIPUTL(target, mul);
|
||||
zutp = new(g)UNZIPUTL(tdfp);
|
||||
|
||||
// We used the file name relative to recorded datapath
|
||||
PlugSetPath(filename, To_File, Tdbp->GetPath());
|
||||
@@ -969,6 +1028,25 @@ bool ZIPFAM::OpenTableFile(PGLOBAL g)
|
||||
{
|
||||
char filename[_MAX_PATH];
|
||||
MODE mode = Tdbp->GetMode();
|
||||
int len = TXTFAM::GetFileLength(g);
|
||||
|
||||
// We used the file name relative to recorded datapath
|
||||
PlugSetPath(filename, To_File, Tdbp->GetPath());
|
||||
|
||||
if (len < 0)
|
||||
return true;
|
||||
else if (!append && len > 0) {
|
||||
strcpy(g->Message, "No insert into existing zip file");
|
||||
return true;
|
||||
} else if (append && len > 0) {
|
||||
UNZIPUTL *zutp = new(g) UNZIPUTL(target, false);
|
||||
|
||||
if (!zutp->IsInsertOk(g, filename)) {
|
||||
strcpy(g->Message, "No insert into existing entry");
|
||||
return true;
|
||||
} // endif Ok
|
||||
|
||||
} // endif's
|
||||
|
||||
/*********************************************************************/
|
||||
/* Allocate the ZIP utility class. */
|
||||
@@ -1028,15 +1106,31 @@ ZPXFAM::ZPXFAM(PDOSDEF tdp) : FIXFAM(tdp)
|
||||
target = tdp->GetEntry();
|
||||
append = tdp->GetAppend();
|
||||
//Lrecl = tdp->GetLrecl();
|
||||
} // end of UZXFAM standard constructor
|
||||
} // end of ZPXFAM standard constructor
|
||||
|
||||
/***********************************************************************/
|
||||
/* OpenTableFile: Open a DOS/UNIX table file from a ZIP file. */
|
||||
/***********************************************************************/
|
||||
bool ZPXFAM::OpenTableFile(PGLOBAL g)
|
||||
{
|
||||
char filename[_MAX_PATH];
|
||||
MODE mode = Tdbp->GetMode();
|
||||
char filename[_MAX_PATH];
|
||||
MODE mode = Tdbp->GetMode();
|
||||
int len = TXTFAM::GetFileLength(g);
|
||||
|
||||
if (len < 0)
|
||||
return true;
|
||||
else if (!append && len > 0) {
|
||||
strcpy(g->Message, "No insert into existing zip file");
|
||||
return true;
|
||||
} else if (append && len > 0) {
|
||||
UNZIPUTL *zutp = new(g) UNZIPUTL(target, false);
|
||||
|
||||
if (!zutp->IsInsertOk(g, filename)) {
|
||||
strcpy(g->Message, "No insert into existing entry");
|
||||
return true;
|
||||
} // endif Ok
|
||||
|
||||
} // endif's
|
||||
|
||||
/*********************************************************************/
|
||||
/* Allocate the ZIP utility class. */
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/************** filamzip H Declares Source Code File (.H) **************/
|
||||
/* Name: filamzip.h Version 1.1 */
|
||||
/* Name: filamzip.h Version 1.2 */
|
||||
/* */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2016-2017 */
|
||||
/* */
|
||||
@@ -27,16 +27,13 @@ typedef class ZPXFAM *PZPXFAM;
|
||||
class DllExport ZIPUTIL : public BLOCK {
|
||||
public:
|
||||
// Constructor
|
||||
ZIPUTIL(PSZ tgt);
|
||||
ZIPUTIL(PCSZ tgt);
|
||||
//ZIPUTIL(ZIPUTIL *zutp);
|
||||
|
||||
// Implementation
|
||||
//PTXF Duplicate(PGLOBAL g) { return (PTXF) new(g)UNZFAM(this); }
|
||||
|
||||
// Methods
|
||||
bool OpenTable(PGLOBAL g, MODE mode, char *fn, bool append);
|
||||
bool open(PGLOBAL g, char *fn, bool append);
|
||||
bool addEntry(PGLOBAL g, char *entry);
|
||||
bool OpenTable(PGLOBAL g, MODE mode, PCSZ fn, bool append);
|
||||
bool open(PGLOBAL g, PCSZ fn, bool append);
|
||||
bool addEntry(PGLOBAL g, PCSZ entry);
|
||||
void close(void);
|
||||
void closeEntry(void);
|
||||
int writeEntry(PGLOBAL g, char *buf, int len);
|
||||
@@ -44,15 +41,10 @@ class DllExport ZIPUTIL : public BLOCK {
|
||||
|
||||
// Members
|
||||
zipFile zipfile; // The ZIP container file
|
||||
PSZ target; // The target file name
|
||||
//unz_file_info finfo; // The current file info
|
||||
PCSZ target; // The target file name
|
||||
PCSZ pwd; // The ZIP file password
|
||||
PFBLOCK fp;
|
||||
//char *memory;
|
||||
//uint size;
|
||||
//int multiple; // Multiple targets
|
||||
bool entryopen; // True when open current entry
|
||||
//char fn[FILENAME_MAX]; // The current entry file name
|
||||
//char mapCaseTable[256];
|
||||
}; // end of ZIPUTIL
|
||||
|
||||
/***********************************************************************/
|
||||
@@ -61,25 +53,27 @@ class DllExport ZIPUTIL : public BLOCK {
|
||||
class DllExport UNZIPUTL : public BLOCK {
|
||||
public:
|
||||
// Constructor
|
||||
UNZIPUTL(PSZ tgt, bool mul);
|
||||
//UNZIPUTL(UNZIPUTL *zutp);
|
||||
UNZIPUTL(PCSZ tgt, bool mul);
|
||||
UNZIPUTL(PDOSDEF tdp);
|
||||
|
||||
// Implementation
|
||||
//PTXF Duplicate(PGLOBAL g) { return (PTXF) new(g)UNZFAM(this); }
|
||||
|
||||
// Methods
|
||||
bool OpenTable(PGLOBAL g, MODE mode, char *fn);
|
||||
bool open(PGLOBAL g, char *fn);
|
||||
bool OpenTable(PGLOBAL g, MODE mode, PCSZ fn);
|
||||
bool open(PGLOBAL g, PCSZ fn);
|
||||
bool openEntry(PGLOBAL g);
|
||||
void close(void);
|
||||
void closeEntry(void);
|
||||
bool WildMatch(PSZ pat, PSZ str);
|
||||
bool WildMatch(PCSZ pat, PCSZ str);
|
||||
int findEntry(PGLOBAL g, bool next);
|
||||
int nextEntry(PGLOBAL g);
|
||||
bool IsInsertOk(PGLOBAL g, PCSZ fn);
|
||||
|
||||
// Members
|
||||
unzFile zipfile; // The ZIP container file
|
||||
PSZ target; // The target file name
|
||||
PCSZ target; // The target file name
|
||||
PCSZ pwd; // The ZIP file password
|
||||
unz_file_info finfo; // The current file info
|
||||
PFBLOCK fp;
|
||||
char *memory;
|
||||
@@ -119,8 +113,7 @@ class DllExport UNZFAM : public MAPFAM {
|
||||
protected:
|
||||
// Members
|
||||
UNZIPUTL *zutp;
|
||||
PSZ target;
|
||||
bool mul;
|
||||
PDOSDEF tdfp;
|
||||
}; // end of UNZFAM
|
||||
|
||||
/***********************************************************************/
|
||||
@@ -147,8 +140,7 @@ class DllExport UZXFAM : public MPXFAM {
|
||||
protected:
|
||||
// Members
|
||||
UNZIPUTL *zutp;
|
||||
PSZ target;
|
||||
bool mul;
|
||||
PDOSDEF tdfp;
|
||||
}; // end of UZXFAM
|
||||
|
||||
/***********************************************************************/
|
||||
@@ -175,8 +167,9 @@ class DllExport ZIPFAM : public DOSFAM {
|
||||
protected:
|
||||
// Members
|
||||
ZIPUTIL *zutp;
|
||||
PSZ target;
|
||||
PCSZ target;
|
||||
bool append;
|
||||
//bool replace;
|
||||
}; // end of ZIPFAM
|
||||
|
||||
/***********************************************************************/
|
||||
@@ -200,7 +193,7 @@ class DllExport ZPXFAM : public FIXFAM {
|
||||
protected:
|
||||
// Members
|
||||
ZIPUTIL *zutp;
|
||||
PSZ target;
|
||||
PCSZ target;
|
||||
bool append;
|
||||
}; // end of ZPXFAM
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/***************** Filter C++ Class Filter Code (.CPP) *****************/
|
||||
/* Name: FILTER.CPP Version 3.9 */
|
||||
/* Name: FILTER.CPP Version 4.0 */
|
||||
/* */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 1998-2014 */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 1998-2017 */
|
||||
/* */
|
||||
/* This file contains the class FILTER function code. */
|
||||
/***********************************************************************/
|
||||
@@ -38,6 +38,13 @@
|
||||
//#include "token.h"
|
||||
//#include "select.h"
|
||||
#include "xindex.h"
|
||||
#if defined(MONGO_SUPPORT)
|
||||
#include "filamtxt.h"
|
||||
#include "tabdos.h"
|
||||
#include "tabjson.h"
|
||||
#include "tabext.h"
|
||||
#include "tabmgo.h"
|
||||
#endif // MONGO_SUPPORT
|
||||
|
||||
/***********************************************************************/
|
||||
/* Utility routines. */
|
||||
@@ -87,8 +94,8 @@ BYTE OpBmp(PGLOBAL g, OPVAL opc)
|
||||
case OP_EXIST: bt = 0x00; break;
|
||||
default:
|
||||
sprintf(g->Message, MSG(BAD_FILTER_OP), opc);
|
||||
longjmp(g->jumper[g->jump_level], TYPE_ARRAY);
|
||||
} // endswitch opc
|
||||
throw TYPE_ARRAY;
|
||||
} // endswitch opc
|
||||
|
||||
return bt;
|
||||
} // end of OpBmp
|
||||
@@ -1405,10 +1412,98 @@ PFIL FILTER::Copy(PTABS t)
|
||||
} // end of Copy
|
||||
#endif // 0
|
||||
|
||||
/***********************************************************************/
|
||||
/* Make selector json representation for Mongo tables. */
|
||||
/***********************************************************************/
|
||||
#if defined(MONGO_SUPPORT)
|
||||
bool FILTER::MakeSelector(PGLOBAL g, PSTRG s, bool m)
|
||||
{
|
||||
s->Append('{');
|
||||
|
||||
if (Opc == OP_AND || Opc == OP_OR) {
|
||||
if (GetArgType(0) != TYPE_FILTER || GetArgType(1) != TYPE_FILTER)
|
||||
return true;
|
||||
|
||||
s->Append("\"$");
|
||||
s->Append(Opc == OP_AND ? "and" : "or");
|
||||
s->Append("\":[");
|
||||
|
||||
if (((PFIL)Arg(0))->MakeSelector(g, s, m))
|
||||
return true;
|
||||
|
||||
s->Append(',');
|
||||
|
||||
if (((PFIL)Arg(1))->MakeSelector(g, s, m))
|
||||
return true;
|
||||
|
||||
s->Append(']');
|
||||
} else {
|
||||
char *pth, buf[501];
|
||||
|
||||
if (GetArgType(0) != TYPE_COLBLK)
|
||||
return true;
|
||||
|
||||
s->Append('"');
|
||||
|
||||
if (m)
|
||||
pth = ((PMGOCOL)Arg(0))->Jpath;
|
||||
else if (!(pth = ((PJCOL)Arg(0))->GetJpath(g, false)))
|
||||
return true;
|
||||
|
||||
s->Append(pth);
|
||||
s->Append("\":{\"$");
|
||||
|
||||
switch (Opc) {
|
||||
case OP_EQ:
|
||||
s->Append("eq");
|
||||
break;
|
||||
case OP_NE:
|
||||
s->Append("ne");
|
||||
break;
|
||||
case OP_GT:
|
||||
s->Append("gt");
|
||||
break;
|
||||
case OP_GE:
|
||||
s->Append("gte");
|
||||
break;
|
||||
case OP_LT:
|
||||
s->Append("lt");
|
||||
break;
|
||||
case OP_LE:
|
||||
s->Append("lte");
|
||||
break;
|
||||
//case OP_NULL:
|
||||
// s->Append("ne");
|
||||
// break;
|
||||
//case OP_LIKE:
|
||||
// s->Append("ne");
|
||||
// break;
|
||||
//case OP_EXIST:
|
||||
// s->Append("ne");
|
||||
// break;
|
||||
default:
|
||||
return true;
|
||||
} // endswitch Opc
|
||||
|
||||
s->Append("\":");
|
||||
|
||||
if (GetArgType(1) == TYPE_COLBLK)
|
||||
return true;
|
||||
|
||||
Arg(1)->Prints(g, buf, 500);
|
||||
s->Append(buf);
|
||||
s->Append('}');
|
||||
} // endif Opc
|
||||
|
||||
s->Append('}');
|
||||
return false;
|
||||
} // end of MakeSelector
|
||||
#endif // MONGO_SUPPORT
|
||||
|
||||
/*********************************************************************/
|
||||
/* Make file output of FILTER contents. */
|
||||
/*********************************************************************/
|
||||
void FILTER::Print(PGLOBAL g, FILE *f, uint n)
|
||||
void FILTER::Printf(PGLOBAL g, FILE *f, uint n)
|
||||
{
|
||||
char m[64];
|
||||
|
||||
@@ -1430,18 +1525,18 @@ void FILTER::Print(PGLOBAL g, FILE *f, uint n)
|
||||
if (lin && fp->GetArgType(i) == TYPE_FILTER)
|
||||
fprintf(f, "%s Filter at %p\n", m, fp->Arg(i));
|
||||
else
|
||||
fp->Arg(i)->Print(g, f, n + 2);
|
||||
fp->Arg(i)->Printf(g, f, n + 2);
|
||||
|
||||
} // endfor i
|
||||
|
||||
} // endfor fp
|
||||
|
||||
} // end of Print
|
||||
} // end of Printf
|
||||
|
||||
/***********************************************************************/
|
||||
/* Make string output of TABLE contents (z should be checked). */
|
||||
/***********************************************************************/
|
||||
void FILTER::Print(PGLOBAL g, char *ps, uint z)
|
||||
void FILTER::Prints(PGLOBAL g, char *ps, uint z)
|
||||
{
|
||||
#define FLEN 100
|
||||
|
||||
@@ -1469,7 +1564,7 @@ void FILTER::Print(PGLOBAL g, char *ps, uint z)
|
||||
bcp = bxp;
|
||||
p = bcp->Cold;
|
||||
n = FLEN;
|
||||
fp->Arg(0)->Print(g, p, n);
|
||||
fp->Arg(0)->Prints(g, p, n);
|
||||
n = FLEN - strlen(p);
|
||||
|
||||
switch (fp->Opc) {
|
||||
@@ -1515,7 +1610,7 @@ void FILTER::Print(PGLOBAL g, char *ps, uint z)
|
||||
|
||||
n = FLEN - strlen(p);
|
||||
p += strlen(p);
|
||||
fp->Arg(1)->Print(g, p, n);
|
||||
fp->Arg(1)->Prints(g, p, n);
|
||||
} else
|
||||
if (!bcp) {
|
||||
strncat(ps, "???", z);
|
||||
@@ -1578,7 +1673,7 @@ void FILTER::Print(PGLOBAL g, char *ps, uint z)
|
||||
bcp = bxp;
|
||||
} while (bcp); // enddo
|
||||
|
||||
} // end of Print
|
||||
} // end of Prints
|
||||
|
||||
|
||||
/* -------------------- Derived Classes Functions -------------------- */
|
||||
@@ -1696,8 +1791,6 @@ PFIL PrepareFilter(PGLOBAL g, PFIL fp, bool having)
|
||||
|
||||
if (trace)
|
||||
htrc("PrepareFilter: fp=%p having=%d\n", fp, having);
|
||||
//if (fp)
|
||||
// fp->Print(g, debug, 0);
|
||||
|
||||
while (fp) {
|
||||
if (fp->Opc == OP_SEP)
|
||||
@@ -1711,7 +1804,7 @@ PFIL PrepareFilter(PGLOBAL g, PFIL fp, bool having)
|
||||
break; // Remove eventual ending separator(s)
|
||||
|
||||
// if (fp->Convert(g, having))
|
||||
// longjmp(g->jumper[g->jump_level], TYPE_FILTER);
|
||||
// throw TYPE_ARRAY;
|
||||
|
||||
filp = fp;
|
||||
fp = fp->Next;
|
||||
@@ -1744,7 +1837,7 @@ DllExport bool ApplyFilter(PGLOBAL g, PFIL filp)
|
||||
// return TRUE;
|
||||
|
||||
if (filp->Eval(g))
|
||||
longjmp(g->jumper[g->jump_level], TYPE_FILTER);
|
||||
throw TYPE_FILTER;
|
||||
|
||||
if (trace > 1)
|
||||
htrc("PlugFilter filp=%p result=%d\n",
|
||||
|
@@ -61,8 +61,11 @@ class DllExport FILTER : public XOBJECT { /* Filter description block */
|
||||
//virtual PXOB CheckSubQuery(PGLOBAL, PSQL);
|
||||
//virtual bool CheckLocal(PTDB);
|
||||
//virtual int CheckSpcCol(PTDB tdbp, int n);
|
||||
virtual void Print(PGLOBAL g, FILE *f, uint n);
|
||||
virtual void Print(PGLOBAL g, char *ps, uint z);
|
||||
#if defined(MONGO_SUPPORT)
|
||||
bool MakeSelector(PGLOBAL g, PSTRG s, bool m);
|
||||
#endif // MONGO_SUPPORT
|
||||
virtual void Printf(PGLOBAL g, FILE *f, uint n);
|
||||
virtual void Prints(PGLOBAL g, char *ps, uint z);
|
||||
// PFIL Linearize(bool nosep);
|
||||
// PFIL Link(PGLOBAL g, PFIL fil2);
|
||||
// PFIL RemoveLastSep(void);
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/***********************************************************************/
|
||||
/* GLOBAL.H: Declaration file used by all CONNECT implementations. */
|
||||
/* (C) Copyright Olivier Bertrand 1993-2014 */
|
||||
/* (C) Copyright Olivier Bertrand 1993-2017 */
|
||||
/***********************************************************************/
|
||||
|
||||
/***********************************************************************/
|
||||
@@ -59,7 +59,7 @@
|
||||
#define NO_IVAL -95684275 /* Used by GetIntegerOption */
|
||||
#define VMLANG 370 /* Size of olf VM lang blocks */
|
||||
#define MAX_JUMP 24 /* Maximum jump level number */
|
||||
#define MAX_STR 1024 /* Maximum string length */
|
||||
#define MAX_STR 4160 /* Maximum message length */
|
||||
#define STR_SIZE 501 /* Length of char strings. */
|
||||
#define STD_INPUT 0 /* Standard language input */
|
||||
#define STD_OUTPUT 1 /* Standard language output */
|
||||
@@ -90,6 +90,7 @@
|
||||
#define TYPE_BIGINT 5
|
||||
#define TYPE_LIST 6
|
||||
#define TYPE_INT 7
|
||||
#define TYPE_DATE 8
|
||||
#define TYPE_DECIM 9
|
||||
#define TYPE_BIN 10
|
||||
#define TYPE_PCHAR 11
|
||||
@@ -229,9 +230,10 @@ typedef struct _parm {
|
||||
typedef struct _global { /* Global structure */
|
||||
void *Sarea; /* Points to work area */
|
||||
uint Sarea_Size; /* Work area size */
|
||||
PACTIVITY Activityp, ActivityStart;
|
||||
PACTIVITY Activityp;
|
||||
char Message[MAX_STR];
|
||||
int Createas; /* To pass info to created table */
|
||||
ulong More; /* Used by jsonudf */
|
||||
int Createas; /* To pass info to created table */
|
||||
void *Xchk; /* indexes in create/alter */
|
||||
short Alchecked; /* Checked for ALTER */
|
||||
short Mrr; /* True when doing mrr */
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -61,7 +61,7 @@ public:
|
||||
oldopn= newopn= NULL;
|
||||
oldpix= newpix= NULL;}
|
||||
|
||||
inline char *SetName(PGLOBAL g, char *name) {return PlugDup(g, name);}
|
||||
inline char *SetName(PGLOBAL g, PCSZ name) {return PlugDup(g, name);}
|
||||
|
||||
bool oldsep; // Sepindex before create/alter
|
||||
bool newsep; // Sepindex after create/alter
|
||||
@@ -168,18 +168,18 @@ public:
|
||||
static bool connect_init(void);
|
||||
static bool connect_end(void);
|
||||
TABTYPE GetRealType(PTOS pos= NULL);
|
||||
char *GetRealString(const char *s);
|
||||
char *GetStringOption(char *opname, char *sdef= NULL);
|
||||
char *GetRealString(PCSZ s);
|
||||
PCSZ GetStringOption(PCSZ opname, PCSZ sdef= NULL);
|
||||
PTOS GetTableOptionStruct(TABLE_SHARE *s= NULL);
|
||||
bool GetBooleanOption(char *opname, bool bdef);
|
||||
bool SetBooleanOption(char *opname, bool b);
|
||||
int GetIntegerOption(char *opname);
|
||||
bool GetIndexOption(KEY *kp, char *opname);
|
||||
bool CheckString(const char *str1, const char *str2);
|
||||
bool SameString(TABLE *tab, char *opn);
|
||||
bool SetIntegerOption(char *opname, int n);
|
||||
bool SameInt(TABLE *tab, char *opn);
|
||||
bool SameBool(TABLE *tab, char *opn);
|
||||
bool GetBooleanOption(PCSZ opname, bool bdef);
|
||||
bool SetBooleanOption(PCSZ opname, bool b);
|
||||
int GetIntegerOption(PCSZ opname);
|
||||
bool GetIndexOption(KEY *kp, PCSZ opname);
|
||||
bool CheckString(PCSZ str1, PCSZ str2);
|
||||
bool SameString(TABLE *tab, PCSZ opn);
|
||||
bool SetIntegerOption(PCSZ opname, int n);
|
||||
bool SameInt(TABLE *tab, PCSZ opn);
|
||||
bool SameBool(TABLE *tab, PCSZ opn);
|
||||
bool FileExists(const char *fn, bool bf);
|
||||
bool NoFieldOptionChange(TABLE *tab);
|
||||
PFOS GetFieldOptionStruct(Field *fp);
|
||||
@@ -187,8 +187,8 @@ public:
|
||||
PXOS GetIndexOptionStruct(KEY *kp);
|
||||
PIXDEF GetIndexInfo(TABLE_SHARE *s= NULL);
|
||||
bool CheckVirtualIndex(TABLE_SHARE *s);
|
||||
const char *GetDBName(const char *name);
|
||||
const char *GetTableName(void);
|
||||
PCSZ GetDBName(PCSZ name);
|
||||
PCSZ GetTableName(void);
|
||||
char *GetPartName(void);
|
||||
//int GetColNameLen(Field *fp);
|
||||
//char *GetColName(Field *fp);
|
||||
@@ -197,9 +197,9 @@ public:
|
||||
bool IsSameIndex(PIXDEF xp1, PIXDEF xp2);
|
||||
bool IsPartitioned(void);
|
||||
bool IsUnique(uint n);
|
||||
char *GetDataPath(void) {return (char*)datapath;}
|
||||
PCSZ GetDataPath(void) {return datapath;}
|
||||
|
||||
void SetDataPath(PGLOBAL g, const char *path);
|
||||
bool SetDataPath(PGLOBAL g, PCSZ path);
|
||||
PTDB GetTDB(PGLOBAL g);
|
||||
int OpenTable(PGLOBAL g, bool del= false);
|
||||
bool CheckColumnList(PGLOBAL g);
|
||||
@@ -513,7 +513,7 @@ protected:
|
||||
ulong hnum; // The number of this handler
|
||||
query_id_t valid_query_id; // The one when tdbp was allocated
|
||||
query_id_t creat_query_id; // The one when handler was allocated
|
||||
char *datapath; // Is the Path of DB data directory
|
||||
PCSZ datapath; // Is the Path of DB data directory
|
||||
PTDB tdbp; // To table class object
|
||||
PVAL sdvalin1; // Used to convert date values
|
||||
PVAL sdvalin2; // Used to convert date values
|
||||
|
@@ -193,7 +193,7 @@ static void PROFILE_Save( FILE *file, PROFILESECTION *section )
|
||||
}
|
||||
|
||||
for (key = section->key; key; key = key->next)
|
||||
if (key->name[0]) {
|
||||
if (key->name && key->name[0]) {
|
||||
fprintf(file, "%s", SVP(key->name));
|
||||
|
||||
if (key->value)
|
||||
|
@@ -4,10 +4,10 @@
|
||||
|
||||
typedef struct jdbc_parms {
|
||||
int CheckSize(int rows);
|
||||
char *Driver; // JDBC driver
|
||||
char *Url; // Driver URL
|
||||
char *User; // User connect info
|
||||
char *Pwd; // Password connect info
|
||||
PCSZ Driver; // JDBC driver
|
||||
PCSZ Url; // Driver URL
|
||||
PCSZ User; // User connect info
|
||||
PCSZ Pwd; // Password connect info
|
||||
//char *Properties; // Connection property list
|
||||
//int Cto; // Connect timeout
|
||||
//int Qto; // Query timeout
|
||||
@@ -19,12 +19,12 @@ typedef struct jdbc_parms {
|
||||
/* JDBC catalog function prototypes. */
|
||||
/***********************************************************************/
|
||||
#if defined(PROMPT_OK)
|
||||
char *JDBCCheckConnection(PGLOBAL g, char *dsn, int cop);
|
||||
char *JDBCCheckConnection(PGLOBAL g, PCSZ dsn, int cop);
|
||||
#endif // PROMPT_OK
|
||||
//PQRYRES JDBCDataSources(PGLOBAL g, int maxres, bool info);
|
||||
PQRYRES JDBCColumns(PGLOBAL g, char *db, char *table,
|
||||
char *colpat, int maxres, bool info, PJPARM sop);
|
||||
PQRYRES JDBCSrcCols(PGLOBAL g, char *src, PJPARM sop);
|
||||
PQRYRES JDBCTables(PGLOBAL g, char *db, char *tabpat,
|
||||
char *tabtyp, int maxres, bool info, PJPARM sop);
|
||||
PQRYRES JDBCColumns(PGLOBAL g, PCSZ db, PCSZ table,
|
||||
PCSZ colpat, int maxres, bool info, PJPARM sop);
|
||||
PQRYRES JDBCSrcCols(PGLOBAL g, PCSZ src, PJPARM sop);
|
||||
PQRYRES JDBCTables(PGLOBAL g, PCSZ db, PCSZ tabpat,
|
||||
PCSZ tabtyp, int maxres, bool info, PJPARM sop);
|
||||
PQRYRES JDBCDrivers(PGLOBAL g, int maxres, bool info);
|
||||
|
@@ -189,8 +189,8 @@ int TranslateJDBCType(int stp, char *tn, int prec, int& len, char& v)
|
||||
/***********************************************************************/
|
||||
/* Allocate the structure used to refer to the result set. */
|
||||
/***********************************************************************/
|
||||
static JCATPARM *AllocCatInfo(PGLOBAL g, JCATINFO fid, char *db,
|
||||
char *tab, PQRYRES qrp)
|
||||
static JCATPARM *AllocCatInfo(PGLOBAL g, JCATINFO fid, PCSZ db,
|
||||
PCSZ tab, PQRYRES qrp)
|
||||
{
|
||||
JCATPARM *cap;
|
||||
|
||||
@@ -213,7 +213,7 @@ static JCATPARM *AllocCatInfo(PGLOBAL g, JCATINFO fid, char *db,
|
||||
/* JDBCColumns: constructs the result blocks containing all columns */
|
||||
/* of a JDBC table that will be retrieved by GetData commands. */
|
||||
/***********************************************************************/
|
||||
PQRYRES JDBCColumns(PGLOBAL g, char *db, char *table, char *colpat,
|
||||
PQRYRES JDBCColumns(PGLOBAL g, PCSZ db, PCSZ table, PCSZ colpat,
|
||||
int maxres, bool info, PJPARM sjp)
|
||||
{
|
||||
int buftyp[] = {TYPE_STRING, TYPE_STRING, TYPE_STRING, TYPE_STRING,
|
||||
@@ -316,7 +316,7 @@ PQRYRES JDBCColumns(PGLOBAL g, char *db, char *table, char *colpat,
|
||||
/* JDBCSrcCols: constructs the result blocks containing the */
|
||||
/* description of all the columns of a Srcdef option. */
|
||||
/**************************************************************************/
|
||||
PQRYRES JDBCSrcCols(PGLOBAL g, char *src, PJPARM sjp)
|
||||
PQRYRES JDBCSrcCols(PGLOBAL g, PCSZ src, PJPARM sjp)
|
||||
{
|
||||
char *sqry;
|
||||
PQRYRES qrp;
|
||||
@@ -330,7 +330,7 @@ PQRYRES JDBCSrcCols(PGLOBAL g, char *src, PJPARM sjp)
|
||||
sqry = (char*)PlugSubAlloc(g, NULL, strlen(src) + 2);
|
||||
sprintf(sqry, src, "1=1"); // dummy where clause
|
||||
} else
|
||||
sqry = src;
|
||||
sqry = (char*)src;
|
||||
|
||||
qrp = jcp->GetMetaData(g, sqry);
|
||||
jcp->Close();
|
||||
@@ -341,7 +341,7 @@ PQRYRES JDBCSrcCols(PGLOBAL g, char *src, PJPARM sjp)
|
||||
/* JDBCTables: constructs the result blocks containing all tables in */
|
||||
/* an JDBC database that will be retrieved by GetData commands. */
|
||||
/**************************************************************************/
|
||||
PQRYRES JDBCTables(PGLOBAL g, char *db, char *tabpat, char *tabtyp,
|
||||
PQRYRES JDBCTables(PGLOBAL g, PCSZ db, PCSZ tabpat, PCSZ tabtyp,
|
||||
int maxres, bool info, PJPARM sjp)
|
||||
{
|
||||
int buftyp[] = {TYPE_STRING, TYPE_STRING, TYPE_STRING,
|
||||
@@ -1059,7 +1059,7 @@ int JDBConn::Open(PJPARM sop)
|
||||
/***********************************************************************/
|
||||
/* Execute an SQL command. */
|
||||
/***********************************************************************/
|
||||
int JDBConn::ExecSQLcommand(char *sql)
|
||||
int JDBConn::ExecSQLcommand(PCSZ sql)
|
||||
{
|
||||
int rc;
|
||||
jint n;
|
||||
@@ -1142,7 +1142,7 @@ int JDBConn::Fetch(int pos)
|
||||
/***********************************************************************/
|
||||
/* Restart from beginning of result set */
|
||||
/***********************************************************************/
|
||||
int JDBConn::Rewind(char *sql)
|
||||
int JDBConn::Rewind(PCSZ sql)
|
||||
{
|
||||
int rbuf = -1;
|
||||
|
||||
@@ -1200,7 +1200,7 @@ void JDBConn::SetColumnValue(int rank, PSZ name, PVAL val)
|
||||
if (rank == 0)
|
||||
if (!name || (jn = env->NewStringUTF(name)) == nullptr) {
|
||||
sprintf(g->Message, "Fail to allocate jstring %s", SVP(name));
|
||||
longjmp(g->jumper[g->jump_level], TYPE_AM_JDBC);
|
||||
throw TYPE_AM_JDBC;
|
||||
} // endif name
|
||||
|
||||
// Returns 666 is case of error
|
||||
@@ -1208,7 +1208,7 @@ void JDBConn::SetColumnValue(int rank, PSZ name, PVAL val)
|
||||
|
||||
if (Check((ctyp == 666) ? -1 : 1)) {
|
||||
sprintf(g->Message, "Getting ctyp: %s", Msg);
|
||||
longjmp(g->jumper[g->jump_level], TYPE_AM_JDBC);
|
||||
throw TYPE_AM_JDBC;
|
||||
} // endif Check
|
||||
|
||||
if (val->GetNullable())
|
||||
@@ -1227,7 +1227,8 @@ void JDBConn::SetColumnValue(int rank, PSZ name, PVAL val)
|
||||
case 12: // VARCHAR
|
||||
case -1: // LONGVARCHAR
|
||||
case 1: // CHAR
|
||||
if (jb)
|
||||
case 3: // DECIMAL
|
||||
if (jb && ctyp != 3)
|
||||
cn = (jstring)jb;
|
||||
else if (!gmID(g, chrfldid, "StringField", "(ILjava/lang/String;)Ljava/lang/String;"))
|
||||
cn = (jstring)env->CallObjectMethod(job, chrfldid, (jint)rank, jn);
|
||||
@@ -1253,7 +1254,7 @@ void JDBConn::SetColumnValue(int rank, PSZ name, PVAL val)
|
||||
break;
|
||||
case 8: // DOUBLE
|
||||
case 2: // NUMERIC
|
||||
case 3: // DECIMAL
|
||||
//case 3: // DECIMAL
|
||||
if (!gmID(g, dblfldid, "DoubleField", "(ILjava/lang/String;)D"))
|
||||
val->SetValue((double)env->CallDoubleMethod(job, dblfldid, rank, jn));
|
||||
else
|
||||
@@ -1314,7 +1315,7 @@ void JDBConn::SetColumnValue(int rank, PSZ name, PVAL val)
|
||||
env->DeleteLocalRef(jn);
|
||||
|
||||
sprintf(g->Message, "SetColumnValue: %s rank=%d ctyp=%d", Msg, rank, (int)ctyp);
|
||||
longjmp(g->jumper[g->jump_level], TYPE_AM_JDBC);
|
||||
throw TYPE_AM_JDBC;
|
||||
} // endif Check
|
||||
|
||||
if (rank == 0)
|
||||
@@ -1325,7 +1326,7 @@ void JDBConn::SetColumnValue(int rank, PSZ name, PVAL val)
|
||||
/***********************************************************************/
|
||||
/* Prepare an SQL statement for insert. */
|
||||
/***********************************************************************/
|
||||
bool JDBConn::PrepareSQL(char *sql)
|
||||
bool JDBConn::PrepareSQL(PCSZ sql)
|
||||
{
|
||||
bool b = true;
|
||||
PGLOBAL& g = m_G;
|
||||
@@ -1348,7 +1349,7 @@ bool JDBConn::PrepareSQL(char *sql)
|
||||
/***********************************************************************/
|
||||
/* Execute an SQL query that returns a result set. */
|
||||
/***********************************************************************/
|
||||
int JDBConn::ExecuteQuery(char *sql)
|
||||
int JDBConn::ExecuteQuery(PCSZ sql)
|
||||
{
|
||||
int rc = RC_FX;
|
||||
jint ncol;
|
||||
@@ -1376,7 +1377,7 @@ int JDBConn::ExecuteQuery(char *sql)
|
||||
/***********************************************************************/
|
||||
/* Execute an SQL query and get the affected rows. */
|
||||
/***********************************************************************/
|
||||
int JDBConn::ExecuteUpdate(char *sql)
|
||||
int JDBConn::ExecuteUpdate(PCSZ sql)
|
||||
{
|
||||
int rc = RC_FX;
|
||||
jint n;
|
||||
@@ -1404,7 +1405,7 @@ int JDBConn::ExecuteUpdate(char *sql)
|
||||
/***********************************************************************/
|
||||
/* Get the number of lines of the result set. */
|
||||
/***********************************************************************/
|
||||
int JDBConn::GetResultSize(char *sql, JDBCCOL *colp)
|
||||
int JDBConn::GetResultSize(PCSZ sql, JDBCCOL *colp)
|
||||
{
|
||||
int rc, n = 0;
|
||||
|
||||
@@ -1642,7 +1643,7 @@ bool JDBConn::SetParam(JDBCCOL *colp)
|
||||
/* GetMetaData: constructs the result blocks containing the */
|
||||
/* description of all the columns of an SQL command. */
|
||||
/**************************************************************************/
|
||||
PQRYRES JDBConn::GetMetaData(PGLOBAL g, char *src)
|
||||
PQRYRES JDBConn::GetMetaData(PGLOBAL g, PCSZ src)
|
||||
{
|
||||
static int buftyp[] = {TYPE_STRING, TYPE_INT, TYPE_INT,
|
||||
TYPE_INT, TYPE_INT};
|
||||
@@ -1844,7 +1845,7 @@ bool JDBConn::SetParam(JDBCCOL *colp)
|
||||
PGLOBAL& g = m_G;
|
||||
// void *buffer;
|
||||
int i, ncol;
|
||||
PSZ fnc = "Unknown";
|
||||
PCSZ fnc = "Unknown";
|
||||
uint n;
|
||||
short len, tp;
|
||||
int crow = 0;
|
||||
@@ -1942,6 +1943,7 @@ bool JDBConn::SetParam(JDBCCOL *colp)
|
||||
} // endif len
|
||||
|
||||
pval[n] = AllocateValue(g, crp->Type, len);
|
||||
pval[n]->SetNullable(true);
|
||||
|
||||
if (crp->Type == TYPE_STRING) {
|
||||
pbuf[n] = (char*)PlugSubAlloc(g, NULL, len);
|
||||
|
@@ -46,9 +46,9 @@ enum JCATINFO {
|
||||
typedef struct tagJCATPARM {
|
||||
JCATINFO Id; // Id to indicate function
|
||||
PQRYRES Qrp; // Result set pointer
|
||||
char *DB; // Database (Schema)
|
||||
char *Tab; // Table name or pattern
|
||||
char *Pat; // Table type or column pattern
|
||||
PCSZ DB; // Database (Schema)
|
||||
PCSZ Tab; // Table name or pattern
|
||||
PCSZ Pat; // Table type or column pattern
|
||||
} JCATPARM;
|
||||
|
||||
typedef jint(JNICALL *CRTJVM) (JavaVM **, void **, void *);
|
||||
@@ -77,7 +77,7 @@ public:
|
||||
JDBConn(PGLOBAL g, TDBJDBC *tdbp);
|
||||
|
||||
int Open(PJPARM sop);
|
||||
int Rewind(char *sql);
|
||||
int Rewind(PCSZ sql);
|
||||
void Close(void);
|
||||
PQRYRES AllocateResult(PGLOBAL g);
|
||||
|
||||
@@ -96,19 +96,19 @@ public:
|
||||
//void SetQueryTimeout(DWORD sec) {m_QueryTimeout = sec;}
|
||||
//void SetUserName(PSZ user) {m_User = user;}
|
||||
//void SetUserPwd(PSZ pwd) {m_Pwd = pwd;}
|
||||
int GetResultSize(char *sql, JDBCCOL *colp);
|
||||
int ExecuteQuery(char *sql);
|
||||
int ExecuteUpdate(char *sql);
|
||||
int GetResultSize(PCSZ sql, JDBCCOL *colp);
|
||||
int ExecuteQuery(PCSZ sql);
|
||||
int ExecuteUpdate(PCSZ sql);
|
||||
int Fetch(int pos = 0);
|
||||
bool PrepareSQL(char *sql);
|
||||
bool PrepareSQL(PCSZ sql);
|
||||
int ExecuteSQL(void);
|
||||
bool SetParam(JDBCCOL *colp);
|
||||
int ExecSQLcommand(char *sql);
|
||||
int ExecSQLcommand(PCSZ sql);
|
||||
void SetColumnValue(int rank, PSZ name, PVAL val);
|
||||
int GetCatInfo(JCATPARM *cap);
|
||||
//bool GetDataSources(PQRYRES qrp);
|
||||
bool GetDrivers(PQRYRES qrp);
|
||||
PQRYRES GetMetaData(PGLOBAL g, char *src);
|
||||
PQRYRES GetMetaData(PGLOBAL g, PCSZ src);
|
||||
|
||||
public:
|
||||
// Set static variables
|
||||
@@ -174,16 +174,10 @@ protected:
|
||||
jmethodID timfldid; // The TimeField method ID
|
||||
jmethodID tspfldid; // The TimestampField method ID
|
||||
jmethodID bigfldid; // The BigintField method ID
|
||||
//DWORD m_LoginTimeout;
|
||||
//DWORD m_QueryTimeout;
|
||||
//DWORD m_UpdateOptions;
|
||||
char *Msg;
|
||||
PCSZ Msg;
|
||||
char *m_Wrap;
|
||||
char m_IDQuoteChar[2];
|
||||
//PSZ m_Driver;
|
||||
//PSZ m_Url;
|
||||
//PSZ m_User;
|
||||
PSZ m_Pwd;
|
||||
PCSZ m_Pwd;
|
||||
int m_Ncol;
|
||||
int m_Aff;
|
||||
int m_Rows;
|
||||
|
@@ -53,6 +53,36 @@ void trans_func(unsigned int u, _EXCEPTION_POINTERS* pExp)
|
||||
char *GetExceptionDesc(PGLOBAL g, unsigned int e);
|
||||
#endif // SE_CATCH
|
||||
|
||||
/***********************************************************************/
|
||||
/* IsNum: check whether this string is all digits. */
|
||||
/***********************************************************************/
|
||||
bool IsNum(PSZ s)
|
||||
{
|
||||
for (char *p = s; *p; p++)
|
||||
if (*p == ']')
|
||||
break;
|
||||
else if (!isdigit(*p) || *p == '-')
|
||||
return false;
|
||||
|
||||
return true;
|
||||
} // end of IsNum
|
||||
|
||||
/***********************************************************************/
|
||||
/* NextChr: return the first found '[' or Sep pointer. */
|
||||
/***********************************************************************/
|
||||
char *NextChr(PSZ s, char sep)
|
||||
{
|
||||
char *p1 = strchr(s, '[');
|
||||
char *p2 = strchr(s, sep);
|
||||
|
||||
if (!p2)
|
||||
return p1;
|
||||
else if (p1)
|
||||
return MY_MIN(p1, p2);
|
||||
|
||||
return p2;
|
||||
} // end of NextChr
|
||||
|
||||
|
||||
/***********************************************************************/
|
||||
/* Parse a json string. */
|
||||
@@ -60,7 +90,7 @@ char *GetExceptionDesc(PGLOBAL g, unsigned int e);
|
||||
/***********************************************************************/
|
||||
PJSON ParseJson(PGLOBAL g, char *s, int len, int *ptyp, bool *comma)
|
||||
{
|
||||
int i, rc, pretty = (ptyp) ? *ptyp : 3;
|
||||
int i, pretty = (ptyp) ? *ptyp : 3;
|
||||
bool b = false, pty[3] = {true, true, true};
|
||||
PJSON jsp = NULL;
|
||||
STRG src;
|
||||
@@ -81,117 +111,91 @@ PJSON ParseJson(PGLOBAL g, char *s, int len, int *ptyp, bool *comma)
|
||||
if (s[0] == '[' && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n')))
|
||||
pty[0] = false;
|
||||
|
||||
|
||||
// Save stack and allocation environment and prepare error return
|
||||
if (g->jump_level == MAX_JUMP) {
|
||||
strcpy(g->Message, MSG(TOO_MANY_JUMPS));
|
||||
return NULL;
|
||||
} // endif jump_level
|
||||
|
||||
#if defined(SE_CATCH)
|
||||
// Let's try to recover from any kind of interrupt
|
||||
_se_translator_function f = _set_se_translator(trans_func);
|
||||
|
||||
try {
|
||||
#endif // SE_CATCH --------------------- try section --------------------
|
||||
if ((rc = setjmp(g->jumper[++g->jump_level])) != 0) {
|
||||
goto err;
|
||||
} // endif rc
|
||||
for (i = 0; i < len; i++)
|
||||
switch (s[i]) {
|
||||
case '[':
|
||||
if (jsp)
|
||||
goto tryit;
|
||||
else if (!(jsp = ParseArray(g, ++i, src, pty)))
|
||||
throw 1;
|
||||
|
||||
#if defined(SE_CATCH) // ------------- end of try section -----------------
|
||||
} catch (SE_Exception e) {
|
||||
sprintf(g->Message, "ParseJson: exception doing setjmp: %s (rc=%hd)",
|
||||
GetExceptionDesc(g, e.nSE), e.nSE);
|
||||
_set_se_translator(f);
|
||||
goto err;
|
||||
} catch (...) {
|
||||
strcpy(g->Message, "Exception doing setjmp");
|
||||
_set_se_translator(f);
|
||||
goto err;
|
||||
} // end of try-catches
|
||||
break;
|
||||
case '{':
|
||||
if (jsp)
|
||||
goto tryit;
|
||||
else if (!(jsp = ParseObject(g, ++i, src, pty)))
|
||||
throw 2;
|
||||
|
||||
_set_se_translator(f);
|
||||
#endif // SE_CATCH
|
||||
break;
|
||||
case ' ':
|
||||
case '\t':
|
||||
case '\n':
|
||||
case '\r':
|
||||
break;
|
||||
case ',':
|
||||
if (jsp && (pretty == 1 || pretty == 3)) {
|
||||
if (comma)
|
||||
*comma = true;
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
switch (s[i]) {
|
||||
case '[':
|
||||
if (jsp)
|
||||
goto tryit;
|
||||
else if (!(jsp = ParseArray(g, ++i, src, pty)))
|
||||
goto err;
|
||||
pty[0] = pty[2] = false;
|
||||
break;
|
||||
} // endif pretty
|
||||
|
||||
break;
|
||||
case '{':
|
||||
if (jsp)
|
||||
goto tryit;
|
||||
else if (!(jsp = ParseObject(g, ++i, src, pty)))
|
||||
goto err;
|
||||
sprintf(g->Message, "Unexpected ',' (pretty=%d)", pretty);
|
||||
throw 3;
|
||||
case '(':
|
||||
b = true;
|
||||
break;
|
||||
case ')':
|
||||
if (b) {
|
||||
b = false;
|
||||
break;
|
||||
} // endif b
|
||||
|
||||
break;
|
||||
case ' ':
|
||||
case '\t':
|
||||
case '\n':
|
||||
case '\r':
|
||||
break;
|
||||
case ',':
|
||||
if (jsp && (pretty == 1 || pretty == 3)) {
|
||||
if (comma)
|
||||
*comma = true;
|
||||
default:
|
||||
if (jsp)
|
||||
goto tryit;
|
||||
else if (!(jsp = ParseValue(g, i, src, pty)))
|
||||
throw 4;
|
||||
|
||||
pty[0] = pty[2] = false;
|
||||
break;
|
||||
} // endif pretty
|
||||
break;
|
||||
}; // endswitch s[i]
|
||||
|
||||
sprintf(g->Message, "Unexpected ',' (pretty=%d)", pretty);
|
||||
goto err;
|
||||
case '(':
|
||||
b = true;
|
||||
break;
|
||||
case ')':
|
||||
if (b) {
|
||||
b = false;
|
||||
break;
|
||||
} // endif b
|
||||
if (!jsp)
|
||||
sprintf(g->Message, "Invalid Json string '%.*s'", 50, s);
|
||||
else if (ptyp && pretty == 3) {
|
||||
*ptyp = 3; // Not recognized pretty
|
||||
|
||||
default:
|
||||
if (jsp)
|
||||
goto tryit;
|
||||
else if (!(jsp = ParseValue(g, i, src, pty)))
|
||||
goto err;
|
||||
for (i = 0; i < 3; i++)
|
||||
if (pty[i]) {
|
||||
*ptyp = i;
|
||||
break;
|
||||
} // endif pty
|
||||
|
||||
break;
|
||||
}; // endswitch s[i]
|
||||
} // endif ptyp
|
||||
|
||||
if (!jsp)
|
||||
sprintf(g->Message, "Invalid Json string '%.*s'", 50, s);
|
||||
else if (ptyp && pretty == 3) {
|
||||
*ptyp = 3; // Not recognized pretty
|
||||
} catch (int n) {
|
||||
if (trace)
|
||||
htrc("Exception %d: %s\n", n, g->Message);
|
||||
jsp = NULL;
|
||||
} catch (const char *msg) {
|
||||
strcpy(g->Message, msg);
|
||||
jsp = NULL;
|
||||
} // end catch
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
if (pty[i]) {
|
||||
*ptyp = i;
|
||||
break;
|
||||
} // endif pty
|
||||
|
||||
} // endif ptyp
|
||||
|
||||
g->jump_level--;
|
||||
return jsp;
|
||||
return jsp;
|
||||
|
||||
tryit:
|
||||
if (pty[0] && (!pretty || pretty > 2)) {
|
||||
if ((jsp = ParseArray(g, (i = 0), src, pty)) && ptyp && pretty == 3)
|
||||
*ptyp = (pty[0]) ? 0 : 3;
|
||||
|
||||
g->jump_level--;
|
||||
return jsp;
|
||||
} else
|
||||
strcpy(g->Message, "More than one item in file");
|
||||
|
||||
err:
|
||||
g->jump_level--;
|
||||
return NULL;
|
||||
return NULL;
|
||||
} // end of ParseJson
|
||||
|
||||
/***********************************************************************/
|
||||
@@ -335,16 +339,16 @@ PJVAL ParseValue(PGLOBAL g, int& i, STRG& src, bool *pty)
|
||||
PJVAL jvp = new(g) JVALUE;
|
||||
|
||||
for (; i < len; i++)
|
||||
switch (s[i]) {
|
||||
case '\n':
|
||||
pty[0] = pty[1] = false;
|
||||
case '\r':
|
||||
case ' ':
|
||||
case '\t':
|
||||
break;
|
||||
default:
|
||||
goto suite;
|
||||
} // endswitch
|
||||
switch (s[i]) {
|
||||
case '\n':
|
||||
pty[0] = pty[1] = false;
|
||||
case '\r':
|
||||
case ' ':
|
||||
case '\t':
|
||||
break;
|
||||
default:
|
||||
goto suite;
|
||||
} // endswitch
|
||||
|
||||
suite:
|
||||
switch (s[i]) {
|
||||
@@ -585,78 +589,75 @@ PVAL ParseNumeric(PGLOBAL g, int& i, STRG& src)
|
||||
PSZ Serialize(PGLOBAL g, PJSON jsp, char *fn, int pretty)
|
||||
{
|
||||
PSZ str = NULL;
|
||||
bool b = false, err = true;
|
||||
JOUT *jp;
|
||||
bool b = false, err = true;
|
||||
JOUT *jp;
|
||||
FILE *fs = NULL;
|
||||
|
||||
g->Message[0] = 0;
|
||||
|
||||
// Save stack and allocation environment and prepare error return
|
||||
if (g->jump_level == MAX_JUMP) {
|
||||
strcpy(g->Message, MSG(TOO_MANY_JUMPS));
|
||||
return NULL;
|
||||
} // endif jump_level
|
||||
|
||||
if (setjmp(g->jumper[++g->jump_level])) {
|
||||
str = NULL;
|
||||
goto fin;
|
||||
} // endif jmp
|
||||
|
||||
if (!jsp) {
|
||||
strcpy(g->Message, "Null json tree");
|
||||
goto fin;
|
||||
} else if (!fn) {
|
||||
// Serialize to a string
|
||||
jp = new(g) JOUTSTR(g);
|
||||
b = pretty == 1;
|
||||
} else {
|
||||
if (!(fs = fopen(fn, "wb"))) {
|
||||
sprintf(g->Message, MSG(OPEN_MODE_ERROR),
|
||||
"w", (int)errno, fn);
|
||||
strcat(strcat(g->Message, ": "), strerror(errno));
|
||||
goto fin;;
|
||||
} else if (pretty >= 2) {
|
||||
// Serialize to a pretty file
|
||||
jp = new(g)JOUTPRT(g, fs);
|
||||
try {
|
||||
if (!jsp) {
|
||||
strcpy(g->Message, "Null json tree");
|
||||
throw 1;
|
||||
} else if (!fn) {
|
||||
// Serialize to a string
|
||||
jp = new(g) JOUTSTR(g);
|
||||
b = pretty == 1;
|
||||
} else {
|
||||
// Serialize to a flat file
|
||||
b = true;
|
||||
jp = new(g)JOUTFILE(g, fs, pretty);
|
||||
if (!(fs = fopen(fn, "wb"))) {
|
||||
sprintf(g->Message, MSG(OPEN_MODE_ERROR),
|
||||
"w", (int)errno, fn);
|
||||
strcat(strcat(g->Message, ": "), strerror(errno));
|
||||
throw 2;
|
||||
} else if (pretty >= 2) {
|
||||
// Serialize to a pretty file
|
||||
jp = new(g)JOUTPRT(g, fs);
|
||||
} else {
|
||||
// Serialize to a flat file
|
||||
b = true;
|
||||
jp = new(g)JOUTFILE(g, fs, pretty);
|
||||
} // endif's
|
||||
|
||||
} // endif's
|
||||
|
||||
switch (jsp->GetType()) {
|
||||
case TYPE_JAR:
|
||||
err = SerializeArray(jp, (PJAR)jsp, b);
|
||||
break;
|
||||
case TYPE_JOB:
|
||||
err = ((b && jp->Prty()) && jp->WriteChr('\t'));
|
||||
err |= SerializeObject(jp, (PJOB)jsp);
|
||||
break;
|
||||
case TYPE_JVAL:
|
||||
err = SerializeValue(jp, (PJVAL)jsp);
|
||||
break;
|
||||
default:
|
||||
strcpy(g->Message, "Invalid json tree");
|
||||
} // endswitch Type
|
||||
|
||||
if (fs) {
|
||||
fputs(EL, fs);
|
||||
fclose(fs);
|
||||
str = (err) ? NULL : strcpy(g->Message, "Ok");
|
||||
} else if (!err) {
|
||||
str = ((JOUTSTR*)jp)->Strp;
|
||||
jp->WriteChr('\0');
|
||||
PlugSubAlloc(g, NULL, ((JOUTSTR*)jp)->N);
|
||||
} else {
|
||||
if (!g->Message[0])
|
||||
strcpy(g->Message, "Error in Serialize");
|
||||
|
||||
} // endif's
|
||||
|
||||
} // endif's
|
||||
} catch (int n) {
|
||||
if (trace)
|
||||
htrc("Exception %d: %s\n", n, g->Message);
|
||||
str = NULL;
|
||||
} catch (const char *msg) {
|
||||
strcpy(g->Message, msg);
|
||||
str = NULL;
|
||||
} // end catch
|
||||
|
||||
switch (jsp->GetType()) {
|
||||
case TYPE_JAR:
|
||||
err = SerializeArray(jp, (PJAR)jsp, b);
|
||||
break;
|
||||
case TYPE_JOB:
|
||||
err = ((b && jp->Prty()) && jp->WriteChr('\t'));
|
||||
err |= SerializeObject(jp, (PJOB)jsp);
|
||||
break;
|
||||
case TYPE_JVAL:
|
||||
err = SerializeValue(jp, (PJVAL)jsp);
|
||||
break;
|
||||
default:
|
||||
strcpy(g->Message, "Invalid json tree");
|
||||
} // endswitch Type
|
||||
|
||||
if (fs) {
|
||||
fputs(EL, fs);
|
||||
fclose(fs);
|
||||
str = (err) ? NULL : strcpy(g->Message, "Ok");
|
||||
} else if (!err) {
|
||||
str = ((JOUTSTR*)jp)->Strp;
|
||||
jp->WriteChr('\0');
|
||||
PlugSubAlloc(g, NULL, ((JOUTSTR*)jp)->N);
|
||||
} else {
|
||||
if (!g->Message[0])
|
||||
strcpy(g->Message, "Error in Serialize");
|
||||
|
||||
} // endif's
|
||||
|
||||
fin:
|
||||
g->jump_level--;
|
||||
return str;
|
||||
} // end of Serialize
|
||||
|
||||
@@ -965,7 +966,7 @@ return false;
|
||||
/***********************************************************************/
|
||||
/* Add a new pair to an Object. */
|
||||
/***********************************************************************/
|
||||
PJPR JOBJECT::AddPair(PGLOBAL g, PSZ key)
|
||||
PJPR JOBJECT::AddPair(PGLOBAL g, PCSZ key)
|
||||
{
|
||||
PJPR jpp = new(g) JPAIR(key);
|
||||
|
||||
@@ -1021,7 +1022,24 @@ PSZ JOBJECT::GetText(PGLOBAL g, PSZ text)
|
||||
|
||||
if (!First && n)
|
||||
return NULL;
|
||||
else for (PJPR jp = First; jp; jp = jp->Next)
|
||||
else if (n == 1 && Size == 1 && !strcmp(First->GetKey(), "$date")) {
|
||||
int i;
|
||||
|
||||
First->Val->GetText(g, text);
|
||||
i = (text[1] == '-' ? 2 : 1);
|
||||
|
||||
if (IsNum(text + i)) {
|
||||
// Date is in milliseconds
|
||||
int j = (int)strlen(text);
|
||||
|
||||
if (j >= 4 + i)
|
||||
text[j - 3] = 0; // Change it to seconds
|
||||
else
|
||||
strcpy(text, " 0");
|
||||
|
||||
} // endif text
|
||||
|
||||
} else for (PJPR jp = First; jp; jp = jp->Next)
|
||||
jp->Val->GetText(g, text);
|
||||
|
||||
if (n)
|
||||
@@ -1051,7 +1069,7 @@ bool JOBJECT::Merge(PGLOBAL g, PJSON jsp)
|
||||
/***********************************************************************/
|
||||
/* Set or add a value corresponding to the given key. */
|
||||
/***********************************************************************/
|
||||
void JOBJECT::SetValue(PGLOBAL g, PJVAL jvp, PSZ key)
|
||||
void JOBJECT::SetValue(PGLOBAL g, PJVAL jvp, PCSZ key)
|
||||
{
|
||||
PJPR jp;
|
||||
|
||||
@@ -1071,7 +1089,7 @@ void JOBJECT::SetValue(PGLOBAL g, PJVAL jvp, PSZ key)
|
||||
/***********************************************************************/
|
||||
/* Delete a value corresponding to the given key. */
|
||||
/***********************************************************************/
|
||||
void JOBJECT::DeleteKey(PSZ key)
|
||||
void JOBJECT::DeleteKey(PCSZ key)
|
||||
{
|
||||
PJPR jp, *pjp = &First;
|
||||
|
||||
@@ -1250,10 +1268,10 @@ JVALUE::JVALUE(PGLOBAL g, PVAL valp) : JSON()
|
||||
/***********************************************************************/
|
||||
/* Constructor for a given string. */
|
||||
/***********************************************************************/
|
||||
JVALUE::JVALUE(PGLOBAL g, PSZ strp) : JSON()
|
||||
JVALUE::JVALUE(PGLOBAL g, PCSZ strp) : JSON()
|
||||
{
|
||||
Jsp = NULL;
|
||||
Value = AllocateValue(g, strp, TYPE_STRING);
|
||||
Value = AllocateValue(g, (void*)strp, TYPE_STRING);
|
||||
Next = NULL;
|
||||
Del = false;
|
||||
} // end of JVALUE constructor
|
||||
@@ -1341,7 +1359,7 @@ PSZ JVALUE::GetText(PGLOBAL g, PSZ text)
|
||||
if (s)
|
||||
strcat(strcat(text, " "), s);
|
||||
else
|
||||
strcat(text, " ???");
|
||||
strcat(text, " <null>");
|
||||
|
||||
return text;
|
||||
} // end of GetText
|
||||
@@ -1374,7 +1392,7 @@ void JVALUE::SetTiny(PGLOBAL g, char n)
|
||||
{
|
||||
Value = AllocateValue(g, &n, TYPE_TINY);
|
||||
Jsp = NULL;
|
||||
} // end of SetInteger
|
||||
} // end of SetTiny
|
||||
|
||||
/***********************************************************************/
|
||||
/* Set the Value's value as the given big integer. */
|
||||
@@ -1408,6 +1426,6 @@ void JVALUE::SetString(PGLOBAL g, PSZ s, short c)
|
||||
/***********************************************************************/
|
||||
bool JVALUE::IsNull(void)
|
||||
{
|
||||
return (Jsp) ? Jsp->IsNull() : (Value) ? Value->IsZero() : true;
|
||||
return (Jsp) ? Jsp->IsNull() : (Value) ? Value->IsNull() : true;
|
||||
} // end of IsNull
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/**************** json H Declares Source Code File (.H) ****************/
|
||||
/* Name: json.h Version 1.2 */
|
||||
/* */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2014 - 2015 */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2014 - 2017 */
|
||||
/* */
|
||||
/* This file contains the JSON classes declares. */
|
||||
/***********************************************************************/
|
||||
@@ -13,11 +13,12 @@
|
||||
#define X
|
||||
#endif
|
||||
|
||||
enum JTYP {TYPE_STRG = 1,
|
||||
TYPE_DBL = 2,
|
||||
TYPE_BOOL = 4,
|
||||
TYPE_BINT = 5,
|
||||
TYPE_INTG = 7,
|
||||
enum JTYP {TYPE_STRG = TYPE_STRING,
|
||||
TYPE_DBL = TYPE_DOUBLE,
|
||||
TYPE_BOOL = TYPE_TINY,
|
||||
TYPE_BINT = TYPE_BIGINT,
|
||||
TYPE_DTM = TYPE_DATE,
|
||||
TYPE_INTG = TYPE_INT,
|
||||
TYPE_JSON = 12,
|
||||
TYPE_JAR,
|
||||
TYPE_JOB,
|
||||
@@ -125,14 +126,14 @@ class JPAIR : public BLOCK {
|
||||
friend PJOB ParseObject(PGLOBAL, int&, STRG&, bool*);
|
||||
friend bool SerializeObject(JOUT *, PJOB);
|
||||
public:
|
||||
JPAIR(PSZ key) : BLOCK() {Key = key; Val = NULL; Next = NULL;}
|
||||
JPAIR(PCSZ key) : BLOCK() {Key = key; Val = NULL; Next = NULL;}
|
||||
|
||||
inline PSZ GetKey(void) {return Key;}
|
||||
inline PCSZ GetKey(void) {return Key;}
|
||||
inline PJVAL GetVal(void) {return Val;}
|
||||
inline PJPR GetNext(void) {return Next;}
|
||||
|
||||
protected:
|
||||
PSZ Key; // This pair key name
|
||||
PCSZ Key; // This pair key name
|
||||
PJVAL Val; // To the value of the pair
|
||||
PJPR Next; // To the next pair
|
||||
}; // end of class JPAIR
|
||||
@@ -150,7 +151,7 @@ class JSON : public BLOCK {
|
||||
virtual JTYP GetValType(void) {X return TYPE_JSON;}
|
||||
virtual void InitArray(PGLOBAL g) {X}
|
||||
//virtual PJVAL AddValue(PGLOBAL g, PJVAL jvp = NULL, int *x = NULL) {X return NULL;}
|
||||
virtual PJPR AddPair(PGLOBAL g, PSZ key) {X return NULL;}
|
||||
virtual PJPR AddPair(PGLOBAL g, PCSZ key) {X return NULL;}
|
||||
virtual PJAR GetKeyList(PGLOBAL g) {X return NULL;}
|
||||
virtual PJVAL GetValue(const char *key) {X return NULL;}
|
||||
virtual PJOB GetObject(void) {return NULL;}
|
||||
@@ -166,13 +167,13 @@ class JSON : public BLOCK {
|
||||
virtual PSZ GetText(PGLOBAL g, PSZ text) {X return NULL;}
|
||||
virtual bool Merge(PGLOBAL g, PJSON jsp) { X return true; }
|
||||
virtual bool SetValue(PGLOBAL g, PJVAL jvp, int i) { X return true; }
|
||||
virtual void SetValue(PGLOBAL g, PJVAL jvp, PSZ key) {X}
|
||||
virtual void SetValue(PGLOBAL g, PJVAL jvp, PCSZ key) {X}
|
||||
virtual void SetValue(PVAL valp) {X}
|
||||
virtual void SetValue(PJSON jsp) {X}
|
||||
virtual void SetString(PGLOBAL g, PSZ s, short c) {X}
|
||||
virtual void SetInteger(PGLOBAL g, int n) {X}
|
||||
virtual void SetFloat(PGLOBAL g, double f) {X}
|
||||
virtual void DeleteKey(char *k) {X}
|
||||
virtual void DeleteKey(PCSZ k) {X}
|
||||
virtual bool DeleteValue(int i) {X return true;}
|
||||
virtual bool IsNull(void) {X return true;}
|
||||
|
||||
@@ -195,14 +196,14 @@ class JOBJECT : public JSON {
|
||||
virtual void Clear(void) {First = Last = NULL; Size = 0;}
|
||||
virtual JTYP GetType(void) {return TYPE_JOB;}
|
||||
virtual PJPR GetFirst(void) {return First;}
|
||||
virtual PJPR AddPair(PGLOBAL g, PSZ key);
|
||||
virtual PJPR AddPair(PGLOBAL g, PCSZ key);
|
||||
virtual PJOB GetObject(void) {return this;}
|
||||
virtual PJVAL GetValue(const char* key);
|
||||
virtual PJAR GetKeyList(PGLOBAL g);
|
||||
virtual PSZ GetText(PGLOBAL g, PSZ text);
|
||||
virtual bool Merge(PGLOBAL g, PJSON jsp);
|
||||
virtual void SetValue(PGLOBAL g, PJVAL jvp, PSZ key);
|
||||
virtual void DeleteKey(char *k);
|
||||
virtual void SetValue(PGLOBAL g, PJVAL jvp, PCSZ key);
|
||||
virtual void DeleteKey(PCSZ k);
|
||||
virtual bool IsNull(void);
|
||||
|
||||
protected:
|
||||
@@ -253,7 +254,7 @@ class JVALUE : public JSON {
|
||||
JVALUE(PJSON jsp) : JSON()
|
||||
{Jsp = jsp; Value = NULL; Next = NULL; Del = false;}
|
||||
JVALUE(PGLOBAL g, PVAL valp);
|
||||
JVALUE(PGLOBAL g, PSZ strp);
|
||||
JVALUE(PGLOBAL g, PCSZ strp);
|
||||
|
||||
using JSON::GetValue;
|
||||
using JSON::SetValue;
|
||||
|
@@ -27,9 +27,11 @@
|
||||
#endif
|
||||
#define M 7
|
||||
|
||||
uint GetJsonGrpSize(void);
|
||||
static int IsJson(UDF_ARGS *args, uint i);
|
||||
static PSZ MakePSZ(PGLOBAL g, UDF_ARGS *args, int i);
|
||||
bool IsNum(PSZ s);
|
||||
char *NextChr(PSZ s, char sep);
|
||||
uint GetJsonGrpSize(void);
|
||||
static int IsJson(UDF_ARGS *args, uint i);
|
||||
static PSZ MakePSZ(PGLOBAL g, UDF_ARGS *args, int i);
|
||||
static char *handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
unsigned long *res_length, char *is_null, char *error);
|
||||
static char *bin_handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
@@ -111,10 +113,9 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm)
|
||||
PJNODE jnp = &Nodes[i];
|
||||
|
||||
if (*p) {
|
||||
if (p[--n] == ']') {
|
||||
p[n--] = 0;
|
||||
p++;
|
||||
} else {
|
||||
if (p[n - 1] == ']') {
|
||||
p[--n] = 0;
|
||||
} else if (!IsNum(p)) {
|
||||
// Wrong array specification
|
||||
sprintf(g->Message, "Invalid array specification %s", p);
|
||||
return true;
|
||||
@@ -124,8 +125,7 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm)
|
||||
b = true;
|
||||
|
||||
// To check whether a numeric Rank was specified
|
||||
for (int k = 0; dg && p[k]; k++)
|
||||
dg = isdigit(p[k]) > 0;
|
||||
dg = IsNum(p);
|
||||
|
||||
if (!n) {
|
||||
// Default specifications
|
||||
@@ -160,13 +160,12 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm)
|
||||
// Set the Op value;
|
||||
switch (*p) {
|
||||
case '+': jnp->Op = OP_ADD; break;
|
||||
case '*': jnp->Op = OP_MULT; break;
|
||||
case 'x': jnp->Op = OP_MULT; break;
|
||||
case '>': jnp->Op = OP_MAX; break;
|
||||
case '<': jnp->Op = OP_MIN; break;
|
||||
case '!': jnp->Op = OP_SEP; break; // Average
|
||||
case '#': jnp->Op = OP_NUM; break;
|
||||
case 'x':
|
||||
case 'X': // Expand this array
|
||||
case '*': // Expand this array
|
||||
strcpy(g->Message, "Expand not supported by this function");
|
||||
return true;
|
||||
default:
|
||||
@@ -232,9 +231,9 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm)
|
||||
/*********************************************************************************/
|
||||
my_bool JSNX::ParseJpath(PGLOBAL g)
|
||||
{
|
||||
char *p, *p2 = NULL, *pbuf = NULL;
|
||||
char *p, *p1 = NULL, *p2 = NULL, *pbuf = NULL;
|
||||
int i;
|
||||
my_bool mul = false;
|
||||
my_bool a, mul = false;
|
||||
|
||||
if (Parsed)
|
||||
return false; // Already done
|
||||
@@ -245,8 +244,12 @@ my_bool JSNX::ParseJpath(PGLOBAL g)
|
||||
if (!(pbuf = PlgDBDup(g, Jpath)))
|
||||
return true;
|
||||
|
||||
// The Jpath must be analyzed
|
||||
for (i = 0, p = pbuf; (p = strchr(p, ':')); i++, p++)
|
||||
if (*pbuf == '$') pbuf++;
|
||||
if (*pbuf == '.') pbuf++;
|
||||
if (*pbuf == '[') p1 = pbuf++;
|
||||
|
||||
// Estimate the required number of nodes
|
||||
for (i = 0, p = pbuf; (p = NextChr(p, '.')); i++, p++)
|
||||
Nod++; // One path node found
|
||||
|
||||
if (!(Nodes = (PJNODE)PlgDBSubAlloc(g, NULL, (++Nod) * sizeof(JNODE))))
|
||||
@@ -255,12 +258,28 @@ my_bool JSNX::ParseJpath(PGLOBAL g)
|
||||
memset(Nodes, 0, (Nod)* sizeof(JNODE));
|
||||
|
||||
// Analyze the Jpath for this column
|
||||
for (i = 0, p = pbuf; i < Nod; i++, p = (p2 ? p2 + 1 : p + strlen(p))) {
|
||||
if ((p2 = strchr(p, ':')))
|
||||
*p2 = 0;
|
||||
for (i = 0, p = pbuf; p && i < Nod; i++, p = (p2 ? p2 : NULL)) {
|
||||
a = (p1 != NULL);
|
||||
p1 = strchr(p, '[');
|
||||
p2 = strchr(p, '.');
|
||||
|
||||
if (!p2)
|
||||
p2 = p1;
|
||||
else if (p1) {
|
||||
if (p1 < p2)
|
||||
p2 = p1;
|
||||
else if (p1 == p2 + 1)
|
||||
*p2++ = 0; // Old syntax .[
|
||||
else
|
||||
p1 = NULL;
|
||||
|
||||
} // endif p1
|
||||
|
||||
if (p2)
|
||||
*p2++ = 0;
|
||||
|
||||
// Jpath must be explicit
|
||||
if (*p == 0 || *p == '[') {
|
||||
if (a || *p == 0 || *p == '[' || IsNum(p)) {
|
||||
// Analyse intermediate array processing
|
||||
if (SetArrayOptions(g, p, i, Nodes[i-1].Key))
|
||||
return true;
|
||||
@@ -279,6 +298,7 @@ my_bool JSNX::ParseJpath(PGLOBAL g)
|
||||
|
||||
} // endfor i, p
|
||||
|
||||
Nod = i;
|
||||
MulVal = AllocateValue(g, Value);
|
||||
Parsed = true;
|
||||
return false;
|
||||
@@ -711,6 +731,7 @@ PSZ JSNX::Locate(PGLOBAL g, PJSON jsp, PJVAL jvp, int k)
|
||||
|
||||
// Write to the path string
|
||||
Jp = new(g) JOUTSTR(g);
|
||||
Jp->WriteChr('$');
|
||||
Jvalp = jvp;
|
||||
K = k;
|
||||
|
||||
@@ -769,7 +790,12 @@ my_bool JSNX::LocateArray(PJAR jarp)
|
||||
/*********************************************************************************/
|
||||
my_bool JSNX::LocateObject(PJOB jobp)
|
||||
{
|
||||
size_t m = Jp->N;
|
||||
size_t m;
|
||||
|
||||
if (Jp->WriteChr('.'))
|
||||
return true;
|
||||
|
||||
m = Jp->N;
|
||||
|
||||
for (PJPR pair = jobp->First; pair && !Found; pair = pair->Next) {
|
||||
Jp->N = m;
|
||||
@@ -790,19 +816,12 @@ my_bool JSNX::LocateObject(PJOB jobp)
|
||||
/*********************************************************************************/
|
||||
my_bool JSNX::LocateValue(PJVAL jvp)
|
||||
{
|
||||
if (CompareTree(Jvalp, jvp)) {
|
||||
if (CompareTree(Jvalp, jvp))
|
||||
Found = (--K == 0);
|
||||
} else if (jvp->GetArray()) {
|
||||
if (Jp->WriteChr(':'))
|
||||
return true;
|
||||
|
||||
else if (jvp->GetArray())
|
||||
return LocateArray(jvp->GetArray());
|
||||
} else if (jvp->GetObject()) {
|
||||
if (Jp->WriteChr(':'))
|
||||
return true;
|
||||
|
||||
else if (jvp->GetObject())
|
||||
return LocateObject(jvp->GetObject());
|
||||
} // endif's
|
||||
|
||||
return false;
|
||||
} // end of LocateValue
|
||||
@@ -848,6 +867,7 @@ PSZ JSNX::LocateAll(PGLOBAL g, PJSON jsp, PJVAL jvp, int mx)
|
||||
if (!g->Message[0])
|
||||
strcpy(g->Message, "Invalid json tree");
|
||||
|
||||
return NULL;
|
||||
} else {
|
||||
if (Jp->N > 1)
|
||||
Jp->N--;
|
||||
@@ -858,7 +878,6 @@ PSZ JSNX::LocateAll(PGLOBAL g, PJSON jsp, PJVAL jvp, int mx)
|
||||
return Jp->Strp;
|
||||
} // endif's
|
||||
|
||||
return NULL;
|
||||
} // end of LocateAll
|
||||
|
||||
/*********************************************************************************/
|
||||
@@ -964,26 +983,26 @@ my_bool JSNX::CompareTree(PJSON jp1, PJSON jp2)
|
||||
/*********************************************************************************/
|
||||
my_bool JSNX::AddPath(void)
|
||||
{
|
||||
char s[16];
|
||||
my_bool b = false;
|
||||
char s[16];
|
||||
|
||||
if (Jp->WriteChr('"'))
|
||||
if (Jp->WriteStr("\"$"))
|
||||
return true;
|
||||
|
||||
for (int i = 0; i <= I; i++) {
|
||||
if (b) {
|
||||
if (Jp->WriteChr(':')) return true;
|
||||
} else
|
||||
b = true;
|
||||
|
||||
if (Jpnp[i].Type == TYPE_JAR) {
|
||||
sprintf(s, "[%d]", Jpnp[i].N + B);
|
||||
|
||||
if (Jp->WriteStr(s))
|
||||
return true;
|
||||
|
||||
} else if (Jp->WriteStr(Jpnp[i].Key))
|
||||
return true;
|
||||
} else {
|
||||
if (Jp->WriteChr('.'))
|
||||
return true;
|
||||
|
||||
if (Jp->WriteStr(Jpnp[i].Key))
|
||||
return true;
|
||||
|
||||
} // endif's
|
||||
|
||||
} // endfor i
|
||||
|
||||
@@ -1104,7 +1123,7 @@ static my_bool JsonInit(UDF_INIT *initid, UDF_ARGS *args,
|
||||
} // endif g
|
||||
|
||||
g->Mrr = (args->arg_count && args->args[0]) ? 1 : 0;
|
||||
g->ActivityStart = (PACTIVITY)more;
|
||||
g->More = more;
|
||||
initid->maybe_null = mbn;
|
||||
initid->max_length = reslen;
|
||||
initid->ptr = (char*)g;
|
||||
@@ -1379,6 +1398,7 @@ static my_bool CalcLen(UDF_ARGS *args, my_bool obj,
|
||||
memlen += (k + sizeof(JOBJECT) + sizeof(JPAIR));
|
||||
} else
|
||||
memlen += sizeof(JARRAY);
|
||||
|
||||
switch (args->arg_type[i]) {
|
||||
case STRING_RESULT:
|
||||
if (n == 2 && args->args[i]) {
|
||||
@@ -1448,13 +1468,13 @@ static my_bool CheckMemory(PGLOBAL g, UDF_INIT *initid, UDF_ARGS *args, uint n,
|
||||
|
||||
} // endif b
|
||||
|
||||
ml += (unsigned long)g->ActivityStart; // more
|
||||
ml += g->More;
|
||||
|
||||
if (ml > g->Sarea_Size) {
|
||||
free(g->Sarea);
|
||||
|
||||
if (!(g->Sarea = PlugAllocMem(g, ml))) {
|
||||
char errmsg[256];
|
||||
char errmsg[MAX_STR];
|
||||
|
||||
sprintf(errmsg, MSG(WORK_AREA), g->Message);
|
||||
strcpy(g->Message, errmsg);
|
||||
@@ -1495,7 +1515,7 @@ static PSZ MakePSZ(PGLOBAL g, UDF_ARGS *args, int i)
|
||||
/*********************************************************************************/
|
||||
/* Make a valid key from the passed argument. */
|
||||
/*********************************************************************************/
|
||||
static PSZ MakeKey(PGLOBAL g, UDF_ARGS *args, int i)
|
||||
static PCSZ MakeKey(PGLOBAL g, UDF_ARGS *args, int i)
|
||||
{
|
||||
if (args->arg_count > (unsigned)i) {
|
||||
int j = 0, n = args->attribute_lengths[i];
|
||||
@@ -1756,16 +1776,16 @@ void jsonvalue_deinit(UDF_INIT* initid)
|
||||
/*********************************************************************************/
|
||||
/* Make a Json array containing all the parameters. */
|
||||
/*********************************************************************************/
|
||||
my_bool json_array_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
|
||||
my_bool json_make_array_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
|
||||
{
|
||||
unsigned long reslen, memlen;
|
||||
|
||||
CalcLen(args, false, reslen, memlen);
|
||||
return JsonInit(initid, args, message, false, reslen, memlen);
|
||||
} // end of json_array_init
|
||||
} // end of json_make_array_init
|
||||
|
||||
char *json_array(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
unsigned long *res_length, char *, char *)
|
||||
char *json_make_array(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
unsigned long *res_length, char *, char *)
|
||||
{
|
||||
char *str;
|
||||
PGLOBAL g = (PGLOBAL)initid->ptr;
|
||||
@@ -1792,12 +1812,12 @@ char *json_array(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
|
||||
*res_length = strlen(str);
|
||||
return str;
|
||||
} // end of json_array
|
||||
} // end of json_make_array
|
||||
|
||||
void json_array_deinit(UDF_INIT* initid)
|
||||
{
|
||||
JsonFreeMem((PGLOBAL)initid->ptr);
|
||||
} // end of json_array_deinit
|
||||
} // end of json_make_array_deinit
|
||||
|
||||
/*********************************************************************************/
|
||||
/* Add one or several values to a Json array. */
|
||||
@@ -2080,16 +2100,16 @@ void json_array_delete_deinit(UDF_INIT* initid)
|
||||
/*********************************************************************************/
|
||||
/* Make a Json Object containing all the parameters. */
|
||||
/*********************************************************************************/
|
||||
my_bool json_object_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
|
||||
my_bool json_make_object_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
|
||||
{
|
||||
unsigned long reslen, memlen;
|
||||
|
||||
CalcLen(args, true, reslen, memlen);
|
||||
return JsonInit(initid, args, message, false, reslen, memlen);
|
||||
} // end of json_object_init
|
||||
} // end of json_make_object_init
|
||||
|
||||
char *json_object(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
unsigned long *res_length, char *, char *)
|
||||
char *json_make_object(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
unsigned long *res_length, char *, char *)
|
||||
{
|
||||
char *str = NULL;
|
||||
PGLOBAL g = (PGLOBAL)initid->ptr;
|
||||
@@ -2114,12 +2134,12 @@ char *json_object(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
|
||||
*res_length = strlen(str);
|
||||
return str;
|
||||
} // end of json_object
|
||||
} // end of json_make_object
|
||||
|
||||
void json_object_deinit(UDF_INIT* initid)
|
||||
void json_make_object_deinit(UDF_INIT* initid)
|
||||
{
|
||||
JsonFreeMem((PGLOBAL)initid->ptr);
|
||||
} // end of json_object_deinit
|
||||
} // end of json_make_object_deinit
|
||||
|
||||
/*********************************************************************************/
|
||||
/* Make a Json Object containing all not null parameters. */
|
||||
@@ -2252,7 +2272,8 @@ my_bool json_object_add_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
|
||||
char *json_object_add(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
unsigned long *res_length, char *is_null, char *error)
|
||||
{
|
||||
char *key, *str = NULL;
|
||||
PCSZ key;
|
||||
char *str = NULL;
|
||||
PGLOBAL g = (PGLOBAL)initid->ptr;
|
||||
|
||||
if (g->Xchk) {
|
||||
@@ -2357,7 +2378,7 @@ char *json_object_delete(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
} // endif Xchk
|
||||
|
||||
if (!CheckMemory(g, initid, args, 1, false, true, true)) {
|
||||
char *key;
|
||||
PCSZ key;
|
||||
PJOB jobp;
|
||||
PJSON jsp, top;
|
||||
PJVAL jvp = MakeValue(g, args, 0, &top);
|
||||
@@ -2913,7 +2934,6 @@ char *jsonget_string(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
unsigned long *res_length, char *is_null, char *)
|
||||
{
|
||||
char *p, *path, *str = NULL;
|
||||
int rc;
|
||||
PJSON jsp;
|
||||
PJSNX jsx;
|
||||
PJVAL jvp;
|
||||
@@ -2921,68 +2941,64 @@ char *jsonget_string(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
|
||||
if (g->N) {
|
||||
str = (char*)g->Activityp;
|
||||
goto fin;
|
||||
goto err;
|
||||
} else if (initid->const_item)
|
||||
g->N = 1;
|
||||
|
||||
// Save stack and allocation environment and prepare error return
|
||||
if (g->jump_level == MAX_JUMP) {
|
||||
PUSH_WARNING(MSG(TOO_MANY_JUMPS));
|
||||
*is_null = 1;
|
||||
return NULL;
|
||||
} // endif jump_level
|
||||
try {
|
||||
if (!g->Xchk) {
|
||||
if (CheckMemory(g, initid, args, 1, true)) {
|
||||
PUSH_WARNING("CheckMemory error");
|
||||
goto err;
|
||||
} else
|
||||
jvp = MakeValue(g, args, 0);
|
||||
|
||||
if ((rc= setjmp(g->jumper[++g->jump_level])) != 0) {
|
||||
if ((p = jvp->GetString())) {
|
||||
if (!(jsp = ParseJson(g, p, strlen(p)))) {
|
||||
PUSH_WARNING(g->Message);
|
||||
goto err;
|
||||
} // endif jsp
|
||||
|
||||
} else
|
||||
jsp = jvp->GetJson();
|
||||
|
||||
if (g->Mrr) { // First argument is a constant
|
||||
g->Xchk = jsp;
|
||||
JsonMemSave(g);
|
||||
} // endif Mrr
|
||||
|
||||
} else
|
||||
jsp = (PJSON)g->Xchk;
|
||||
|
||||
path = MakePSZ(g, args, 1);
|
||||
jsx = new(g) JSNX(g, jsp, TYPE_STRING, initid->max_length);
|
||||
|
||||
if (jsx->SetJpath(g, path)) {
|
||||
PUSH_WARNING(g->Message);
|
||||
goto err;
|
||||
} // endif SetJpath
|
||||
|
||||
jsx->ReadValue(g);
|
||||
|
||||
if (!jsx->GetValue()->IsNull())
|
||||
str = jsx->GetValue()->GetCharValue();
|
||||
|
||||
if (initid->const_item)
|
||||
// Keep result of constant function
|
||||
g->Activityp = (PACTIVITY)str;
|
||||
|
||||
} catch (int n) {
|
||||
if (trace)
|
||||
htrc("Exception %d: %s\n", n, g->Message);
|
||||
PUSH_WARNING(g->Message);
|
||||
str = NULL;
|
||||
goto err;
|
||||
} // endif rc
|
||||
|
||||
if (!g->Xchk) {
|
||||
if (CheckMemory(g, initid, args, 1, true)) {
|
||||
PUSH_WARNING("CheckMemory error");
|
||||
goto err;
|
||||
} else
|
||||
jvp = MakeValue(g, args, 0);
|
||||
|
||||
if ((p = jvp->GetString())) {
|
||||
if (!(jsp = ParseJson(g, p, strlen(p)))) {
|
||||
PUSH_WARNING(g->Message);
|
||||
goto err;
|
||||
} // endif jsp
|
||||
|
||||
} else
|
||||
jsp = jvp->GetJson();
|
||||
|
||||
if (g->Mrr) { // First argument is a constant
|
||||
g->Xchk = jsp;
|
||||
JsonMemSave(g);
|
||||
} // endif Mrr
|
||||
|
||||
} else
|
||||
jsp = (PJSON)g->Xchk;
|
||||
|
||||
path = MakePSZ(g, args, 1);
|
||||
jsx = new(g) JSNX(g, jsp, TYPE_STRING, initid->max_length);
|
||||
|
||||
if (jsx->SetJpath(g, path)) {
|
||||
} catch (const char *msg) {
|
||||
strcpy(g->Message, msg);
|
||||
PUSH_WARNING(g->Message);
|
||||
goto err;
|
||||
} // endif SetJpath
|
||||
|
||||
jsx->ReadValue(g);
|
||||
|
||||
if (!jsx->GetValue()->IsNull())
|
||||
str = jsx->GetValue()->GetCharValue();
|
||||
|
||||
if (initid->const_item)
|
||||
// Keep result of constant function
|
||||
g->Activityp = (PACTIVITY)str;
|
||||
str = NULL;
|
||||
} // end catch
|
||||
|
||||
err:
|
||||
g->jump_level--;
|
||||
|
||||
fin:
|
||||
if (!str) {
|
||||
*is_null = 1;
|
||||
*res_length = 0;
|
||||
@@ -3253,7 +3269,7 @@ char *jsonlocate(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
unsigned long *res_length, char *is_null, char *error)
|
||||
{
|
||||
char *p, *path = NULL;
|
||||
int k, rc;
|
||||
int k;
|
||||
PJVAL jvp, jvp2;
|
||||
PJSON jsp;
|
||||
PJSNX jsx;
|
||||
@@ -3273,61 +3289,58 @@ char *jsonlocate(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
} else if (initid->const_item)
|
||||
g->N = 1;
|
||||
|
||||
// Save stack and allocation environment and prepare error return
|
||||
if (g->jump_level == MAX_JUMP) {
|
||||
PUSH_WARNING(MSG(TOO_MANY_JUMPS));
|
||||
*error = 1;
|
||||
*is_null = 1;
|
||||
return NULL;
|
||||
} // endif jump_level
|
||||
try {
|
||||
if (!g->Xchk) {
|
||||
if (CheckMemory(g, initid, args, 1, !g->Xchk)) {
|
||||
PUSH_WARNING("CheckMemory error");
|
||||
*error = 1;
|
||||
goto err;
|
||||
} else
|
||||
jvp = MakeValue(g, args, 0);
|
||||
|
||||
if ((rc= setjmp(g->jumper[++g->jump_level])) != 0) {
|
||||
if ((p = jvp->GetString())) {
|
||||
if (!(jsp = ParseJson(g, p, strlen(p)))) {
|
||||
PUSH_WARNING(g->Message);
|
||||
goto err;
|
||||
} // endif jsp
|
||||
|
||||
} else
|
||||
jsp = jvp->GetJson();
|
||||
|
||||
if (g->Mrr) { // First argument is a constant
|
||||
g->Xchk = jsp;
|
||||
JsonMemSave(g);
|
||||
} // endif Mrr
|
||||
|
||||
} else
|
||||
jsp = (PJSON)g->Xchk;
|
||||
|
||||
// The item to locate
|
||||
jvp2 = MakeValue(g, args, 1);
|
||||
|
||||
k = (args->arg_count > 2) ? (int)*(long long*)args->args[2] : 1;
|
||||
|
||||
jsx = new(g) JSNX(g, jsp, TYPE_STRING);
|
||||
path = jsx->Locate(g, jsp, jvp2, k);
|
||||
|
||||
if (initid->const_item)
|
||||
// Keep result of constant function
|
||||
g->Activityp = (PACTIVITY)path;
|
||||
|
||||
} catch (int n) {
|
||||
if (trace)
|
||||
htrc("Exception %d: %s\n", n, g->Message);
|
||||
PUSH_WARNING(g->Message);
|
||||
*error = 1;
|
||||
path = NULL;
|
||||
goto err;
|
||||
} // endif rc
|
||||
|
||||
if (!g->Xchk) {
|
||||
if (CheckMemory(g, initid, args, 1, !g->Xchk)) {
|
||||
PUSH_WARNING("CheckMemory error");
|
||||
*error = 1;
|
||||
goto err;
|
||||
} else
|
||||
jvp = MakeValue(g, args, 0);
|
||||
|
||||
if ((p = jvp->GetString())) {
|
||||
if (!(jsp = ParseJson(g, p, strlen(p)))) {
|
||||
PUSH_WARNING(g->Message);
|
||||
goto err;
|
||||
} // endif jsp
|
||||
|
||||
} else
|
||||
jsp = jvp->GetJson();
|
||||
|
||||
if (g->Mrr) { // First argument is a constant
|
||||
g->Xchk = jsp;
|
||||
JsonMemSave(g);
|
||||
} // endif Mrr
|
||||
|
||||
} else
|
||||
jsp = (PJSON)g->Xchk;
|
||||
|
||||
// The item to locate
|
||||
jvp2 = MakeValue(g, args, 1);
|
||||
|
||||
k = (args->arg_count > 2) ? (int)*(long long*)args->args[2] : 1;
|
||||
|
||||
jsx = new(g) JSNX(g, jsp, TYPE_STRING);
|
||||
path = jsx->Locate(g, jsp, jvp2, k);
|
||||
|
||||
if (initid->const_item)
|
||||
// Keep result of constant function
|
||||
g->Activityp = (PACTIVITY)path;
|
||||
} catch (const char *msg) {
|
||||
strcpy(g->Message, msg);
|
||||
PUSH_WARNING(g->Message);
|
||||
*error = 1;
|
||||
path = NULL;
|
||||
} // end catch
|
||||
|
||||
err:
|
||||
g->jump_level--;
|
||||
|
||||
if (!path) {
|
||||
*res_length = 0;
|
||||
*is_null = 1;
|
||||
@@ -3378,7 +3391,7 @@ char *json_locate_all(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
unsigned long *res_length, char *is_null, char *error)
|
||||
{
|
||||
char *p, *path = NULL;
|
||||
int rc, mx = 10;
|
||||
int mx = 10;
|
||||
PJVAL jvp, jvp2;
|
||||
PJSON jsp;
|
||||
PJSNX jsx;
|
||||
@@ -3399,62 +3412,59 @@ char *json_locate_all(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
} else if (initid->const_item)
|
||||
g->N = 1;
|
||||
|
||||
// Save stack and allocation environment and prepare error return
|
||||
if (g->jump_level == MAX_JUMP) {
|
||||
PUSH_WARNING(MSG(TOO_MANY_JUMPS));
|
||||
*error = 1;
|
||||
*is_null = 1;
|
||||
return NULL;
|
||||
} // endif jump_level
|
||||
try {
|
||||
if (!g->Xchk) {
|
||||
if (CheckMemory(g, initid, args, 1, true)) {
|
||||
PUSH_WARNING("CheckMemory error");
|
||||
*error = 1;
|
||||
goto err;
|
||||
} else
|
||||
jvp = MakeValue(g, args, 0);
|
||||
|
||||
if ((rc= setjmp(g->jumper[++g->jump_level])) != 0) {
|
||||
if ((p = jvp->GetString())) {
|
||||
if (!(jsp = ParseJson(g, p, strlen(p)))) {
|
||||
PUSH_WARNING(g->Message);
|
||||
goto err;
|
||||
} // endif jsp
|
||||
|
||||
} else
|
||||
jsp = jvp->GetJson();
|
||||
|
||||
if (g->Mrr) { // First argument is a constant
|
||||
g->Xchk = jsp;
|
||||
JsonMemSave(g);
|
||||
} // endif Mrr
|
||||
|
||||
} else
|
||||
jsp = (PJSON)g->Xchk;
|
||||
|
||||
// The item to locate
|
||||
jvp2 = MakeValue(g, args, 1);
|
||||
|
||||
if (args->arg_count > 2)
|
||||
mx = (int)*(long long*)args->args[2];
|
||||
|
||||
jsx = new(g) JSNX(g, jsp, TYPE_STRING);
|
||||
path = jsx->LocateAll(g, jsp, jvp2, mx);
|
||||
|
||||
if (initid->const_item)
|
||||
// Keep result of constant function
|
||||
g->Activityp = (PACTIVITY)path;
|
||||
|
||||
} catch (int n) {
|
||||
if (trace)
|
||||
htrc("Exception %d: %s\n", n, g->Message);
|
||||
PUSH_WARNING(g->Message);
|
||||
*error = 1;
|
||||
path = NULL;
|
||||
goto err;
|
||||
} // endif rc
|
||||
|
||||
if (!g->Xchk) {
|
||||
if (CheckMemory(g, initid, args, 1, true)) {
|
||||
PUSH_WARNING("CheckMemory error");
|
||||
*error = 1;
|
||||
goto err;
|
||||
} else
|
||||
jvp = MakeValue(g, args, 0);
|
||||
|
||||
if ((p = jvp->GetString())) {
|
||||
if (!(jsp = ParseJson(g, p, strlen(p)))) {
|
||||
PUSH_WARNING(g->Message);
|
||||
goto err;
|
||||
} // endif jsp
|
||||
|
||||
} else
|
||||
jsp = jvp->GetJson();
|
||||
|
||||
if (g->Mrr) { // First argument is a constant
|
||||
g->Xchk = jsp;
|
||||
JsonMemSave(g);
|
||||
} // endif Mrr
|
||||
|
||||
} else
|
||||
jsp = (PJSON)g->Xchk;
|
||||
|
||||
// The item to locate
|
||||
jvp2 = MakeValue(g, args, 1);
|
||||
|
||||
if (args->arg_count > 2)
|
||||
mx = (int)*(long long*)args->args[2];
|
||||
|
||||
jsx = new(g) JSNX(g, jsp, TYPE_STRING);
|
||||
path = jsx->LocateAll(g, jsp, jvp2, mx);
|
||||
|
||||
if (initid->const_item)
|
||||
// Keep result of constant function
|
||||
g->Activityp = (PACTIVITY)path;
|
||||
} catch (const char *msg) {
|
||||
strcpy(g->Message, msg);
|
||||
PUSH_WARNING(g->Message);
|
||||
*error = 1;
|
||||
path = NULL;
|
||||
} // end catch
|
||||
|
||||
err:
|
||||
g->jump_level--;
|
||||
|
||||
if (!path) {
|
||||
*res_length = 0;
|
||||
*is_null = 1;
|
||||
@@ -3632,11 +3642,11 @@ void jsoncontains_path_deinit(UDF_INIT* initid)
|
||||
/*********************************************************************************/
|
||||
/* This function is used by the json_set/insert/update_item functions. */
|
||||
/*********************************************************************************/
|
||||
static char *handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
char *handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
unsigned long *res_length, char *is_null, char *error)
|
||||
{
|
||||
char *p, *path, *str = NULL;
|
||||
int w, rc;
|
||||
int w;
|
||||
my_bool b = true;
|
||||
PJSON jsp;
|
||||
PJSNX jsx;
|
||||
@@ -3658,78 +3668,73 @@ static char *handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
w = 2;
|
||||
else {
|
||||
PUSH_WARNING("Logical error, please contact CONNECT developer");
|
||||
goto err;
|
||||
goto fin;
|
||||
} // endelse
|
||||
|
||||
// Save stack and allocation environment and prepare error return
|
||||
if (g->jump_level == MAX_JUMP) {
|
||||
PUSH_WARNING(MSG(TOO_MANY_JUMPS));
|
||||
*error = 1;
|
||||
goto fin;
|
||||
} // endif jump_level
|
||||
try {
|
||||
if (!g->Xchk) {
|
||||
if (CheckMemory(g, initid, args, 1, true, false, true)) {
|
||||
PUSH_WARNING("CheckMemory error");
|
||||
throw 1;
|
||||
} else
|
||||
jvp = MakeValue(g, args, 0);
|
||||
|
||||
if ((rc= setjmp(g->jumper[++g->jump_level])) != 0) {
|
||||
if ((p = jvp->GetString())) {
|
||||
if (!(jsp = ParseJson(g, p, strlen(p)))) {
|
||||
throw 2;
|
||||
} // endif jsp
|
||||
|
||||
} else
|
||||
jsp = jvp->GetJson();
|
||||
|
||||
if (g->Mrr) { // First argument is a constant
|
||||
g->Xchk = jsp;
|
||||
JsonMemSave(g);
|
||||
} // endif Mrr
|
||||
|
||||
} else
|
||||
jsp = (PJSON)g->Xchk;
|
||||
|
||||
jsx = new(g)JSNX(g, jsp, TYPE_STRING, initid->max_length, 0, true);
|
||||
|
||||
for (uint i = 1; i + 1 < args->arg_count; i += 2) {
|
||||
jvp = MakeValue(gb, args, i);
|
||||
path = MakePSZ(g, args, i + 1);
|
||||
|
||||
if (jsx->SetJpath(g, path, false)) {
|
||||
PUSH_WARNING(g->Message);
|
||||
continue;
|
||||
} // endif SetJpath
|
||||
|
||||
if (w) {
|
||||
jsx->ReadValue(g);
|
||||
b = jsx->GetValue()->IsNull();
|
||||
b = (w == 1) ? b : !b;
|
||||
} // endif w
|
||||
|
||||
if (b && jsx->WriteValue(gb, jvp))
|
||||
PUSH_WARNING(g->Message);
|
||||
|
||||
} // endfor i
|
||||
|
||||
// In case of error or file, return unchanged argument
|
||||
if (!(str = MakeResult(g, args, jsp, INT_MAX32)))
|
||||
str = MakePSZ(g, args, 0);
|
||||
|
||||
if (g->N)
|
||||
// Keep result of constant function
|
||||
g->Activityp = (PACTIVITY)str;
|
||||
|
||||
} catch (int n) {
|
||||
if (trace)
|
||||
htrc("Exception %d: %s\n", n, g->Message);
|
||||
PUSH_WARNING(g->Message);
|
||||
str = NULL;
|
||||
goto err;
|
||||
} // endif rc
|
||||
|
||||
if (!g->Xchk) {
|
||||
if (CheckMemory(g, initid, args, 1, true, false, true)) {
|
||||
PUSH_WARNING("CheckMemory error");
|
||||
goto err;
|
||||
} else
|
||||
jvp = MakeValue(g, args, 0);
|
||||
|
||||
if ((p = jvp->GetString())) {
|
||||
if (!(jsp = ParseJson(g, p, strlen(p)))) {
|
||||
PUSH_WARNING(g->Message);
|
||||
goto err;
|
||||
} // endif jsp
|
||||
|
||||
} else
|
||||
jsp = jvp->GetJson();
|
||||
|
||||
if (g->Mrr) { // First argument is a constant
|
||||
g->Xchk = jsp;
|
||||
JsonMemSave(g);
|
||||
} // endif Mrr
|
||||
|
||||
} else
|
||||
jsp = (PJSON)g->Xchk;
|
||||
|
||||
jsx = new(g)JSNX(g, jsp, TYPE_STRING, initid->max_length, 0, true);
|
||||
|
||||
for (uint i = 1; i+1 < args->arg_count; i += 2) {
|
||||
jvp = MakeValue(gb, args, i);
|
||||
path = MakePSZ(g, args, i+1);
|
||||
|
||||
if (jsx->SetJpath(g, path, false)) {
|
||||
PUSH_WARNING(g->Message);
|
||||
continue;
|
||||
} // endif SetJpath
|
||||
|
||||
if (w) {
|
||||
jsx->ReadValue(g);
|
||||
b = jsx->GetValue()->IsNull();
|
||||
b = (w == 1) ? b : !b;
|
||||
} // endif w
|
||||
|
||||
if (b && jsx->WriteValue(gb, jvp))
|
||||
PUSH_WARNING(g->Message);
|
||||
|
||||
} // endfor i
|
||||
|
||||
// In case of error or file, return unchanged argument
|
||||
if (!(str = MakeResult(g, args, jsp, INT_MAX32)))
|
||||
str = MakePSZ(g, args, 0);
|
||||
|
||||
if (g->N)
|
||||
// Keep result of constant function
|
||||
g->Activityp = (PACTIVITY)str;
|
||||
|
||||
err:
|
||||
g->jump_level--;
|
||||
} catch (const char *msg) {
|
||||
strcpy(g->Message, msg);
|
||||
PUSH_WARNING(g->Message);
|
||||
str = NULL;
|
||||
} // end catch
|
||||
|
||||
fin:
|
||||
if (!str) {
|
||||
@@ -4556,7 +4561,7 @@ char *jbin_object_add(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
} // endif bsp
|
||||
|
||||
if (!CheckMemory(g, initid, args, 2, false, true, true)) {
|
||||
char *key;
|
||||
PCSZ key;
|
||||
PJOB jobp;
|
||||
PJVAL jvp = MakeValue(g, args, 0, &top);
|
||||
PJSON jsp = jvp->GetJson();
|
||||
@@ -4636,7 +4641,7 @@ char *jbin_object_delete(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
} // endif bsp
|
||||
|
||||
if (!CheckMemory(g, initid, args, 1, false, true, true)) {
|
||||
char *key;
|
||||
PCSZ key;
|
||||
PJOB jobp;
|
||||
PJVAL jvp = MakeValue(g, args, 0, &top);
|
||||
PJSON jsp = jvp->GetJson();
|
||||
@@ -4905,7 +4910,7 @@ void jbin_item_merge_deinit(UDF_INIT* initid)
|
||||
/*********************************************************************************/
|
||||
/* This function is used by the jbin_set/insert/update functions. */
|
||||
/*********************************************************************************/
|
||||
static char *bin_handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
char *bin_handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
unsigned long *res_length, char *is_null, char *error)
|
||||
{
|
||||
char *p, *path;
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/******************** tabjson H Declares Source Code File (.H) *******************/
|
||||
/* Name: jsonudf.h Version 1.2 */
|
||||
/* Name: jsonudf.h Version 1.3 */
|
||||
/* */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2015 */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2015-2017 */
|
||||
/* */
|
||||
/* This file contains the JSON UDF function and class declares. */
|
||||
/*********************************************************************************/
|
||||
@@ -37,9 +37,9 @@ extern "C" {
|
||||
DllExport char *jsonvalue(UDF_EXEC_ARGS);
|
||||
DllExport void jsonvalue_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool json_array_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *json_array(UDF_EXEC_ARGS);
|
||||
DllExport void json_array_deinit(UDF_INIT*);
|
||||
DllExport my_bool json_make_array_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *json_make_array(UDF_EXEC_ARGS);
|
||||
DllExport void json_make_array_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool json_array_add_values_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *json_array_add_values(UDF_EXEC_ARGS);
|
||||
@@ -53,9 +53,9 @@ extern "C" {
|
||||
DllExport char *json_array_delete(UDF_EXEC_ARGS);
|
||||
DllExport void json_array_delete_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool json_object_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *json_object(UDF_EXEC_ARGS);
|
||||
DllExport void json_object_deinit(UDF_INIT*);
|
||||
DllExport my_bool json_make_object_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *json_make_object(UDF_EXEC_ARGS);
|
||||
DllExport void json_make_object_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool json_object_nonull_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *json_object_nonull(UDF_EXEC_ARGS);
|
||||
@@ -232,7 +232,7 @@ extern "C" {
|
||||
/*********************************************************************************/
|
||||
typedef struct _jpn {
|
||||
enum JTYP Type;
|
||||
PSZ Key;
|
||||
PCSZ Key;
|
||||
int N;
|
||||
} JPN, *PJPN;
|
||||
|
||||
|
@@ -68,9 +68,9 @@ class LIBXMLDOC : public XMLDOCUMENT {
|
||||
virtual void SetNofree(bool b) {Nofreelist = b;}
|
||||
|
||||
// Methods
|
||||
virtual bool Initialize(PGLOBAL g, char *entry, bool zipped);
|
||||
virtual bool Initialize(PGLOBAL g, PCSZ entry, bool zipped);
|
||||
virtual bool ParseFile(PGLOBAL g, char *fn);
|
||||
virtual bool NewDoc(PGLOBAL g, char *ver);
|
||||
virtual bool NewDoc(PGLOBAL g, PCSZ ver);
|
||||
virtual void AddComment(PGLOBAL g, char *com);
|
||||
virtual PXNODE GetRoot(PGLOBAL g);
|
||||
virtual PXNODE NewRoot(PGLOBAL g, char *name);
|
||||
@@ -119,9 +119,9 @@ class XML2NODE : public XMLNODE {
|
||||
virtual PXLIST SelectNodes(PGLOBAL g, char *xp, PXLIST lp);
|
||||
virtual PXNODE SelectSingleNode(PGLOBAL g, char *xp, PXNODE np);
|
||||
virtual PXATTR GetAttribute(PGLOBAL g, char *name, PXATTR ap);
|
||||
virtual PXNODE AddChildNode(PGLOBAL g, char *name, PXNODE np);
|
||||
virtual PXNODE AddChildNode(PGLOBAL g, PCSZ name, PXNODE np);
|
||||
virtual PXATTR AddProperty(PGLOBAL g, char *name, PXATTR ap);
|
||||
virtual void AddText(PGLOBAL g, char *txtp);
|
||||
virtual void AddText(PGLOBAL g, PCSZ txtp);
|
||||
virtual void DeleteChild(PGLOBAL g, PXNODE dnp);
|
||||
|
||||
protected:
|
||||
@@ -373,7 +373,7 @@ LIBXMLDOC::LIBXMLDOC(char *nsl, char *nsdf, char *enc, PFBLOCK fp)
|
||||
/******************************************************************/
|
||||
/* Initialize XML parser and check library compatibility. */
|
||||
/******************************************************************/
|
||||
bool LIBXMLDOC::Initialize(PGLOBAL g, char *entry, bool zipped)
|
||||
bool LIBXMLDOC::Initialize(PGLOBAL g, PCSZ entry, bool zipped)
|
||||
{
|
||||
if (zipped && InitZip(g, entry))
|
||||
return true;
|
||||
@@ -434,7 +434,7 @@ PFBLOCK LIBXMLDOC::LinkXblock(PGLOBAL g, MODE m, int rc, char *fn)
|
||||
/******************************************************************/
|
||||
/* Construct and add the XML processing instruction node. */
|
||||
/******************************************************************/
|
||||
bool LIBXMLDOC::NewDoc(PGLOBAL g, char *ver)
|
||||
bool LIBXMLDOC::NewDoc(PGLOBAL g, PCSZ ver)
|
||||
{
|
||||
if (trace)
|
||||
htrc("NewDoc\n");
|
||||
@@ -863,14 +863,13 @@ RCODE XML2NODE::GetContent(PGLOBAL g, char *buf, int len)
|
||||
xmlFree(Content);
|
||||
|
||||
if ((Content = xmlNodeGetContent(Nodep))) {
|
||||
char *extra = " \t\r\n";
|
||||
char *p1 = (char*)Content, *p2 = buf;
|
||||
bool b = false;
|
||||
|
||||
// Copy content eliminating extra characters
|
||||
for (; *p1; p1++)
|
||||
if ((p2 - buf) < len) {
|
||||
if (strchr(extra, *p1)) {
|
||||
if (strchr(" \t\r\n", *p1)) {
|
||||
if (b) {
|
||||
// This to have one blank between sub-nodes
|
||||
*p2++ = ' ';
|
||||
@@ -1020,19 +1019,19 @@ PXATTR XML2NODE::GetAttribute(PGLOBAL g, char *name, PXATTR ap)
|
||||
/******************************************************************/
|
||||
/* Add a new child node to this node and return it. */
|
||||
/******************************************************************/
|
||||
PXNODE XML2NODE::AddChildNode(PGLOBAL g, char *name, PXNODE np)
|
||||
PXNODE XML2NODE::AddChildNode(PGLOBAL g, PCSZ name, PXNODE np)
|
||||
{
|
||||
char *p, *pn, *pf = NULL;
|
||||
char *p, *pn, *pf = NULL, *nmp = PlugDup(g, name);
|
||||
|
||||
if (trace)
|
||||
htrc("AddChildNode: %s\n", name);
|
||||
|
||||
// Is a prefix specified
|
||||
if ((pn = strchr(name, ':'))) {
|
||||
pf = name;
|
||||
if ((pn = strchr(nmp, ':'))) {
|
||||
pf = nmp;
|
||||
*pn++ = '\0'; // Separate name from prefix
|
||||
} else
|
||||
pn = name;
|
||||
pn = nmp;
|
||||
|
||||
// If name has the format m[n] only m is taken as node name
|
||||
if ((p = strchr(pn, '[')))
|
||||
@@ -1096,7 +1095,7 @@ PXATTR XML2NODE::AddProperty(PGLOBAL g, char *name, PXATTR ap)
|
||||
/******************************************************************/
|
||||
/* Add a new text node to this node. */
|
||||
/******************************************************************/
|
||||
void XML2NODE::AddText(PGLOBAL g, char *txtp)
|
||||
void XML2NODE::AddText(PGLOBAL g, PCSZ txtp)
|
||||
{
|
||||
if (trace)
|
||||
htrc("AddText: %s\n", txtp);
|
||||
|
@@ -192,7 +192,7 @@ bool MACINFO::GetOneInfo(PGLOBAL g, int flag, void *v, int lv)
|
||||
case 23:
|
||||
break;
|
||||
default:
|
||||
p = "";
|
||||
p = PlugDup(g, "");
|
||||
} // endswitch flag
|
||||
|
||||
} else switch (flag) {
|
||||
|
815
storage/connect/mongofam.cpp
Normal file
815
storage/connect/mongofam.cpp
Normal file
@@ -0,0 +1,815 @@
|
||||
/************ MONGO FAM C++ Program Source Code File (.CPP) ************/
|
||||
/* PROGRAM NAME: mongofam.cpp */
|
||||
/* ------------- */
|
||||
/* Version 1.1 */
|
||||
/* */
|
||||
/* COPYRIGHT: */
|
||||
/* ---------- */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 20017 */
|
||||
/* */
|
||||
/* WHAT THIS PROGRAM DOES: */
|
||||
/* ----------------------- */
|
||||
/* This program are the MongoDB access method classes. */
|
||||
/* */
|
||||
/***********************************************************************/
|
||||
|
||||
/***********************************************************************/
|
||||
/* Include relevant sections of the System header files. */
|
||||
/***********************************************************************/
|
||||
#include "my_global.h"
|
||||
#if defined(__WIN__)
|
||||
//#include <io.h>
|
||||
//#include <fcntl.h>
|
||||
//#include <errno.h>
|
||||
#if defined(__BORLANDC__)
|
||||
#define __MFC_COMPAT__ // To define min/max as macro
|
||||
#endif // __BORLANDC__
|
||||
//#include <windows.h>
|
||||
#else // !__WIN__
|
||||
#if defined(UNIX) || defined(UNIV_LINUX)
|
||||
//#include <errno.h>
|
||||
#include <unistd.h>
|
||||
//#if !defined(sun) // Sun has the ftruncate fnc.
|
||||
//#define USETEMP // Force copy mode for DELETE
|
||||
//#endif // !sun
|
||||
#else // !UNIX
|
||||
//#include <io.h>
|
||||
#endif // !UNIX
|
||||
//#include <fcntl.h>
|
||||
#endif // !__WIN__
|
||||
|
||||
/***********************************************************************/
|
||||
/* Include application header files: */
|
||||
/* global.h is header containing all global declarations. */
|
||||
/* plgdbsem.h is header containing the DB application declarations. */
|
||||
/* filamtxt.h is header containing the file AM classes declarations. */
|
||||
/***********************************************************************/
|
||||
#include "global.h"
|
||||
#include "plgdbsem.h"
|
||||
#include "reldef.h"
|
||||
#include "filamtxt.h"
|
||||
#include "tabdos.h"
|
||||
#include "tabjson.h"
|
||||
#include "mongofam.h"
|
||||
|
||||
#if defined(UNIX) || defined(UNIV_LINUX)
|
||||
#include "osutil.h"
|
||||
//#define _fileno fileno
|
||||
//#define _O_RDONLY O_RDONLY
|
||||
#endif
|
||||
|
||||
// Required to initialize libmongoc's internals
|
||||
void mongo_init(bool init)
|
||||
{
|
||||
if (init)
|
||||
mongoc_init();
|
||||
else
|
||||
mongoc_cleanup();
|
||||
|
||||
} // end of mongo_init
|
||||
|
||||
/* --------------------------- Class MGOFAM -------------------------- */
|
||||
|
||||
/***********************************************************************/
|
||||
/* Constructors. */
|
||||
/***********************************************************************/
|
||||
MGOFAM::MGOFAM(PJDEF tdp) : DOSFAM((PDOSDEF)NULL)
|
||||
{
|
||||
Client = NULL;
|
||||
Database = NULL;
|
||||
Collection = NULL;
|
||||
Cursor = NULL;
|
||||
Query = NULL;
|
||||
Opts = NULL;
|
||||
To_Fbt = NULL;
|
||||
Mode = MODE_ANY;
|
||||
Uristr = tdp->Uri;
|
||||
Db_name = tdp->Schema;
|
||||
Coll_name = tdp->Collname;
|
||||
Options = tdp->Options;
|
||||
Filter = NULL;
|
||||
Done = false;
|
||||
Pipe = tdp->Pipe;
|
||||
Lrecl = tdp->Lrecl + tdp->Ending;
|
||||
} // end of MGOFAM standard constructor
|
||||
|
||||
MGOFAM::MGOFAM(PMGOFAM tdfp) : DOSFAM(tdfp)
|
||||
{
|
||||
Client = tdfp->Client;
|
||||
Database = NULL;
|
||||
Collection = tdfp->Collection;
|
||||
Cursor = tdfp->Cursor;
|
||||
Query = tdfp->Query;
|
||||
Opts = tdfp->Opts;
|
||||
To_Fbt = tdfp->To_Fbt;
|
||||
Mode = tdfp->Mode;
|
||||
Uristr = tdfp->Uristr;
|
||||
Db_name = tdfp->Db_name;
|
||||
Coll_name = tdfp->Coll_name;
|
||||
Options = tdfp->Options;
|
||||
Filter = NULL;
|
||||
Done = tdfp->Done;
|
||||
Pipe = tdfp->Pipe;
|
||||
} // end of MGOFAM copy constructor
|
||||
|
||||
#if 0
|
||||
void *MGOFAM::mgo_alloc(size_t n)
|
||||
{
|
||||
char *mst = (char*)PlgDBSubAlloc(G, NULL, n + sizeof(size_t));
|
||||
|
||||
if (mst) {
|
||||
*(size_t*)mst = n;
|
||||
return mst + sizeof(size_t);
|
||||
} // endif mst
|
||||
|
||||
return NULL;
|
||||
} // end of mgo_alloc
|
||||
|
||||
void *MGOFAM::mgo_calloc(size_t n, size_t sz)
|
||||
{
|
||||
void *m = mgo_alloc(n * sz);
|
||||
|
||||
if (m)
|
||||
memset(m, 0, n * sz);
|
||||
|
||||
return m;
|
||||
} // end of mgo_calloc
|
||||
|
||||
void *MGOFAM::mgo_realloc(void *m, size_t n)
|
||||
{
|
||||
if (!m)
|
||||
return n ? mgo_alloc(n) : NULL;
|
||||
|
||||
size_t *osz = (size_t*)((char*)m - sizeof(size_t));
|
||||
|
||||
if (n > *osz) {
|
||||
void *nwm = mgo_alloc(n);
|
||||
|
||||
if (nwm)
|
||||
memcpy(nwm, m, *osz);
|
||||
|
||||
return nwm;
|
||||
} else {
|
||||
*osz = n;
|
||||
return m;
|
||||
} // endif n
|
||||
|
||||
} // end of mgo_realloc
|
||||
#endif // 0
|
||||
|
||||
/***********************************************************************/
|
||||
/* Reset: reset position values at the beginning of file. */
|
||||
/***********************************************************************/
|
||||
void MGOFAM::Reset(void)
|
||||
{
|
||||
TXTFAM::Reset();
|
||||
Fpos = Tpos = Spos = 0;
|
||||
} // end of Reset
|
||||
|
||||
/***********************************************************************/
|
||||
/* MGO GetFileLength: returns file size in number of bytes. */
|
||||
/***********************************************************************/
|
||||
int MGOFAM::GetFileLength(PGLOBAL g)
|
||||
{
|
||||
return 0;
|
||||
} // end of GetFileLength
|
||||
|
||||
/***********************************************************************/
|
||||
/* Cardinality: returns table cardinality in number of rows. */
|
||||
/* This function can be called with a null argument to test the */
|
||||
/* availability of Cardinality implementation (1 yes, 0 no). */
|
||||
/***********************************************************************/
|
||||
int MGOFAM::Cardinality(PGLOBAL g)
|
||||
{
|
||||
if (g) {
|
||||
if (!Init(g)) {
|
||||
bson_t *query;
|
||||
const char *jf = NULL;
|
||||
|
||||
if (Pipe)
|
||||
return 10;
|
||||
else if (Filter)
|
||||
jf = Filter;
|
||||
|
||||
if (jf) {
|
||||
query = bson_new_from_json((const uint8_t *)jf, -1, &Error);
|
||||
|
||||
if (!query) {
|
||||
htrc("Wrong filter: %s", Error.message);
|
||||
return 10;
|
||||
} // endif Query
|
||||
|
||||
} else
|
||||
query = bson_new();
|
||||
|
||||
int64_t card = (int)mongoc_collection_count(Collection,
|
||||
MONGOC_QUERY_NONE, query, 0, 0, NULL, &Error);
|
||||
|
||||
if (card < 0)
|
||||
sprintf(g->Message, "Collection count: %s", Error.message);
|
||||
|
||||
bson_destroy(query);
|
||||
return card;
|
||||
} else
|
||||
return -1;
|
||||
|
||||
} else
|
||||
return 1;
|
||||
|
||||
} // end of Cardinality
|
||||
|
||||
/***********************************************************************/
|
||||
/* Note: This function is not really implemented yet. */
|
||||
/***********************************************************************/
|
||||
int MGOFAM::MaxBlkSize(PGLOBAL, int s)
|
||||
{
|
||||
return s;
|
||||
} // end of MaxBlkSize
|
||||
|
||||
/***********************************************************************/
|
||||
/* Init: initialize MongoDB processing. */
|
||||
/***********************************************************************/
|
||||
bool MGOFAM::Init(PGLOBAL g)
|
||||
{
|
||||
if (Done)
|
||||
return false;
|
||||
|
||||
if (Options && !Pipe) {
|
||||
char *p = (char*)strchr(Options, ';');
|
||||
|
||||
if (p) {
|
||||
*p++ = 0;
|
||||
|
||||
if (p)
|
||||
Filter = p;
|
||||
|
||||
} // endif p
|
||||
|
||||
} // endif Options
|
||||
|
||||
Uri = mongoc_uri_new(Uristr);
|
||||
|
||||
if (!Uri) {
|
||||
sprintf(g->Message, "Failed to parse URI: \"%s\"", Uristr);
|
||||
return true;
|
||||
} // endif Uri
|
||||
|
||||
// Create a new client pool instance
|
||||
Pool = mongoc_client_pool_new(Uri);
|
||||
mongoc_client_pool_set_error_api(Pool, 2);
|
||||
|
||||
// Register the application name so we can track it in the profile logs
|
||||
// on the server. This can also be done from the URI.
|
||||
mongoc_client_pool_set_appname(Pool, "Connect");
|
||||
|
||||
// Create a new client instance
|
||||
Client = mongoc_client_pool_pop(Pool);
|
||||
//Client = mongoc_client_new(uristr);
|
||||
|
||||
if (!Client) {
|
||||
sprintf(g->Message, "Failed to get Client");
|
||||
return true;
|
||||
} // endif Client
|
||||
|
||||
//mongoc_client_set_error_api(Client, 2);
|
||||
|
||||
// Register the application name so we can track it in the profile logs
|
||||
// on the server. This can also be done from the URI.
|
||||
//mongoc_client_set_appname(Client, "Connect");
|
||||
|
||||
// Get a handle on the database Db_name and collection Coll_name
|
||||
// Database = mongoc_client_get_database(Client, Db_name);
|
||||
// Collection = mongoc_database_get_collection(Database, Coll_name);
|
||||
Collection = mongoc_client_get_collection(Client, Db_name, Coll_name);
|
||||
|
||||
if (!Collection) {
|
||||
sprintf(g->Message, "Failed to get Collection %s.%s", Db_name, Coll_name);
|
||||
return true;
|
||||
} // endif Collection
|
||||
|
||||
Done = true;
|
||||
return false;
|
||||
} // end of Init
|
||||
|
||||
/***********************************************************************/
|
||||
/* OpenDB: Data Base open routine for MONGO access method. */
|
||||
/***********************************************************************/
|
||||
bool MGOFAM::MakeCursor(PGLOBAL g)
|
||||
{
|
||||
const char *p;
|
||||
bool b = false, id = (Mode != MODE_READ), all = false;
|
||||
uint len;
|
||||
PSZ jp;
|
||||
PCOL cp;
|
||||
PSTRG s = NULL;
|
||||
|
||||
if (Options && !stricmp(Options, "all")) {
|
||||
Options = NULL;
|
||||
all = true;
|
||||
} // endif Options
|
||||
|
||||
for (cp = Tdbp->GetColumns(); cp; cp = cp->GetNext())
|
||||
if (!strcmp(cp->GetName(), "_id"))
|
||||
id = true;
|
||||
else if (cp->GetFmt() && !strcmp(cp->GetFmt(), "*"))
|
||||
all = true;
|
||||
|
||||
if (Pipe) {
|
||||
if (trace)
|
||||
htrc("Pipeline: %s\n", Options);
|
||||
|
||||
p = strrchr(Options, ']');
|
||||
|
||||
if (!p) {
|
||||
strcpy(g->Message, "Missing ] in pipeline");
|
||||
return true;
|
||||
} else
|
||||
*(char*)p = 0;
|
||||
|
||||
s = new(g) STRING(g, 1023, (PSZ)Options);
|
||||
len = s->GetLength();
|
||||
|
||||
if (Tdbp->GetFilter()) {
|
||||
s->Append(",{\"$match\":");
|
||||
|
||||
if (!Tdbp->GetFilter()->MakeSelector(g, s, false)) {
|
||||
s->Append('}');
|
||||
Tdbp->SetFilter(NULL); // Not needed anymore
|
||||
} else {
|
||||
if (((TDBJSN*)Tdbp)->Xcol)
|
||||
Tdbp->SetFilter(NULL); // Incompatible
|
||||
|
||||
htrc("Failed making selector\n");
|
||||
s->Truncate(len);
|
||||
} // endif Selector
|
||||
|
||||
} // endif To_Filter
|
||||
|
||||
if (!all) {
|
||||
// Project list
|
||||
len = s->GetLength();
|
||||
|
||||
if (Tdbp->GetColumns()) {
|
||||
s->Append(",{\"$project\":{\"");
|
||||
|
||||
if (!id)
|
||||
s->Append("_id\":0,\"");
|
||||
|
||||
for (PCOL cp = Tdbp->GetColumns(); cp; cp = cp->GetNext()) {
|
||||
if (b)
|
||||
s->Append(",\"");
|
||||
else
|
||||
b = true;
|
||||
|
||||
if ((jp = ((PJCOL)cp)->GetJpath(g, true)))
|
||||
s->Append(jp);
|
||||
else {
|
||||
s->Truncate(len);
|
||||
goto nop;
|
||||
} // endif Jpath
|
||||
|
||||
s->Append("\":1");
|
||||
} // endfor cp
|
||||
|
||||
} else
|
||||
s->Append(",{\"$project\":{\"_id\":1}}");
|
||||
|
||||
s->Append("}}");
|
||||
} // endif all
|
||||
|
||||
nop:
|
||||
s->Append("]}");
|
||||
s->Resize(s->GetLength() + 1);
|
||||
p = s->GetStr();
|
||||
|
||||
if (trace)
|
||||
htrc("New Pipeline: %s\n", p);
|
||||
|
||||
Query = bson_new_from_json((const uint8_t *)p, -1, &Error);
|
||||
|
||||
if (!Query) {
|
||||
sprintf(g->Message, "Wrong pipeline: %s", Error.message);
|
||||
return true;
|
||||
} // endif Query
|
||||
|
||||
Cursor = mongoc_collection_aggregate(Collection, MONGOC_QUERY_NONE,
|
||||
Query, NULL, NULL);
|
||||
|
||||
if (mongoc_cursor_error(Cursor, &Error)) {
|
||||
sprintf(g->Message, "Mongo aggregate Failure: %s", Error.message);
|
||||
return true;
|
||||
} // endif cursor
|
||||
|
||||
} else {
|
||||
if (Filter || Tdbp->GetFilter()) {
|
||||
if (trace) {
|
||||
if (Filter)
|
||||
htrc("Filter: %s\n", Filter);
|
||||
|
||||
if (Tdbp->GetFilter()) {
|
||||
char buf[512];
|
||||
|
||||
Tdbp->GetFilter()->Prints(g, buf, 511);
|
||||
htrc("To_Filter: %s\n", buf);
|
||||
} // endif To_Filter
|
||||
|
||||
} // endif trace
|
||||
|
||||
s = new(g) STRING(g, 1023, (PSZ)Filter);
|
||||
len = s->GetLength();
|
||||
|
||||
if (Tdbp->GetFilter()) {
|
||||
if (Filter)
|
||||
s->Append(',');
|
||||
|
||||
if (Tdbp->GetFilter()->MakeSelector(g, s, false)) {
|
||||
if (((TDBJSN*)Tdbp)->Xcol)
|
||||
Tdbp->SetFilter(NULL); // Incompatible
|
||||
|
||||
htrc("Cannot make selector\n");
|
||||
s->Truncate(len);
|
||||
} else
|
||||
Tdbp->SetFilter(NULL); // Not needed anymore
|
||||
|
||||
} // endif To_Filter
|
||||
|
||||
if (trace)
|
||||
htrc("selector: %s\n", s->GetStr());
|
||||
|
||||
s->Resize(s->GetLength() + 1);
|
||||
|
||||
if (s->GetLength()) {
|
||||
Query = bson_new_from_json((const uint8_t *)s->GetStr(), -1, &Error);
|
||||
|
||||
if (!Query) {
|
||||
sprintf(g->Message, "Wrong filter: %s", Error.message);
|
||||
return true;
|
||||
} // endif Query
|
||||
|
||||
} else
|
||||
Query = bson_new();
|
||||
|
||||
} else
|
||||
Query = bson_new();
|
||||
|
||||
if (!all) {
|
||||
if (Options && *Options) {
|
||||
if (trace)
|
||||
htrc("options=%s\n", Options);
|
||||
|
||||
p = Options;
|
||||
} else if (Tdbp->GetColumns()) {
|
||||
// Projection list
|
||||
if (s)
|
||||
s->Set("{\"projection\":{\"");
|
||||
else
|
||||
s = new(g) STRING(g, 511, "{\"projection\":{\"");
|
||||
|
||||
if (!id)
|
||||
s->Append("_id\":0,\"");
|
||||
|
||||
for (PCOL cp = Tdbp->GetColumns(); cp; cp = cp->GetNext()) {
|
||||
if (b)
|
||||
s->Append(",\"");
|
||||
else
|
||||
b = true;
|
||||
|
||||
if ((jp = ((PJCOL)cp)->GetJpath(g, true)))
|
||||
s->Append(jp);
|
||||
else {
|
||||
s->Reset();
|
||||
s->Resize(0);
|
||||
goto nope;
|
||||
} // endif Jpath
|
||||
|
||||
s->Append("\":1");
|
||||
} // endfor cp
|
||||
|
||||
s->Append("}}");
|
||||
s->Resize(s->GetLength() + 1);
|
||||
p = s->GetStr();
|
||||
} else {
|
||||
// count(*) ?
|
||||
p = "{\"projection\":{\"_id\":1}}";
|
||||
} // endif Options
|
||||
|
||||
Opts = bson_new_from_json((const uint8_t *)p, -1, &Error);
|
||||
|
||||
if (!Opts) {
|
||||
sprintf(g->Message, "Wrong options: %s", Error.message);
|
||||
return true;
|
||||
} // endif Opts
|
||||
|
||||
} // endif all
|
||||
|
||||
nope:
|
||||
Cursor = mongoc_collection_find_with_opts(Collection, Query, Opts, NULL);
|
||||
} // endif Pipe
|
||||
|
||||
return false;
|
||||
} // end of MakeCursor
|
||||
|
||||
/***********************************************************************/
|
||||
/* OpenTableFile: Open a MongoDB table. */
|
||||
/***********************************************************************/
|
||||
bool MGOFAM::OpenTableFile(PGLOBAL g)
|
||||
{
|
||||
Mode = Tdbp->GetMode();
|
||||
|
||||
if (Pipe && Mode != MODE_READ) {
|
||||
strcpy(g->Message, "Pipeline tables are read only");
|
||||
return true;
|
||||
} // endif Pipe
|
||||
|
||||
if (Init(g))
|
||||
return true;
|
||||
|
||||
if (Mode == MODE_DELETE && !Tdbp->GetNext()) {
|
||||
// Store the number of deleted lines
|
||||
DelRows = Cardinality(g);
|
||||
|
||||
// Delete all documents
|
||||
if (!mongoc_collection_remove(Collection, MONGOC_REMOVE_NONE,
|
||||
Query, NULL, &Error)) {
|
||||
sprintf(g->Message, "Remove all: %s", Error.message);
|
||||
return true;
|
||||
} // endif remove
|
||||
|
||||
} else if (Mode != MODE_INSERT)
|
||||
if (MakeCursor(g))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
} // end of OpenTableFile
|
||||
|
||||
/***********************************************************************/
|
||||
/* GetRowID: return the RowID of last read record. */
|
||||
/***********************************************************************/
|
||||
int MGOFAM::GetRowID(void)
|
||||
{
|
||||
return Rows;
|
||||
} // end of GetRowID
|
||||
|
||||
/***********************************************************************/
|
||||
/* GetPos: return the position of last read record. */
|
||||
/***********************************************************************/
|
||||
int MGOFAM::GetPos(void)
|
||||
{
|
||||
return Fpos;
|
||||
} // end of GetPos
|
||||
|
||||
/***********************************************************************/
|
||||
/* GetNextPos: return the position of next record. */
|
||||
/***********************************************************************/
|
||||
int MGOFAM::GetNextPos(void)
|
||||
{
|
||||
return Fpos; // TODO
|
||||
} // end of GetNextPos
|
||||
|
||||
/***********************************************************************/
|
||||
/* SetPos: Replace the table at the specified position. */
|
||||
/***********************************************************************/
|
||||
bool MGOFAM::SetPos(PGLOBAL g, int pos)
|
||||
{
|
||||
Fpos = pos;
|
||||
Placed = true;
|
||||
return false;
|
||||
} // end of SetPos
|
||||
|
||||
/***********************************************************************/
|
||||
/* Record file position in case of UPDATE or DELETE. */
|
||||
/***********************************************************************/
|
||||
bool MGOFAM::RecordPos(PGLOBAL g)
|
||||
{
|
||||
strcpy(g->Message, "MGOFAM::RecordPos NIY");
|
||||
return true;
|
||||
} // end of RecordPos
|
||||
|
||||
/***********************************************************************/
|
||||
/* Initialize Fpos and the current position for indexed DELETE. */
|
||||
/***********************************************************************/
|
||||
int MGOFAM::InitDelete(PGLOBAL g, int fpos, int spos)
|
||||
{
|
||||
strcpy(g->Message, "MGOFAM::InitDelete NIY");
|
||||
return RC_FX;
|
||||
} // end of InitDelete
|
||||
|
||||
/***********************************************************************/
|
||||
/* Skip one record in file. */
|
||||
/***********************************************************************/
|
||||
int MGOFAM::SkipRecord(PGLOBAL g, bool header)
|
||||
{
|
||||
return RC_OK; // Dummy
|
||||
} // end of SkipRecord
|
||||
|
||||
/***********************************************************************/
|
||||
/* Use to trace restaurants document contains. */
|
||||
/***********************************************************************/
|
||||
void MGOFAM::ShowDocument(bson_iter_t *iter, const bson_t *doc, const char *k)
|
||||
{
|
||||
|
||||
if (!doc || bson_iter_init(iter, doc)) {
|
||||
const char *key;
|
||||
|
||||
while (bson_iter_next(iter)) {
|
||||
key = bson_iter_key(iter);
|
||||
htrc("Found element key: \"%s\"\n", key);
|
||||
|
||||
if (BSON_ITER_HOLDS_UTF8(iter))
|
||||
htrc("%s.%s=\"%s\"\n", k, key, bson_iter_utf8(iter, NULL));
|
||||
else if (BSON_ITER_HOLDS_INT32(iter))
|
||||
htrc("%s.%s=%d\n", k, key, bson_iter_int32(iter));
|
||||
else if (BSON_ITER_HOLDS_INT64(iter))
|
||||
htrc("%s.%s=%lld\n", k, key, bson_iter_int64(iter));
|
||||
else if (BSON_ITER_HOLDS_DOUBLE(iter))
|
||||
htrc("%s.%s=%g\n", k, key, bson_iter_double(iter));
|
||||
else if (BSON_ITER_HOLDS_DATE_TIME(iter))
|
||||
htrc("%s.%s=date(%lld)\n", k, key, bson_iter_date_time(iter));
|
||||
else if (BSON_ITER_HOLDS_OID(iter)) {
|
||||
char str[25];
|
||||
|
||||
bson_oid_to_string(bson_iter_oid(iter), str);
|
||||
htrc("%s.%s=%s\n", k, key, str);
|
||||
} else if (BSON_ITER_HOLDS_DECIMAL128(iter)) {
|
||||
char *str = NULL;
|
||||
bson_decimal128_t dec;
|
||||
|
||||
bson_iter_decimal128(iter, &dec);
|
||||
bson_decimal128_to_string(&dec, str);
|
||||
htrc("%s.%s=%s\n", k, key, str);
|
||||
} else if (BSON_ITER_HOLDS_DOCUMENT(iter)) {
|
||||
bson_iter_t child;
|
||||
|
||||
if (bson_iter_recurse(iter, &child))
|
||||
ShowDocument(&child, NULL, key);
|
||||
|
||||
} else if (BSON_ITER_HOLDS_ARRAY(iter)) {
|
||||
bson_t *arr;
|
||||
bson_iter_t itar;
|
||||
const uint8_t *data = NULL;
|
||||
uint32_t len = 0;
|
||||
|
||||
bson_iter_array(iter, &len, &data);
|
||||
arr = bson_new_from_data(data, len);
|
||||
ShowDocument(&itar, arr, key);
|
||||
} // endif's
|
||||
|
||||
} // endwhile bson_iter_next
|
||||
|
||||
} // endif bson_iter_init
|
||||
|
||||
} // end of ShowDocument
|
||||
|
||||
/***********************************************************************/
|
||||
/* ReadBuffer: Get next document from a collection. */
|
||||
/***********************************************************************/
|
||||
int MGOFAM::ReadBuffer(PGLOBAL g)
|
||||
{
|
||||
int rc = RC_OK;
|
||||
|
||||
if (mongoc_cursor_next(Cursor, &Document)) {
|
||||
char *str = bson_as_json(Document, NULL);
|
||||
|
||||
if (trace > 1) {
|
||||
bson_iter_t iter;
|
||||
ShowDocument(&iter, Document, "");
|
||||
} else if (trace == 1)
|
||||
htrc("%s\n", str);
|
||||
|
||||
strncpy(Tdbp->GetLine(), str, Lrecl);
|
||||
bson_free(str);
|
||||
} else if (mongoc_cursor_error(Cursor, &Error)) {
|
||||
sprintf(g->Message, "Mongo Cursor Failure: %s", Error.message);
|
||||
rc = RC_FX;
|
||||
} else {
|
||||
//mongoc_cursor_destroy(Cursor);
|
||||
rc = RC_EF;
|
||||
} // endif's Cursor
|
||||
|
||||
return rc;
|
||||
} // end of ReadBuffer
|
||||
|
||||
/***********************************************************************/
|
||||
/* WriteBuffer: File write routine for MGO access method. */
|
||||
/***********************************************************************/
|
||||
int MGOFAM::WriteBuffer(PGLOBAL g)
|
||||
{
|
||||
int rc = RC_OK;
|
||||
bson_t *doc;
|
||||
|
||||
//if (Mode == MODE_INSERT && !Collection) {
|
||||
// if ((Database = mongoc_client_get_database(Client, db_name)))
|
||||
// Collection = mongoc_database_create_collection(Database, coll_name,
|
||||
// NULL, &Error);
|
||||
|
||||
// if (!Collection)
|
||||
// if (Database) {
|
||||
// sprintf(g->Message, "Create collection: %s", Error.message);
|
||||
// return RC_FX;
|
||||
// } else {
|
||||
// sprintf(g->Message, "Fail to get database %s", db_name);
|
||||
// return RC_FX;
|
||||
// } // endif Database
|
||||
|
||||
//} // endif Collection
|
||||
|
||||
if (!(doc = bson_new_from_json((const uint8_t *)Tdbp->GetLine(),
|
||||
-1, &Error))) {
|
||||
sprintf(g->Message, "Wrong document: %s", Error.message);
|
||||
return RC_FX;
|
||||
} // endif doc
|
||||
|
||||
if (Mode != MODE_INSERT) {
|
||||
bool b = false;
|
||||
bson_iter_t iter;
|
||||
bson_t *selector = bson_new();
|
||||
|
||||
bson_iter_init(&iter, Document);
|
||||
|
||||
if (bson_iter_find(&iter, "_id")) {
|
||||
if (BSON_ITER_HOLDS_OID(&iter))
|
||||
b = BSON_APPEND_OID(selector, "_id", bson_iter_oid(&iter));
|
||||
else if (BSON_ITER_HOLDS_INT32(&iter))
|
||||
b = BSON_APPEND_INT32(selector, "_id", bson_iter_int32(&iter));
|
||||
else if (BSON_ITER_HOLDS_INT64(&iter))
|
||||
b = BSON_APPEND_INT64(selector, "_id", bson_iter_int64(&iter));
|
||||
else if (BSON_ITER_HOLDS_DOUBLE(&iter))
|
||||
b = BSON_APPEND_DOUBLE(selector, "_id", bson_iter_double(&iter));
|
||||
else if (BSON_ITER_HOLDS_UTF8(&iter))
|
||||
b = BSON_APPEND_UTF8(selector, "_id", bson_iter_utf8(&iter, NULL));
|
||||
|
||||
} // endif iter
|
||||
|
||||
if (!b) {
|
||||
strcpy(g->Message, "Cannot find _id");
|
||||
return RC_FX;
|
||||
} // endif oid
|
||||
|
||||
if (Mode == MODE_DELETE) {
|
||||
if (!mongoc_collection_remove(Collection, MONGOC_REMOVE_NONE,
|
||||
selector, NULL, &Error)) {
|
||||
sprintf(g->Message, "Remove: %s", Error.message);
|
||||
bson_destroy(selector);
|
||||
return RC_FX;
|
||||
} // endif remove
|
||||
|
||||
} else {
|
||||
if (!mongoc_collection_update(Collection, MONGOC_UPDATE_NONE,
|
||||
selector, doc, NULL, &Error)) {
|
||||
sprintf(g->Message, "Update: %s", Error.message);
|
||||
bson_destroy(selector);
|
||||
return RC_FX;
|
||||
} // endif remove
|
||||
|
||||
} // endif Mode
|
||||
|
||||
bson_destroy(selector);
|
||||
} else if (!mongoc_collection_insert(Collection, MONGOC_INSERT_NONE,
|
||||
doc, NULL, &Error)) {
|
||||
sprintf(g->Message, "Inserting: %s", Error.message);
|
||||
rc = RC_FX;
|
||||
} // endif insert
|
||||
|
||||
bson_destroy(doc);
|
||||
return rc;
|
||||
} // end of WriteBuffer
|
||||
|
||||
/***********************************************************************/
|
||||
/* Data Base delete line routine for MGO and BLK access methods. */
|
||||
/***********************************************************************/
|
||||
int MGOFAM::DeleteRecords(PGLOBAL g, int irc)
|
||||
{
|
||||
return (irc == RC_OK) ? WriteBuffer(g) : RC_OK;
|
||||
} // end of DeleteRecords
|
||||
|
||||
/***********************************************************************/
|
||||
/* Table file close routine for MGO access method. */
|
||||
/***********************************************************************/
|
||||
void MGOFAM::CloseTableFile(PGLOBAL g, bool)
|
||||
{
|
||||
if (Query) bson_destroy(Query);
|
||||
if (Opts) bson_destroy(Opts);
|
||||
if (Cursor) mongoc_cursor_destroy(Cursor);
|
||||
if (Collection) mongoc_collection_destroy(Collection);
|
||||
// mongoc_database_destroy(Database);
|
||||
// mongoc_client_destroy(Client);
|
||||
if (Client) mongoc_client_pool_push(Pool, Client);
|
||||
if (Pool) mongoc_client_pool_destroy(Pool);
|
||||
if (Uri) mongoc_uri_destroy(Uri);
|
||||
//bson_mem_restore_vtable();
|
||||
//mongoc_cleanup();
|
||||
//G = NULL;
|
||||
Done = false;
|
||||
} // end of CloseTableFile
|
||||
|
||||
/***********************************************************************/
|
||||
/* Rewind routine for MGO access method. */
|
||||
/***********************************************************************/
|
||||
void MGOFAM::Rewind(void)
|
||||
{
|
||||
mongoc_cursor_t *cursor = mongoc_cursor_clone(Cursor);
|
||||
|
||||
mongoc_cursor_destroy(Cursor);
|
||||
Cursor = cursor;
|
||||
} // end of Rewind
|
||||
|
97
storage/connect/mongofam.h
Normal file
97
storage/connect/mongofam.h
Normal file
@@ -0,0 +1,97 @@
|
||||
/************** MongoFam H Declares Source Code File (.H) **************/
|
||||
/* Name: mongofam.h Version 1.3 */
|
||||
/* */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2017 */
|
||||
/* */
|
||||
/* This file contains the MongoDB access method classes declares. */
|
||||
/***********************************************************************/
|
||||
#pragma once
|
||||
|
||||
/***********************************************************************/
|
||||
/* Include MongoDB library header files. */
|
||||
/***********************************************************************/
|
||||
#include <bson.h>
|
||||
#include <bcon.h>
|
||||
#include <mongoc.h>
|
||||
|
||||
#include "block.h"
|
||||
//#include "array.h"
|
||||
|
||||
typedef class TXTFAM *PTXF;
|
||||
typedef class MGOFAM *PMGOFAM;
|
||||
typedef class MGODEF *PMGODEF;
|
||||
typedef class TDBMGO *PTDBMGO;
|
||||
|
||||
/***********************************************************************/
|
||||
/* This is the MongoDB Access Method class declaration. */
|
||||
/***********************************************************************/
|
||||
class DllExport MGOFAM : public DOSFAM {
|
||||
friend void mongo_init(bool);
|
||||
public:
|
||||
// Constructor
|
||||
MGOFAM(PJDEF tdp);
|
||||
MGOFAM(PMGOFAM txfp);
|
||||
|
||||
// Implementation
|
||||
virtual AMT GetAmType(void) { return TYPE_AM_MGO; }
|
||||
virtual bool GetUseTemp(void) { return false; }
|
||||
virtual int GetPos(void);
|
||||
virtual int GetNextPos(void);
|
||||
virtual PTXF Duplicate(PGLOBAL g) { return (PTXF)new(g) MGOFAM(this); }
|
||||
void SetLrecl(int lrecl) { Lrecl = lrecl; }
|
||||
|
||||
// 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 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) { return false; }
|
||||
virtual bool MoveIntermediateLines(PGLOBAL g, bool *b) { return false; }
|
||||
virtual int RenameTempFile(PGLOBAL g) { return RC_OK; }
|
||||
virtual int InitDelete(PGLOBAL g, int fpos, int spos);
|
||||
bool Init(PGLOBAL g);
|
||||
bool MakeCursor(PGLOBAL g);
|
||||
void ShowDocument(bson_iter_t *i, const bson_t *b, const char *k);
|
||||
//static void *mgo_alloc(size_t n);
|
||||
//static void *mgo_calloc(size_t n, size_t sz);
|
||||
//static void *mgo_realloc(void *m, size_t n);
|
||||
//static void mgo_free(void *) {}
|
||||
|
||||
|
||||
// Members
|
||||
//static PGLOBAL G;
|
||||
mongoc_uri_t *Uri;
|
||||
mongoc_client_pool_t *Pool; // Thread safe client pool
|
||||
mongoc_client_t *Client; // The MongoDB client
|
||||
mongoc_database_t *Database; // The MongoDB database
|
||||
mongoc_collection_t *Collection; // The MongoDB collection
|
||||
mongoc_cursor_t *Cursor;
|
||||
const bson_t *Document;
|
||||
//bson_mem_vtable_t Vtable;
|
||||
bson_t *Query; // MongoDB cursor filter
|
||||
bson_t *Opts; // MongoDB cursor options
|
||||
bson_error_t Error;
|
||||
PFBLOCK To_Fbt; // Pointer to temp file block
|
||||
MODE Mode;
|
||||
const char *Uristr;
|
||||
const char *Db_name;
|
||||
const char *Coll_name;
|
||||
const char *Options;
|
||||
const char *Filter;
|
||||
bool Done; // Init done
|
||||
bool Pipe;
|
||||
}; // end of class MGOFAM
|
||||
|
@@ -96,6 +96,9 @@
|
||||
#if defined(XML_SUPPORT)
|
||||
#include "tabxml.h"
|
||||
#endif // XML_SUPPORT
|
||||
#if defined(MONGO_SUPPORT)
|
||||
#include "tabmgo.h"
|
||||
#endif // MONGO_SUPPORT
|
||||
#if defined(ZIP_SUPPORT)
|
||||
#include "tabzip.h"
|
||||
#endif // ZIP_SUPPORT
|
||||
@@ -161,7 +164,10 @@ TABTYPE GetTypeID(const char *type)
|
||||
#ifdef ZIP_SUPPORT
|
||||
: (!stricmp(type, "ZIP")) ? TAB_ZIP
|
||||
#endif
|
||||
: (!stricmp(type, "OEM")) ? TAB_OEM : TAB_NIY;
|
||||
#ifdef MONGO_SUPPORT
|
||||
: (!stricmp(type, "MONGO")) ? TAB_MONGO
|
||||
#endif
|
||||
: (!stricmp(type, "OEM")) ? TAB_OEM : TAB_NIY;
|
||||
} // end of GetTypeID
|
||||
|
||||
/***********************************************************************/
|
||||
@@ -307,6 +313,7 @@ int GetIndexType(TABTYPE type)
|
||||
case TAB_MYSQL:
|
||||
case TAB_ODBC:
|
||||
case TAB_JDBC:
|
||||
case TAB_MONGO:
|
||||
xtyp= 2;
|
||||
break;
|
||||
case TAB_VIR:
|
||||
@@ -477,39 +484,6 @@ void MYCAT::Reset(void)
|
||||
{
|
||||
} // end of Reset
|
||||
|
||||
#if 0
|
||||
/***********************************************************************/
|
||||
/* This function sets the current database path. */
|
||||
/***********************************************************************/
|
||||
void MYCAT::SetPath(PGLOBAL g, LPCSTR *datapath, const char *path)
|
||||
{
|
||||
if (path) {
|
||||
size_t len= strlen(path) + (*path != '.' ? 4 : 1);
|
||||
char *buf= (char*)PlugSubAlloc(g, NULL, len);
|
||||
|
||||
if (PlugIsAbsolutePath(path))
|
||||
{
|
||||
strcpy(buf, path);
|
||||
*datapath= buf;
|
||||
return;
|
||||
}
|
||||
|
||||
if (*path != '.') {
|
||||
#if defined(__WIN__)
|
||||
char *s= "\\";
|
||||
#else // !__WIN__
|
||||
char *s= "/";
|
||||
#endif // !__WIN__
|
||||
strcat(strcat(strcat(strcpy(buf, "."), s), path), s);
|
||||
} else
|
||||
strcpy(buf, path);
|
||||
|
||||
*datapath= buf;
|
||||
} // endif path
|
||||
|
||||
} // end of SetDataPath
|
||||
#endif // 0
|
||||
|
||||
/***********************************************************************/
|
||||
/* GetTableDesc: retrieve a table descriptor. */
|
||||
/* Look for a table descriptor matching the name and type. */
|
||||
@@ -583,6 +557,9 @@ PRELDEF MYCAT::MakeTableDesc(PGLOBAL g, PTABLE tablep, LPCSTR am)
|
||||
#endif // PIVOT_SUPPORT
|
||||
case TAB_VIR: tdp= new(g) VIRDEF; break;
|
||||
case TAB_JSON: tdp= new(g) JSONDEF; break;
|
||||
#if defined(MONGO_SUPPORT)
|
||||
case TAB_MONGO: tdp = new(g) MGODEF; break;
|
||||
#endif // MONGO_SUPPORT
|
||||
#if defined(ZIP_SUPPORT)
|
||||
case TAB_ZIP: tdp= new(g) ZIPDEF; break;
|
||||
#endif // ZIP_SUPPORT
|
||||
|
@@ -98,10 +98,7 @@ class MYCAT : public CATALOG {
|
||||
|
||||
// Methods
|
||||
void Reset(void);
|
||||
//void SetDataPath(PGLOBAL g, const char *path)
|
||||
// {SetPath(g, &DataPath, path);}
|
||||
bool StoreIndex(PGLOBAL, PTABDEF) {return false;} // Temporary
|
||||
// PRELDEF GetTableDesc(PGLOBAL g, LPCSTR name,
|
||||
PRELDEF GetTableDesc(PGLOBAL g, PTABLE tablep,
|
||||
LPCSTR type, PRELDEF *prp = NULL);
|
||||
PTDB GetTable(PGLOBAL g, PTABLE tablep,
|
||||
@@ -109,9 +106,7 @@ class MYCAT : public CATALOG {
|
||||
void ClearDB(PGLOBAL g);
|
||||
|
||||
protected:
|
||||
// PRELDEF MakeTableDesc(PGLOBAL g, LPCSTR name, LPCSTR am);
|
||||
PRELDEF MakeTableDesc(PGLOBAL g, PTABLE tablep, LPCSTR am);
|
||||
//void SetPath(PGLOBAL g, LPCSTR *datapath, const char *path);
|
||||
|
||||
// Members
|
||||
ha_connect *Hc; // The Connect handler
|
||||
|
@@ -135,10 +135,13 @@ PQRYRES MyColumns(PGLOBAL g, THD *thd, const char *host, const char *db,
|
||||
FLD_KEY, FLD_SCALE, FLD_RADIX, FLD_NULL,
|
||||
FLD_REM, FLD_NO, FLD_DEFAULT, FLD_EXTRA,
|
||||
FLD_CHARSET};
|
||||
unsigned int length[] = {0, 4, 16, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0};
|
||||
char *fld, *colname, *chset, *fmt, v, buf[128], uns[16], zero[16];
|
||||
//unsigned int length[] = {0, 4, 16, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0};
|
||||
unsigned int length[] = {0, 4, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0};
|
||||
PCSZ fmt;
|
||||
char *fld, *colname, *chset, v, buf[128], uns[16], zero[16];
|
||||
int i, n, nf, ncol = sizeof(buftyp) / sizeof(int);
|
||||
int len, type, prec, rc, k = 0;
|
||||
bool b;
|
||||
PQRYRES qrp;
|
||||
PCOLRES crp;
|
||||
MYSQLC myc;
|
||||
@@ -157,7 +160,7 @@ PQRYRES MyColumns(PGLOBAL g, THD *thd, const char *host, const char *db,
|
||||
/* Do an evaluation of the result size. */
|
||||
/********************************************************************/
|
||||
STRING cmd(g, 64, "SHOW FULL COLUMNS FROM ");
|
||||
bool b = cmd.Append((PSZ)table);
|
||||
b = cmd.Append((PSZ)table);
|
||||
|
||||
b |= cmd.Append(" FROM ");
|
||||
b |= cmd.Append((PSZ)(db ? db : PlgGetUser(g)->DBName));
|
||||
@@ -232,11 +235,31 @@ PQRYRES MyColumns(PGLOBAL g, THD *thd, const char *host, const char *db,
|
||||
fld = myc.GetCharField(1);
|
||||
prec = 0;
|
||||
len = 0;
|
||||
v = (chset && !strcmp(chset, "binary")) ? 'B' : 0;
|
||||
// v = (chset && !strcmp(chset, "binary")) ? 'B' : 0;
|
||||
v = 0;
|
||||
*uns = 0;
|
||||
*zero = 0;
|
||||
b = false;
|
||||
|
||||
switch ((nf = sscanf(fld, "%[^(](%d,%d", buf, &len, &prec))) {
|
||||
if (!strnicmp(fld, "enum", 4)) {
|
||||
char *p2, *p1 = fld + 6; // to skip enum('
|
||||
|
||||
while (true) {
|
||||
p2 = strchr(p1, '\'');
|
||||
len = MY_MAX(len, p2 - p1);
|
||||
if (*++p2 != ',') break;
|
||||
p1 = p2 + 2;
|
||||
} // endwhile
|
||||
|
||||
v = (len > 255) ? 'V' : 0;
|
||||
strcpy(buf, "enum");
|
||||
b = true;
|
||||
} else if (!strnicmp(fld, "set", 3)) {
|
||||
len = (int)strlen(fld) - 2;
|
||||
v = 'V';
|
||||
strcpy(buf, "set");
|
||||
b = true;
|
||||
} else switch ((nf = sscanf(fld, "%[^(](%d,%d", buf, &len, &prec))) {
|
||||
case 3:
|
||||
nf = sscanf(fld, "%[^(](%d,%d) %s %s", buf, &len, &prec, uns, zero);
|
||||
break;
|
||||
@@ -271,7 +294,7 @@ PQRYRES MyColumns(PGLOBAL g, THD *thd, const char *host, const char *db,
|
||||
colname, len);
|
||||
PushWarning(g, thd);
|
||||
v = 'V';
|
||||
} else
|
||||
} else
|
||||
len = MY_MIN(len, 4096);
|
||||
|
||||
} // endif type
|
||||
@@ -286,6 +309,9 @@ PQRYRES MyColumns(PGLOBAL g, THD *thd, const char *host, const char *db,
|
||||
default: crp->Nulls[i] = v; break;
|
||||
} // endswitch nf
|
||||
|
||||
if (b) // enum or set
|
||||
nf = sscanf(fld, "%s ", buf); // get values
|
||||
|
||||
crp = crp->Next; // Type_Name
|
||||
crp->Kdata->SetValue(buf, i);
|
||||
|
||||
@@ -849,7 +875,8 @@ MYSQL_FIELD *MYSQLC::GetNextField(void)
|
||||
/***********************************************************************/
|
||||
PQRYRES MYSQLC::GetResult(PGLOBAL g, bool pdb)
|
||||
{
|
||||
char *fmt, v;
|
||||
PCSZ fmt;
|
||||
char *name, v;
|
||||
int n;
|
||||
bool uns;
|
||||
PCOLRES *pcrp, crp;
|
||||
@@ -887,8 +914,9 @@ PQRYRES MYSQLC::GetResult(PGLOBAL g, bool pdb)
|
||||
memset(crp, 0, sizeof(COLRES));
|
||||
crp->Ncol = ++qrp->Nbcol;
|
||||
|
||||
crp->Name = (char*)PlugSubAlloc(g, NULL, fld->name_length + 1);
|
||||
strcpy(crp->Name, fld->name);
|
||||
name = (char*)PlugSubAlloc(g, NULL, fld->name_length + 1);
|
||||
strcpy(name, fld->name);
|
||||
crp->Name = name;
|
||||
|
||||
if ((crp->Type = MYSQLtoPLG(fld->type, &v)) == TYPE_ERROR) {
|
||||
sprintf(g->Message, "Type %d not supported for column %s",
|
||||
|
@@ -9,10 +9,9 @@
|
||||
# Do not use any TAB characters for whitespace.
|
||||
#
|
||||
##############################################################################
|
||||
#jdbc : Variable settings depend on machine configuration
|
||||
#jdbc_new : Variable settings depend on machine configuration
|
||||
jdbc : Variable settings depend on machine configuration
|
||||
jdbc_new : Variable settings depend on machine configuration
|
||||
jdbc_oracle : Variable settings depend on machine configuration
|
||||
jdbc_postgresql : Variable settings depend on machine configuration
|
||||
json : TABLE_TYPE = JSON conflicts with the SQL syntax
|
||||
json_udf : conflicts with the server JSON functions
|
||||
json_udf_bin : conflicts with the server JSON functions
|
||||
json_mgo : Need MongoDB running and its C Driver installed
|
||||
mongo : Need MongoDB running and its C Driver installed
|
||||
|
@@ -57,7 +57,7 @@ t1 CREATE TABLE `t1` (
|
||||
`name` char(10) NOT NULL,
|
||||
`birth` date NOT NULL,
|
||||
`id` char(5) NOT NULL `FIELD_FORMAT`='S',
|
||||
`salary` double(9,2) NOT NULL DEFAULT 0.00 `FIELD_FORMAT`='F',
|
||||
`salary` double(9,2) NOT NULL DEFAULT '0.00' `FIELD_FORMAT`='F',
|
||||
`dept` int(4) NOT NULL `FIELD_FORMAT`='S'
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`=BIN `FILE_NAME`='Testbal.dat' `OPTION_LIST`='Endian=Little' `READONLY`=NO
|
||||
INSERT INTO t1 VALUES (7777,'BILL','1973-06-30',4444,5555.555,777);
|
||||
@@ -76,7 +76,7 @@ t1 CREATE TABLE `t1` (
|
||||
`name` char(10) NOT NULL,
|
||||
`birth` date NOT NULL,
|
||||
`id` char(5) NOT NULL `FIELD_FORMAT`='S',
|
||||
`salary` double(9,2) NOT NULL DEFAULT 0.00 `FIELD_FORMAT`='F',
|
||||
`salary` double(9,2) NOT NULL DEFAULT '0.00' `FIELD_FORMAT`='F',
|
||||
`dept` int(4) NOT NULL `FIELD_FORMAT`='S'
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`=BIN `FILE_NAME`='Testbal.dat' `OPTION_LIST`='Endian=Little' `READONLY`=YES
|
||||
INSERT INTO t1 VALUES (7777,'BILL','1973-06-30',4444,5555.555,777);
|
||||
|
@@ -25,7 +25,6 @@ SELECT fname, ftype, size FROM t1 ORDER BY fname, ftype, size;
|
||||
fname ftype size
|
||||
boys .txt 282
|
||||
boyswin .txt 288
|
||||
SET STATEMENT sql_mode = '' FOR
|
||||
INSERT INTO t1 VALUES ('','','','');
|
||||
ERROR HY000: Got error 174 'COLBLK SetBuffer: undefined Access Method' from CONNECT
|
||||
DROP TABLE t1;
|
||||
|
@@ -4,8 +4,6 @@ set sql_mode="";
|
||||
#
|
||||
GRANT ALL PRIVILEGES ON *.* TO user@localhost;
|
||||
REVOKE FILE ON *.* FROM user@localhost;
|
||||
connect user,localhost,user,,;
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -16,7 +14,6 @@ ftype CHAR(4) NOT NULL,
|
||||
size DOUBLE(12,0) NOT NULL flag=5
|
||||
) ENGINE=CONNECT TABLE_TYPE=DIR FILE_NAME='*.*';
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
@@ -29,7 +26,6 @@ size DOUBLE(12,0) NOT NULL flag=5
|
||||
SELECT fname, ftype, size FROM t1 WHERE size>0;
|
||||
fname ftype size
|
||||
t1 .frm 1081
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -48,12 +44,10 @@ ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
# Testing a VIEW created with FILE privileges but accessed with no FILE
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT * FROM t1;
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -65,8 +59,6 @@ UPDATE v1 SET path=123;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
DELETE FROM v1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
disconnect user;
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
@@ -82,8 +74,6 @@ DROP USER user@localhost;
|
||||
CREATE USER user@localhost;
|
||||
GRANT ALL PRIVILEGES ON *.* TO user@localhost;
|
||||
REVOKE FILE ON *.* FROM user@localhost;
|
||||
connect user,localhost,user,,;
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -112,13 +102,11 @@ DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=BIN FILE_NAME='t1.EXT';
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=BIN FILE_NAME='t1.EXT';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -141,12 +129,10 @@ ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
# Testing a VIEW created with FILE privileges but accessed with no FILE
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT * FROM t1;
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -158,7 +144,6 @@ UPDATE v1 SET a=123;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
DELETE FROM v1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
@@ -168,15 +153,12 @@ CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=BIN;
|
||||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.bin
|
||||
INSERT INTO t1 VALUES (10);
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
ALTER TABLE t1 FILE_NAME='t1.EXT';
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
disconnect user;
|
||||
DROP USER user@localhost;
|
||||
#
|
||||
# End of grant.inc
|
||||
@@ -187,8 +169,6 @@ DROP USER user@localhost;
|
||||
CREATE USER user@localhost;
|
||||
GRANT ALL PRIVILEGES ON *.* TO user@localhost;
|
||||
REVOKE FILE ON *.* FROM user@localhost;
|
||||
connect user,localhost,user,,;
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -217,13 +197,11 @@ DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=CSV FILE_NAME='t1.EXT';
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=CSV FILE_NAME='t1.EXT';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -246,12 +224,10 @@ ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
# Testing a VIEW created with FILE privileges but accessed with no FILE
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT * FROM t1;
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -263,7 +239,6 @@ UPDATE v1 SET a=123;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
DELETE FROM v1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
@@ -273,15 +248,12 @@ CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=CSV;
|
||||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.csv
|
||||
INSERT INTO t1 VALUES (10);
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
ALTER TABLE t1 FILE_NAME='t1.EXT';
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
disconnect user;
|
||||
DROP USER user@localhost;
|
||||
#
|
||||
# End of grant.inc
|
||||
@@ -292,8 +264,6 @@ DROP USER user@localhost;
|
||||
CREATE USER user@localhost;
|
||||
GRANT ALL PRIVILEGES ON *.* TO user@localhost;
|
||||
REVOKE FILE ON *.* FROM user@localhost;
|
||||
connect user,localhost,user,,;
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -322,13 +292,11 @@ DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.EXT';
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.EXT';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -351,12 +319,10 @@ ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
# Testing a VIEW created with FILE privileges but accessed with no FILE
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT * FROM t1;
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -368,7 +334,6 @@ UPDATE v1 SET a=123;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
DELETE FROM v1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
@@ -378,15 +343,12 @@ CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=DBF;
|
||||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.dbf
|
||||
INSERT INTO t1 VALUES (10);
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
ALTER TABLE t1 FILE_NAME='t1.EXT';
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
disconnect user;
|
||||
DROP USER user@localhost;
|
||||
#
|
||||
# End of grant.inc
|
||||
@@ -397,8 +359,6 @@ DROP USER user@localhost;
|
||||
CREATE USER user@localhost;
|
||||
GRANT ALL PRIVILEGES ON *.* TO user@localhost;
|
||||
REVOKE FILE ON *.* FROM user@localhost;
|
||||
connect user,localhost,user,,;
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -427,13 +387,11 @@ DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=FIX FILE_NAME='t1.EXT';
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=FIX FILE_NAME='t1.EXT';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -456,12 +414,10 @@ ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
# Testing a VIEW created with FILE privileges but accessed with no FILE
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT * FROM t1;
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -473,7 +429,6 @@ UPDATE v1 SET a=123;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
DELETE FROM v1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
@@ -483,15 +438,12 @@ CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=FIX;
|
||||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.fix
|
||||
INSERT INTO t1 VALUES (10);
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
ALTER TABLE t1 FILE_NAME='t1.EXT';
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
disconnect user;
|
||||
DROP USER user@localhost;
|
||||
#
|
||||
# End of grant.inc
|
||||
@@ -502,8 +454,6 @@ DROP USER user@localhost;
|
||||
CREATE USER user@localhost;
|
||||
GRANT ALL PRIVILEGES ON *.* TO user@localhost;
|
||||
REVOKE FILE ON *.* FROM user@localhost;
|
||||
connect user,localhost,user,,;
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -532,13 +482,11 @@ DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=VEC MAX_ROWS=100 FILE_NAME='t1.EXT';
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=VEC MAX_ROWS=100 FILE_NAME='t1.EXT';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -561,12 +509,10 @@ ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
# Testing a VIEW created with FILE privileges but accessed with no FILE
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT * FROM t1;
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -578,7 +524,6 @@ UPDATE v1 SET a=123;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
DELETE FROM v1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
@@ -588,15 +533,12 @@ CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=VEC MAX_ROWS=100;
|
||||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.vec
|
||||
INSERT INTO t1 VALUES (10);
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
ALTER TABLE t1 FILE_NAME='t1.EXT';
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
disconnect user;
|
||||
DROP USER user@localhost;
|
||||
#
|
||||
# End of grant.inc
|
||||
|
@@ -5,7 +5,6 @@ CREATE USER user@localhost;
|
||||
GRANT ALL PRIVILEGES ON *.* TO user@localhost;
|
||||
REVOKE FILE ON *.* FROM user@localhost;
|
||||
# Testing SQLCOM_SELECT
|
||||
connection default;
|
||||
CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
CREATE SQL SECURITY INVOKER VIEW v1_invoker AS SELECT * FROM t1;
|
||||
@@ -22,7 +21,6 @@ a
|
||||
10
|
||||
SELECT * FROM v1_baddefiner;
|
||||
ERROR 28000: Access denied for user 'root'@'localhost' (using password: NO)
|
||||
connect user,localhost,user,,;
|
||||
SELECT * FROM t1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
SELECT * FROM v1_invoker;
|
||||
@@ -30,11 +28,9 @@ ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
SELECT * FROM v1_definer;
|
||||
a
|
||||
10
|
||||
connection default;
|
||||
DROP VIEW v1_invoker, v1_definer, v1_baddefiner;
|
||||
DROP TABLE t1;
|
||||
# Testing SQLCOM_UPDATE
|
||||
connection default;
|
||||
CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
CREATE SQL SECURITY INVOKER VIEW v1_invoker AS SELECT * FROM t1;
|
||||
@@ -42,17 +38,14 @@ CREATE SQL SECURITY DEFINER VIEW v1_definer AS SELECT * FROM t1;
|
||||
UPDATE t1 SET a=11;
|
||||
UPDATE v1_invoker SET a=12;
|
||||
UPDATE v1_definer SET a=13;
|
||||
connection user;
|
||||
UPDATE t1 SET a=21;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
UPDATE v1_invoker SET a=22;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
UPDATE v1_definer SET a=23;
|
||||
connection default;
|
||||
DROP VIEW v1_invoker, v1_definer;
|
||||
DROP TABLE t1;
|
||||
# Testing SQLCOM_INSERT
|
||||
connection default;
|
||||
CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
CREATE SQL SECURITY INVOKER VIEW v1_invoker AS SELECT * FROM t1;
|
||||
@@ -60,17 +53,14 @@ CREATE SQL SECURITY DEFINER VIEW v1_definer AS SELECT * FROM t1;
|
||||
INSERT INTO t1 VALUES (11);
|
||||
INSERT INTO v1_invoker VALUES (12);
|
||||
INSERT INTO v1_definer VALUES (13);
|
||||
connection user;
|
||||
INSERT INTO t1 VALUES (21);
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
INSERT INTO v1_invoker VALUES (22);
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
INSERT INTO v1_definer VALUES (23);
|
||||
connection default;
|
||||
DROP VIEW v1_invoker, v1_definer;
|
||||
DROP TABLE t1;
|
||||
# Testing SQLCOM_REPLACE
|
||||
connection default;
|
||||
CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
CREATE SQL SECURITY INVOKER VIEW v1_invoker AS SELECT * FROM t1;
|
||||
@@ -81,18 +71,15 @@ REPLACE INTO v1_invoker VALUES (12);
|
||||
ERROR 42000: CONNECT Unsupported command
|
||||
REPLACE INTO v1_definer VALUES (13);
|
||||
ERROR 42000: CONNECT Unsupported command
|
||||
connection user;
|
||||
REPLACE INTO t1 VALUES (21);
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
REPLACE INTO v1_invoker VALUES (22);
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
REPLACE INTO v1_definer VALUES (23);
|
||||
ERROR 42000: CONNECT Unsupported command
|
||||
connection default;
|
||||
DROP VIEW v1_invoker, v1_definer;
|
||||
DROP TABLE t1;
|
||||
# Testing SQLCOM_DELETE
|
||||
connection default;
|
||||
CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
INSERT INTO t1 VALUES (10),(11),(12),(13),(21),(22),(23);
|
||||
CREATE SQL SECURITY INVOKER VIEW v1_invoker AS SELECT * FROM t1;
|
||||
@@ -100,17 +87,14 @@ CREATE SQL SECURITY DEFINER VIEW v1_definer AS SELECT * FROM t1;
|
||||
DELETE FROM t1 WHERE a=11;
|
||||
DELETE FROM v1_invoker WHERE a=12;
|
||||
DELETE FROM v1_definer WHERE a=13;
|
||||
connection user;
|
||||
DELETE FROM t1 WHERE a=21;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
DELETE FROM v1_invoker WHERE a=22;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
DELETE FROM v1_definer WHERE a=23;
|
||||
connection default;
|
||||
DROP VIEW v1_invoker, v1_definer;
|
||||
DROP TABLE t1;
|
||||
# Testing SQLCOM_LOAD
|
||||
connection default;
|
||||
CREATE TABLE t1 (a VARCHAR(128)) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
CREATE SQL SECURITY INVOKER VIEW v1_invoker AS SELECT * FROM t1;
|
||||
@@ -118,38 +102,29 @@ CREATE SQL SECURITY DEFINER VIEW v1_definer AS SELECT * FROM t1;
|
||||
LOAD DATA LOCAL INFILE 'MTR_SUITE_DIR/std_data/boys.txt' INTO TABLE t1;
|
||||
LOAD DATA LOCAL INFILE 'MTR_SUITE_DIR/std_data/boys.txt' INTO TABLE v1_invoker;
|
||||
LOAD DATA LOCAL INFILE 'MTR_SUITE_DIR/std_data/boys.txt' INTO TABLE v1_definer;
|
||||
connection user;
|
||||
LOAD DATA LOCAL INFILE 'MTR_SUITE_DIR/std_data/boys.txt' INTO TABLE t1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
LOAD DATA LOCAL INFILE 'MTR_SUITE_DIR/std_data/boys.txt' INTO TABLE v1_invoker;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
LOAD DATA LOCAL INFILE 'MTR_SUITE_DIR/std_data/boys.txt' INTO TABLE v1_definer;
|
||||
connection default;
|
||||
DROP VIEW v1_invoker, v1_definer;
|
||||
DROP TABLE t1;
|
||||
# Testing SQLCOM_TRUNCATE
|
||||
connection default;
|
||||
CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
TRUNCATE TABLE t1;
|
||||
INSERT INTO t1 VALUES (11);
|
||||
connection user;
|
||||
TRUNCATE TABLE t1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
# Testing SQLCOM_DROP_TABLE
|
||||
connection default;
|
||||
CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
connection user;
|
||||
DROP TABLE t1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
# Testing SQLCOM_DROP_VIEW
|
||||
# DROP VIEW does not need FILE_ACL.
|
||||
connection default;
|
||||
CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
INSERT INTO t1 VALUES (10),(11),(12),(13),(21),(22),(23);
|
||||
CREATE SQL SECURITY INVOKER VIEW v1_invoker AS SELECT * FROM t1;
|
||||
@@ -157,18 +132,13 @@ CREATE SQL SECURITY DEFINER VIEW v1_definer AS SELECT * FROM t1;
|
||||
DROP VIEW v1_invoker, v1_definer;
|
||||
CREATE SQL SECURITY INVOKER VIEW v1_invoker AS SELECT * FROM t1;
|
||||
CREATE SQL SECURITY DEFINER VIEW v1_definer AS SELECT * FROM t1;
|
||||
connection user;
|
||||
DROP VIEW v1_invoker;
|
||||
DROP VIEW v1_definer;
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
# Testing SQLCOM_CREATE_TABLE
|
||||
connection user;
|
||||
CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
# Testing SQLCOM_LOCK_TABLES
|
||||
connection default;
|
||||
CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
CREATE SQL SECURITY INVOKER VIEW v1_invoker AS SELECT * FROM t1;
|
||||
@@ -185,7 +155,6 @@ LOCK TABLE v1_definer READ;
|
||||
UNLOCK TABLES;
|
||||
LOCK TABLE v1_definer WRITE;
|
||||
UNLOCK TABLES;
|
||||
connection user;
|
||||
LOCK TABLE t1 READ;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
LOCK TABLE t1 WRITE;
|
||||
@@ -198,11 +167,9 @@ LOCK TABLE v1_definer READ;
|
||||
UNLOCK TABLES;
|
||||
LOCK TABLE v1_definer WRITE;
|
||||
UNLOCK TABLES;
|
||||
connection default;
|
||||
DROP VIEW v1_invoker, v1_definer;
|
||||
DROP TABLE t1;
|
||||
# Testing SQLCOM_UPDATE_MULTI
|
||||
connection default;
|
||||
CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
CREATE TABLE t2 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t2.fix';
|
||||
CREATE TABLE t3 (a INT);
|
||||
@@ -262,7 +229,6 @@ UPDATE v2_definer a1,v1_invoker a2 SET a1.a=50 WHERE a1.a=a2.a;
|
||||
UPDATE v2_definer a1,v1_definer a2 SET a1.a=50 WHERE a1.a=a2.a;
|
||||
UPDATE v2_definer a1,v2_invoker a2 SET a1.a=50 WHERE a1.a=a2.a;
|
||||
UPDATE v2_definer a1,v2_definer a2 SET a1.a=50 WHERE a1.a=a2.a;
|
||||
connection user;
|
||||
UPDATE t1 a1,t1 a2 SET a1.a=50 WHERE a1.a=a2.a;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
UPDATE t1 a1,t2 a2 SET a1.a=50 WHERE a1.a=a2.a;
|
||||
@@ -352,11 +318,9 @@ UPDATE v2_definer a1,v1_definer a2 SET a1.a=50 WHERE a1.a=a2.a;
|
||||
UPDATE v2_definer a1,v2_invoker a2 SET a1.a=50 WHERE a1.a=a2.a;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
UPDATE v2_definer a1,v2_definer a2 SET a1.a=50 WHERE a1.a=a2.a;
|
||||
connection default;
|
||||
DROP VIEW v1_invoker, v1_definer, v2_invoker, v2_definer;
|
||||
DROP TABLE t1, t2, t3;
|
||||
# Testing SQLCOM_DELETE_MULTI
|
||||
connection default;
|
||||
CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
CREATE TABLE t2 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t2.fix';
|
||||
CREATE TABLE t3 (a INT);
|
||||
@@ -416,7 +380,6 @@ DELETE a1 FROM v2_definer a1,v1_invoker a2 WHERE a1.a=a2.a;
|
||||
DELETE a1 FROM v2_definer a1,v1_definer a2 WHERE a1.a=a2.a;
|
||||
DELETE a1 FROM v2_definer a1,v2_invoker a2 WHERE a1.a=a2.a;
|
||||
DELETE a1 FROM v2_definer a1,v2_definer a2 WHERE a1.a=a2.a;
|
||||
connection user;
|
||||
DELETE a1 FROM t1 a1,t1 a2 WHERE a1.a=a2.a;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
DELETE a1 FROM t1 a1,t2 a2 WHERE a1.a=a2.a;
|
||||
@@ -506,11 +469,9 @@ DELETE a1 FROM v2_definer a1,v1_definer a2 WHERE a1.a=a2.a;
|
||||
DELETE a1 FROM v2_definer a1,v2_invoker a2 WHERE a1.a=a2.a;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
DELETE a1 FROM v2_definer a1,v2_definer a2 WHERE a1.a=a2.a;
|
||||
connection default;
|
||||
DROP VIEW v1_invoker, v1_definer, v2_invoker, v2_definer;
|
||||
DROP TABLE t1, t2, t3;
|
||||
# Testing SQLCOM_CREATE_VIEW
|
||||
connection default;
|
||||
CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
CREATE SQL SECURITY INVOKER VIEW v1_invoker AS SELECT * FROM t1;
|
||||
@@ -519,18 +480,15 @@ CREATE VIEW v2 AS SELECT * FROM v1_invoker;
|
||||
DROP VIEW v2;
|
||||
CREATE VIEW v2 AS SELECT * FROM v1_definer;
|
||||
DROP VIEW v2;
|
||||
connection user;
|
||||
CREATE VIEW v2 AS SELECT * FROM t1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
CREATE VIEW v2 AS SELECT * FROM v1_invoker;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
CREATE VIEW v2 AS SELECT * FROM v1_definer;
|
||||
DROP VIEW v2;
|
||||
connection default;
|
||||
DROP VIEW v1_invoker, v1_definer;
|
||||
DROP TABLE t1;
|
||||
# Testing SQLCOM_INSERT_SELECT
|
||||
connection default;
|
||||
CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
CREATE SQL SECURITY INVOKER VIEW v1_invoker AS SELECT * FROM t1;
|
||||
@@ -544,7 +502,6 @@ INSERT INTO v1_invoker SELECT * FROM v1_definer WHERE a=20;
|
||||
INSERT INTO v1_definer SELECT * FROM t1 WHERE a=20;
|
||||
INSERT INTO v1_definer SELECT * FROM v1_invoker WHERE a=20;
|
||||
INSERT INTO v1_definer SELECT * FROM v1_definer WHERE a=20;
|
||||
connection user;
|
||||
INSERT INTO t1 SELECT * FROM t1 WHERE a=20;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
INSERT INTO t1 SELECT * FROM v1_invoker WHERE a=20;
|
||||
@@ -562,11 +519,9 @@ ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
INSERT INTO v1_definer SELECT * FROM v1_invoker WHERE a=20;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
INSERT INTO v1_definer SELECT * FROM v1_definer WHERE a=20;
|
||||
connection default;
|
||||
DROP VIEW v1_invoker, v1_definer;
|
||||
DROP TABLE t1;
|
||||
# Testing SQLCOM_REPLACE_SELECT
|
||||
connection default;
|
||||
CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
CREATE SQL SECURITY INVOKER VIEW v1_invoker AS SELECT * FROM t1;
|
||||
@@ -589,7 +544,6 @@ REPLACE INTO v1_definer SELECT * FROM v1_invoker WHERE a=20;
|
||||
ERROR 42000: CONNECT Unsupported command
|
||||
REPLACE INTO v1_definer SELECT * FROM v1_definer WHERE a=20;
|
||||
ERROR 42000: CONNECT Unsupported command
|
||||
connection user;
|
||||
REPLACE INTO t1 SELECT * FROM t1 WHERE a=20;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
REPLACE INTO t1 SELECT * FROM v1_invoker WHERE a=20;
|
||||
@@ -608,11 +562,9 @@ REPLACE INTO v1_definer SELECT * FROM v1_invoker WHERE a=20;
|
||||
ERROR 42000: CONNECT Unsupported command
|
||||
REPLACE INTO v1_definer SELECT * FROM v1_definer WHERE a=20;
|
||||
ERROR 42000: CONNECT Unsupported command
|
||||
connection default;
|
||||
DROP VIEW v1_invoker, v1_definer;
|
||||
DROP TABLE t1;
|
||||
# Testing SQLCOM_RENAME_TABLE
|
||||
connection default;
|
||||
CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
RENAME TABLE t1 TO t2;
|
||||
@@ -622,13 +574,10 @@ t2 CREATE TABLE `t2` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`=fix `FILE_NAME`='t1.fix'
|
||||
RENAME TABLE t2 TO t1;
|
||||
connection user;
|
||||
RENAME TABLE t1 TO t2;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
# Testing SQLCOM_ALTER_TABLE (for ALTER..RENAME)
|
||||
connection default;
|
||||
CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
ALTER TABLE t1 RENAME TO t2;
|
||||
@@ -638,26 +587,20 @@ t2 CREATE TABLE `t2` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`=fix `FILE_NAME`='t1.fix'
|
||||
ALTER TABLE t2 RENAME TO t1;
|
||||
connection user;
|
||||
ALTER TABLE t1 RENAME TO t2;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
# Testing SQLCOM_ALTER_TABLE (changing ENGINE to non-CONNECT)
|
||||
connection default;
|
||||
CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
ALTER TABLE t1 ENGINE=MyISAM;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
connection user;
|
||||
ALTER TABLE t1 ENGINE=MyISAM;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
# Testing SQLCOM_ALTER_TABLE (changing ENGINE to CONNECT)
|
||||
connection default;
|
||||
CREATE TABLE t1 (a INT) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES (10);
|
||||
SELECT * FROM t1;
|
||||
@@ -667,83 +610,63 @@ ALTER TABLE t1 ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a INT) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES (10);
|
||||
connection user;
|
||||
ALTER TABLE t1 ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
# Testing SQLCOM_OPTIMIZE
|
||||
connection default;
|
||||
CREATE TABLE t1 (a INT NOT NULL, KEY(a)) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
OPTIMIZE TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 optimize status OK
|
||||
connection user;
|
||||
OPTIMIZE TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 optimize Error Access denied for user 'user'@'localhost' (using password: NO)
|
||||
test.t1 optimize Error Got error 122 'This operation requires the FILE privilege' from CONNECT
|
||||
test.t1 optimize error Corrupt
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
# Testing SQLCOM_ALTER_TABLE (adding columns)
|
||||
connection default;
|
||||
CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
ALTER TABLE t1 ADD b INT;
|
||||
Warnings:
|
||||
Warning 1105 This is an outward table, table data were not modified.
|
||||
connection user;
|
||||
ALTER TABLE t1 ADD c INT;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
# Testing SQLCOM_ALTER_TABLE (removing columns)
|
||||
connection default;
|
||||
CREATE TABLE t1 (a INT,b INT,c INT) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
INSERT INTO t1 VALUES (10,10,10);
|
||||
ALTER TABLE t1 DROP b;
|
||||
Warnings:
|
||||
Warning 1105 This is an outward table, table data were not modified.
|
||||
connection user;
|
||||
ALTER TABLE t1 DROP c;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
# Testing SQLCOM_ALTER_TABLE (adding keys)
|
||||
connection default;
|
||||
CREATE TABLE t1 (a INT NOT NULL,b INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
INSERT INTO t1 VALUES (10,10);
|
||||
ALTER TABLE t1 ADD KEY(a);
|
||||
connection user;
|
||||
ALTER TABLE t1 ADD KEY(b);
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
# Testing SQLCOM_ALTER_TABLE (removing keys)
|
||||
connection default;
|
||||
CREATE TABLE t1 (a INT NOT NULL,b INT NOT NULL, KEY a(a), KEY b(b)) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
INSERT INTO t1 VALUES (10,10);
|
||||
ALTER TABLE t1 DROP KEY a;
|
||||
connection user;
|
||||
ALTER TABLE t1 DROP KEY b;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
# Testing SQLCOM_CREATE_INDEX and SQLCOM_DROP_INDEX
|
||||
connection default;
|
||||
CREATE TABLE t1 (a INT NOT NULL,b INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='t1.fix';
|
||||
INSERT INTO t1 VALUES (10,10);
|
||||
CREATE INDEX a ON t1 (a);
|
||||
DROP INDEX a ON t1;
|
||||
CREATE INDEX a ON t1 (a);
|
||||
connection user;
|
||||
CREATE INDEX b ON t1 (b);
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
DROP INDEX a ON t1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
# Testing stored procedures
|
||||
CREATE PROCEDURE p_definer() SQL SECURITY DEFINER
|
||||
@@ -758,11 +681,9 @@ CALL p_invoker();
|
||||
DROP TABLE t1;
|
||||
CALL p_baddefiner();
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection user;
|
||||
CALL p_invoker();
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
CALL p_definer();
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
DROP PROCEDURE p_definer;
|
||||
DROP PROCEDURE p_invoker;
|
||||
|
@@ -5,8 +5,6 @@ set sql_mode="";
|
||||
GRANT ALL PRIVILEGES ON *.* TO user@localhost;
|
||||
REVOKE FILE ON *.* FROM user@localhost;
|
||||
set sql_mode=default;
|
||||
connect user,localhost,user,,;
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -35,13 +33,11 @@ DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (sec CHAR(10) NOT NULL FLAG=1, val CHAR(10) NOT NULL) ENGINE=CONNECT TABLE_TYPE=INI FILE_NAME='t1.EXT';
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
CREATE TABLE t1 (sec CHAR(10) NOT NULL FLAG=1, val CHAR(10) NOT NULL) ENGINE=CONNECT TABLE_TYPE=INI FILE_NAME='t1.EXT';
|
||||
INSERT INTO t1 VALUES ('sec1','val1');
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -62,12 +58,10 @@ ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
# Testing a VIEW created with FILE privileges but accessed with no FILE
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT * FROM t1;
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -79,8 +73,6 @@ UPDATE v1 SET val='val11';
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
DELETE FROM v1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
disconnect user;
|
||||
connection default;
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
DROP USER user@localhost;
|
||||
|
@@ -14,9 +14,7 @@ NULL NULL
|
||||
SET GLOBAL time_zone='+1:00';
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC
|
||||
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=unknown';
|
||||
SELECT * FROM t1;
|
||||
ERROR HY000: Got error 174 'Connecting: java.sql.SQLException: Access denied for user 'unknown'@'localhost' (using password: NO) rc=-2' from CONNECT
|
||||
DROP TABLE t1;
|
||||
ERROR HY000: Connecting: java.sql.SQLException: Access denied for user 'unknown'@'localhost' (using password: NO) rc=-2
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC
|
||||
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/unknown?user=root';
|
||||
ERROR HY000: Connecting: java.sql.SQLSyntaxErrorException: Unknown database 'unknown' rc=-2
|
||||
|
@@ -24,15 +24,15 @@ DROP TABLE t1;
|
||||
CREATE TABLE t1
|
||||
(
|
||||
ISBN CHAR(15),
|
||||
Language CHAR(2) FIELD_FORMAT='LANG',
|
||||
Subject CHAR(32) FIELD_FORMAT='SUBJECT',
|
||||
Authors INT(2) FIELD_FORMAT='AUTHOR:[#]',
|
||||
Title CHAR(32) FIELD_FORMAT='TITLE',
|
||||
Translation CHAR(32) FIELD_FORMAT='TRANSLATION',
|
||||
Translator CHAR(80) FIELD_FORMAT='TRANSLATOR',
|
||||
Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME',
|
||||
Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE',
|
||||
Year int(4) FIELD_FORMAT='DATEPUB'
|
||||
Language CHAR(2) FIELD_FORMAT='$.LANG',
|
||||
Subject CHAR(32) FIELD_FORMAT='$.SUBJECT',
|
||||
Authors INT(2) FIELD_FORMAT='$.AUTHOR[#]',
|
||||
Title CHAR(32) FIELD_FORMAT='$.TITLE',
|
||||
Translation CHAR(32) FIELD_FORMAT='$.TRANSLATION',
|
||||
Translator CHAR(80) FIELD_FORMAT='$.TRANSLATOR',
|
||||
Publisher CHAR(20) FIELD_FORMAT='$.PUBLISHER.NAME',
|
||||
Location CHAR(16) FIELD_FORMAT='$.PUBLISHER.PLACE',
|
||||
Year int(4) FIELD_FORMAT='$.DATEPUB'
|
||||
)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json';
|
||||
SELECT * FROM t1;
|
||||
@@ -46,16 +46,16 @@ DROP TABLE t1;
|
||||
CREATE TABLE t1
|
||||
(
|
||||
ISBN CHAR(15),
|
||||
Language CHAR(2) FIELD_FORMAT='LANG',
|
||||
Subject CHAR(32) FIELD_FORMAT='SUBJECT',
|
||||
AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[" and "]:FIRSTNAME',
|
||||
AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[" and "]:LASTNAME',
|
||||
Title CHAR(32) FIELD_FORMAT='TITLE',
|
||||
Translation CHAR(32) FIELD_FORMAT='TRANSLATION',
|
||||
Translator CHAR(80) FIELD_FORMAT='TRANSLATOR',
|
||||
Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME',
|
||||
Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE',
|
||||
Year int(4) FIELD_FORMAT='DATEPUB'
|
||||
Language CHAR(2) FIELD_FORMAT='$.LANG',
|
||||
Subject CHAR(32) FIELD_FORMAT='$.SUBJECT',
|
||||
AuthorFN CHAR(128) FIELD_FORMAT='$.AUTHOR[" and "].FIRSTNAME',
|
||||
AuthorLN CHAR(128) FIELD_FORMAT='$.AUTHOR[" and "].LASTNAME',
|
||||
Title CHAR(32) FIELD_FORMAT='$.TITLE',
|
||||
Translation CHAR(32) FIELD_FORMAT='$.TRANSLATION',
|
||||
Translator CHAR(80) FIELD_FORMAT='$.TRANSLATOR',
|
||||
Publisher CHAR(20) FIELD_FORMAT='$.PUBLISHER.NAME',
|
||||
Location CHAR(16) FIELD_FORMAT='$.PUBLISHER.PLACE',
|
||||
Year int(4) FIELD_FORMAT='$.DATEPUB'
|
||||
)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json';
|
||||
SELECT * FROM t1;
|
||||
@@ -69,16 +69,16 @@ DROP TABLE t1;
|
||||
CREATE TABLE t1
|
||||
(
|
||||
ISBN CHAR(15),
|
||||
Language CHAR(2) FIELD_FORMAT='LANG',
|
||||
Subject CHAR(32) FIELD_FORMAT='SUBJECT',
|
||||
AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:FIRSTNAME',
|
||||
AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:LASTNAME',
|
||||
Title CHAR(32) FIELD_FORMAT='TITLE',
|
||||
Translation CHAR(32) FIELD_FORMAT='TRANSLATION',
|
||||
Translator CHAR(80) FIELD_FORMAT='TRANSLATOR',
|
||||
Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME',
|
||||
Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE',
|
||||
Year int(4) FIELD_FORMAT='DATEPUB'
|
||||
Language CHAR(2) FIELD_FORMAT='$.LANG',
|
||||
Subject CHAR(32) FIELD_FORMAT='$.SUBJECT',
|
||||
AuthorFN CHAR(128) FIELD_FORMAT='$.AUTHOR[*].FIRSTNAME',
|
||||
AuthorLN CHAR(128) FIELD_FORMAT='$.AUTHOR[*].LASTNAME',
|
||||
Title CHAR(32) FIELD_FORMAT='$.TITLE',
|
||||
Translation CHAR(32) FIELD_FORMAT='$.TRANSLATION',
|
||||
Translator CHAR(80) FIELD_FORMAT='$.TRANSLATOR',
|
||||
Publisher CHAR(20) FIELD_FORMAT='$.PUBLISHER.NAME',
|
||||
Location CHAR(16) FIELD_FORMAT='$.PUBLISHER.PLACE',
|
||||
Year int(4) FIELD_FORMAT='$.DATEPUB'
|
||||
)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json';
|
||||
SELECT * FROM t1;
|
||||
@@ -97,7 +97,7 @@ ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher L
|
||||
CREATE TABLE t2 (
|
||||
FIRSTNAME CHAR(32),
|
||||
LASTNAME CHAR(32))
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json' OPTION_LIST='Object=[1]:AUTHOR';
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json' OPTION_LIST='Object=$[1].AUTHOR';
|
||||
SELECT * FROM t2;
|
||||
FIRSTNAME LASTNAME
|
||||
William J. Pardi
|
||||
@@ -176,17 +176,17 @@ DROP TABLE t1;
|
||||
CREATE TABLE t1
|
||||
(
|
||||
ISBN CHAR(15) NOT NULL,
|
||||
Language CHAR(2) FIELD_FORMAT='LANG',
|
||||
Subject CHAR(32) FIELD_FORMAT='SUBJECT',
|
||||
AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:FIRSTNAME',
|
||||
AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:LASTNAME',
|
||||
Title CHAR(32) FIELD_FORMAT='TITLE',
|
||||
Translation CHAR(32) FIELD_FORMAT='TRANSLATED:PREFIX',
|
||||
TranslatorFN CHAR(80) FIELD_FORMAT='TRANSLATED:TRANSLATOR:FIRSTNAME',
|
||||
TranslatorLN CHAR(80) FIELD_FORMAT='TRANSLATED:TRANSLATOR:LASTNAME',
|
||||
Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME',
|
||||
Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE',
|
||||
Year int(4) FIELD_FORMAT='DATEPUB',
|
||||
Language CHAR(2) FIELD_FORMAT='$.LANG',
|
||||
Subject CHAR(32) FIELD_FORMAT='$.SUBJECT',
|
||||
AuthorFN CHAR(128) FIELD_FORMAT='$.AUTHOR[*].FIRSTNAME',
|
||||
AuthorLN CHAR(128) FIELD_FORMAT='$.AUTHOR[*].LASTNAME',
|
||||
Title CHAR(32) FIELD_FORMAT='$.TITLE',
|
||||
Translation CHAR(32) FIELD_FORMAT='$.TRANSLATED.PREFIX',
|
||||
TranslatorFN CHAR(80) FIELD_FORMAT='$.TRANSLATED.TRANSLATOR.FIRSTNAME',
|
||||
TranslatorLN CHAR(80) FIELD_FORMAT='$.TRANSLATED.TRANSLATOR.LASTNAME',
|
||||
Publisher CHAR(20) FIELD_FORMAT='$.PUBLISHER.NAME',
|
||||
Location CHAR(16) FIELD_FORMAT='$.PUBLISHER.PLACE',
|
||||
Year int(4) FIELD_FORMAT='$.DATEPUB',
|
||||
INDEX IX(ISBN)
|
||||
)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='bib0.json' LRECL=320 OPTION_LIST='Pretty=0';
|
||||
@@ -209,9 +209,9 @@ DROP TABLE t1;
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2) FIELD_FORMAT='WEEK:[X]:NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='WEEK::EXPENSE:["+"]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK::EXPENSE:[+]:AMOUNT')
|
||||
WEEK INT(2) FIELD_FORMAT='$.WEEK[*].NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.WEEK[].EXPENSE["+"].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[].EXPENSE[+].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json';
|
||||
SELECT * FROM t1;
|
||||
WHO WEEK WHAT AMOUNT
|
||||
@@ -230,9 +230,9 @@ DROP TABLE t1;
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2) FIELD_FORMAT='WEEK:[X]:NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:AMOUNT')
|
||||
WEEK INT(2) FIELD_FORMAT='$.WEEK[*].NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.WEEK[*].EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[*].EXPENSE[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json';
|
||||
SELECT * FROM t1;
|
||||
WHO WEEK WHAT AMOUNT
|
||||
@@ -266,14 +266,14 @@ DROP TABLE t1;
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
WHO CHAR(12) NOT NULL,
|
||||
WEEKS CHAR(12) NOT NULL FIELD_FORMAT='WEEK:[", "]:NUMBER',
|
||||
SUMS CHAR(64) NOT NULL FIELD_FORMAT='WEEK:["+"]:EXPENSE:[+]:AMOUNT',
|
||||
SUM DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[+]:EXPENSE:[+]:AMOUNT',
|
||||
AVGS CHAR(64) NOT NULL FIELD_FORMAT='WEEK:["+"]:EXPENSE:[!]:AMOUNT',
|
||||
SUMAVG DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[+]:EXPENSE:[!]:AMOUNT',
|
||||
AVGSUM DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[!]:EXPENSE:[+]:AMOUNT',
|
||||
AVGAVG DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[!]:EXPENSE:[!]:AMOUNT',
|
||||
AVERAGE DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[!]:EXPENSE:[X]:AMOUNT')
|
||||
WEEKS CHAR(12) NOT NULL FIELD_FORMAT='$.WEEK[", "].NUMBER',
|
||||
SUMS CHAR(64) NOT NULL FIELD_FORMAT='$.WEEK["+"].EXPENSE[+].AMOUNT',
|
||||
SUM DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[+].EXPENSE[+].AMOUNT',
|
||||
AVGS CHAR(64) NOT NULL FIELD_FORMAT='$.WEEK["+"].EXPENSE[!].AMOUNT',
|
||||
SUMAVG DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[+].EXPENSE[!].AMOUNT',
|
||||
AVGSUM DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[!].EXPENSE[+].AMOUNT',
|
||||
AVGAVG DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[!].EXPENSE[!].AMOUNT',
|
||||
AVERAGE DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[!].EXPENSE[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json';
|
||||
SELECT * FROM t1;
|
||||
WHO WEEKS SUMS SUM AVGS SUMAVG AVGSUM AVGAVG AVERAGE
|
||||
@@ -286,9 +286,9 @@ DROP TABLE t1;
|
||||
#
|
||||
CREATE TABLE t2 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2) FIELD_FORMAT='WEEK:[0]:NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='WEEK:[0]:EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[0]:EXPENSE:[X]:AMOUNT')
|
||||
WEEK INT(2) FIELD_FORMAT='$.WEEK[0].NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.WEEK[0].EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[0].EXPENSE[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json';
|
||||
SELECT * FROM t2;
|
||||
WHO WEEK WHAT AMOUNT
|
||||
@@ -302,9 +302,9 @@ Janet 3 Food 18.00
|
||||
Janet 3 Beer 18.00
|
||||
CREATE TABLE t3 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2) FIELD_FORMAT='WEEK:[1]:NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:AMOUNT')
|
||||
WEEK INT(2) FIELD_FORMAT='$.WEEK[1].NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.WEEK[1].EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[1].EXPENSE[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json';
|
||||
SELECT * FROM t3;
|
||||
WHO WEEK WHAT AMOUNT
|
||||
@@ -318,9 +318,9 @@ Beth 4 Beer 15.00
|
||||
Janet 4 Car 17.00
|
||||
CREATE TABLE t4 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2) FIELD_FORMAT='WEEK:[2]:NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:AMOUNT')
|
||||
WEEK INT(2) FIELD_FORMAT='$.WEEK[2].NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.WEEK[2].EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[2].EXPENSE[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json';
|
||||
SELECT * FROM t4;
|
||||
WHO WEEK WHAT AMOUNT
|
||||
@@ -374,8 +374,8 @@ DROP TABLE t1, t2, t3, t4;
|
||||
CREATE TABLE t2 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2),
|
||||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT')
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp3.json';
|
||||
SELECT * FROM t2;
|
||||
WHO WEEK WHAT AMOUNT
|
||||
@@ -390,8 +390,8 @@ Janet 3 Beer 18.00
|
||||
CREATE TABLE t3 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2),
|
||||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT')
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp4.json';
|
||||
SELECT * FROM t3;
|
||||
WHO WEEK WHAT AMOUNT
|
||||
@@ -406,8 +406,8 @@ Janet 4 Car 17.00
|
||||
CREATE TABLE t4 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2),
|
||||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT')
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp5.json';
|
||||
SELECT * FROM t4;
|
||||
WHO WEEK WHAT AMOUNT
|
||||
@@ -425,8 +425,8 @@ Janet 5 Food 12.00
|
||||
CREATE TABLE t1 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2),
|
||||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT')
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp*.json' MULTIPLE=1;
|
||||
SELECT * FROM t1 ORDER BY WHO, WEEK, WHAT, AMOUNT;
|
||||
WHO WEEK WHAT AMOUNT
|
||||
@@ -461,8 +461,8 @@ DROP TABLE t1;
|
||||
CREATE TABLE t1 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2),
|
||||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT')
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp%s.json';
|
||||
ALTER TABLE t1
|
||||
PARTITION BY LIST COLUMNS(WEEK) (
|
||||
|
@@ -35,18 +35,18 @@ JsonValue('[11, 22, 33]' json_)
|
||||
[11,22,33]
|
||||
[11,22,33]
|
||||
[11,22,33]
|
||||
SELECT Json_Array();
|
||||
Json_Array()
|
||||
SELECT Json_Make_Array();
|
||||
Json_Make_Array()
|
||||
[]
|
||||
SELECT Json_Array(56, 3.1416, 'My name is "Foo"', NULL);
|
||||
Json_Array(56, 3.1416, 'My name is "Foo"', NULL)
|
||||
SELECT Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL);
|
||||
Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL)
|
||||
[56,3.141600,"My name is \"Foo\"",null]
|
||||
SELECT Json_Array(Json_Array(56, 3.1416, 'foo'), TRUE);
|
||||
Json_Array(Json_Array(56, 3.1416, 'foo'), TRUE)
|
||||
SELECT Json_Make_Array(Json_Make_Array(56, 3.1416, 'foo'), TRUE);
|
||||
Json_Make_Array(Json_Make_Array(56, 3.1416, 'foo'), TRUE)
|
||||
[[56,3.141600,"foo"],true]
|
||||
SELECT Json_Array_Add(Json_Array(56, 3.1416, 'foo', NULL)) Array;
|
||||
SELECT Json_Array_Add(Json_Make_Array(56, 3.1416, 'foo', NULL)) Array;
|
||||
ERROR HY000: Can't initialize function 'json_array_add'; This function must have at least 2 arguments
|
||||
SELECT Json_Array_Add(Json_Array(56, 3.1416, 'foo', NULL), 'One more') Array;
|
||||
SELECT Json_Array_Add(Json_Make_Array(56, 3.1416, 'foo', NULL), 'One more') Array;
|
||||
Array
|
||||
[56,3.141600,"foo",null,"One more"]
|
||||
SELECT Json_Array_Add(JsonValue('one value'), 'One more');
|
||||
@@ -70,33 +70,33 @@ Array
|
||||
SELECT Json_Array_Add('[5,3,8,7,9]' json_, 4, 9);
|
||||
Json_Array_Add('[5,3,8,7,9]' json_, 4, 9)
|
||||
[5,3,8,7,9,4]
|
||||
SELECT Json_Array_Add(Json_Array(1, 2, Json_Array(11, 22)), '[2]', 33, 1);
|
||||
Json_Array_Add(Json_Array(1, 2, Json_Array(11, 22)), '[2]', 33, 1)
|
||||
SELECT Json_Array_Add(Json_Make_Array(1, 2, Json_Make_Array(11, 22)), '[2]', 33, 1);
|
||||
Json_Array_Add(Json_Make_Array(1, 2, Json_Make_Array(11, 22)), '[2]', 33, 1)
|
||||
[1,2,[11,22],"[2]"]
|
||||
SELECT Json_Array_Add(Json_Array(1, 2, Json_Array(11, 22)), 33, '[2]', 1);
|
||||
Json_Array_Add(Json_Array(1, 2, Json_Array(11, 22)), 33, '[2]', 1)
|
||||
SELECT Json_Array_Add(Json_Make_Array(1, 2, Json_Make_Array(11, 22)), 33, '[2]', 1);
|
||||
Json_Array_Add(Json_Make_Array(1, 2, Json_Make_Array(11, 22)), 33, '[2]', 1)
|
||||
[1,2,[11,33,22]]
|
||||
SELECT Json_Array_Add(Json_Array(1, 2, Json_Array(11, 22)), 33, 1, '[2]');
|
||||
Json_Array_Add(Json_Array(1, 2, Json_Array(11, 22)), 33, 1, '[2]')
|
||||
SELECT Json_Array_Add(Json_Make_Array(1, 2, Json_Make_Array(11, 22)), 33, 1, '[2]');
|
||||
Json_Array_Add(Json_Make_Array(1, 2, Json_Make_Array(11, 22)), 33, 1, '[2]')
|
||||
[1,2,[11,33,22]]
|
||||
SELECT Json_Array_Add_Values(Json_Array(56, 3.1416, 'machin', NULL), 'One more', 'Two more') Array;
|
||||
SELECT Json_Array_Add_Values(Json_Make_Array(56, 3.1416, 'machin', NULL), 'One more', 'Two more') Array;
|
||||
Array
|
||||
[56,3.141600,"machin",null,"One more","Two more"]
|
||||
SELECT Json_Array_Add_Values(Json_Array(56, 3.1416, 'machin'), 'One more', 'Two more') Array FROM t1;
|
||||
SELECT Json_Array_Add_Values(Json_Make_Array(56, 3.1416, 'machin'), 'One more', 'Two more') Array FROM t1;
|
||||
Array
|
||||
[56,3.141600,"machin","One more","Two more"]
|
||||
[56,3.141600,"machin","One more","Two more"]
|
||||
[56,3.141600,"machin","One more","Two more"]
|
||||
[56,3.141600,"machin","One more","Two more"]
|
||||
[56,3.141600,"machin","One more","Two more"]
|
||||
SELECT Json_Array_Add_Values(Json_Array(56, 3.1416, 'machin'), n) Array FROM t1;
|
||||
SELECT Json_Array_Add_Values(Json_Make_Array(56, 3.1416, 'machin'), n) Array FROM t1;
|
||||
Array
|
||||
[56,3.141600,"machin",1]
|
||||
[56,3.141600,"machin",2]
|
||||
[56,3.141600,"machin",3]
|
||||
[56,3.141600,"machin",4]
|
||||
[56,3.141600,"machin",5]
|
||||
SELECT Json_Array_Add_Values(Json_Array(n, 3.1416, 'machin'), n) Array FROM t1;
|
||||
SELECT Json_Array_Add_Values(Json_Make_Array(n, 3.1416, 'machin'), n) Array FROM t1;
|
||||
Array
|
||||
[1,3.141600,"machin",1]
|
||||
[2,3.141600,"machin",2]
|
||||
@@ -106,49 +106,49 @@ Array
|
||||
SELECT Json_Array_Add_Values('[56]', 3.1416, 'machin') Array;
|
||||
Array
|
||||
[56,3.141600,"machin"]
|
||||
SELECT Json_Array_Delete(Json_Array(56, 3.1416, 'My name is "Foo"', NULL), 0);
|
||||
Json_Array_Delete(Json_Array(56, 3.1416, 'My name is "Foo"', NULL), 0)
|
||||
SELECT Json_Array_Delete(Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL), 0);
|
||||
Json_Array_Delete(Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL), 0)
|
||||
[3.141600,"My name is \"Foo\"",null]
|
||||
SELECT Json_Array_Delete(Json_Object(56, 3.1416, 'My name is Foo', NULL), 2);
|
||||
Json_Array_Delete(Json_Object(56, 3.1416, 'My name is Foo', NULL), 2)
|
||||
SELECT Json_Array_Delete(Json_Make_Object(56, 3.1416, 'My name is Foo', NULL), 2);
|
||||
Json_Array_Delete(Json_Make_Object(56, 3.1416, 'My name is Foo', NULL), 2)
|
||||
{"56":56,"3.1416":3.141600,"My name is Foo":"My name is Foo","NULL":null}
|
||||
Warnings:
|
||||
Warning 1105 First argument target is not an array
|
||||
SELECT Json_Array_Delete(Json_Array(56, 3.1416, 'My name is "Foo"', NULL), '2');
|
||||
Json_Array_Delete(Json_Array(56, 3.1416, 'My name is "Foo"', NULL), '2')
|
||||
SELECT Json_Array_Delete(Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL), '2');
|
||||
Json_Array_Delete(Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL), '2')
|
||||
[56,3.141600,"My name is \"Foo\"",null]
|
||||
Warnings:
|
||||
Warning 1105 Missing or null array index
|
||||
SELECT Json_Array_Delete(json_array(56, 3.1416, 'My name is "Foo"', NULL), '2', 2);
|
||||
Json_Array_Delete(json_array(56, 3.1416, 'My name is "Foo"', NULL), '2', 2)
|
||||
SELECT Json_Array_Delete(Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL), '2', 2);
|
||||
Json_Array_Delete(Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL), '2', 2)
|
||||
[56,3.141600,"My name is \"Foo\"",null]
|
||||
Warnings:
|
||||
Warning 1105 No sub-item at '2'
|
||||
SELECT Json_Object(56, 3.1416, 'foo', NULL);
|
||||
Json_Object(56, 3.1416, 'foo', NULL)
|
||||
Warning 1105 First argument target is not an array
|
||||
SELECT Json_Make_Object(56, 3.1416, 'foo', NULL);
|
||||
Json_Make_Object(56, 3.1416, 'foo', NULL)
|
||||
{"56":56,"3.1416":3.141600,"foo":"foo","NULL":null}
|
||||
SELECT Json_Object(56 qty, 3.1416 price, 'foo' truc, NULL garanty);
|
||||
Json_Object(56 qty, 3.1416 price, 'foo' truc, NULL garanty)
|
||||
SELECT Json_Make_Object(56 qty, 3.1416 price, 'foo' truc, NULL garanty);
|
||||
Json_Make_Object(56 qty, 3.1416 price, 'foo' truc, NULL garanty)
|
||||
{"qty":56,"price":3.141600,"truc":"foo","garanty":null}
|
||||
SELECT Json_Object();
|
||||
Json_Object()
|
||||
SELECT Json_Make_Object();
|
||||
Json_Make_Object()
|
||||
{}
|
||||
SELECT Json_Object(Json_Array(56, 3.1416, 'foo'), NULL);
|
||||
Json_Object(Json_Array(56, 3.1416, 'foo'), NULL)
|
||||
{"Array(56, 3.1416, 'foo')":[56,3.141600,"foo"],"NULL":null}
|
||||
SELECT Json_Array(Json_Object(56 "qty", 3.1416 "price", 'foo') ,NULL);
|
||||
Json_Array(Json_Object(56 "qty", 3.1416 "price", 'foo') ,NULL)
|
||||
SELECT Json_Make_Object(Json_Make_Array(56, 3.1416, 'foo'), NULL);
|
||||
Json_Make_Object(Json_Make_Array(56, 3.1416, 'foo'), NULL)
|
||||
{"Make_Array(56, 3.1416, 'foo')":[56,3.141600,"foo"],"NULL":null}
|
||||
SELECT Json_Make_Array(Json_Make_Object(56 "qty", 3.1416 "price", 'foo') ,NULL);
|
||||
Json_Make_Array(Json_Make_Object(56 "qty", 3.1416 "price", 'foo') ,NULL)
|
||||
[{"qty":56,"price":3.141600,"foo":"foo"},null]
|
||||
SELECT Json_Object_Key('qty', 56, 'price', 3.1416, 'truc', 'machin', 'garanty', NULL);
|
||||
Json_Object_Key('qty', 56, 'price', 3.1416, 'truc', 'machin', 'garanty', NULL)
|
||||
{"qty":56,"price":3.141600,"truc":"machin","garanty":null}
|
||||
SELECT Json_Object_Key('qty', 56, 'price', 3.1416, 'truc', 'machin', 'garanty');
|
||||
ERROR HY000: Can't initialize function 'json_object_key'; This function must have an even number of arguments
|
||||
SELECT Json_Object_Add(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'blue' color);
|
||||
Json_Object_Add(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'blue' color)
|
||||
SELECT Json_Object_Add(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'blue' color);
|
||||
Json_Object_Add(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'blue' color)
|
||||
{"qty":56,"price":3.141600,"truc":"machin","garanty":null,"color":"blue"}
|
||||
SELECT Json_Object_Add(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 45.99 price);
|
||||
Json_Object_Add(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 45.99 price)
|
||||
SELECT Json_Object_Add(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 45.99 price);
|
||||
Json_Object_Add(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 45.99 price)
|
||||
{"qty":56,"price":45.990000,"truc":"machin","garanty":null}
|
||||
SELECT Json_Object_Add(Json_File('notexist.json'), 'cheese' item, '[1]', 1);
|
||||
Json_Object_Add(Json_File('notexist.json'), 'cheese' item, '[1]', 1)
|
||||
@@ -156,13 +156,13 @@ NULL
|
||||
Warnings:
|
||||
Warning 1105 Error 2 opening notexist.json
|
||||
Warning 1105 First argument target is not an object
|
||||
SELECT Json_Object_Delete(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'truc');
|
||||
Json_Object_Delete(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'truc')
|
||||
SELECT Json_Object_Delete(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'truc');
|
||||
Json_Object_Delete(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'truc')
|
||||
{"qty":56,"price":3.141600,"garanty":null}
|
||||
SELECT Json_Object_Delete(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'chose');
|
||||
Json_Object_Delete(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'chose')
|
||||
SELECT Json_Object_Delete(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'chose');
|
||||
Json_Object_Delete(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'chose')
|
||||
{"qty":56,"price":3.141600,"truc":"machin","garanty":null}
|
||||
SELECT Json_Object_List(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty)) "Key List";
|
||||
SELECT Json_Object_List(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty)) "Key List";
|
||||
Key List
|
||||
["qty","price","truc","garanty"]
|
||||
SELECT Json_Object_List('{"qty":56, "price":3.1416, "truc":"machin", "garanty":null}') "Key List";
|
||||
@@ -183,12 +183,12 @@ TRANSLATOR CHAR(80),
|
||||
PUBLISHER CHAR(32),
|
||||
DATEPUB int(4)
|
||||
) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json';
|
||||
SELECT Json_Array(AUTHOR, TITLE, DATEPUB) FROM t2;
|
||||
Json_Array(AUTHOR, TITLE, DATEPUB)
|
||||
SELECT Json_Make_Array(AUTHOR, TITLE, DATEPUB) FROM t2;
|
||||
Json_Make_Array(AUTHOR, TITLE, DATEPUB)
|
||||
["Jean-Christophe Bernadac","Construire une application XML",1999]
|
||||
["William J. Pardi","XML en Action",1999]
|
||||
SELECT Json_Object(AUTHOR, TITLE, DATEPUB) FROM t2;
|
||||
Json_Object(AUTHOR, TITLE, DATEPUB)
|
||||
SELECT Json_Make_Object(AUTHOR, TITLE, DATEPUB) FROM t2;
|
||||
Json_Make_Object(AUTHOR, TITLE, DATEPUB)
|
||||
{"AUTHOR":"Jean-Christophe Bernadac","TITLE":"Construire une application XML","DATEPUB":1999}
|
||||
{"AUTHOR":"William J. Pardi","TITLE":"XML en Action","DATEPUB":1999}
|
||||
SELECT Json_Array_Grp(TITLE, DATEPUB) FROM t2;
|
||||
@@ -206,8 +206,8 @@ DEPARTMENT CHAr(4) NOT NULL FLAG=41,
|
||||
SECRETARY CHAR(5) DEFAULT NULL FLAG=46,
|
||||
SALARY DOUBLE(8,2) NOT NULL FLAG=52
|
||||
) ENGINE=CONNECT TABLE_TYPE=FIX BLOCK_SIZE=8 FILE_NAME='employee.dat' ENDING=1;
|
||||
SELECT Json_Object(SERIALNO, NAME, TITLE, SALARY) FROM t3 WHERE NAME = 'MERCHANT';
|
||||
Json_Object(SERIALNO, NAME, TITLE, SALARY)
|
||||
SELECT Json_Make_Object(SERIALNO, NAME, TITLE, SALARY) FROM t3 WHERE NAME = 'MERCHANT';
|
||||
Json_Make_Object(SERIALNO, NAME, TITLE, SALARY)
|
||||
{"SERIALNO":"78943","NAME":"MERCHANT","TITLE":"SALESMAN","SALARY":8700.000000}
|
||||
SELECT DEPARTMENT, Json_Array_Grp(NAME) FROM t3 GROUP BY DEPARTMENT;
|
||||
DEPARTMENT Json_Array_Grp(NAME)
|
||||
@@ -220,8 +220,8 @@ Warning 1105 Result truncated to json_grp_size values
|
||||
SELECT JsonSet_Grp_Size(30);
|
||||
JsonSet_Grp_Size(30)
|
||||
30
|
||||
SELECT Json_Object(title, Json_Array_Grp(name) `json_names`) from t3 GROUP BY title;
|
||||
Json_Object(title, Json_Array_Grp(name) `json_names`)
|
||||
SELECT Json_Make_Object(title, Json_Array_Grp(name) `json_names`) from t3 GROUP BY title;
|
||||
Json_Make_Object(title, Json_Array_Grp(name) `json_names`)
|
||||
{"title":"ADMINISTRATOR","names":["GOOSEPEN","FUNNIGUY","SHRINKY"]}
|
||||
{"title":"DIRECTOR","names":["QUINN","WERTHER","STRONG"]}
|
||||
{"title":"ENGINEER","names":["BROWNY","ORELLY","MARTIN","TONGHO","WALTER","SMITH"]}
|
||||
@@ -230,26 +230,26 @@ Json_Object(title, Json_Array_Grp(name) `json_names`)
|
||||
{"title":"SCIENTIST","names":["BIGHEAD","BIGHORN"]}
|
||||
{"title":"SECRETARY","names":["MESSIFUL","HONEY","SHORTSIGHT","CHERRY","MONAPENNY"]}
|
||||
{"title":"TYPIST","names":["KITTY","PLUMHEAD"]}
|
||||
SELECT Json_Array(DEPARTMENT, Json_Array_Grp(NAME)) FROM t3 GROUP BY DEPARTMENT;
|
||||
Json_Array(DEPARTMENT, Json_Array_Grp(NAME))
|
||||
SELECT Json_Make_Array(DEPARTMENT, Json_Array_Grp(NAME)) FROM t3 GROUP BY DEPARTMENT;
|
||||
Json_Make_Array(DEPARTMENT, Json_Array_Grp(NAME))
|
||||
["0021",["STRONG","SHORTSIGHT"]]
|
||||
["0318",["BANCROFT","PLUMHEAD","HONEY","TONGHO","WALTER","SHRINKY","WERTHER","MERCHANT","WHEELFOR"]]
|
||||
["0319",["BULLOZER","QUINN","BROWNY","KITTY","MONAPENNY","MARTIN","FUNNIGUY","BUGHAPPY","FODDERMAN","MESSIFUL","GOOSEPEN"]]
|
||||
["2452",["BIGHEAD","ORELLY","BIGHORN","SMITH","CHERRY"]]
|
||||
SELECT Json_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES) FROM t3 GROUP BY DEPARTMENT;
|
||||
Json_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES)
|
||||
SELECT Json_Make_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES) FROM t3 GROUP BY DEPARTMENT;
|
||||
Json_Make_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES)
|
||||
{"DEPARTMENT":"0021","NAMES":["STRONG","SHORTSIGHT"]}
|
||||
{"DEPARTMENT":"0318","NAMES":["BANCROFT","PLUMHEAD","HONEY","TONGHO","WALTER","SHRINKY","WERTHER","MERCHANT","WHEELFOR"]}
|
||||
{"DEPARTMENT":"0319","NAMES":["BULLOZER","QUINN","BROWNY","KITTY","MONAPENNY","MARTIN","FUNNIGUY","BUGHAPPY","FODDERMAN","MESSIFUL","GOOSEPEN"]}
|
||||
{"DEPARTMENT":"2452","NAMES":["BIGHEAD","ORELLY","BIGHORN","SMITH","CHERRY"]}
|
||||
SELECT Json_Object(DEPARTMENT, Json_Array_Grp(Json_Object(SERIALNO, NAME, TITLE, SALARY)) json_EMPLOYES) FROM t3 GROUP BY DEPARTMENT;
|
||||
Json_Object(DEPARTMENT, Json_Array_Grp(Json_Object(SERIALNO, NAME, TITLE, SALARY)) json_EMPLOYES)
|
||||
SELECT Json_Make_Object(DEPARTMENT, Json_Array_Grp(Json_Make_Object(SERIALNO, NAME, TITLE, SALARY)) json_EMPLOYES) FROM t3 GROUP BY DEPARTMENT;
|
||||
Json_Make_Object(DEPARTMENT, Json_Array_Grp(Json_Make_Object(SERIALNO, NAME, TITLE, SALARY)) json_EMPLOYES)
|
||||
{"DEPARTMENT":"0021","EMPLOYES":[{"SERIALNO":"87777","NAME":"STRONG","TITLE":"DIRECTOR","SALARY":23000.000000},{"SERIALNO":"22222","NAME":"SHORTSIGHT","TITLE":"SECRETARY","SALARY":5500.000000}]}
|
||||
{"DEPARTMENT":"0318","EMPLOYES":[{"SERIALNO":"74200","NAME":"BANCROFT","TITLE":"SALESMAN","SALARY":9600.000000},{"SERIALNO":"24888","NAME":"PLUMHEAD","TITLE":"TYPIST","SALARY":2800.000000},{"SERIALNO":"27845","NAME":"HONEY","TITLE":"SECRETARY","SALARY":4900.000000},{"SERIALNO":"73452","NAME":"TONGHO","TITLE":"ENGINEER","SALARY":6800.000000},{"SERIALNO":"74234","NAME":"WALTER","TITLE":"ENGINEER","SALARY":7400.000000},{"SERIALNO":"77777","NAME":"SHRINKY","TITLE":"ADMINISTRATOR","SALARY":7500.000000},{"SERIALNO":"70012","NAME":"WERTHER","TITLE":"DIRECTOR","SALARY":14500.000000},{"SERIALNO":"78943","NAME":"MERCHANT","TITLE":"SALESMAN","SALARY":8700.000000},{"SERIALNO":"73111","NAME":"WHEELFOR","TITLE":"SALESMAN","SALARY":10030.000000}]}
|
||||
{"DEPARTMENT":"0319","EMPLOYES":[{"SERIALNO":"76543","NAME":"BULLOZER","TITLE":"SALESMAN","SALARY":14800.000000},{"SERIALNO":"40567","NAME":"QUINN","TITLE":"DIRECTOR","SALARY":14000.000000},{"SERIALNO":"00137","NAME":"BROWNY","TITLE":"ENGINEER","SALARY":10500.000000},{"SERIALNO":"12345","NAME":"KITTY","TITLE":"TYPIST","SALARY":3000.450000},{"SERIALNO":"33333","NAME":"MONAPENNY","TITLE":"SECRETARY","SALARY":3800.000000},{"SERIALNO":"00023","NAME":"MARTIN","TITLE":"ENGINEER","SALARY":10000.000000},{"SERIALNO":"07654","NAME":"FUNNIGUY","TITLE":"ADMINISTRATOR","SALARY":8500.000000},{"SERIALNO":"45678","NAME":"BUGHAPPY","TITLE":"PROGRAMMER","SALARY":8500.000000},{"SERIALNO":"56789","NAME":"FODDERMAN","TITLE":"SALESMAN","SALARY":7000.000000},{"SERIALNO":"55555","NAME":"MESSIFUL","TITLE":"SECRETARY","SALARY":5000.500000},{"SERIALNO":"98765","NAME":"GOOSEPEN","TITLE":"ADMINISTRATOR","SALARY":4700.000000}]}
|
||||
{"DEPARTMENT":"2452","EMPLOYES":[{"SERIALNO":"34567","NAME":"BIGHEAD","TITLE":"SCIENTIST","SALARY":8000.000000},{"SERIALNO":"31416","NAME":"ORELLY","TITLE":"ENGINEER","SALARY":13400.000000},{"SERIALNO":"36666","NAME":"BIGHORN","TITLE":"SCIENTIST","SALARY":11000.000000},{"SERIALNO":"02345","NAME":"SMITH","TITLE":"ENGINEER","SALARY":9000.000000},{"SERIALNO":"11111","NAME":"CHERRY","TITLE":"SECRETARY","SALARY":4500.000000}]}
|
||||
SELECT Json_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Object(SERIALNO, NAME, SALARY)) json_EMPLOYES) FROM t3 GROUP BY DEPARTMENT, TITLE;
|
||||
Json_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Object(SERIALNO, NAME, SALARY)) json_EMPLOYES)
|
||||
SELECT Json_Make_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Make_Object(SERIALNO, NAME, SALARY)) json_EMPLOYES) FROM t3 GROUP BY DEPARTMENT, TITLE;
|
||||
Json_Make_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Make_Object(SERIALNO, NAME, SALARY)) json_EMPLOYES)
|
||||
{"DEPARTMENT":"0021","TITLE":"DIRECTOR","EMPLOYES":[{"SERIALNO":"87777","NAME":"STRONG","SALARY":23000.000000}]}
|
||||
{"DEPARTMENT":"0021","TITLE":"SECRETARY","EMPLOYES":[{"SERIALNO":"22222","NAME":"SHORTSIGHT","SALARY":5500.000000}]}
|
||||
{"DEPARTMENT":"0318","TITLE":"ADMINISTRATOR","EMPLOYES":[{"SERIALNO":"77777","NAME":"SHRINKY","SALARY":7500.000000}]}
|
||||
@@ -273,8 +273,8 @@ ERROR HY000: Can't initialize function 'json_object_grp'; This function requires
|
||||
SELECT Json_Object_Grp(NAME, SALARY) FROM t3;
|
||||
Json_Object_Grp(NAME, SALARY)
|
||||
{"BANCROFT":9600.000000,"SMITH":9000.000000,"MERCHANT":8700.000000,"FUNNIGUY":8500.000000,"BUGHAPPY":8500.000000,"BIGHEAD":8000.000000,"SHRINKY":7500.000000,"WALTER":7400.000000,"FODDERMAN":7000.000000,"TONGHO":6800.000000,"SHORTSIGHT":5500.000000,"MESSIFUL":5000.500000,"HONEY":4900.000000,"GOOSEPEN":4700.000000,"CHERRY":4500.000000,"MONAPENNY":3800.000000,"KITTY":3000.450000,"PLUMHEAD":2800.000000,"STRONG":23000.000000,"BULLOZER":14800.000000,"WERTHER":14500.000000,"QUINN":14000.000000,"ORELLY":13400.000000,"BIGHORN":11000.000000,"BROWNY":10500.000000,"WHEELFOR":10030.000000,"MARTIN":10000.000000}
|
||||
SELECT Json_Object(DEPARTMENT, Json_Object_Grp(NAME, SALARY) "Json_SALARIES") FROM t3 GROUP BY DEPARTMENT;
|
||||
Json_Object(DEPARTMENT, Json_Object_Grp(NAME, SALARY) "Json_SALARIES")
|
||||
SELECT Json_Make_Object(DEPARTMENT, Json_Object_Grp(NAME, SALARY) "Json_SALARIES") FROM t3 GROUP BY DEPARTMENT;
|
||||
Json_Make_Object(DEPARTMENT, Json_Object_Grp(NAME, SALARY) "Json_SALARIES")
|
||||
{"DEPARTMENT":"0021","SALARIES":{"STRONG":23000.000000,"SHORTSIGHT":5500.000000}}
|
||||
{"DEPARTMENT":"0318","SALARIES":{"BANCROFT":9600.000000,"PLUMHEAD":2800.000000,"HONEY":4900.000000,"TONGHO":6800.000000,"WALTER":7400.000000,"SHRINKY":7500.000000,"WERTHER":14500.000000,"MERCHANT":8700.000000,"WHEELFOR":10030.000000}}
|
||||
{"DEPARTMENT":"0319","SALARIES":{"BULLOZER":14800.000000,"QUINN":14000.000000,"BROWNY":10500.000000,"KITTY":3000.450000,"MONAPENNY":3800.000000,"MARTIN":10000.000000,"FUNNIGUY":8500.000000,"BUGHAPPY":8500.000000,"FODDERMAN":7000.000000,"MESSIFUL":5000.500000,"GOOSEPEN":4700.000000}}
|
||||
@@ -309,26 +309,26 @@ SELECT JsonGet_String(Json_Array_Grp(name),'[>]') FROM t3;
|
||||
JsonGet_String(Json_Array_Grp(name),'[>]')
|
||||
WHEELFOR
|
||||
SET @j1 = '[45,28,36,45,89]';
|
||||
SELECT JsonGet_String(@j1,'[1]');
|
||||
JsonGet_String(@j1,'[1]')
|
||||
SELECT JsonGet_String(@j1,'1');
|
||||
JsonGet_String(@j1,'1')
|
||||
28
|
||||
SELECT JsonGet_String(@j1 json_,'[3]');
|
||||
JsonGet_String(@j1 json_,'[3]')
|
||||
SELECT JsonGet_String(@j1 json_,'3');
|
||||
JsonGet_String(@j1 json_,'3')
|
||||
45
|
||||
SELECT JsonGet_String(Json_Array(45,28,36,45,89),'[3]');
|
||||
JsonGet_String(Json_Array(45,28,36,45,89),'[3]')
|
||||
SELECT JsonGet_String(Json_Make_Array(45,28,36,45,89),'3');
|
||||
JsonGet_String(Json_Make_Array(45,28,36,45,89),'3')
|
||||
45
|
||||
SELECT JsonGet_String(Json_Array(45,28,36,45,89),'["+"]') "list",'=' as "egal",JsonGet_String(Json_Array(45,28,36,45,89),'[+]') "sum";
|
||||
SELECT JsonGet_String(Json_Make_Array(45,28,36,45,89),'["+"]') "list",'=' as "egal",JsonGet_String(Json_Make_Array(45,28,36,45,89),'[+]') "sum";
|
||||
list egal sum
|
||||
45+28+36+45+89 = 243.00
|
||||
SELECT JsonGet_String(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:[0]');
|
||||
JsonGet_String(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:[0]')
|
||||
SELECT JsonGet_String(Json_Make_Array(Json_Make_Array(45,28),Json_Make_Array(36,45,89)),'1.0');
|
||||
JsonGet_String(Json_Make_Array(Json_Make_Array(45,28),Json_Make_Array(36,45,89)),'1.0')
|
||||
36
|
||||
SELECT JsonGet_String(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:*');
|
||||
JsonGet_String(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:*')
|
||||
SELECT JsonGet_String(Json_Make_Array(Json_Make_Array(45,28),Json_Make_Array(36,45,89)),'1.*');
|
||||
JsonGet_String(Json_Make_Array(Json_Make_Array(45,28),Json_Make_Array(36,45,89)),'1.*')
|
||||
[36,45,89]
|
||||
SELECT JsonGet_String(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'truc');
|
||||
JsonGet_String(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'truc')
|
||||
SELECT JsonGet_String(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'truc');
|
||||
JsonGet_String(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'truc')
|
||||
machin
|
||||
SET @j2 = '{"qty":56,"price":3.141600,"truc":"machin","garanty":null}';
|
||||
SELECT JsonGet_String(@j2 json_,'truc');
|
||||
@@ -345,14 +345,14 @@ JsonGet_String(NULL json_, NULL)
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 1105
|
||||
SELECT department, JsonGet_String(Json_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries:[+]') Sumsal FROM t3 GROUP BY department;
|
||||
SELECT department, JsonGet_String(Json_Make_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries.[+]') Sumsal FROM t3 GROUP BY department;
|
||||
department Sumsal
|
||||
0021 28500.00
|
||||
0318 72230.00
|
||||
0319 89800.95
|
||||
2452 45900.00
|
||||
SELECT JsonGet_Int(@j1, '[4]');
|
||||
JsonGet_Int(@j1, '[4]')
|
||||
SELECT JsonGet_Int(@j1, '4');
|
||||
JsonGet_Int(@j1, '4')
|
||||
89
|
||||
SELECT JsonGet_Int(@j1, '[#]');
|
||||
JsonGet_Int(@j1, '[#]')
|
||||
@@ -360,26 +360,26 @@ JsonGet_Int(@j1, '[#]')
|
||||
SELECT JsonGet_Int(@j1, '[+]');
|
||||
JsonGet_Int(@j1, '[+]')
|
||||
243
|
||||
SELECT JsonGet_Int(@j1 json_, '[3]');
|
||||
JsonGet_Int(@j1 json_, '[3]')
|
||||
SELECT JsonGet_Int(@j1 json_, '3');
|
||||
JsonGet_Int(@j1 json_, '3')
|
||||
45
|
||||
SELECT JsonGet_Int(Json_Array(45,28,36,45,89), '[3]');
|
||||
JsonGet_Int(Json_Array(45,28,36,45,89), '[3]')
|
||||
SELECT JsonGet_Int(Json_Make_Array(45,28,36,45,89), '3');
|
||||
JsonGet_Int(Json_Make_Array(45,28,36,45,89), '3')
|
||||
45
|
||||
SELECT JsonGet_Int(Json_Array(45,28,36,45,89), '["+"]');
|
||||
JsonGet_Int(Json_Array(45,28,36,45,89), '["+"]')
|
||||
SELECT JsonGet_Int(Json_Make_Array(45,28,36,45,89), '["+"]');
|
||||
JsonGet_Int(Json_Make_Array(45,28,36,45,89), '["+"]')
|
||||
45
|
||||
SELECT JsonGet_Int(Json_Array(45,28,36,45,89), '[+]');
|
||||
JsonGet_Int(Json_Array(45,28,36,45,89), '[+]')
|
||||
SELECT JsonGet_Int(Json_Make_Array(45,28,36,45,89), '[+]');
|
||||
JsonGet_Int(Json_Make_Array(45,28,36,45,89), '[+]')
|
||||
243
|
||||
SELECT JsonGet_Int(Json_Array(json_array(45,28), json_array(36,45,89)), '[1]:[0]');
|
||||
JsonGet_Int(Json_Array(json_array(45,28), json_array(36,45,89)), '[1]:[0]')
|
||||
SELECT JsonGet_Int(Json_Make_Array(Json_Make_Array(45,28), Json_Make_Array(36,45,89)), '1.0');
|
||||
JsonGet_Int(Json_Make_Array(Json_Make_Array(45,28), Json_Make_Array(36,45,89)), '1.0')
|
||||
36
|
||||
SELECT JsonGet_Int(Json_Array(json_array(45,28), json_array(36,45,89)), '[0]:[1]');
|
||||
JsonGet_Int(Json_Array(json_array(45,28), json_array(36,45,89)), '[0]:[1]')
|
||||
SELECT JsonGet_Int(Json_Make_Array(Json_Make_Array(45,28), Json_Make_Array(36,45,89)), '0.1');
|
||||
JsonGet_Int(Json_Make_Array(Json_Make_Array(45,28), Json_Make_Array(36,45,89)), '0.1')
|
||||
28
|
||||
SELECT JsonGet_Int(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'qty');
|
||||
JsonGet_Int(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'qty')
|
||||
SELECT JsonGet_Int(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'qty');
|
||||
JsonGet_Int(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'qty')
|
||||
56
|
||||
SELECT JsonGet_Int(@j2 json_, 'price');
|
||||
JsonGet_Int(@j2 json_, 'price')
|
||||
@@ -390,38 +390,38 @@ JsonGet_Int(@j2, 'qty')
|
||||
SELECT JsonGet_Int('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}', 'chose');
|
||||
JsonGet_Int('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}', 'chose')
|
||||
NULL
|
||||
SELECT JsonGet_Int(JsonGet_String(Json_Array(Json_Array(45,28),Json_Array(36,45,89)), '[1]:*'), '[+]') sum;
|
||||
SELECT JsonGet_Int(JsonGet_String(Json_Make_Array(Json_Make_Array(45,28),Json_Make_Array(36,45,89)), '1.*'), '[+]') sum;
|
||||
sum
|
||||
170
|
||||
SELECT department, JsonGet_Int(Json_Object(department, Json_Array_Grp(salary) "Json_salaries"), 'salaries:[+]') Sumsal FROM t3 GROUP BY department;
|
||||
SELECT department, JsonGet_Int(Json_Make_Object(department, Json_Array_Grp(salary) "Json_salaries"), 'salaries.[+]') Sumsal FROM t3 GROUP BY department;
|
||||
department Sumsal
|
||||
0021 28500
|
||||
0318 72230
|
||||
0319 89800
|
||||
2452 45900
|
||||
SELECT JsonGet_Real(@j1, '[2]');
|
||||
JsonGet_Real(@j1, '[2]')
|
||||
SELECT JsonGet_Real(@j1, '2');
|
||||
JsonGet_Real(@j1, '2')
|
||||
36.000000000000000
|
||||
SELECT JsonGet_Real(@j1 json_, '[3]', 2);
|
||||
JsonGet_Real(@j1 json_, '[3]', 2)
|
||||
SELECT JsonGet_Real(@j1 json_, '3', 2);
|
||||
JsonGet_Real(@j1 json_, '3', 2)
|
||||
45.00
|
||||
SELECT JsonGet_Real(Json_Array(45,28,36,45,89), '[3]');
|
||||
JsonGet_Real(Json_Array(45,28,36,45,89), '[3]')
|
||||
SELECT JsonGet_Real(Json_Make_Array(45,28,36,45,89), '3');
|
||||
JsonGet_Real(Json_Make_Array(45,28,36,45,89), '3')
|
||||
45.000000000000000
|
||||
SELECT JsonGet_Real(Json_Array(45,28,36,45,89), '["+"]');
|
||||
JsonGet_Real(Json_Array(45,28,36,45,89), '["+"]')
|
||||
SELECT JsonGet_Real(Json_Make_Array(45,28,36,45,89), '["+"]');
|
||||
JsonGet_Real(Json_Make_Array(45,28,36,45,89), '["+"]')
|
||||
45.000000000000000
|
||||
SELECT JsonGet_Real(Json_Array(45,28,36,45,89), '[+]');
|
||||
JsonGet_Real(Json_Array(45,28,36,45,89), '[+]')
|
||||
SELECT JsonGet_Real(Json_Make_Array(45,28,36,45,89), '[+]');
|
||||
JsonGet_Real(Json_Make_Array(45,28,36,45,89), '[+]')
|
||||
243.000000000000000
|
||||
SELECT JsonGet_Real(Json_Array(45,28,36,45,89), '[!]');
|
||||
JsonGet_Real(Json_Array(45,28,36,45,89), '[!]')
|
||||
SELECT JsonGet_Real(Json_Make_Array(45,28,36,45,89), '[!]');
|
||||
JsonGet_Real(Json_Make_Array(45,28,36,45,89), '[!]')
|
||||
48.600000000000000
|
||||
SELECT JsonGet_Real(Json_Array(json_array(45,28), json_array(36,45,89)), '[1]:[0]');
|
||||
JsonGet_Real(Json_Array(json_array(45,28), json_array(36,45,89)), '[1]:[0]')
|
||||
SELECT JsonGet_Real(Json_Make_Array(Json_Make_Array(45,28), Json_Make_Array(36,45,89)), '1.0');
|
||||
JsonGet_Real(Json_Make_Array(Json_Make_Array(45,28), Json_Make_Array(36,45,89)), '1.0')
|
||||
36.000000000000000
|
||||
SELECT JsonGet_Real(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'price');
|
||||
JsonGet_Real(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'price')
|
||||
SELECT JsonGet_Real(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'price');
|
||||
JsonGet_Real(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'price')
|
||||
3.141600000000000
|
||||
SELECT JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}' json_, 'qty');
|
||||
JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}' json_, 'qty')
|
||||
@@ -435,7 +435,7 @@ JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}', 'pric
|
||||
SELECT JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}', 'chose');
|
||||
JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}', 'chose')
|
||||
NULL
|
||||
SELECT department, JsonGet_Real(Json_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries:[+]') Sumsal FROM t3 GROUP BY department;
|
||||
SELECT department, JsonGet_Real(Json_Make_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries.[+]') Sumsal FROM t3 GROUP BY department;
|
||||
department Sumsal
|
||||
0021 28500.000000000000000
|
||||
0318 72230.000000000000000
|
||||
@@ -445,11 +445,11 @@ department Sumsal
|
||||
# Documentation examples
|
||||
#
|
||||
SELECT
|
||||
JsonGet_Int(Json_Array(45,28,36,45,89), '[4]') "Rank",
|
||||
JsonGet_Int(Json_Array(45,28,36,45,89), '[#]') "Number",
|
||||
JsonGet_String(Json_Array(45,28,36,45,89), '[","]') "Concat",
|
||||
JsonGet_Int(Json_Array(45,28,36,45,89), '[+]') "Sum",
|
||||
JsonGet_Real(Json_Array(45,28,36,45,89), '[!]', 2) "Avg";
|
||||
JsonGet_Int(Json_Make_Array(45,28,36,45,89), '4') "Rank",
|
||||
JsonGet_Int(Json_Make_Array(45,28,36,45,89), '[#]') "Number",
|
||||
JsonGet_String(Json_Make_Array(45,28,36,45,89), '[","]') "Concat",
|
||||
JsonGet_Int(Json_Make_Array(45,28,36,45,89), '[+]') "Sum",
|
||||
JsonGet_Real(Json_Make_Array(45,28,36,45,89), '[!]', 2) "Avg";
|
||||
Rank Number Concat Sum Avg
|
||||
89 5 45,28,36,45,89 243 48.60
|
||||
SELECT
|
||||
@@ -464,33 +464,33 @@ Real
|
||||
#
|
||||
# Testing Locate
|
||||
#
|
||||
SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'machin');
|
||||
JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'machin')
|
||||
truc
|
||||
SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),56);
|
||||
JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),56)
|
||||
qty
|
||||
SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),3.1416);
|
||||
JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),3.1416)
|
||||
price
|
||||
SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'chose');
|
||||
JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'chose')
|
||||
SELECT JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'machin');
|
||||
JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'machin')
|
||||
$.truc
|
||||
SELECT JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),56);
|
||||
JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),56)
|
||||
$.qty
|
||||
SELECT JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),3.1416);
|
||||
JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),3.1416)
|
||||
$.price
|
||||
SELECT JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'chose');
|
||||
JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'chose')
|
||||
NULL
|
||||
SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, 'Jack') Path;
|
||||
Path
|
||||
AUTHORS:[1]:FN
|
||||
$.AUTHORS[1].FN
|
||||
SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, 'jack' ci) Path;
|
||||
Path
|
||||
AUTHORS:[1]:FN
|
||||
$.AUTHORS[1].FN
|
||||
SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, '{"FN":"Jack", "LN":"London"}' json_) Path;
|
||||
Path
|
||||
AUTHORS:[1]
|
||||
$.AUTHORS[1]
|
||||
SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, '{"FN":"jack", "LN":"London"}' json_) Path;
|
||||
Path
|
||||
NULL
|
||||
SELECT JsonLocate('[45,28,36,45,89]',36);
|
||||
JsonLocate('[45,28,36,45,89]',36)
|
||||
[2]
|
||||
$[2]
|
||||
SELECT JsonLocate('[45,28,36,45,89]' json_,28.0);
|
||||
JsonLocate('[45,28,36,45,89]' json_,28.0)
|
||||
NULL
|
||||
@@ -499,71 +499,71 @@ Json_Locate_All('[45,28,36,45,89]',10)
|
||||
[]
|
||||
SELECT Json_Locate_All('[45,28,36,45,89]',45);
|
||||
Json_Locate_All('[45,28,36,45,89]',45)
|
||||
["[0]","[3]"]
|
||||
["$[0]","$[3]"]
|
||||
SELECT Json_Locate_All('[[45,28],36,45,89]',45);
|
||||
Json_Locate_All('[[45,28],36,45,89]',45)
|
||||
["[0]:[0]","[2]"]
|
||||
["$[0][0]","$[2]"]
|
||||
SELECT Json_Locate_All('[[45,28,45],36,45,89]',45);
|
||||
Json_Locate_All('[[45,28,45],36,45,89]',45)
|
||||
["[0]:[0]","[0]:[2]","[2]"]
|
||||
["$[0][0]","$[0][2]","$[2]"]
|
||||
SELECT Json_Locate_All('[[45,28,45],36,45,89]',JsonGet_Int('[3,45]','[1]'));
|
||||
Json_Locate_All('[[45,28,45],36,45,89]',JsonGet_Int('[3,45]','[1]'))
|
||||
["[0]:[0]","[0]:[2]","[2]"]
|
||||
["$[0][0]","$[0][2]","$[2]"]
|
||||
SELECT JsonLocate('[[45,28,45],36,45,89]',45,n) from t1;
|
||||
JsonLocate('[[45,28,45],36,45,89]',45,n)
|
||||
[0]:[0]
|
||||
[0]:[2]
|
||||
[2]
|
||||
$[0][0]
|
||||
$[0][2]
|
||||
$[2]
|
||||
NULL
|
||||
NULL
|
||||
SELECT JsonGet_String(Json_Locate_All('[[45,28,45],36,45,89]',45),concat('[',n-1,']')) FROM t1;
|
||||
JsonGet_String(Json_Locate_All('[[45,28,45],36,45,89]',45),concat('[',n-1,']'))
|
||||
[0]:[0]
|
||||
[0]:[2]
|
||||
[2]
|
||||
$[0][0]
|
||||
$[0][2]
|
||||
$[2]
|
||||
NULL
|
||||
NULL
|
||||
SELECT JsonGet_String(Json_Locate_All('[[45,28,45],36,45,89]',45),concat('[',n-1,']')) AS `Path` FROM t1 GROUP BY n HAVING `Path` IS NOT NULL;
|
||||
Path
|
||||
[0]:[0]
|
||||
[0]:[2]
|
||||
[2]
|
||||
$[0][0]
|
||||
$[0][2]
|
||||
$[2]
|
||||
SELECT Json_Locate_All('[45,28,[36,45,89]]',45);
|
||||
Json_Locate_All('[45,28,[36,45,89]]',45)
|
||||
["[0]","[2]:[1]"]
|
||||
["$[0]","$[2][1]"]
|
||||
SELECT Json_Locate_All('[[45,28],[36,45.0,89]]',JsonValue(45.0));
|
||||
Json_Locate_All('[[45,28],[36,45.0,89]]',JsonValue(45.0))
|
||||
[]
|
||||
SELECT Json_Locate_All('[[45,28],[36,45.0,89]]',45.0);
|
||||
Json_Locate_All('[[45,28],[36,45.0,89]]',45.0)
|
||||
["[1]:[1]"]
|
||||
["$[1][1]"]
|
||||
SELECT JsonLocate('[[45,28],[36,45,89]]','[36,45,89]' json_);
|
||||
JsonLocate('[[45,28],[36,45,89]]','[36,45,89]' json_)
|
||||
[1]
|
||||
$[1]
|
||||
SELECT JsonLocate('[[45,28],[36,45,89]]','[45,28]' json_);
|
||||
JsonLocate('[[45,28],[36,45,89]]','[45,28]' json_)
|
||||
[0]
|
||||
$[0]
|
||||
SELECT Json_Locate_All('[[45,28],[[36,45],89]]','45') "All paths";
|
||||
All paths
|
||||
[]
|
||||
SELECT Json_Locate_All('[[45,28],[[36,45],89]]','[36,45]' json_);
|
||||
Json_Locate_All('[[45,28],[[36,45],89]]','[36,45]' json_)
|
||||
["[1]:[0]"]
|
||||
["$[1][0]"]
|
||||
SELECT JsonGet_Int(Json_Locate_All('[[45,28],[[36,45],89]]',45), '[#]') "Nb of occurs";
|
||||
Nb of occurs
|
||||
2
|
||||
SELECT Json_Locate_All('[[45,28],[[36,45],89]]',45,2);
|
||||
Json_Locate_All('[[45,28],[[36,45],89]]',45,2)
|
||||
["[0]:[0]"]
|
||||
SELECT JsonGet_String(Json_Locate_All('[45,28,36,45,89]',45),'[0]');
|
||||
JsonGet_String(Json_Locate_All('[45,28,36,45,89]',45),'[0]')
|
||||
[0]
|
||||
["$[0][0]"]
|
||||
SELECT JsonGet_String(Json_Locate_All('[45,28,36,45,89]',45),'0');
|
||||
JsonGet_String(Json_Locate_All('[45,28,36,45,89]',45),'0')
|
||||
$[0]
|
||||
SELECT JsonLocate(Json_File('test/biblio.json'), 'Knab');
|
||||
JsonLocate(Json_File('test/biblio.json'), 'Knab')
|
||||
[0]:AUTHOR:[1]:LASTNAME
|
||||
$[0].AUTHOR[1].LASTNAME
|
||||
SELECT Json_Locate_All('test/biblio.json' jfile_, 'Knab');
|
||||
Json_Locate_All('test/biblio.json' jfile_, 'Knab')
|
||||
["[0]:AUTHOR:[1]:LASTNAME"]
|
||||
["$[0].AUTHOR[1].LASTNAME"]
|
||||
#
|
||||
# Testing json files
|
||||
#
|
||||
@@ -595,54 +595,54 @@ Warning 1105 File pretty format doesn't match the specified pretty value
|
||||
SELECT Json_File('test/fx.json', 0);
|
||||
Json_File('test/fx.json', 0)
|
||||
[{"_id":5,"type":"food","item":"beer","taste":"light","price":5.65,"ratings":[5,8,9]},{"_id":6,"type":"car","item":"roadster","mileage":56000,"ratings":[6,9]},{"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2,4]},{"_id":8,"type":"furniture","item":"table","size":{"W":60,"L":80,"H":40},"ratings":[5,8,7]}]
|
||||
SELECT Json_File('test/fx.json', '[0]');
|
||||
Json_File('test/fx.json', '[0]')
|
||||
SELECT Json_File('test/fx.json', '0');
|
||||
Json_File('test/fx.json', '0')
|
||||
{"_id":5,"type":"food","item":"beer","taste":"light","price":5.65,"ratings":[5,8,9]}
|
||||
SELECT Json_File('test/fx.json', '[?]');
|
||||
Json_File('test/fx.json', '[?]')
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 1105 Invalid function specification ?
|
||||
SELECT JsonGet_String(Json_File('test/fx.json'), '[1]:*');
|
||||
JsonGet_String(Json_File('test/fx.json'), '[1]:*')
|
||||
SELECT JsonGet_String(Json_File('test/fx.json'), '1.*');
|
||||
JsonGet_String(Json_File('test/fx.json'), '1.*')
|
||||
{"_id":6,"type":"car","item":"roadster","mileage":56000,"ratings":[6,9]}
|
||||
SELECT JsonGet_String(Json_File('test/fx.json'), '[1]');
|
||||
JsonGet_String(Json_File('test/fx.json'), '[1]')
|
||||
6 car roadster 56000 ???
|
||||
SELECT JsonGet_Int(Json_File('test/fx.json'), '[1]:mileage') AS Mileage;
|
||||
SELECT JsonGet_String(Json_File('test/fx.json'), '1');
|
||||
JsonGet_String(Json_File('test/fx.json'), '1')
|
||||
6 car roadster 56000 <null>
|
||||
SELECT JsonGet_Int(Json_File('test/fx.json'), '1.mileage') AS Mileage;
|
||||
Mileage
|
||||
56000
|
||||
SELECT JsonGet_Real(Json_File('test/fx.json'), '[0]:price', 2) AS Price;
|
||||
SELECT JsonGet_Real(Json_File('test/fx.json'), '0.price', 2) AS Price;
|
||||
Price
|
||||
5.65
|
||||
SELECT Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 'ratings');
|
||||
Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 'ratings')
|
||||
SELECT Json_Array_Add(Json_File('test/fx.json', '2'), 6, 'ratings');
|
||||
Json_Array_Add(Json_File('test/fx.json', '2'), 6, 'ratings')
|
||||
{"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2,4,6]}
|
||||
SELECT Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 1, 'ratings');
|
||||
Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 1, 'ratings')
|
||||
SELECT Json_Array_Add(Json_File('test/fx.json', '2'), 6, 1, 'ratings');
|
||||
Json_Array_Add(Json_File('test/fx.json', '2'), 6, 1, 'ratings')
|
||||
{"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2,6,4]}
|
||||
SELECT Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 'ratings', 1);
|
||||
Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 'ratings', 1)
|
||||
SELECT Json_Array_Add(Json_File('test/fx.json', '2'), 6, 'ratings', 1);
|
||||
Json_Array_Add(Json_File('test/fx.json', '2'), 6, 'ratings', 1)
|
||||
{"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2,6,4]}
|
||||
SELECT Json_Array_Add(Json_File('test/fx.json', '[2]:ratings'), 6, 0);
|
||||
Json_Array_Add(Json_File('test/fx.json', '[2]:ratings'), 6, 0)
|
||||
SELECT Json_Array_Add(Json_File('test/fx.json', '2.ratings'), 6, 0);
|
||||
Json_Array_Add(Json_File('test/fx.json', '2.ratings'), 6, 0)
|
||||
[6,2,4]
|
||||
SELECT Json_Array_Delete(Json_File('test/fx.json', '[2]'), 'ratings', 1);
|
||||
Json_Array_Delete(Json_File('test/fx.json', '[2]'), 'ratings', 1)
|
||||
SELECT Json_Array_Delete(Json_File('test/fx.json', '2'), 'ratings', 1);
|
||||
Json_Array_Delete(Json_File('test/fx.json', '2'), 'ratings', 1)
|
||||
{"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2]}
|
||||
SELECT Json_Object_Add(Json_File('test/fx.json', '[2]'), 'france' origin);
|
||||
Json_Object_Add(Json_File('test/fx.json', '[2]'), 'france' origin)
|
||||
SELECT Json_Object_Add(Json_File('test/fx.json', '2'), 'france' origin);
|
||||
Json_Object_Add(Json_File('test/fx.json', '2'), 'france' origin)
|
||||
{"_id":7,"type":"food","item":"meat","origin":"france","ratings":[2,4]}
|
||||
SELECT Json_Object_Add(Json_File('test/fx.json', '[2]'), 70 H, 'size');
|
||||
Json_Object_Add(Json_File('test/fx.json', '[2]'), 70 H, 'size')
|
||||
SELECT Json_Object_Add(Json_File('test/fx.json', '2'), 70 H, 'size');
|
||||
Json_Object_Add(Json_File('test/fx.json', '2'), 70 H, 'size')
|
||||
{"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2,4]}
|
||||
Warnings:
|
||||
Warning 1105 No sub-item at 'size'
|
||||
SELECT Json_Object_Add(Json_File('test/fx.json', '[3]'), 70 H, 'size');
|
||||
Json_Object_Add(Json_File('test/fx.json', '[3]'), 70 H, 'size')
|
||||
SELECT Json_Object_Add(Json_File('test/fx.json', '3'), 70 H, 'size');
|
||||
Json_Object_Add(Json_File('test/fx.json', '3'), 70 H, 'size')
|
||||
{"_id":8,"type":"furniture","item":"table","size":{"W":60,"L":80,"H":70},"ratings":[5,8,7]}
|
||||
SELECT Json_Object_List(Json_File('test/fx.json', '[3]:size'));
|
||||
Json_Object_List(Json_File('test/fx.json', '[3]:size'))
|
||||
SELECT Json_Object_List(Json_File('test/fx.json', '3.size'));
|
||||
Json_Object_List(Json_File('test/fx.json', '3.size'))
|
||||
["W","L","H"]
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
|
@@ -29,8 +29,8 @@ Json_Array_Delete(Jbin_Array(56, Jbin_Array(3.1416, 'My name is "Foo"'), NULL),
|
||||
SELECT Json_Array_Delete(Jbin_Array(56, Jbin_Array(3.1416, 'My name is "Foo"'), TRUE), 1, '[1]');
|
||||
Json_Array_Delete(Jbin_Array(56, Jbin_Array(3.1416, 'My name is "Foo"'), TRUE), 1, '[1]')
|
||||
[56,[3.141600],true]
|
||||
SELECT Json_Array(1, TRUE, 0, FALSE);
|
||||
Json_Array(1, TRUE, 0, FALSE)
|
||||
SELECT Json_Make_Array(1, TRUE, 0, FALSE);
|
||||
Json_Make_Array(1, TRUE, 0, FALSE)
|
||||
[1,true,0,false]
|
||||
SELECT Json_Serialize(Jbin_Array(TRUE, FALSE));
|
||||
Json_Serialize(Jbin_Array(TRUE, FALSE))
|
||||
@@ -63,94 +63,94 @@ Json_Serialize(Jbin_File('gloss.json'))
|
||||
{"glossary":{"title":"example glossary","GlossDiv":{"title":"S","GlossList":{"GlossEntry":{"ID":"SGML","SortAs":"SGML","GlossTerm":"Standard Generalized Markup Language","Acronym":"SGML","Abbrev":"ISO 8879:1986","GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso":["GML","XML"]},"GlossSee":"markup"}}}}}
|
||||
SELECT JsonLocate(Jbin_File('gloss.json'),'XML');
|
||||
JsonLocate(Jbin_File('gloss.json'),'XML')
|
||||
glossary:GlossDiv:GlossList:GlossEntry:GlossDef:GlossSeeAlso:[1]
|
||||
$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso[1]
|
||||
SELECT Json_Object_Key('first', 'foo', 'second', Jbin_Array('a', 33));
|
||||
Json_Object_Key('first', 'foo', 'second', Jbin_Array('a', 33))
|
||||
{"first":"foo","second":["a",33]}
|
||||
SELECT Json_Get_Item(Json_Array('a','b','c'), '[1]');
|
||||
Json_Get_Item(Json_Array('a','b','c'), '[1]')
|
||||
SELECT Json_Get_Item(Json_Make_Array('a','b','c'), '$[1]');
|
||||
Json_Get_Item(Json_Make_Array('a','b','c'), '$[1]')
|
||||
NULL
|
||||
SELECT Json_Get_Item(Json_Object('foo' AS "first", Json_Array('a', 33) AS "json_second"), 'second') AS "item";
|
||||
SELECT Json_Get_Item(Json_Make_Object('foo' AS "first", Json_Make_Array('a', 33) AS "json_second"), '$.second') AS "item";
|
||||
item
|
||||
["a",33]
|
||||
SELECT Json_Get_Item(Jbin_Object('foo' first, Jbin_Array('a', 33) jbin_second), 'second:*') item;
|
||||
SELECT Json_Get_Item(Jbin_Object('foo' first, Jbin_Array('a', 33) jbin_second), '$.second') item;
|
||||
item
|
||||
["a",33]
|
||||
SELECT Json_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv');
|
||||
Json_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv')
|
||||
SELECT Json_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv');
|
||||
Json_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv')
|
||||
{"title":"S","GlossList":{"GlossEntry":{"ID":"SGML","SortAs":"SGML","GlossTerm":"Standard Generalized Markup Language","Acronym":"SGML","Abbrev":"ISO 8879:1986","GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso":["GML","XML"]},"GlossSee":"markup"}}}
|
||||
SELECT Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv'));
|
||||
Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv'))
|
||||
SELECT Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv'));
|
||||
Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv'))
|
||||
{"title":"S","GlossList":{"GlossEntry":{"ID":"SGML","SortAs":"SGML","GlossTerm":"Standard Generalized Markup Language","Acronym":"SGML","Abbrev":"ISO 8879:1986","GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso":["GML","XML"]},"GlossSee":"markup"}}}
|
||||
SELECT Json_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv:*');
|
||||
Json_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv:*')
|
||||
SELECT Json_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv');
|
||||
Json_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv')
|
||||
{"title":"S","GlossList":{"GlossEntry":{"ID":"SGML","SortAs":"SGML","GlossTerm":"Standard Generalized Markup Language","Acronym":"SGML","Abbrev":"ISO 8879:1986","GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso":["GML","XML"]},"GlossSee":"markup"}}}
|
||||
SELECT JsonGet_String(Json_File('gloss.json'),'glossary:GlossDiv:GlossList:GlossEntry:GlossDef:GlossSeeAlso') lang;
|
||||
SELECT JsonGet_String(Json_File('gloss.json'),'$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso') lang;
|
||||
lang
|
||||
GML
|
||||
SELECT Json_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv:GlossList:GlossEntry:GlossDef:GlossSeeAlso') "See also";
|
||||
SELECT Json_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso') "See also";
|
||||
See also
|
||||
["GML","XML"]
|
||||
SELECT Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv:GlossList:GlossEntry:GlossDef:GlossSeeAlso')) "See also";
|
||||
SELECT Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso')) "See also";
|
||||
See also
|
||||
["GML","XML"]
|
||||
SELECT JsonGet_String(Json_Get_Item(Json_File('gloss.json'),'glossary:GlossDiv:GlossList:GlossEntry:GlossDef:GlossSeeAlso'),'[0]') lang;
|
||||
SELECT JsonGet_String(Json_Get_Item(Json_File('gloss.json'),'$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso'),'$[0]') lang;
|
||||
lang
|
||||
GML
|
||||
#
|
||||
# Test Item Get/Set/Insert/Update UDF's
|
||||
#
|
||||
SELECT Json_Get_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '[]');
|
||||
Json_Get_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '[]')
|
||||
SELECT Json_Get_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '$[]');
|
||||
Json_Get_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '$[]')
|
||||
[1,2,{"trois":3,"quatre":4}]
|
||||
SELECT Json_Get_Item(Jbin_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '[1]');
|
||||
Json_Get_Item(Jbin_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '[1]')
|
||||
SELECT Json_Get_Item(Jbin_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '$[1]');
|
||||
Json_Get_Item(Jbin_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '$[1]')
|
||||
NULL
|
||||
SELECT Json_Get_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), '[1]');
|
||||
Json_Get_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), '[1]')
|
||||
SELECT Json_Get_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), '$[1]');
|
||||
Json_Get_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), '$[1]')
|
||||
NULL
|
||||
SELECT Json_Set_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)));
|
||||
Json_Set_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)))
|
||||
SELECT Json_Set_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)));
|
||||
Json_Set_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)))
|
||||
[1,2,{"trois":3,"quatre":4}]
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 'foo');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), '$.foo');
|
||||
ERROR HY000: Can't initialize function 'json_set_item'; This function must have an odd number of arguments
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq')
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq')
|
||||
[1,2,{"trois":3,"quatre":4,"cinq":5}]
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 7, '[1]');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 7, '[1]')
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 7, '$[1]');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 7, '$[1]')
|
||||
[1,7,{"trois":3,"quatre":4}]
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 7, '[1]');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 7, '[1]')
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 7, '$[1]');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 7, '$[1]')
|
||||
[1,7,{"trois":3,"quatre":4,"cinq":5}]
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Json_Array(7, 8, 9), '[1]');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Json_Array(7, 8, 9), '[1]')
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Json_Make_Array(7, 8, 9), '$[1]');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Json_Make_Array(7, 8, 9), '$[1]')
|
||||
[1,[7,8,9],{"trois":3,"quatre":4}]
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '[2]');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '[2]')
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '$[2]');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '$[2]')
|
||||
[1,2,[7,8,9]]
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '[2]:*');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '[2]:*')
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '$[2].*');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '$[2].*')
|
||||
[1,2,{"trois":3,"quatre":4}]
|
||||
Warnings:
|
||||
Warning 1105 Invalid specification * in a write path
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 3.1416, 'foo');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 3.1416, 'foo')
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 3.1416, '$.foo');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 3.1416, '$.foo')
|
||||
[1,2,{"trois":3,"quatre":4}]
|
||||
SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 'toto', '[1]:[2]');
|
||||
Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 'toto', '[1]:[2]')
|
||||
SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 'toto', '$[1][2]');
|
||||
Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 'toto', '$[1][2]')
|
||||
[1,[7,8,"toto"],{"trois":3,"quatre":4}]
|
||||
SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 300, '[2]:nxt:total:[]');
|
||||
Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 300, '[2]:nxt:total:[]')
|
||||
SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 300, '$[2].nxt.total[]');
|
||||
Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 300, '$[2].nxt.total[]')
|
||||
[1,[7,8,9],{"trois":3,"quatre":4,"nxt":{"total":[300]}}]
|
||||
SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[]', 300, '[2]:nxt:total:[]');
|
||||
Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[]', 300, '[2]:nxt:total:[]')
|
||||
SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][]', 300, '$[2].nxt.total[]');
|
||||
Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][]', 300, '$[2].nxt.total[]')
|
||||
[1,[7,8,9,10],{"trois":3,"quatre":4,"cinq":5,"nxt":{"total":[300]}}]
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '[1]', 5, '[2]:cinq', 10, '[1]:[]');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '[1]', 5, '[2]:cinq', 10, '[1]:[]')
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '$[1]', 5, '$[2].cinq', 10, '$[1][]');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '$[1]', 5, '$[2].cinq', 10, '$[1][]')
|
||||
[1,[7,8,9,10],{"trois":3,"quatre":4,"cinq":5}]
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 44, '[2]:quatre');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 44, '[2]:quatre')
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 44, '$[2].quatre');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 44, '$[2].quatre')
|
||||
[1,2,{"trois":3,"quatre":44}]
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, 'truc');
|
||||
Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, 'truc')
|
||||
@@ -163,32 +163,32 @@ Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '*'
|
||||
[1,2,{"trois":3,"quatre":4}]
|
||||
Warnings:
|
||||
Warning 1105 Invalid specification * in a write path
|
||||
SELECT Json_Serialize(Jbin_Set_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq'));
|
||||
Json_Serialize(Jbin_Set_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq'))
|
||||
SELECT Json_Serialize(Jbin_Set_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq'));
|
||||
Json_Serialize(Jbin_Set_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq'))
|
||||
[1,2,{"trois":3,"quatre":4,"cinq":5}]
|
||||
SELECT Json_Insert_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq');
|
||||
Json_Insert_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq')
|
||||
SELECT Json_Insert_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq');
|
||||
Json_Insert_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq')
|
||||
[1,2,{"trois":3,"quatre":4,"cinq":5}]
|
||||
SELECT Json_Update_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq');
|
||||
Json_Update_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq')
|
||||
SELECT Json_Update_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq');
|
||||
Json_Update_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq')
|
||||
[1,2,{"trois":3,"quatre":4}]
|
||||
SELECT Json_Insert_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[]', 44, '[2]:quatre');
|
||||
Json_Insert_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[]', 44, '[2]:quatre')
|
||||
SELECT Json_Insert_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][]', 44, '$[2].quatre');
|
||||
Json_Insert_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][]', 44, '$[2].quatre')
|
||||
[1,[7,8,9,10],{"trois":3,"quatre":4,"cinq":5}]
|
||||
SELECT Json_Update_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[]', 44, '[2]:quatre');
|
||||
Json_Update_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[]', 44, '[2]:quatre')
|
||||
SELECT Json_Update_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][]', 44, '$[2].quatre');
|
||||
Json_Update_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][]', 44, '$[2].quatre')
|
||||
[1,[7,8,9],{"trois":3,"quatre":44}]
|
||||
SELECT Json_Insert_Item(Json_Array(1, Json_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[1]', 300, '[2]:nxt:total:[]');
|
||||
Json_Insert_Item(Json_Array(1, Json_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[1]', 300, '[2]:nxt:total:[]')
|
||||
SELECT Json_Insert_Item(Json_Make_Array(1, Json_Make_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][1]', 300, '$[2].nxt.total[]');
|
||||
Json_Insert_Item(Json_Make_Array(1, Json_Make_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][1]', 300, '$[2].nxt.total[]')
|
||||
[1,[7,8,9],{"trois":3,"quatre":4,"cinq":5,"nxt":{"total":[300]}}]
|
||||
SELECT Json_Update_Item(Json_Array(1, Json_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[1]', 300, '[2]:nxt:total:[]');
|
||||
Json_Update_Item(Json_Array(1, Json_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[1]', 300, '[2]:nxt:total:[]')
|
||||
SELECT Json_Update_Item(Json_Make_Array(1, Json_Make_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][1]', 300, '$[2].nxt.total[]');
|
||||
Json_Update_Item(Json_Make_Array(1, Json_Make_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][1]', 300, '$[2].nxt.total[]')
|
||||
[1,[7,10,9],{"trois":3,"quatre":4}]
|
||||
SELECT Json_Insert_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[]');
|
||||
Json_Insert_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[]')
|
||||
SELECT Json_Insert_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[]');
|
||||
Json_Insert_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[]')
|
||||
[1,2,{"trois":3,"quatre":4},5]
|
||||
SELECT Json_Update_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[]');
|
||||
Json_Update_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[]')
|
||||
SELECT Json_Update_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[]');
|
||||
Json_Update_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[]')
|
||||
[1,2,{"trois":3,"quatre":4}]
|
||||
#
|
||||
# Test merging items UDF's
|
||||
@@ -196,7 +196,7 @@ Json_Update_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5,
|
||||
SELECT Json_Item_Merge(Jbin_Array('a','b','c'), Jbin_Array('d','e','f'));
|
||||
Json_Item_Merge(Jbin_Array('a','b','c'), Jbin_Array('d','e','f'))
|
||||
["a","b","c","d","e","f"]
|
||||
SELECT Json_Item_Merge(Json_Array('a','b','c'), Json_Array('d','e','f')) AS "Result";
|
||||
SELECT Json_Item_Merge(Json_Make_Array('a','b','c'), Json_Make_Array('d','e','f')) AS "Result";
|
||||
Result
|
||||
["a","b","c","d","e","f"]
|
||||
SELECT Json_Array_Add(Jbin_Item_Merge(Jbin_Array('a','b','c'), Jbin_Array('d','e','f')), 'and', 3);
|
||||
@@ -216,7 +216,7 @@ Json_Object_Add(Jbin_Item_Merge(Jbin_Object(1 "a",2 "b",3 "c"), Jbin_Object(4 "d
|
||||
SELECT Json_Item_Merge(Jbin_Object(1 "a",2 "b",3 "c"), Jbin_Object(4 "a",5 "e",6 "f"));
|
||||
Json_Item_Merge(Jbin_Object(1 "a",2 "b",3 "c"), Jbin_Object(4 "a",5 "e",6 "f"))
|
||||
{"a":4,"b":2,"c":3,"e":5,"f":6}
|
||||
SELECT Json_Item_Merge('foo', Json_Array('d','e','f'));
|
||||
SELECT Json_Item_Merge('foo', Json_Make_Array('d','e','f'));
|
||||
ERROR HY000: Can't initialize function 'json_item_merge'; First argument must be a json item
|
||||
#
|
||||
# Test making file UDF's
|
||||
@@ -294,17 +294,17 @@ Json_File('bt1.json', 2)
|
||||
SELECT Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json');
|
||||
Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json')
|
||||
bt1.json
|
||||
SELECT Json_Object(Jbin_Array_Add(Jbin_Array('a','b','c'), 'd') "Jbin_foo") AS "Result";
|
||||
SELECT Json_Make_Object(Jbin_Array_Add(Jbin_Array('a','b','c'), 'd') "Jbin_foo") AS "Result";
|
||||
Result
|
||||
{"foo":["a","b","c","d"]}
|
||||
SELECT Json_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd')) AS "Result";
|
||||
SELECT Json_Make_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd')) AS "Result";
|
||||
Result
|
||||
{"Array_Add(Jbin_File('bt1.json'), 'd')":["a","b","c","d"]}
|
||||
SELECT Json_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd') "Jbin_bt1") AS "Result";
|
||||
SELECT Json_Make_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd') "Jbin_bt1") AS "Result";
|
||||
Result
|
||||
{"bt1":["a","b","c","d"]}
|
||||
# This does modify the file
|
||||
SELECT Json_Object(Json_Array_Add(Jbin_File('bt1.json'), 'd') "Jfile_bt1") AS "Result";
|
||||
SELECT Json_Make_Object(Json_Array_Add(Jbin_File('bt1.json'), 'd') "Jfile_bt1") AS "Result";
|
||||
Result
|
||||
{"bt1":["a","b","c","d"]}
|
||||
SELECT Json_File('bt1.json');
|
||||
@@ -319,7 +319,7 @@ Json_File('bt1.json')
|
||||
SELECT Json_File(Json_Array_Delete(Jbin_File('bt1.json'), 3), 2);
|
||||
Json_File(Json_Array_Delete(Jbin_File('bt1.json'), 3), 2)
|
||||
["a","b","c"]
|
||||
SELECT Json_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd') "Jbin_bt1", n "t1") AS "Result" from t1;
|
||||
SELECT Json_Make_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd') "Jbin_bt1", n "t1") AS "Result" from t1;
|
||||
Result
|
||||
{"bt1":["a","b","c","d"],"t1":1}
|
||||
{"bt1":["a","b","c","d"],"t1":2}
|
||||
@@ -432,23 +432,23 @@ SELECT Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json');
|
||||
Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json')
|
||||
bt1.json
|
||||
# Test DELETE from file
|
||||
SELECT Json_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 1)) AS "Result";
|
||||
SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 1)) AS "Result";
|
||||
Result
|
||||
{"Array_Delete(Jbin_File('bt1.json'), 1)":["a","c"]}
|
||||
SELECT Json_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 2) "Jbin_bt1") AS "Result";
|
||||
SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 2) "Jbin_bt1") AS "Result";
|
||||
Result
|
||||
{"bt1":["a","b"]}
|
||||
SELECT Json_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 0) "Jbin_bt1", n "t1") AS "Result" from t1;
|
||||
SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 0) "Jbin_bt1", n "t1") AS "Result" from t1;
|
||||
Result
|
||||
{"bt1":["b","c"],"t1":1}
|
||||
{"bt1":["b","c"],"t1":2}
|
||||
{"bt1":["b","c"],"t1":3}
|
||||
SELECT Json_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 3 - n) "Jbin_bt1") AS "Result" from t1;
|
||||
SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 3 - n) "Jbin_bt1") AS "Result" from t1;
|
||||
Result
|
||||
{"bt1":["a","b"]}
|
||||
{"bt1":["a"]}
|
||||
{"bt1":[]}
|
||||
SELECT Json_Object(Json_Array_Delete(Jbin_File('bt1.json'), 3 - n) "Jbin_bt1") AS "Result" from t1;
|
||||
SELECT Json_Make_Object(Json_Array_Delete(Jbin_File('bt1.json'), 3 - n) "Jbin_bt1") AS "Result" from t1;
|
||||
Result
|
||||
{"bt1":["a","b"]}
|
||||
{"bt1":["a"]}
|
||||
@@ -475,17 +475,17 @@ SELECT Json_Serialize(Jbin_Object_Add(Jbin_File('bt2.json'), 4 "d"));
|
||||
Json_Serialize(Jbin_Object_Add(Jbin_File('bt2.json'), 4 "d"))
|
||||
{"a":1,"b":2,"c":3,"d":4}
|
||||
# First query (file not modified)
|
||||
SELECT Json_Object(Jbin_Object_Add(Jbin_File('bt2.json'), 4 AS "d") AS "Jbin_new") AS "Result";
|
||||
SELECT Json_Make_Object(Jbin_Object_Add(Jbin_File('bt2.json'), 4 AS "d") AS "Jbin_new") AS "Result";
|
||||
Result
|
||||
{"new":{"a":1,"b":2,"c":3,"d":4}}
|
||||
# First query (file modified)
|
||||
SELECT Json_Object(Json_Object_Add(Jbin_File('bt2.json'), 4 AS "d") AS "Jfile_new") AS "Result";
|
||||
SELECT Json_Make_Object(Json_Object_Add(Jbin_File('bt2.json'), 4 AS "d") AS "Jfile_new") AS "Result";
|
||||
Result
|
||||
{"new":{"a":1,"b":2,"c":3,"d":4}}
|
||||
SELECT Jfile_Make(Jbin_Object(1 "a", 2 "b", 3 "c"), 'bt2.json', 0);
|
||||
Jfile_Make(Jbin_Object(1 "a", 2 "b", 3 "c"), 'bt2.json', 0)
|
||||
bt2.json
|
||||
SELECT Json_Object(Jbin_Object_Add(Jbin_File('bt2.json'), 4 "d") "Jbin_new", n "t1") AS "Result" from t1;
|
||||
SELECT Json_Make_Object(Jbin_Object_Add(Jbin_File('bt2.json'), 4 "d") "Jbin_new", n "t1") AS "Result" from t1;
|
||||
Result
|
||||
{"new":{"a":1,"b":2,"c":3,"d":4},"t1":1}
|
||||
{"new":{"a":1,"b":2,"c":3,"d":4},"t1":2}
|
||||
@@ -526,22 +526,22 @@ SELECT Json_File(Json_Item_Merge(Jbin_File('bt2.json'), Jbin_Object(4 "d",5 "e",
|
||||
Result
|
||||
{"a":1,"b":2,"c":3,"d":4,"e":5,"f":6}
|
||||
|
||||
SELECT Json_Item_Merge(Json_Object(1 "a", 2 "b", 3 "c"), Json_Object(4 "d",5 "b",6 "f")) AS "Result";
|
||||
SELECT Json_Item_Merge(Json_Make_Object(1 "a", 2 "b", 3 "c"), Json_Make_Object(4 "d",5 "b",6 "f")) AS "Result";
|
||||
Result
|
||||
{"a":1,"b":5,"c":3,"d":4,"f":6}
|
||||
SELECT Json_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'b')) AS "Result";
|
||||
SELECT Json_Make_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'b')) AS "Result";
|
||||
Result
|
||||
{"Object_Delete(Jbin_File('bt2.json'), 'b')":{"a":1,"c":3,"d":4,"e":5,"f":6}}
|
||||
SELECT Json_Object(Jbin_Object_Delete(Jbin_File('bt2.json'), 'c') "Jbin_bt1") AS "Result";
|
||||
SELECT Json_Make_Object(Jbin_Object_Delete(Jbin_File('bt2.json'), 'c') "Jbin_bt1") AS "Result";
|
||||
Result
|
||||
{"bt1":{"a":1,"d":4,"e":5,"f":6}}
|
||||
SELECT Json_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'c') "Jbin_bt1") AS "Result";
|
||||
SELECT Json_Make_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'c') "Jbin_bt1") AS "Result";
|
||||
Result
|
||||
{"bt1":{"a":1,"d":4,"e":5,"f":6}}
|
||||
SELECT Json_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'c') "Jfile_bt1") AS "Result";
|
||||
SELECT Json_Make_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'c') "Jfile_bt1") AS "Result";
|
||||
Result
|
||||
{"bt1":{"a":1,"d":4,"e":5,"f":6}}
|
||||
SELECT Json_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'a') "Jbin_bt1", n "t1") AS "Result" from t1;
|
||||
SELECT Json_Make_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'a') "Jbin_bt1", n "t1") AS "Result" from t1;
|
||||
Result
|
||||
{"bt1":{"d":4,"e":5,"f":6},"t1":1}
|
||||
{"bt1":{"d":4,"e":5,"f":6},"t1":2}
|
||||
@@ -552,14 +552,14 @@ Key list
|
||||
SELECT Jfile_Make('{"a":1, "b":[44, 55]}' json_, 'bt3.json', 0);
|
||||
Jfile_Make('{"a":1, "b":[44, 55]}' json_, 'bt3.json', 0)
|
||||
bt3.json
|
||||
SELECT Json_Array_Add(Json_File('bt3.json', 'b'), 66);
|
||||
Json_Array_Add(Json_File('bt3.json', 'b'), 66)
|
||||
SELECT Json_Array_Add(Json_File('bt3.json', '$.b'), 66);
|
||||
Json_Array_Add(Json_File('bt3.json', '$.b'), 66)
|
||||
[44,55,66]
|
||||
SELECT Json_Array_Add(Json_File('bt3.json'), 66, 'b');
|
||||
Json_Array_Add(Json_File('bt3.json'), 66, 'b')
|
||||
SELECT Json_Array_Add(Json_File('bt3.json'), 66, '$.b');
|
||||
Json_Array_Add(Json_File('bt3.json'), 66, '$.b')
|
||||
{"a":1,"b":[44,55,66]}
|
||||
SELECT Json_Array_Add(Jbin_File('bt3.json', 'b'), 66);
|
||||
Json_Array_Add(Jbin_File('bt3.json', 'b'), 66)
|
||||
SELECT Json_Array_Add(Jbin_File('bt3.json', '$.b'), 66);
|
||||
Json_Array_Add(Jbin_File('bt3.json', '$.b'), 66)
|
||||
bt3.json
|
||||
SELECT Json_File('bt3.json', 3);
|
||||
Json_File('bt3.json', 3)
|
||||
@@ -573,15 +573,15 @@ jfile_cols CHAR(12) NOT NULL)
|
||||
ENGINE= MYISAM;
|
||||
INSERT INTO t2 VALUES(1,'bt3.json');
|
||||
# In this table, the jfile_cols column just contains a file name
|
||||
UPDATE t2 SET jfile_cols = Json_Array_Add(Jbin_File('bt3.json', 'b'), 66) WHERE n = 1;
|
||||
UPDATE t2 SET jfile_cols = Json_Array_Add(Jbin_File('bt3.json', '$.b'), 66) WHERE n = 1;
|
||||
SELECT JsonGet_String(jfile_cols, '*') FROM t2;
|
||||
JsonGet_String(jfile_cols, '*')
|
||||
{"a":1,"b":[44,55,66]}
|
||||
UPDATE t2 SET jfile_cols = Json_Insert_Item(jfile_cols, 77, 'b:[]') WHERE n = 1;
|
||||
SELECT JsonGet_String(jfile_cols, 'b:*') FROM t2;
|
||||
JsonGet_String(jfile_cols, 'b:*')
|
||||
UPDATE t2 SET jfile_cols = Json_Insert_Item(jfile_cols, 77, '$.b[]') WHERE n = 1;
|
||||
SELECT JsonGet_String(jfile_cols, '$.b.*') FROM t2;
|
||||
JsonGet_String(jfile_cols, '$.b.*')
|
||||
[44,55,66,77]
|
||||
UPDATE t2 SET jfile_cols = Json_Insert_Item(Jbin_Insert_Item(jfile_cols, 88, 'b:') , 99, 'b:') WHERE n = 1;
|
||||
UPDATE t2 SET jfile_cols = Json_Insert_Item(Jbin_Insert_Item(jfile_cols, 88, '$.b[]') , 99, '$.b[]') WHERE n = 1;
|
||||
SELECT JsonGet_String(jfile_cols, '*') FROM t2;
|
||||
JsonGet_String(jfile_cols, '*')
|
||||
{"a":1,"b":[44,55,66,77,88,99]}
|
||||
|
136
storage/connect/mysql-test/connect/r/mul_new.result
Normal file
136
storage/connect/mysql-test/connect/r/mul_new.result
Normal file
@@ -0,0 +1,136 @@
|
||||
#
|
||||
# Testing multiple 1
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
Chiffre int(3) NOT NULL,
|
||||
Lettre char(16) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=CSV FILE_NAME='num1.csv' LRECL=20 HEADER=1;
|
||||
INSERT INTO t1 VALUES(1,'One'),(2,'Two'),(3,'Three'),(4,'Four'),(5,'Five'),(6,'Six');
|
||||
SELECT * FROM t1;
|
||||
Chiffre Lettre
|
||||
1 One
|
||||
2 Two
|
||||
3 Three
|
||||
4 Four
|
||||
5 Five
|
||||
6 Six
|
||||
CREATE TABLE t2 (
|
||||
Chiffre int(3) NOT NULL,
|
||||
Lettre char(16) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE='CSV' FILE_NAME='subdir/num2.csv' LRECL=20 HEADER=1;
|
||||
INSERT INTO t2 VALUES(7,'Seven'),(8,'Eight'),(9,'Nine'),(10,'Ten'),(11,'Eleven'),(12,'Twelve');
|
||||
SELECT * FROM t2;
|
||||
Chiffre Lettre
|
||||
7 Seven
|
||||
8 Eight
|
||||
9 Nine
|
||||
10 Ten
|
||||
11 Eleven
|
||||
12 Twelve
|
||||
CREATE TABLE t3 (
|
||||
Chiffre int(3) NOT NULL,
|
||||
Lettre char(16) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE='CSV' FILE_NAME='num3.csv' LRECL=20 HEADER=1;
|
||||
INSERT INTO t3 VALUES(13,'Thirteen'),(14,'Fourteen'),(15,'Fifteen'),(16,'Sixteen'),(17,'Seventeen'),(18,'Eighteen');
|
||||
SELECT * FROM t3;
|
||||
Chiffre Lettre
|
||||
13 Thirteen
|
||||
14 Fourteen
|
||||
15 Fifteen
|
||||
16 Sixteen
|
||||
17 Seventeen
|
||||
18 Eighteen
|
||||
CREATE TABLE t4 (
|
||||
Chiffre int(3) NOT NULL,
|
||||
Lettre char(16) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE='CSV' FILE_NAME='subdir/num4.csv' LRECL=20 HEADER=1;
|
||||
INSERT INTO t4 VALUES(19,'Nineteen'),(20,'Twenty'),(21,'Twenty one'),(22,'Twenty two'),(23,'Tenty three'),(24,'Twenty four');
|
||||
SELECT * FROM t4;
|
||||
Chiffre Lettre
|
||||
19 Nineteen
|
||||
20 Twenty
|
||||
21 Twenty one
|
||||
22 Twenty two
|
||||
23 Tenty three
|
||||
24 Twenty four
|
||||
CREATE TABLE t5 (
|
||||
Chiffre int(3) NOT NULL,
|
||||
Lettre char(16) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE='CSV' FILE_NAME='num5.csv' LRECL=20 HEADER=1;
|
||||
INSERT INTO t5 VALUES(25,'Twenty five'),(26,'Twenty six'),(27,'Twenty seven'),(28,'Twenty eight'),(29,'Tenty eight'),(30,'Thirty');
|
||||
SELECT * FROM t5;
|
||||
Chiffre Lettre
|
||||
25 Twenty five
|
||||
26 Twenty six
|
||||
27 Twenty seven
|
||||
28 Twenty eight
|
||||
29 Tenty eight
|
||||
30 Thirty
|
||||
CREATE TABLE t_all (
|
||||
Chiffre int(3) not null,
|
||||
Lettre char(16) not null)
|
||||
ENGINE=CONNECT TABLE_TYPE=CSV FILE_NAME='num?.csv' HEADER=1 LRECL=20 MULTIPLE=1;
|
||||
SELECT * FROM t_all ORDER BY Chiffre;
|
||||
Chiffre Lettre
|
||||
1 One
|
||||
2 Two
|
||||
3 Three
|
||||
4 Four
|
||||
5 Five
|
||||
6 Six
|
||||
13 Thirteen
|
||||
14 Fourteen
|
||||
15 Fifteen
|
||||
16 Sixteen
|
||||
17 Seventeen
|
||||
18 Eighteen
|
||||
25 Twenty five
|
||||
26 Twenty six
|
||||
27 Twenty seven
|
||||
28 Twenty eight
|
||||
29 Tenty eight
|
||||
30 Thirty
|
||||
#
|
||||
# Testing multiple 3
|
||||
#
|
||||
ALTER TABLE t_all MULTIPLE=3;
|
||||
Warnings:
|
||||
Warning 1105 This is an outward table, table data were not modified.
|
||||
SELECT * FROM t_all ORDER BY Chiffre;
|
||||
Chiffre Lettre
|
||||
1 One
|
||||
2 Two
|
||||
3 Three
|
||||
4 Four
|
||||
5 Five
|
||||
6 Six
|
||||
7 Seven
|
||||
8 Eight
|
||||
9 Nine
|
||||
10 Ten
|
||||
11 Eleven
|
||||
12 Twelve
|
||||
13 Thirteen
|
||||
14 Fourteen
|
||||
15 Fifteen
|
||||
16 Sixteen
|
||||
17 Seventeen
|
||||
18 Eighteen
|
||||
19 Nineteen
|
||||
20 Twenty
|
||||
21 Twenty one
|
||||
22 Twenty two
|
||||
23 Tenty three
|
||||
24 Twenty four
|
||||
25 Twenty five
|
||||
26 Twenty six
|
||||
27 Twenty seven
|
||||
28 Twenty eight
|
||||
29 Tenty eight
|
||||
30 Thirty
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
DROP TABLE t3;
|
||||
DROP TABLE t4;
|
||||
DROP TABLE t5;
|
||||
DROP TABLE t_all;
|
@@ -1,10 +1,5 @@
|
||||
connect master,127.0.0.1,root,,test,$MASTER_MYPORT,;
|
||||
connect slave,127.0.0.1,root,,test,$SLAVE_MYPORT,;
|
||||
connection master;
|
||||
CREATE DATABASE connect;
|
||||
connection slave;
|
||||
CREATE DATABASE connect;
|
||||
connection slave;
|
||||
CREATE TABLE t1 (
|
||||
`id` int(20) primary key,
|
||||
`group` int NOT NULL default 1,
|
||||
@@ -12,15 +7,14 @@ CREATE TABLE t1 (
|
||||
`a\\` int unsigned,
|
||||
`name` varchar(32) default 'name')
|
||||
DEFAULT CHARSET=latin1;
|
||||
connection master;
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL
|
||||
CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/test/t1';
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`id` int(20) NOT NULL,
|
||||
`group` int(11) NOT NULL DEFAULT 1,
|
||||
`a\\b` int(11) NOT NULL DEFAULT 2,
|
||||
`group` int(11) NOT NULL DEFAULT '1',
|
||||
`a\\b` int(11) NOT NULL DEFAULT '2',
|
||||
`a\\` int(10) unsigned DEFAULT NULL,
|
||||
`name` varchar(32) DEFAULT 'name'
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/test/t1' `TABLE_TYPE`='MYSQL'
|
||||
@@ -31,15 +25,12 @@ id group a\\b a\\ name
|
||||
1 1 2 NULL foo
|
||||
2 1 2 NULL fee
|
||||
DROP TABLE t1;
|
||||
connection slave;
|
||||
SELECT * FROM t1;
|
||||
id group a\\b a\\ name
|
||||
1 1 2 NULL foo
|
||||
2 1 2 NULL fee
|
||||
DROP TABLE t1;
|
||||
connection master;
|
||||
DROP TABLE IF EXISTS connect.t1;
|
||||
DROP DATABASE IF EXISTS connect;
|
||||
connection slave;
|
||||
DROP TABLE IF EXISTS connect.t1;
|
||||
DROP DATABASE IF EXISTS connect;
|
||||
|
@@ -1,13 +1,8 @@
|
||||
connect master,127.0.0.1,root,,test,$MASTER_MYPORT,;
|
||||
connect slave,127.0.0.1,root,,test,$SLAVE_MYPORT,;
|
||||
connection master;
|
||||
CREATE DATABASE connect;
|
||||
connection slave;
|
||||
CREATE DATABASE connect;
|
||||
#
|
||||
# Checking Sending Commands
|
||||
#
|
||||
connection master;
|
||||
CREATE TABLE t1 (
|
||||
command VARCHAR(128) NOT NULL,
|
||||
warnings INT(4) NOT NULL FLAG=3,
|
||||
@@ -31,8 +26,9 @@ insert into t1(msg) values('One'),(NULL),('Three') 1 3 Affected rows
|
||||
Warning 0 1048 Column 'msg' cannot be null
|
||||
insert into t1 values(2,'Deux') on duplicate key update msg = 'Two' 0 2 Affected rows
|
||||
insert into t1(message) values('Four'),('Five'),('Six') 0 1054 Remote: Unknown column 'message' in 'field list'
|
||||
insert into t1(id) values(NULL) 0 1364 Remote: Field 'msg' doesn't have a default value
|
||||
update t1 set msg = 'Four' where id = 4 0 0 Affected rows
|
||||
insert into t1(id) values(NULL) 1 1 Affected rows
|
||||
Warning 0 1364 Field 'msg' doesn't have a default value
|
||||
update t1 set msg = 'Four' where id = 4 0 1 Affected rows
|
||||
select * from t1 0 2 Result set columns
|
||||
#
|
||||
# Checking Using Procedure
|
||||
@@ -45,22 +41,22 @@ READS SQL DATA
|
||||
SELECT * FROM t1 WHERE command IN ('Warning','Note',cmd);
|
||||
CALL p1('insert into t1(id) values(NULL)');
|
||||
command warnings number message
|
||||
insert into t1(id) values(NULL) 0 1364 Remote: Field 'msg' doesn't have a default value
|
||||
insert into t1(id) values(NULL) 1 1 Affected rows
|
||||
Warning 0 1364 Field 'msg' doesn't have a default value
|
||||
CALL p1('update t1 set msg = "Five" where id = 5');
|
||||
command warnings number message
|
||||
update t1 set msg = "Five" where id = 5 0 0 Affected rows
|
||||
update t1 set msg = "Five" where id = 5 0 1 Affected rows
|
||||
DROP PROCEDURE p1;
|
||||
DROP TABLE t1;
|
||||
connection slave;
|
||||
SELECT * FROM t1;
|
||||
id msg
|
||||
1 One
|
||||
2 Two
|
||||
3 Three
|
||||
4 Four
|
||||
5 Five
|
||||
DROP TABLE t1;
|
||||
connection master;
|
||||
DROP TABLE IF EXISTS connect.t1;
|
||||
DROP DATABASE IF EXISTS connect;
|
||||
connection slave;
|
||||
DROP TABLE IF EXISTS connect.t1;
|
||||
DROP DATABASE IF EXISTS connect;
|
||||
|
@@ -5,14 +5,11 @@ set sql_mode="";
|
||||
GRANT ALL PRIVILEGES ON *.* TO user@localhost;
|
||||
REVOKE FILE ON *.* FROM user@localhost;
|
||||
set sql_mode=default;
|
||||
connect user,localhost,user,,;
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=MySQL OPTION_LIST='host=localhost,user=root1,port=PORT';
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
@@ -24,7 +21,6 @@ a
|
||||
10
|
||||
20
|
||||
30
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -43,12 +39,10 @@ ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
# Testing a VIEW created with FILE privileges but accessed with no FILE
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT * FROM t1;
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -60,8 +54,6 @@ UPDATE v1 SET a=123;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
DELETE FROM v1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
disconnect user;
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
|
@@ -1,10 +1,5 @@
|
||||
connect master,127.0.0.1,root,,test,$MASTER_MYPORT,;
|
||||
connect slave,127.0.0.1,root,,test,$SLAVE_MYPORT,;
|
||||
connection master;
|
||||
CREATE DATABASE connect;
|
||||
connection slave;
|
||||
CREATE DATABASE connect;
|
||||
connection slave;
|
||||
CREATE TABLE t1 (a int, b char(10));
|
||||
INSERT INTO t1 VALUES (NULL,NULL),(0,'test00'),(1,'test01'),(2,'test02'),(3,'test03');
|
||||
SELECT * FROM t1;
|
||||
@@ -17,7 +12,6 @@ NULL NULL
|
||||
#
|
||||
# Testing errors
|
||||
#
|
||||
connection master;
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL
|
||||
CONNECTION='mysql://unknown@127.0.0.1:SLAVE_PORT/test/t1';
|
||||
ERROR HY000: (1045) Access denied for user 'unknown'@'localhost' (using password: NO)
|
||||
@@ -45,14 +39,10 @@ ERROR HY000: Got error 174 '(1054) Unknown column 'x' in 'field list' [SELECT `x
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a int, b char(10)) ENGINE=CONNECT TABLE_TYPE=MYSQL
|
||||
CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/test/t1';
|
||||
connection slave;
|
||||
ALTER TABLE t1 RENAME t1backup;
|
||||
connection master;
|
||||
SELECT * FROM t1;
|
||||
ERROR HY000: Got error 174 '(1146) Table 'test.t1' doesn't exist [SELECT `a`, `b` FROM `t1`]' from CONNECT
|
||||
connection slave;
|
||||
ALTER TABLE t1backup RENAME t1;
|
||||
connection master;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Testing SELECT, etc.
|
||||
@@ -121,7 +111,6 @@ NULL NULL
|
||||
2 0
|
||||
3 0
|
||||
DROP TABLE t1;
|
||||
connection slave;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Testing numeric data types
|
||||
@@ -140,7 +129,6 @@ t1 CREATE TABLE `t1` (
|
||||
`h` decimal(20,5) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
INSERT INTO t1 VALUES(100,3333,41235,1234567890,235000000000,3.14159265,3.14159265,3141.59265);
|
||||
connection master;
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL
|
||||
OPTION_LIST='host=127.0.0.1,user=root,port=SLAVE_PORT';
|
||||
SHOW CREATE TABLE t1;
|
||||
@@ -159,7 +147,6 @@ SELECT * FROM t1;
|
||||
a b c d e f g h
|
||||
100 3333 41235 1234567890 235000000000 3.14159 3.14159265 3141.59265
|
||||
DROP TABLE t1;
|
||||
connection slave;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Testing character data types
|
||||
@@ -175,7 +162,6 @@ INSERT INTO t1 VALUES('Welcome','Hello, World');
|
||||
SELECT * FROM t1;
|
||||
a b
|
||||
Welcome Hello, World
|
||||
connection master;
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL
|
||||
CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT';
|
||||
SHOW CREATE TABLE t1;
|
||||
@@ -188,7 +174,6 @@ SELECT * FROM t1;
|
||||
a b
|
||||
Welcome Hello, World
|
||||
DROP TABLE t1;
|
||||
connection slave;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Testing temporal data types
|
||||
@@ -200,10 +185,10 @@ t1 CREATE TABLE `t1` (
|
||||
`a` date DEFAULT NULL,
|
||||
`b` datetime DEFAULT NULL,
|
||||
`c` time DEFAULT NULL,
|
||||
`d` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
|
||||
`d` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`e` year(4) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
INSERT IGNORE INTO t1 VALUES('2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23');
|
||||
INSERT INTO t1 VALUES('2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23');
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'a' at row 1
|
||||
Note 1265 Data truncated for column 'c' at row 1
|
||||
@@ -211,7 +196,6 @@ Warning 1265 Data truncated for column 'e' at row 1
|
||||
SELECT * FROM t1;
|
||||
a b c d e
|
||||
2003-05-27 2003-05-27 10:45:23 10:45:23 2003-05-27 10:45:23 2003
|
||||
connection master;
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL
|
||||
CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT';
|
||||
SHOW CREATE TABLE t1;
|
||||
@@ -220,18 +204,15 @@ t1 CREATE TABLE `t1` (
|
||||
`a` date DEFAULT NULL,
|
||||
`b` datetime DEFAULT NULL,
|
||||
`c` time DEFAULT NULL,
|
||||
`d` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
|
||||
`d` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`e` year(4) DEFAULT NULL
|
||||
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT' `TABLE_TYPE`='MYSQL'
|
||||
SELECT * FROM t1;
|
||||
a b c d e
|
||||
2003-05-27 2003-05-27 10:45:23 10:45:23 2003-05-27 10:45:23 2003
|
||||
DROP TABLE t1;
|
||||
connection slave;
|
||||
DROP TABLE t1;
|
||||
connection master;
|
||||
DROP TABLE IF EXISTS connect.t1;
|
||||
DROP DATABASE IF EXISTS connect;
|
||||
connection slave;
|
||||
DROP TABLE IF EXISTS connect.t1;
|
||||
DROP DATABASE IF EXISTS connect;
|
||||
|
@@ -72,11 +72,11 @@ TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtr'
|
||||
CATFUNC=Columns;
|
||||
SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name;
|
||||
Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks
|
||||
MTR T1 A 3 DECIMAL 38 40 0 10 1
|
||||
MTR T1 B 6 NUMBER 38 40 NULL NULL 1
|
||||
MTR T2 A 12 VARCHAR2 64 64 NULL NULL 1
|
||||
MTR V1 A 3 DECIMAL 38 40 0 10 1
|
||||
MTR V1 B 6 NUMBER 38 40 NULL NULL 1
|
||||
NULL MTR T1 A 3 DECIMAL 38 40 0 10 1 NULL
|
||||
NULL MTR T1 B 6 NUMBER 38 40 NULL NULL 1 NULL
|
||||
NULL MTR T2 A 12 VARCHAR2 64 64 NULL NULL 1 NULL
|
||||
NULL MTR V1 A 3 DECIMAL 38 40 0 10 1 NULL
|
||||
NULL MTR V1 B 6 NUMBER 38 40 NULL NULL 1 NULL
|
||||
DROP TABLE t1;
|
||||
# All columns in all schemas (limited with WHERE)
|
||||
CREATE TABLE t1 ENGINE=CONNECT
|
||||
@@ -84,18 +84,18 @@ TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtr'
|
||||
CATFUNC=Columns TABNAME='%.%';
|
||||
SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name;
|
||||
Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks
|
||||
MTR T1 A 3 DECIMAL 38 40 0 10 1
|
||||
MTR T1 B 6 NUMBER 38 40 NULL NULL 1
|
||||
MTR T2 A 12 VARCHAR2 64 64 NULL NULL 1
|
||||
MTR V1 A 3 DECIMAL 38 40 0 10 1
|
||||
MTR V1 B 6 NUMBER 38 40 NULL NULL 1
|
||||
NULL MTR T1 A 3 DECIMAL 38 40 0 10 1 NULL
|
||||
NULL MTR T1 B 6 NUMBER 38 40 NULL NULL 1 NULL
|
||||
NULL MTR T2 A 12 VARCHAR2 64 64 NULL NULL 1 NULL
|
||||
NULL MTR V1 A 3 DECIMAL 38 40 0 10 1 NULL
|
||||
NULL MTR V1 B 6 NUMBER 38 40 NULL NULL 1 NULL
|
||||
DROP TABLE t1;
|
||||
# All tables "T1" in all schemas (limited with WHERE)
|
||||
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtr' CATFUNC=Columns TABNAME='%.T1';
|
||||
SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name;
|
||||
Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks
|
||||
MTR T1 A 3 DECIMAL 38 40 0 10 1
|
||||
MTR T1 B 6 NUMBER 38 40 NULL NULL 1
|
||||
NULL MTR T1 A 3 DECIMAL 38 40 0 10 1 NULL
|
||||
NULL MTR T1 B 6 NUMBER 38 40 NULL NULL 1 NULL
|
||||
DROP TABLE t1;
|
||||
# Table "T1" in the schema "MTR"
|
||||
CREATE TABLE t1 ENGINE=CONNECT
|
||||
@@ -103,8 +103,8 @@ TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtr'
|
||||
CATFUNC=Columns TABNAME='MTR.T1';
|
||||
SELECT * FROM t1 ORDER BY Table_Schema, Table_Name;
|
||||
Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks
|
||||
MTR T1 A 3 DECIMAL 38 40 0 10 1
|
||||
MTR T1 B 6 NUMBER 38 40 NULL NULL 1
|
||||
NULL MTR T1 A 3 DECIMAL 38 40 0 10 1 NULL
|
||||
NULL MTR T1 B 6 NUMBER 38 40 NULL NULL 1 NULL
|
||||
DROP TABLE t1;
|
||||
# All tables "T1" in all schemas (filtered with WHERE)
|
||||
CREATE TABLE t1 ENGINE=CONNECT
|
||||
@@ -112,8 +112,8 @@ TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtr'
|
||||
CATFUNC=Columns TABNAME='%.T1';
|
||||
SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name;
|
||||
Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks
|
||||
MTR T1 A 3 DECIMAL 38 40 0 10 1
|
||||
MTR T1 B 6 NUMBER 38 40 NULL NULL 1
|
||||
NULL MTR T1 A 3 DECIMAL 38 40 0 10 1 NULL
|
||||
NULL MTR T1 B 6 NUMBER 38 40 NULL NULL 1 NULL
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Checking tables
|
||||
|
@@ -27,13 +27,13 @@ UPDATE t1 SET e = d;
|
||||
SELECT * FROM t1;
|
||||
a b c d e
|
||||
255 65535 4294967295 18446744073709551615 18446744073709551615
|
||||
UPDATE IGNORE t1 SET c = d;
|
||||
UPDATE t1 SET c = d;
|
||||
Warnings:
|
||||
Warning 1264 Out of range value for column 'c' at row 1
|
||||
SELECT * FROM t1;
|
||||
a b c d e
|
||||
255 65535 4294967295 18446744073709551615 18446744073709551615
|
||||
UPDATE IGNORE t1 SET c = e;
|
||||
UPDATE t1 SET c = e;
|
||||
Warnings:
|
||||
Warning 1264 Out of range value for column 'c' at row 1
|
||||
SELECT * FROM t1;
|
||||
|
@@ -1,4 +1,3 @@
|
||||
SET sql_mode = 'NO_ENGINE_SUBSTITUTION';
|
||||
CREATE TABLE employee
|
||||
(
|
||||
serialno CHAR(5) NOT NULL,
|
||||
@@ -1626,4 +1625,3 @@ serialno name sex title manager department secretary salary
|
||||
#
|
||||
DROP PROCEDURE test.tst_up;
|
||||
DROP TABLE employee;
|
||||
SET sql_mode = DEFAULT;
|
||||
|
@@ -1,29 +0,0 @@
|
||||
create table t1 (
|
||||
#linenum int(6) not null default 0 special=rowid,
|
||||
name char(12) not null,
|
||||
city char(11) not null,
|
||||
birth date not null date_format='DD/MM/YYYY',
|
||||
hired date not null date_format='DD/MM/YYYY' flag=36,
|
||||
agehired int(3) as (floor(datediff(hired,birth)/365.25))
|
||||
)
|
||||
engine=CONNECT table_type=FIX file_name='boys.txt' mapped=YES lrecl=47;
|
||||
select * from t1;
|
||||
name city birth hired agehired
|
||||
John Boston 1986-01-25 2010-06-02 24
|
||||
Henry Boston 1987-06-07 2008-04-01 20
|
||||
George San Jose 1981-08-10 2010-06-02 28
|
||||
Sam Chicago 1979-11-22 2007-10-10 27
|
||||
James Dallas 1992-05-13 2009-12-14 17
|
||||
Bill Boston 1986-09-11 2008-02-10 21
|
||||
drop table t1;
|
||||
create table t1 (
|
||||
#linenum int(6) not null default 0 special=rowid,
|
||||
name char(12) not null,
|
||||
city char(11) not null,
|
||||
birth date not null date_format='DD/MM/YYYY',
|
||||
hired date not null date_format='DD/MM/YYYY' flag=36,
|
||||
agehired int(3) as (floor(datediff(hired,birth)/365.25)),
|
||||
index (agehired)
|
||||
)
|
||||
engine=CONNECT table_type=FIX file_name='boys.txt' mapped=YES lrecl=47;
|
||||
ERROR 42000: Table handler doesn't support NULL in given index. Please change column 'agehired' to be NOT NULL or use another handler
|
@@ -6,8 +6,6 @@ Warning 1105 No file name. Table will use t1.xml
|
||||
CREATE USER user@localhost;
|
||||
GRANT ALL PRIVILEGES ON *.* TO user@localhost;
|
||||
REVOKE FILE ON *.* FROM user@localhost;
|
||||
connect user,localhost,user,,;
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -36,13 +34,11 @@ DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2,rownode=row' FILE_NAME='t1.EXT';
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmlsup=libxml2,rownode=row' FILE_NAME='t1.EXT';
|
||||
INSERT INTO t1 VALUES (10);
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -65,12 +61,10 @@ ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
# Testing a VIEW created with FILE privileges but accessed with no FILE
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT * FROM t1;
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
@@ -82,7 +76,6 @@ UPDATE v1 SET a=123;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
DELETE FROM v1;
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
SELECT user();
|
||||
user()
|
||||
root@localhost
|
||||
@@ -92,15 +85,12 @@ CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML OPTION_LIST='xmls
|
||||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.xml
|
||||
INSERT INTO t1 VALUES (10);
|
||||
connection user;
|
||||
SELECT user();
|
||||
user()
|
||||
user@localhost
|
||||
ALTER TABLE t1 FILE_NAME='t1.EXT';
|
||||
ERROR 28000: Access denied for user 'user'@'localhost' (using password: NO)
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
disconnect user;
|
||||
DROP USER user@localhost;
|
||||
#
|
||||
# End of grant.inc
|
||||
|
@@ -19,7 +19,7 @@ SELECT * FROM t1 WHERE i = 5;
|
||||
i
|
||||
5
|
||||
ALTER TABLE t1 DROP INDEX i;
|
||||
ERROR 42000: Can't DROP INDEX `i`; check that it exists
|
||||
ERROR 42000: Can't DROP 'i'; check that column/key exists
|
||||
DROP INDEX i ON t1;
|
||||
ERROR 42000: Can't DROP INDEX `i`; check that it exists
|
||||
ERROR 42000: Can't DROP 'i'; check that column/key exists
|
||||
DROP TABLE t1;
|
||||
|
@@ -171,16 +171,16 @@ DROP TABLE t1,t2,t3,t4;
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
_id INT(2) NOT NULL,
|
||||
name_first CHAR(9) NOT NULL FIELD_FORMAT='name:first',
|
||||
name_aka CHAR(4) DEFAULT NULL FIELD_FORMAT='name:aka',
|
||||
name_last CHAR(10) NOT NULL FIELD_FORMAT='name:last',
|
||||
name_first CHAR(9) NOT NULL FIELD_FORMAT='$.name.first',
|
||||
name_aka CHAR(4) DEFAULT NULL FIELD_FORMAT='$.name.aka',
|
||||
name_last CHAR(10) NOT NULL FIELD_FORMAT='$.name.last',
|
||||
title CHAR(12) DEFAULT NULL,
|
||||
birth CHAR(20) DEFAULT NULL,
|
||||
death CHAR(20) DEFAULT NULL,
|
||||
contribs CHAR(7) NOT NULL FIELD_FORMAT='contribs:',
|
||||
awards_award CHAR(42) DEFAULT NULL FIELD_FORMAT='awards::award',
|
||||
awards_year CHAR(4) DEFAULT NULL FIELD_FORMAT='awards::year',
|
||||
awards_by CHAR(38) DEFAULT NULL FIELD_FORMAT='awards::by'
|
||||
contribs CHAR(7) NOT NULL FIELD_FORMAT='$.contribs',
|
||||
awards_award CHAR(42) DEFAULT NULL FIELD_FORMAT='$.awards.award',
|
||||
awards_year CHAR(4) DEFAULT NULL FIELD_FORMAT='$.awards.year',
|
||||
awards_by CHAR(38) DEFAULT NULL FIELD_FORMAT='$.awards.by'
|
||||
) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='bios.zip' OPTION_LIST='ENTRY=bios.json,LOAD=bios.json' ZIPPED=YES;
|
||||
SELECT * FROM t1;
|
||||
_id name_first name_aka name_last title birth death contribs awards_award awards_year awards_by
|
||||
@@ -211,16 +211,16 @@ _id name_first name_aka name_last title birth death contribs awards_award awards
|
||||
10 Martin NULL Odersky NULL NULL NULL Scala NULL NULL NULL
|
||||
CREATE TABLE t3 (
|
||||
_id INT(2) NOT NULL,
|
||||
firstname CHAR(9) NOT NULL FIELD_FORMAT='name:first',
|
||||
aka CHAR(4) DEFAULT NULL FIELD_FORMAT='name:aka',
|
||||
lastname CHAR(10) NOT NULL FIELD_FORMAT='name:last',
|
||||
firstname CHAR(9) NOT NULL FIELD_FORMAT='$.name.first',
|
||||
aka CHAR(4) DEFAULT NULL FIELD_FORMAT='$.name.aka',
|
||||
lastname CHAR(10) NOT NULL FIELD_FORMAT='$.name.last',
|
||||
title CHAR(12) DEFAULT NULL,
|
||||
birth date DEFAULT NULL date_format="YYYY-DD-MM'T'hh:mm:ss'Z'",
|
||||
death date DEFAULT NULL date_format="YYYY-DD-MM'T'hh:mm:ss'Z'",
|
||||
contribs CHAR(64) NOT NULL FIELD_FORMAT='contribs:[", "]',
|
||||
award CHAR(42) DEFAULT NULL FIELD_FORMAT='awards:[x]:award',
|
||||
year CHAR(4) DEFAULT NULL FIELD_FORMAT='awards:[x]:year',
|
||||
`by` CHAR(38) DEFAULT NULL FIELD_FORMAT='awards:[x]:by'
|
||||
contribs CHAR(64) NOT NULL FIELD_FORMAT='$.contribs.[", "]',
|
||||
award CHAR(42) DEFAULT NULL FIELD_FORMAT='$.awards[*].award',
|
||||
year CHAR(4) DEFAULT NULL FIELD_FORMAT='$.awards[*].year',
|
||||
`by` CHAR(38) DEFAULT NULL FIELD_FORMAT='$.awards[*].by'
|
||||
) ENGINE=CONNECT TABLE_TYPE='json' FILE_NAME='bios.zip' ZIPPED=YES;
|
||||
SELECT * FROM t3 WHERE _id = 1;
|
||||
_id firstname aka lastname title birth death contribs award year by
|
||||
|
@@ -26,7 +26,6 @@ SELECT fname, ftype, size FROM t1 ORDER BY fname, ftype, size;
|
||||
|
||||
# TODO: add a better error message
|
||||
--error ER_GET_ERRMSG
|
||||
SET STATEMENT sql_mode = '' FOR
|
||||
INSERT INTO t1 VALUES ('','','','');
|
||||
|
||||
DROP TABLE t1;
|
||||
|
@@ -24,11 +24,9 @@ SET GLOBAL time_zone='+1:00';
|
||||
# Bad user name
|
||||
# Suppress "mysql_real_connect failed:" (printed in _DEBUG build)
|
||||
--replace_result $SLAVE_MYPORT SLAVE_PORT "mysql_real_connect failed: " ""
|
||||
--error ER_UNKNOWN_ERROR
|
||||
eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC
|
||||
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=unknown';
|
||||
--error ER_GET_ERRMSG
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
# Bad database name
|
||||
--replace_result $SLAVE_MYPORT SLAVE_PORT "mysql_real_connect failed: " ""
|
||||
|
@@ -35,15 +35,15 @@ DROP TABLE t1;
|
||||
CREATE TABLE t1
|
||||
(
|
||||
ISBN CHAR(15),
|
||||
Language CHAR(2) FIELD_FORMAT='LANG',
|
||||
Subject CHAR(32) FIELD_FORMAT='SUBJECT',
|
||||
Authors INT(2) FIELD_FORMAT='AUTHOR:[#]',
|
||||
Title CHAR(32) FIELD_FORMAT='TITLE',
|
||||
Translation CHAR(32) FIELD_FORMAT='TRANSLATION',
|
||||
Translator CHAR(80) FIELD_FORMAT='TRANSLATOR',
|
||||
Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME',
|
||||
Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE',
|
||||
Year int(4) FIELD_FORMAT='DATEPUB'
|
||||
Language CHAR(2) FIELD_FORMAT='$.LANG',
|
||||
Subject CHAR(32) FIELD_FORMAT='$.SUBJECT',
|
||||
Authors INT(2) FIELD_FORMAT='$.AUTHOR[#]',
|
||||
Title CHAR(32) FIELD_FORMAT='$.TITLE',
|
||||
Translation CHAR(32) FIELD_FORMAT='$.TRANSLATION',
|
||||
Translator CHAR(80) FIELD_FORMAT='$.TRANSLATOR',
|
||||
Publisher CHAR(20) FIELD_FORMAT='$.PUBLISHER.NAME',
|
||||
Location CHAR(16) FIELD_FORMAT='$.PUBLISHER.PLACE',
|
||||
Year int(4) FIELD_FORMAT='$.DATEPUB'
|
||||
)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json';
|
||||
SELECT * FROM t1;
|
||||
@@ -55,16 +55,16 @@ DROP TABLE t1;
|
||||
CREATE TABLE t1
|
||||
(
|
||||
ISBN CHAR(15),
|
||||
Language CHAR(2) FIELD_FORMAT='LANG',
|
||||
Subject CHAR(32) FIELD_FORMAT='SUBJECT',
|
||||
AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[" and "]:FIRSTNAME',
|
||||
AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[" and "]:LASTNAME',
|
||||
Title CHAR(32) FIELD_FORMAT='TITLE',
|
||||
Translation CHAR(32) FIELD_FORMAT='TRANSLATION',
|
||||
Translator CHAR(80) FIELD_FORMAT='TRANSLATOR',
|
||||
Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME',
|
||||
Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE',
|
||||
Year int(4) FIELD_FORMAT='DATEPUB'
|
||||
Language CHAR(2) FIELD_FORMAT='$.LANG',
|
||||
Subject CHAR(32) FIELD_FORMAT='$.SUBJECT',
|
||||
AuthorFN CHAR(128) FIELD_FORMAT='$.AUTHOR[" and "].FIRSTNAME',
|
||||
AuthorLN CHAR(128) FIELD_FORMAT='$.AUTHOR[" and "].LASTNAME',
|
||||
Title CHAR(32) FIELD_FORMAT='$.TITLE',
|
||||
Translation CHAR(32) FIELD_FORMAT='$.TRANSLATION',
|
||||
Translator CHAR(80) FIELD_FORMAT='$.TRANSLATOR',
|
||||
Publisher CHAR(20) FIELD_FORMAT='$.PUBLISHER.NAME',
|
||||
Location CHAR(16) FIELD_FORMAT='$.PUBLISHER.PLACE',
|
||||
Year int(4) FIELD_FORMAT='$.DATEPUB'
|
||||
)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json';
|
||||
SELECT * FROM t1;
|
||||
@@ -76,16 +76,16 @@ DROP TABLE t1;
|
||||
CREATE TABLE t1
|
||||
(
|
||||
ISBN CHAR(15),
|
||||
Language CHAR(2) FIELD_FORMAT='LANG',
|
||||
Subject CHAR(32) FIELD_FORMAT='SUBJECT',
|
||||
AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:FIRSTNAME',
|
||||
AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:LASTNAME',
|
||||
Title CHAR(32) FIELD_FORMAT='TITLE',
|
||||
Translation CHAR(32) FIELD_FORMAT='TRANSLATION',
|
||||
Translator CHAR(80) FIELD_FORMAT='TRANSLATOR',
|
||||
Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME',
|
||||
Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE',
|
||||
Year int(4) FIELD_FORMAT='DATEPUB'
|
||||
Language CHAR(2) FIELD_FORMAT='$.LANG',
|
||||
Subject CHAR(32) FIELD_FORMAT='$.SUBJECT',
|
||||
AuthorFN CHAR(128) FIELD_FORMAT='$.AUTHOR[*].FIRSTNAME',
|
||||
AuthorLN CHAR(128) FIELD_FORMAT='$.AUTHOR[*].LASTNAME',
|
||||
Title CHAR(32) FIELD_FORMAT='$.TITLE',
|
||||
Translation CHAR(32) FIELD_FORMAT='$.TRANSLATION',
|
||||
Translator CHAR(80) FIELD_FORMAT='$.TRANSLATOR',
|
||||
Publisher CHAR(20) FIELD_FORMAT='$.PUBLISHER.NAME',
|
||||
Location CHAR(16) FIELD_FORMAT='$.PUBLISHER.PLACE',
|
||||
Year int(4) FIELD_FORMAT='$.DATEPUB'
|
||||
)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json';
|
||||
SELECT * FROM t1;
|
||||
@@ -98,7 +98,7 @@ SELECT * FROM t1 WHERE ISBN = '9782212090819';
|
||||
CREATE TABLE t2 (
|
||||
FIRSTNAME CHAR(32),
|
||||
LASTNAME CHAR(32))
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json' OPTION_LIST='Object=[1]:AUTHOR';
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json' OPTION_LIST='Object=$[1].AUTHOR';
|
||||
SELECT * FROM t2;
|
||||
INSERT INTO t2 VALUES('Charles','Dickens');
|
||||
SELECT * FROM t1;
|
||||
@@ -122,17 +122,17 @@ DROP TABLE t1;
|
||||
CREATE TABLE t1
|
||||
(
|
||||
ISBN CHAR(15) NOT NULL,
|
||||
Language CHAR(2) FIELD_FORMAT='LANG',
|
||||
Subject CHAR(32) FIELD_FORMAT='SUBJECT',
|
||||
AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:FIRSTNAME',
|
||||
AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:LASTNAME',
|
||||
Title CHAR(32) FIELD_FORMAT='TITLE',
|
||||
Translation CHAR(32) FIELD_FORMAT='TRANSLATED:PREFIX',
|
||||
TranslatorFN CHAR(80) FIELD_FORMAT='TRANSLATED:TRANSLATOR:FIRSTNAME',
|
||||
TranslatorLN CHAR(80) FIELD_FORMAT='TRANSLATED:TRANSLATOR:LASTNAME',
|
||||
Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME',
|
||||
Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE',
|
||||
Year int(4) FIELD_FORMAT='DATEPUB',
|
||||
Language CHAR(2) FIELD_FORMAT='$.LANG',
|
||||
Subject CHAR(32) FIELD_FORMAT='$.SUBJECT',
|
||||
AuthorFN CHAR(128) FIELD_FORMAT='$.AUTHOR[*].FIRSTNAME',
|
||||
AuthorLN CHAR(128) FIELD_FORMAT='$.AUTHOR[*].LASTNAME',
|
||||
Title CHAR(32) FIELD_FORMAT='$.TITLE',
|
||||
Translation CHAR(32) FIELD_FORMAT='$.TRANSLATED.PREFIX',
|
||||
TranslatorFN CHAR(80) FIELD_FORMAT='$.TRANSLATED.TRANSLATOR.FIRSTNAME',
|
||||
TranslatorLN CHAR(80) FIELD_FORMAT='$.TRANSLATED.TRANSLATOR.LASTNAME',
|
||||
Publisher CHAR(20) FIELD_FORMAT='$.PUBLISHER.NAME',
|
||||
Location CHAR(16) FIELD_FORMAT='$.PUBLISHER.PLACE',
|
||||
Year int(4) FIELD_FORMAT='$.DATEPUB',
|
||||
INDEX IX(ISBN)
|
||||
)
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='bib0.json' LRECL=320 OPTION_LIST='Pretty=0';
|
||||
@@ -148,9 +148,9 @@ DROP TABLE t1;
|
||||
--echo #
|
||||
CREATE TABLE t1 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2) FIELD_FORMAT='WEEK:[X]:NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='WEEK::EXPENSE:["+"]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK::EXPENSE:[+]:AMOUNT')
|
||||
WEEK INT(2) FIELD_FORMAT='$.WEEK[*].NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.WEEK[].EXPENSE["+"].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[].EXPENSE[+].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json';
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
@@ -160,9 +160,9 @@ DROP TABLE t1;
|
||||
--echo #
|
||||
CREATE TABLE t1 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2) FIELD_FORMAT='WEEK:[X]:NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:AMOUNT')
|
||||
WEEK INT(2) FIELD_FORMAT='$.WEEK[*].NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.WEEK[*].EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[*].EXPENSE[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json';
|
||||
#--error ER_GET_ERRMSG
|
||||
SELECT * FROM t1;
|
||||
@@ -173,14 +173,14 @@ DROP TABLE t1;
|
||||
--echo #
|
||||
CREATE TABLE t1 (
|
||||
WHO CHAR(12) NOT NULL,
|
||||
WEEKS CHAR(12) NOT NULL FIELD_FORMAT='WEEK:[", "]:NUMBER',
|
||||
SUMS CHAR(64) NOT NULL FIELD_FORMAT='WEEK:["+"]:EXPENSE:[+]:AMOUNT',
|
||||
SUM DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[+]:EXPENSE:[+]:AMOUNT',
|
||||
AVGS CHAR(64) NOT NULL FIELD_FORMAT='WEEK:["+"]:EXPENSE:[!]:AMOUNT',
|
||||
SUMAVG DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[+]:EXPENSE:[!]:AMOUNT',
|
||||
AVGSUM DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[!]:EXPENSE:[+]:AMOUNT',
|
||||
AVGAVG DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[!]:EXPENSE:[!]:AMOUNT',
|
||||
AVERAGE DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[!]:EXPENSE:[X]:AMOUNT')
|
||||
WEEKS CHAR(12) NOT NULL FIELD_FORMAT='$.WEEK[", "].NUMBER',
|
||||
SUMS CHAR(64) NOT NULL FIELD_FORMAT='$.WEEK["+"].EXPENSE[+].AMOUNT',
|
||||
SUM DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[+].EXPENSE[+].AMOUNT',
|
||||
AVGS CHAR(64) NOT NULL FIELD_FORMAT='$.WEEK["+"].EXPENSE[!].AMOUNT',
|
||||
SUMAVG DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[+].EXPENSE[!].AMOUNT',
|
||||
AVGSUM DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[!].EXPENSE[+].AMOUNT',
|
||||
AVGAVG DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[!].EXPENSE[!].AMOUNT',
|
||||
AVERAGE DOUBLE(8,2) NOT NULL FIELD_FORMAT='$.WEEK[!].EXPENSE[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json';
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
@@ -190,25 +190,25 @@ DROP TABLE t1;
|
||||
--echo #
|
||||
CREATE TABLE t2 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2) FIELD_FORMAT='WEEK:[0]:NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='WEEK:[0]:EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[0]:EXPENSE:[X]:AMOUNT')
|
||||
WEEK INT(2) FIELD_FORMAT='$.WEEK[0].NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.WEEK[0].EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[0].EXPENSE[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json';
|
||||
SELECT * FROM t2;
|
||||
|
||||
CREATE TABLE t3 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2) FIELD_FORMAT='WEEK:[1]:NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:AMOUNT')
|
||||
WEEK INT(2) FIELD_FORMAT='$.WEEK[1].NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.WEEK[1].EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[1].EXPENSE[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json';
|
||||
SELECT * FROM t3;
|
||||
|
||||
CREATE TABLE t4 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2) FIELD_FORMAT='WEEK:[2]:NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:AMOUNT')
|
||||
WEEK INT(2) FIELD_FORMAT='$.WEEK[2].NUMBER',
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.WEEK[2].EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.WEEK[2].EXPENSE[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json';
|
||||
SELECT * FROM t4;
|
||||
|
||||
@@ -230,24 +230,24 @@ DROP TABLE t1, t2, t3, t4;
|
||||
CREATE TABLE t2 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2),
|
||||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT')
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp3.json';
|
||||
SELECT * FROM t2;
|
||||
|
||||
CREATE TABLE t3 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2),
|
||||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT')
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp4.json';
|
||||
SELECT * FROM t3;
|
||||
|
||||
CREATE TABLE t4 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2),
|
||||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT')
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp5.json';
|
||||
SELECT * FROM t4;
|
||||
|
||||
@@ -257,8 +257,8 @@ SELECT * FROM t4;
|
||||
CREATE TABLE t1 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2),
|
||||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT')
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp*.json' MULTIPLE=1;
|
||||
SELECT * FROM t1 ORDER BY WHO, WEEK, WHAT, AMOUNT;
|
||||
DROP TABLE t1;
|
||||
@@ -269,8 +269,8 @@ DROP TABLE t1;
|
||||
CREATE TABLE t1 (
|
||||
WHO CHAR(12),
|
||||
WEEK INT(2),
|
||||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT')
|
||||
WHAT CHAR(32) FIELD_FORMAT='$.EXPENSE[*].WHAT',
|
||||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='$.EXPENSE.[*].AMOUNT')
|
||||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp%s.json';
|
||||
ALTER TABLE t1
|
||||
PARTITION BY LIST COLUMNS(WEEK) (
|
||||
|
@@ -9,11 +9,11 @@ if (!$HA_CONNECT_SO) {
|
||||
--skip Needs a dynamically built ha_connect.so
|
||||
}
|
||||
|
||||
--eval CREATE FUNCTION json_array RETURNS STRING SONAME '$HA_CONNECT_SO';
|
||||
--eval CREATE FUNCTION json_make_array RETURNS STRING SONAME '$HA_CONNECT_SO';
|
||||
--eval CREATE FUNCTION json_array_add RETURNS STRING SONAME '$HA_CONNECT_SO';
|
||||
--eval CREATE FUNCTION json_array_add_values RETURNS STRING SONAME '$HA_CONNECT_SO';
|
||||
--eval CREATE FUNCTION json_array_delete RETURNS STRING SONAME '$HA_CONNECT_SO';
|
||||
--eval CREATE FUNCTION json_object RETURNS STRING SONAME '$HA_CONNECT_SO';
|
||||
--eval CREATE FUNCTION json_make_object RETURNS STRING SONAME '$HA_CONNECT_SO';
|
||||
--eval CREATE FUNCTION json_object_nonull RETURNS STRING SONAME '$HA_CONNECT_SO';
|
||||
--eval CREATE FUNCTION json_object_key RETURNS STRING SONAME '$HA_CONNECT_SO';
|
||||
--eval CREATE FUNCTION json_object_add RETURNS STRING SONAME '$HA_CONNECT_SO';
|
||||
|
@@ -22,13 +22,13 @@ SELECT JsonValue(FALSE);
|
||||
SELECT JsonValue();
|
||||
SELECT JsonValue('[11, 22, 33]' json_) FROM t1;
|
||||
#
|
||||
SELECT Json_Array();
|
||||
SELECT Json_Array(56, 3.1416, 'My name is "Foo"', NULL);
|
||||
SELECT Json_Array(Json_Array(56, 3.1416, 'foo'), TRUE);
|
||||
SELECT Json_Make_Array();
|
||||
SELECT Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL);
|
||||
SELECT Json_Make_Array(Json_Make_Array(56, 3.1416, 'foo'), TRUE);
|
||||
#
|
||||
--error ER_CANT_INITIALIZE_UDF
|
||||
SELECT Json_Array_Add(Json_Array(56, 3.1416, 'foo', NULL)) Array;
|
||||
SELECT Json_Array_Add(Json_Array(56, 3.1416, 'foo', NULL), 'One more') Array;
|
||||
SELECT Json_Array_Add(Json_Make_Array(56, 3.1416, 'foo', NULL)) Array;
|
||||
SELECT Json_Array_Add(Json_Make_Array(56, 3.1416, 'foo', NULL), 'One more') Array;
|
||||
--error ER_CANT_INITIALIZE_UDF
|
||||
SELECT Json_Array_Add(JsonValue('one value'), 'One more');
|
||||
--error ER_CANT_INITIALIZE_UDF
|
||||
@@ -39,38 +39,38 @@ SELECT Json_Array_Add(5 json_, 'One more');
|
||||
SELECT Json_Array_Add('[5,3,8,7,9]' json_, 4, 0);
|
||||
SELECT Json_Array_Add('[5,3,8,7,9]' json_, 4, 2) Array;
|
||||
SELECT Json_Array_Add('[5,3,8,7,9]' json_, 4, 9);
|
||||
SELECT Json_Array_Add(Json_Array(1, 2, Json_Array(11, 22)), '[2]', 33, 1);
|
||||
SELECT Json_Array_Add(Json_Array(1, 2, Json_Array(11, 22)), 33, '[2]', 1);
|
||||
SELECT Json_Array_Add(Json_Array(1, 2, Json_Array(11, 22)), 33, 1, '[2]');
|
||||
SELECT Json_Array_Add(Json_Make_Array(1, 2, Json_Make_Array(11, 22)), '[2]', 33, 1);
|
||||
SELECT Json_Array_Add(Json_Make_Array(1, 2, Json_Make_Array(11, 22)), 33, '[2]', 1);
|
||||
SELECT Json_Array_Add(Json_Make_Array(1, 2, Json_Make_Array(11, 22)), 33, 1, '[2]');
|
||||
#
|
||||
SELECT Json_Array_Add_Values(Json_Array(56, 3.1416, 'machin', NULL), 'One more', 'Two more') Array;
|
||||
SELECT Json_Array_Add_Values(Json_Array(56, 3.1416, 'machin'), 'One more', 'Two more') Array FROM t1;
|
||||
SELECT Json_Array_Add_Values(Json_Array(56, 3.1416, 'machin'), n) Array FROM t1;
|
||||
SELECT Json_Array_Add_Values(Json_Array(n, 3.1416, 'machin'), n) Array FROM t1;
|
||||
SELECT Json_Array_Add_Values(Json_Make_Array(56, 3.1416, 'machin', NULL), 'One more', 'Two more') Array;
|
||||
SELECT Json_Array_Add_Values(Json_Make_Array(56, 3.1416, 'machin'), 'One more', 'Two more') Array FROM t1;
|
||||
SELECT Json_Array_Add_Values(Json_Make_Array(56, 3.1416, 'machin'), n) Array FROM t1;
|
||||
SELECT Json_Array_Add_Values(Json_Make_Array(n, 3.1416, 'machin'), n) Array FROM t1;
|
||||
SELECT Json_Array_Add_Values('[56]', 3.1416, 'machin') Array;
|
||||
#
|
||||
SELECT Json_Array_Delete(Json_Array(56, 3.1416, 'My name is "Foo"', NULL), 0);
|
||||
SELECT Json_Array_Delete(Json_Object(56, 3.1416, 'My name is Foo', NULL), 2);
|
||||
SELECT Json_Array_Delete(Json_Array(56, 3.1416, 'My name is "Foo"', NULL), '2');
|
||||
SELECT Json_Array_Delete(json_array(56, 3.1416, 'My name is "Foo"', NULL), '2', 2);
|
||||
SELECT Json_Array_Delete(Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL), 0);
|
||||
SELECT Json_Array_Delete(Json_Make_Object(56, 3.1416, 'My name is Foo', NULL), 2);
|
||||
SELECT Json_Array_Delete(Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL), '2');
|
||||
SELECT Json_Array_Delete(Json_Make_Array(56, 3.1416, 'My name is "Foo"', NULL), '2', 2);
|
||||
#
|
||||
SELECT Json_Object(56, 3.1416, 'foo', NULL);
|
||||
SELECT Json_Object(56 qty, 3.1416 price, 'foo' truc, NULL garanty);
|
||||
SELECT Json_Object();
|
||||
SELECT Json_Object(Json_Array(56, 3.1416, 'foo'), NULL);
|
||||
SELECT Json_Array(Json_Object(56 "qty", 3.1416 "price", 'foo') ,NULL);
|
||||
SELECT Json_Make_Object(56, 3.1416, 'foo', NULL);
|
||||
SELECT Json_Make_Object(56 qty, 3.1416 price, 'foo' truc, NULL garanty);
|
||||
SELECT Json_Make_Object();
|
||||
SELECT Json_Make_Object(Json_Make_Array(56, 3.1416, 'foo'), NULL);
|
||||
SELECT Json_Make_Array(Json_Make_Object(56 "qty", 3.1416 "price", 'foo') ,NULL);
|
||||
SELECT Json_Object_Key('qty', 56, 'price', 3.1416, 'truc', 'machin', 'garanty', NULL);
|
||||
--error ER_CANT_INITIALIZE_UDF
|
||||
SELECT Json_Object_Key('qty', 56, 'price', 3.1416, 'truc', 'machin', 'garanty');
|
||||
#
|
||||
SELECT Json_Object_Add(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'blue' color);
|
||||
SELECT Json_Object_Add(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 45.99 price);
|
||||
SELECT Json_Object_Add(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'blue' color);
|
||||
SELECT Json_Object_Add(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 45.99 price);
|
||||
SELECT Json_Object_Add(Json_File('notexist.json'), 'cheese' item, '[1]', 1);
|
||||
#
|
||||
SELECT Json_Object_Delete(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'truc');
|
||||
SELECT Json_Object_Delete(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'chose');
|
||||
SELECT Json_Object_Delete(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'truc');
|
||||
SELECT Json_Object_Delete(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'chose');
|
||||
#
|
||||
SELECT Json_Object_List(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty)) "Key List";
|
||||
SELECT Json_Object_List(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty)) "Key List";
|
||||
SELECT Json_Object_List('{"qty":56, "price":3.1416, "truc":"machin", "garanty":null}') "Key List";
|
||||
|
||||
--echo #
|
||||
@@ -89,8 +89,8 @@ CREATE TABLE t2
|
||||
DATEPUB int(4)
|
||||
) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json';
|
||||
|
||||
SELECT Json_Array(AUTHOR, TITLE, DATEPUB) FROM t2;
|
||||
SELECT Json_Object(AUTHOR, TITLE, DATEPUB) FROM t2;
|
||||
SELECT Json_Make_Array(AUTHOR, TITLE, DATEPUB) FROM t2;
|
||||
SELECT Json_Make_Object(AUTHOR, TITLE, DATEPUB) FROM t2;
|
||||
--error ER_CANT_INITIALIZE_UDF
|
||||
SELECT Json_Array_Grp(TITLE, DATEPUB) FROM t2;
|
||||
SELECT Json_Array_Grp(TITLE) FROM t2;
|
||||
@@ -106,19 +106,19 @@ CREATE TABLE t3 (
|
||||
SALARY DOUBLE(8,2) NOT NULL FLAG=52
|
||||
) ENGINE=CONNECT TABLE_TYPE=FIX BLOCK_SIZE=8 FILE_NAME='employee.dat' ENDING=1;
|
||||
|
||||
SELECT Json_Object(SERIALNO, NAME, TITLE, SALARY) FROM t3 WHERE NAME = 'MERCHANT';
|
||||
SELECT Json_Make_Object(SERIALNO, NAME, TITLE, SALARY) FROM t3 WHERE NAME = 'MERCHANT';
|
||||
SELECT DEPARTMENT, Json_Array_Grp(NAME) FROM t3 GROUP BY DEPARTMENT;
|
||||
#SET connect_json_grp_size=30; Deprecated
|
||||
SELECT JsonSet_Grp_Size(30);
|
||||
SELECT Json_Object(title, Json_Array_Grp(name) `json_names`) from t3 GROUP BY title;
|
||||
SELECT Json_Array(DEPARTMENT, Json_Array_Grp(NAME)) FROM t3 GROUP BY DEPARTMENT;
|
||||
SELECT Json_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES) FROM t3 GROUP BY DEPARTMENT;
|
||||
SELECT Json_Object(DEPARTMENT, Json_Array_Grp(Json_Object(SERIALNO, NAME, TITLE, SALARY)) json_EMPLOYES) FROM t3 GROUP BY DEPARTMENT;
|
||||
SELECT Json_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Object(SERIALNO, NAME, SALARY)) json_EMPLOYES) FROM t3 GROUP BY DEPARTMENT, TITLE;
|
||||
SELECT Json_Make_Object(title, Json_Array_Grp(name) `json_names`) from t3 GROUP BY title;
|
||||
SELECT Json_Make_Array(DEPARTMENT, Json_Array_Grp(NAME)) FROM t3 GROUP BY DEPARTMENT;
|
||||
SELECT Json_Make_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES) FROM t3 GROUP BY DEPARTMENT;
|
||||
SELECT Json_Make_Object(DEPARTMENT, Json_Array_Grp(Json_Make_Object(SERIALNO, NAME, TITLE, SALARY)) json_EMPLOYES) FROM t3 GROUP BY DEPARTMENT;
|
||||
SELECT Json_Make_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Make_Object(SERIALNO, NAME, SALARY)) json_EMPLOYES) FROM t3 GROUP BY DEPARTMENT, TITLE;
|
||||
--error ER_CANT_INITIALIZE_UDF
|
||||
SELECT Json_Object_Grp(SALARY) FROM t3;
|
||||
SELECT Json_Object_Grp(NAME, SALARY) FROM t3;
|
||||
SELECT Json_Object(DEPARTMENT, Json_Object_Grp(NAME, SALARY) "Json_SALARIES") FROM t3 GROUP BY DEPARTMENT;
|
||||
SELECT Json_Make_Object(DEPARTMENT, Json_Object_Grp(NAME, SALARY) "Json_SALARIES") FROM t3 GROUP BY DEPARTMENT;
|
||||
SELECT Json_Array_Grp(NAME) FROM t3;
|
||||
#
|
||||
SELECT Json_Object_Key(name, title) FROM t3 WHERE DEPARTMENT = 318;
|
||||
@@ -131,59 +131,59 @@ SELECT JsonGet_String(Json_Array_Grp(name),'[#]') FROM t3;
|
||||
SELECT JsonGet_String(Json_Array_Grp(name),'[","]') FROM t3;
|
||||
SELECT JsonGet_String(Json_Array_Grp(name),'[>]') FROM t3;
|
||||
SET @j1 = '[45,28,36,45,89]';
|
||||
SELECT JsonGet_String(@j1,'[1]');
|
||||
SELECT JsonGet_String(@j1 json_,'[3]');
|
||||
SELECT JsonGet_String(Json_Array(45,28,36,45,89),'[3]');
|
||||
SELECT JsonGet_String(Json_Array(45,28,36,45,89),'["+"]') "list",'=' as "egal",JsonGet_String(Json_Array(45,28,36,45,89),'[+]') "sum";
|
||||
SELECT JsonGet_String(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:[0]');
|
||||
SELECT JsonGet_String(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:*');
|
||||
SELECT JsonGet_String(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'truc');
|
||||
SELECT JsonGet_String(@j1,'1');
|
||||
SELECT JsonGet_String(@j1 json_,'3');
|
||||
SELECT JsonGet_String(Json_Make_Array(45,28,36,45,89),'3');
|
||||
SELECT JsonGet_String(Json_Make_Array(45,28,36,45,89),'["+"]') "list",'=' as "egal",JsonGet_String(Json_Make_Array(45,28,36,45,89),'[+]') "sum";
|
||||
SELECT JsonGet_String(Json_Make_Array(Json_Make_Array(45,28),Json_Make_Array(36,45,89)),'1.0');
|
||||
SELECT JsonGet_String(Json_Make_Array(Json_Make_Array(45,28),Json_Make_Array(36,45,89)),'1.*');
|
||||
SELECT JsonGet_String(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'truc');
|
||||
SET @j2 = '{"qty":56,"price":3.141600,"truc":"machin","garanty":null}';
|
||||
SELECT JsonGet_String(@j2 json_,'truc');
|
||||
SELECT JsonGet_String(@j2,'truc');
|
||||
SELECT JsonGet_String(@j2,'chose');
|
||||
SELECT JsonGet_String(NULL json_, NULL);
|
||||
SELECT department, JsonGet_String(Json_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries:[+]') Sumsal FROM t3 GROUP BY department;
|
||||
SELECT department, JsonGet_String(Json_Make_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries.[+]') Sumsal FROM t3 GROUP BY department;
|
||||
#
|
||||
SELECT JsonGet_Int(@j1, '[4]');
|
||||
SELECT JsonGet_Int(@j1, '4');
|
||||
SELECT JsonGet_Int(@j1, '[#]');
|
||||
SELECT JsonGet_Int(@j1, '[+]');
|
||||
SELECT JsonGet_Int(@j1 json_, '[3]');
|
||||
SELECT JsonGet_Int(Json_Array(45,28,36,45,89), '[3]');
|
||||
SELECT JsonGet_Int(Json_Array(45,28,36,45,89), '["+"]');
|
||||
SELECT JsonGet_Int(Json_Array(45,28,36,45,89), '[+]');
|
||||
SELECT JsonGet_Int(Json_Array(json_array(45,28), json_array(36,45,89)), '[1]:[0]');
|
||||
SELECT JsonGet_Int(Json_Array(json_array(45,28), json_array(36,45,89)), '[0]:[1]');
|
||||
SELECT JsonGet_Int(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'qty');
|
||||
SELECT JsonGet_Int(@j1 json_, '3');
|
||||
SELECT JsonGet_Int(Json_Make_Array(45,28,36,45,89), '3');
|
||||
SELECT JsonGet_Int(Json_Make_Array(45,28,36,45,89), '["+"]');
|
||||
SELECT JsonGet_Int(Json_Make_Array(45,28,36,45,89), '[+]');
|
||||
SELECT JsonGet_Int(Json_Make_Array(Json_Make_Array(45,28), Json_Make_Array(36,45,89)), '1.0');
|
||||
SELECT JsonGet_Int(Json_Make_Array(Json_Make_Array(45,28), Json_Make_Array(36,45,89)), '0.1');
|
||||
SELECT JsonGet_Int(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'qty');
|
||||
SELECT JsonGet_Int(@j2 json_, 'price');
|
||||
SELECT JsonGet_Int(@j2, 'qty');
|
||||
SELECT JsonGet_Int('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}', 'chose');
|
||||
SELECT JsonGet_Int(JsonGet_String(Json_Array(Json_Array(45,28),Json_Array(36,45,89)), '[1]:*'), '[+]') sum;
|
||||
SELECT department, JsonGet_Int(Json_Object(department, Json_Array_Grp(salary) "Json_salaries"), 'salaries:[+]') Sumsal FROM t3 GROUP BY department;
|
||||
SELECT JsonGet_Int(JsonGet_String(Json_Make_Array(Json_Make_Array(45,28),Json_Make_Array(36,45,89)), '1.*'), '[+]') sum;
|
||||
SELECT department, JsonGet_Int(Json_Make_Object(department, Json_Array_Grp(salary) "Json_salaries"), 'salaries.[+]') Sumsal FROM t3 GROUP BY department;
|
||||
#
|
||||
SELECT JsonGet_Real(@j1, '[2]');
|
||||
SELECT JsonGet_Real(@j1 json_, '[3]', 2);
|
||||
SELECT JsonGet_Real(Json_Array(45,28,36,45,89), '[3]');
|
||||
SELECT JsonGet_Real(Json_Array(45,28,36,45,89), '["+"]');
|
||||
SELECT JsonGet_Real(Json_Array(45,28,36,45,89), '[+]');
|
||||
SELECT JsonGet_Real(Json_Array(45,28,36,45,89), '[!]');
|
||||
SELECT JsonGet_Real(Json_Array(json_array(45,28), json_array(36,45,89)), '[1]:[0]');
|
||||
SELECT JsonGet_Real(Json_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'price');
|
||||
SELECT JsonGet_Real(@j1, '2');
|
||||
SELECT JsonGet_Real(@j1 json_, '3', 2);
|
||||
SELECT JsonGet_Real(Json_Make_Array(45,28,36,45,89), '3');
|
||||
SELECT JsonGet_Real(Json_Make_Array(45,28,36,45,89), '["+"]');
|
||||
SELECT JsonGet_Real(Json_Make_Array(45,28,36,45,89), '[+]');
|
||||
SELECT JsonGet_Real(Json_Make_Array(45,28,36,45,89), '[!]');
|
||||
SELECT JsonGet_Real(Json_Make_Array(Json_Make_Array(45,28), Json_Make_Array(36,45,89)), '1.0');
|
||||
SELECT JsonGet_Real(Json_Make_Object(56 qty, 3.1416 price, 'machin' truc, NULL garanty), 'price');
|
||||
SELECT JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}' json_, 'qty');
|
||||
SELECT JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}', 'price');
|
||||
SELECT JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}', 'price', 4);
|
||||
SELECT JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}', 'chose');
|
||||
SELECT department, JsonGet_Real(Json_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries:[+]') Sumsal FROM t3 GROUP BY department;
|
||||
SELECT department, JsonGet_Real(Json_Make_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries.[+]') Sumsal FROM t3 GROUP BY department;
|
||||
|
||||
--echo #
|
||||
--echo # Documentation examples
|
||||
--echo #
|
||||
SELECT
|
||||
JsonGet_Int(Json_Array(45,28,36,45,89), '[4]') "Rank",
|
||||
JsonGet_Int(Json_Array(45,28,36,45,89), '[#]') "Number",
|
||||
JsonGet_String(Json_Array(45,28,36,45,89), '[","]') "Concat",
|
||||
JsonGet_Int(Json_Array(45,28,36,45,89), '[+]') "Sum",
|
||||
JsonGet_Real(Json_Array(45,28,36,45,89), '[!]', 2) "Avg";
|
||||
JsonGet_Int(Json_Make_Array(45,28,36,45,89), '4') "Rank",
|
||||
JsonGet_Int(Json_Make_Array(45,28,36,45,89), '[#]') "Number",
|
||||
JsonGet_String(Json_Make_Array(45,28,36,45,89), '[","]') "Concat",
|
||||
JsonGet_Int(Json_Make_Array(45,28,36,45,89), '[+]') "Sum",
|
||||
JsonGet_Real(Json_Make_Array(45,28,36,45,89), '[!]', 2) "Avg";
|
||||
SELECT
|
||||
JsonGet_String('{"qty":7,"price":29.50,"garanty":null}', 'price') "String",
|
||||
JsonGet_Int('{"qty":7,"price":29.50,"garanty":null}', 'price') "Int",
|
||||
@@ -193,10 +193,10 @@ SELECT JsonGet_Real('{"qty":7,"price":29.50,"garanty":null}', 'price', 3) "Real"
|
||||
--echo #
|
||||
--echo # Testing Locate
|
||||
--echo #
|
||||
SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'machin');
|
||||
SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),56);
|
||||
SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),3.1416);
|
||||
SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'chose');
|
||||
SELECT JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'machin');
|
||||
SELECT JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),56);
|
||||
SELECT JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),3.1416);
|
||||
SELECT JsonLocate(Json_Make_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'chose');
|
||||
SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, 'Jack') Path;
|
||||
SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, 'jack' ci) Path;
|
||||
SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, '{"FN":"Jack", "LN":"London"}' json_) Path;
|
||||
@@ -220,7 +220,7 @@ SELECT Json_Locate_All('[[45,28],[[36,45],89]]','45') "All paths";
|
||||
SELECT Json_Locate_All('[[45,28],[[36,45],89]]','[36,45]' json_);
|
||||
SELECT JsonGet_Int(Json_Locate_All('[[45,28],[[36,45],89]]',45), '[#]') "Nb of occurs";
|
||||
SELECT Json_Locate_All('[[45,28],[[36,45],89]]',45,2);
|
||||
SELECT JsonGet_String(Json_Locate_All('[45,28,36,45,89]',45),'[0]');
|
||||
SELECT JsonGet_String(Json_Locate_All('[45,28,36,45,89]',45),'0');
|
||||
SELECT JsonLocate(Json_File('test/biblio.json'), 'Knab');
|
||||
SELECT Json_Locate_All('test/biblio.json' jfile_, 'Knab');
|
||||
|
||||
@@ -237,21 +237,21 @@ SELECT Jfile_Make(Jbin_File('test/fx.json'), 0);
|
||||
SELECT Json_File('test/fx.json', 1);
|
||||
SELECT Json_File('test/fx.json', 2);
|
||||
SELECT Json_File('test/fx.json', 0);
|
||||
SELECT Json_File('test/fx.json', '[0]');
|
||||
SELECT Json_File('test/fx.json', '0');
|
||||
SELECT Json_File('test/fx.json', '[?]');
|
||||
SELECT JsonGet_String(Json_File('test/fx.json'), '[1]:*');
|
||||
SELECT JsonGet_String(Json_File('test/fx.json'), '[1]');
|
||||
SELECT JsonGet_Int(Json_File('test/fx.json'), '[1]:mileage') AS Mileage;
|
||||
SELECT JsonGet_Real(Json_File('test/fx.json'), '[0]:price', 2) AS Price;
|
||||
SELECT Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 'ratings');
|
||||
SELECT Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 1, 'ratings');
|
||||
SELECT Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 'ratings', 1);
|
||||
SELECT Json_Array_Add(Json_File('test/fx.json', '[2]:ratings'), 6, 0);
|
||||
SELECT Json_Array_Delete(Json_File('test/fx.json', '[2]'), 'ratings', 1);
|
||||
SELECT Json_Object_Add(Json_File('test/fx.json', '[2]'), 'france' origin);
|
||||
SELECT Json_Object_Add(Json_File('test/fx.json', '[2]'), 70 H, 'size');
|
||||
SELECT Json_Object_Add(Json_File('test/fx.json', '[3]'), 70 H, 'size');
|
||||
SELECT Json_Object_List(Json_File('test/fx.json', '[3]:size'));
|
||||
SELECT JsonGet_String(Json_File('test/fx.json'), '1.*');
|
||||
SELECT JsonGet_String(Json_File('test/fx.json'), '1');
|
||||
SELECT JsonGet_Int(Json_File('test/fx.json'), '1.mileage') AS Mileage;
|
||||
SELECT JsonGet_Real(Json_File('test/fx.json'), '0.price', 2) AS Price;
|
||||
SELECT Json_Array_Add(Json_File('test/fx.json', '2'), 6, 'ratings');
|
||||
SELECT Json_Array_Add(Json_File('test/fx.json', '2'), 6, 1, 'ratings');
|
||||
SELECT Json_Array_Add(Json_File('test/fx.json', '2'), 6, 'ratings', 1);
|
||||
SELECT Json_Array_Add(Json_File('test/fx.json', '2.ratings'), 6, 0);
|
||||
SELECT Json_Array_Delete(Json_File('test/fx.json', '2'), 'ratings', 1);
|
||||
SELECT Json_Object_Add(Json_File('test/fx.json', '2'), 'france' origin);
|
||||
SELECT Json_Object_Add(Json_File('test/fx.json', '2'), 70 H, 'size');
|
||||
SELECT Json_Object_Add(Json_File('test/fx.json', '3'), 70 H, 'size');
|
||||
SELECT Json_Object_List(Json_File('test/fx.json', '3.size'));
|
||||
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
@@ -264,3 +264,5 @@ DROP TABLE t3;
|
||||
--remove_file $MYSQLD_DATADIR/test/biblio.json
|
||||
--remove_file $MYSQLD_DATADIR/test/employee.dat
|
||||
--remove_file $MYSQLD_DATADIR/test/fx.json
|
||||
|
||||
|
||||
|
@@ -1,10 +1,10 @@
|
||||
--disable_query_log
|
||||
|
||||
DROP FUNCTION json_array;
|
||||
DROP FUNCTION json_make_array;
|
||||
DROP FUNCTION json_array_add;
|
||||
DROP FUNCTION json_array_add_values;
|
||||
DROP FUNCTION json_array_delete;
|
||||
DROP FUNCTION json_object;
|
||||
DROP FUNCTION json_make_object;
|
||||
DROP FUNCTION json_object_nonull;
|
||||
DROP FUNCTION json_object_key;
|
||||
DROP FUNCTION json_object_add;
|
||||
|
@@ -16,7 +16,7 @@ SELECT Json_Array_Add(Jbin_Array(56, 3.1416, 'My name is "Foo"', NULL), JsonGet_
|
||||
SELECT Json_Array_Delete(Jbin_Array_Add_Values(Jbin_Array(56, 3.1416, 'My name is "Foo"', NULL), "One more", 2), 4);
|
||||
SELECT Json_Array_Delete(Jbin_Array(56, Jbin_Array(3.1416, 'My name is "Foo"'), NULL), '[1]', 1);
|
||||
SELECT Json_Array_Delete(Jbin_Array(56, Jbin_Array(3.1416, 'My name is "Foo"'), TRUE), 1, '[1]');
|
||||
SELECT Json_Array(1, TRUE, 0, FALSE);
|
||||
SELECT Json_Make_Array(1, TRUE, 0, FALSE);
|
||||
SELECT Json_Serialize(Jbin_Array(TRUE, FALSE));
|
||||
#
|
||||
SELECT Json_Object_Key('qty', 56, 'price', 3.1416, 'truc', 'machin', 'garanty', NULL);
|
||||
@@ -35,65 +35,65 @@ SELECT Json_Serialize(Jbin_File('gloss.json'));
|
||||
SELECT JsonLocate(Jbin_File('gloss.json'),'XML');
|
||||
#
|
||||
SELECT Json_Object_Key('first', 'foo', 'second', Jbin_Array('a', 33));
|
||||
SELECT Json_Get_Item(Json_Array('a','b','c'), '[1]');
|
||||
SELECT Json_Get_Item(Json_Object('foo' AS "first", Json_Array('a', 33) AS "json_second"), 'second') AS "item";
|
||||
SELECT Json_Get_Item(Jbin_Object('foo' first, Jbin_Array('a', 33) jbin_second), 'second:*') item;
|
||||
SELECT Json_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv');
|
||||
SELECT Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv'));
|
||||
SELECT Json_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv:*');
|
||||
SELECT JsonGet_String(Json_File('gloss.json'),'glossary:GlossDiv:GlossList:GlossEntry:GlossDef:GlossSeeAlso') lang;
|
||||
SELECT Json_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv:GlossList:GlossEntry:GlossDef:GlossSeeAlso') "See also";
|
||||
SELECT Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'glossary:GlossDiv:GlossList:GlossEntry:GlossDef:GlossSeeAlso')) "See also";
|
||||
SELECT JsonGet_String(Json_Get_Item(Json_File('gloss.json'),'glossary:GlossDiv:GlossList:GlossEntry:GlossDef:GlossSeeAlso'),'[0]') lang;
|
||||
SELECT Json_Get_Item(Json_Make_Array('a','b','c'), '$[1]');
|
||||
SELECT Json_Get_Item(Json_Make_Object('foo' AS "first", Json_Make_Array('a', 33) AS "json_second"), '$.second') AS "item";
|
||||
SELECT Json_Get_Item(Jbin_Object('foo' first, Jbin_Array('a', 33) jbin_second), '$.second') item;
|
||||
SELECT Json_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv');
|
||||
SELECT Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv'));
|
||||
SELECT Json_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv');
|
||||
SELECT JsonGet_String(Json_File('gloss.json'),'$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso') lang;
|
||||
SELECT Json_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso') "See also";
|
||||
SELECT Json_Serialize(Jbin_Get_Item(Jbin_File('gloss.json'),'$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso')) "See also";
|
||||
SELECT JsonGet_String(Json_Get_Item(Json_File('gloss.json'),'$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso'),'$[0]') lang;
|
||||
|
||||
--echo #
|
||||
--echo # Test Item Get/Set/Insert/Update UDF's
|
||||
--echo #
|
||||
SELECT Json_Get_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '[]');
|
||||
SELECT Json_Get_Item(Jbin_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '[1]');
|
||||
SELECT Json_Get_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), '[1]');
|
||||
SELECT Json_Get_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '$[]');
|
||||
SELECT Json_Get_Item(Jbin_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), '$[1]');
|
||||
SELECT Json_Get_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), '$[1]');
|
||||
#
|
||||
SELECT Json_Set_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)));
|
||||
SELECT Json_Set_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)));
|
||||
--error ER_CANT_INITIALIZE_UDF
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 'foo');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 7, '[1]');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 7, '[1]');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Json_Array(7, 8, 9), '[1]');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '[2]');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '[2]:*');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 3.1416, 'foo');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 'toto', '[1]:[2]');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 300, '[2]:nxt:total:[]');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[]', 300, '[2]:nxt:total:[]');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '[1]', 5, '[2]:cinq', 10, '[1]:[]');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 44, '[2]:quatre');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), '$.foo');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 7, '$[1]');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 7, '$[1]');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Json_Make_Array(7, 8, 9), '$[1]');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '$[2]');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '$[2].*');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 3.1416, '$.foo');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 'toto', '$[1][2]');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 300, '$[2].nxt.total[]');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][]', 300, '$[2].nxt.total[]');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), Jbin_Array(7, 8, 9), '$[1]', 5, '$[2].cinq', 10, '$[1][]');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 44, '$[2].quatre');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, 'truc');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '');
|
||||
SELECT Json_Set_Item(Jbin_Array(1, 2, Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '*');
|
||||
SELECT Json_Serialize(Jbin_Set_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq'));
|
||||
SELECT Json_Serialize(Jbin_Set_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq'));
|
||||
#
|
||||
SELECT Json_Insert_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq');
|
||||
SELECT Json_Update_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq');
|
||||
SELECT Json_Insert_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[]', 44, '[2]:quatre');
|
||||
SELECT Json_Update_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[]', 44, '[2]:quatre');
|
||||
SELECT Json_Insert_Item(Json_Array(1, Json_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[1]', 300, '[2]:nxt:total:[]');
|
||||
SELECT Json_Update_Item(Json_Array(1, Json_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[2]:cinq', 10, '[1]:[1]', 300, '[2]:nxt:total:[]');
|
||||
SELECT Json_Insert_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[]');
|
||||
SELECT Json_Update_Item(Json_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '[]');
|
||||
SELECT Json_Insert_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq');
|
||||
SELECT Json_Update_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq');
|
||||
SELECT Json_Insert_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][]', 44, '$[2].quatre');
|
||||
SELECT Json_Update_Item(Jbin_Array(1, Jbin_Array(7, 8, 9), Jbin_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][]', 44, '$[2].quatre');
|
||||
SELECT Json_Insert_Item(Json_Make_Array(1, Json_Make_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][1]', 300, '$[2].nxt.total[]');
|
||||
SELECT Json_Update_Item(Json_Make_Array(1, Json_Make_Array(7, 8, 9), Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[2].cinq', 10, '$[1][1]', 300, '$[2].nxt.total[]');
|
||||
SELECT Json_Insert_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[]');
|
||||
SELECT Json_Update_Item(Json_Make_Array(1, 2, Json_Object_Key('trois', 3, 'quatre', 4)), 5, '$[]');
|
||||
|
||||
--echo #
|
||||
--echo # Test merging items UDF's
|
||||
--echo #
|
||||
SELECT Json_Item_Merge(Jbin_Array('a','b','c'), Jbin_Array('d','e','f'));
|
||||
SELECT Json_Item_Merge(Json_Array('a','b','c'), Json_Array('d','e','f')) AS "Result";
|
||||
SELECT Json_Item_Merge(Json_Make_Array('a','b','c'), Json_Make_Array('d','e','f')) AS "Result";
|
||||
SELECT Json_Array_Add(Jbin_Item_Merge(Jbin_Array('a','b','c'), Jbin_Array('d','e','f')), 'and', 3);
|
||||
SELECT Json_Item_Merge(Jbin_Object(1 "a",2 "b",3 "c"), Jbin_Object(4 "d",5 "e",6 "f"));
|
||||
SELECT Json_Item_Merge(Jbin_Object(1 "a",2 "b",2 "c"), Jbin_Array('d','e','f'));
|
||||
SELECT Json_Object_Add(Jbin_Item_Merge(Jbin_Object(1 "a",2 "b",3 "c"), Jbin_Object(4 "d",5 "e",6 "f")), 'x' AS "and");
|
||||
SELECT Json_Item_Merge(Jbin_Object(1 "a",2 "b",3 "c"), Jbin_Object(4 "a",5 "e",6 "f"));
|
||||
--error ER_CANT_INITIALIZE_UDF
|
||||
SELECT Json_Item_Merge('foo', Json_Array('d','e','f'));
|
||||
SELECT Json_Item_Merge('foo', Json_Make_Array('d','e','f'));
|
||||
|
||||
--echo #
|
||||
--echo # Test making file UDF's
|
||||
@@ -116,14 +116,14 @@ SELECT Json_Array_Add(Jbin_File('bt1.json'), 'd');
|
||||
SELECT Json_File('bt1.json', 2);
|
||||
--echo # Back to the original file
|
||||
SELECT Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json');
|
||||
SELECT Json_Object(Jbin_Array_Add(Jbin_Array('a','b','c'), 'd') "Jbin_foo") AS "Result";
|
||||
SELECT Json_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd')) AS "Result";
|
||||
SELECT Json_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd') "Jbin_bt1") AS "Result";
|
||||
SELECT Json_Make_Object(Jbin_Array_Add(Jbin_Array('a','b','c'), 'd') "Jbin_foo") AS "Result";
|
||||
SELECT Json_Make_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd')) AS "Result";
|
||||
SELECT Json_Make_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd') "Jbin_bt1") AS "Result";
|
||||
--echo # This does modify the file
|
||||
SELECT Json_Object(Json_Array_Add(Jbin_File('bt1.json'), 'd') "Jfile_bt1") AS "Result";
|
||||
SELECT Json_Make_Object(Json_Array_Add(Jbin_File('bt1.json'), 'd') "Jfile_bt1") AS "Result";
|
||||
SELECT Json_File('bt1.json');
|
||||
SELECT Json_File(Json_Array_Delete(Jbin_File('bt1.json'), 3), 2);
|
||||
SELECT Json_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd') "Jbin_bt1", n "t1") AS "Result" from t1;
|
||||
SELECT Json_Make_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd') "Jbin_bt1", n "t1") AS "Result" from t1;
|
||||
SELECT Json_File(Json_Array_Add(Jbin_Array_Add(Jbin_File('bt1.json'), 'd'), 'e')) AS "Result";
|
||||
SELECT Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json');
|
||||
SELECT Json_File(Json_Array_Add(Jbin_Array_Add(Jbin_File('bt1.json'), 'd'), 'e')) AS "Result" from t1;
|
||||
@@ -140,11 +140,11 @@ SELECT Json_File(Jbin_Item_Merge(Jbin_File('bt1.json'), Jbin_Array('d','e','f'))
|
||||
SELECT Json_File(Json_Item_Merge(Jbin_File('bt1.json'), Jbin_Array('d','e','f')));
|
||||
SELECT Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json');
|
||||
--echo # Test DELETE from file
|
||||
SELECT Json_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 1)) AS "Result";
|
||||
SELECT Json_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 2) "Jbin_bt1") AS "Result";
|
||||
SELECT Json_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 0) "Jbin_bt1", n "t1") AS "Result" from t1;
|
||||
SELECT Json_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 3 - n) "Jbin_bt1") AS "Result" from t1;
|
||||
SELECT Json_Object(Json_Array_Delete(Jbin_File('bt1.json'), 3 - n) "Jbin_bt1") AS "Result" from t1;
|
||||
SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 1)) AS "Result";
|
||||
SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 2) "Jbin_bt1") AS "Result";
|
||||
SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 0) "Jbin_bt1", n "t1") AS "Result" from t1;
|
||||
SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 3 - n) "Jbin_bt1") AS "Result" from t1;
|
||||
SELECT Json_Make_Object(Json_Array_Delete(Jbin_File('bt1.json'), 3 - n) "Jbin_bt1") AS "Result" from t1;
|
||||
--echo # Show modified file
|
||||
SELECT Json_File('bt1.json');
|
||||
--echo # Object file
|
||||
@@ -153,11 +153,11 @@ SELECT Json_File('bt2.json', 0);
|
||||
SELECT Json_File('bt2.json');
|
||||
SELECT Json_Serialize(Jbin_Object_Add(Jbin_File('bt2.json'), 4 "d"));
|
||||
--echo # First query (file not modified)
|
||||
SELECT Json_Object(Jbin_Object_Add(Jbin_File('bt2.json'), 4 AS "d") AS "Jbin_new") AS "Result";
|
||||
SELECT Json_Make_Object(Jbin_Object_Add(Jbin_File('bt2.json'), 4 AS "d") AS "Jbin_new") AS "Result";
|
||||
--echo # First query (file modified)
|
||||
SELECT Json_Object(Json_Object_Add(Jbin_File('bt2.json'), 4 AS "d") AS "Jfile_new") AS "Result";
|
||||
SELECT Json_Make_Object(Json_Object_Add(Jbin_File('bt2.json'), 4 AS "d") AS "Jfile_new") AS "Result";
|
||||
SELECT Jfile_Make(Jbin_Object(1 "a", 2 "b", 3 "c"), 'bt2.json', 0);
|
||||
SELECT Json_Object(Jbin_Object_Add(Jbin_File('bt2.json'), 4 "d") "Jbin_new", n "t1") AS "Result" from t1;
|
||||
SELECT Json_Make_Object(Jbin_Object_Add(Jbin_File('bt2.json'), 4 "d") "Jbin_new", n "t1") AS "Result" from t1;
|
||||
SELECT Json_File(Json_Object_Add(Jbin_Object_Add(Jbin_File('bt2.json'), 4 "d"), 5 "e")) AS "Result";
|
||||
SELECT Json_Object_Add(Jbin_Object_Add(Jbin_File('bt2.json'), 4 "d"), 5 "e") AS "Result" from t1;
|
||||
SELECT Json_Object_Add(Jbin_Object_Add(Jbin_File('bt2.json'), 4 "d"), n "n") AS "Result" from t1;
|
||||
@@ -167,13 +167,13 @@ SELECT Json_File('bt2.json');
|
||||
SELECT Jfile_Make(Jbin_Object(1 "a", 2 "b", 3 "c"), 'bt2.json', 0);
|
||||
SELECT Json_Serialize(Jbin_Item_Merge(Jbin_File('bt2.json'), Jbin_Object(4 "d",5 "e",6 "f"))) AS "Result";
|
||||
SELECT Json_File(Json_Item_Merge(Jbin_File('bt2.json'), Jbin_Object(4 "d",5 "e",6 "f"))) AS "Result";
|
||||
SELECT Json_Item_Merge(Json_Object(1 "a", 2 "b", 3 "c"), Json_Object(4 "d",5 "b",6 "f")) AS "Result";
|
||||
SELECT Json_Item_Merge(Json_Make_Object(1 "a", 2 "b", 3 "c"), Json_Make_Object(4 "d",5 "b",6 "f")) AS "Result";
|
||||
#
|
||||
SELECT Json_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'b')) AS "Result";
|
||||
SELECT Json_Object(Jbin_Object_Delete(Jbin_File('bt2.json'), 'c') "Jbin_bt1") AS "Result";
|
||||
SELECT Json_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'c') "Jbin_bt1") AS "Result";
|
||||
SELECT Json_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'c') "Jfile_bt1") AS "Result";
|
||||
SELECT Json_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'a') "Jbin_bt1", n "t1") AS "Result" from t1;
|
||||
SELECT Json_Make_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'b')) AS "Result";
|
||||
SELECT Json_Make_Object(Jbin_Object_Delete(Jbin_File('bt2.json'), 'c') "Jbin_bt1") AS "Result";
|
||||
SELECT Json_Make_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'c') "Jbin_bt1") AS "Result";
|
||||
SELECT Json_Make_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'c') "Jfile_bt1") AS "Result";
|
||||
SELECT Json_Make_Object(Json_Object_Delete(Jbin_File('bt2.json'), 'a') "Jbin_bt1", n "t1") AS "Result" from t1;
|
||||
#
|
||||
SELECT Json_Serialize(Jbin_Object_List(Jbin_File('bt2.json'))) "Key list";
|
||||
|
||||
@@ -181,9 +181,9 @@ SELECT Json_Serialize(Jbin_Object_List(Jbin_File('bt2.json'))) "Key list";
|
||||
# Test documentation examples
|
||||
#
|
||||
SELECT Jfile_Make('{"a":1, "b":[44, 55]}' json_, 'bt3.json', 0);
|
||||
SELECT Json_Array_Add(Json_File('bt3.json', 'b'), 66);
|
||||
SELECT Json_Array_Add(Json_File('bt3.json'), 66, 'b');
|
||||
SELECT Json_Array_Add(Jbin_File('bt3.json', 'b'), 66);
|
||||
SELECT Json_Array_Add(Json_File('bt3.json', '$.b'), 66);
|
||||
SELECT Json_Array_Add(Json_File('bt3.json'), 66, '$.b');
|
||||
SELECT Json_Array_Add(Jbin_File('bt3.json', '$.b'), 66);
|
||||
SELECT Json_File('bt3.json', 3);
|
||||
SELECT Jfile_Make('{"a":1, "b":[44, 55]}' json_, 'bt3.json', 0);
|
||||
#
|
||||
@@ -193,11 +193,11 @@ CREATE TABLE t2 (
|
||||
ENGINE= MYISAM;
|
||||
INSERT INTO t2 VALUES(1,'bt3.json');
|
||||
--echo # In this table, the jfile_cols column just contains a file name
|
||||
UPDATE t2 SET jfile_cols = Json_Array_Add(Jbin_File('bt3.json', 'b'), 66) WHERE n = 1;
|
||||
UPDATE t2 SET jfile_cols = Json_Array_Add(Jbin_File('bt3.json', '$.b'), 66) WHERE n = 1;
|
||||
SELECT JsonGet_String(jfile_cols, '*') FROM t2;
|
||||
UPDATE t2 SET jfile_cols = Json_Insert_Item(jfile_cols, 77, 'b:[]') WHERE n = 1;
|
||||
SELECT JsonGet_String(jfile_cols, 'b:*') FROM t2;
|
||||
UPDATE t2 SET jfile_cols = Json_Insert_Item(Jbin_Insert_Item(jfile_cols, 88, 'b:') , 99, 'b:') WHERE n = 1;
|
||||
UPDATE t2 SET jfile_cols = Json_Insert_Item(jfile_cols, 77, '$.b[]') WHERE n = 1;
|
||||
SELECT JsonGet_String(jfile_cols, '$.b.*') FROM t2;
|
||||
UPDATE t2 SET jfile_cols = Json_Insert_Item(Jbin_Insert_Item(jfile_cols, 88, '$.b[]') , 99, '$.b[]') WHERE n = 1;
|
||||
SELECT JsonGet_String(jfile_cols, '*') FROM t2;
|
||||
|
||||
DROP TABLE t1, t2;
|
||||
@@ -210,3 +210,4 @@ DROP TABLE t1, t2;
|
||||
--remove_file $MYSQLD_DATADIR/bt1.json
|
||||
--remove_file $MYSQLD_DATADIR/bt2.json
|
||||
--remove_file $MYSQLD_DATADIR/bt3.json
|
||||
|
||||
|
67
storage/connect/mysql-test/connect/t/mul_new.test
Normal file
67
storage/connect/mysql-test/connect/t/mul_new.test
Normal file
@@ -0,0 +1,67 @@
|
||||
let $MYSQLD_DATADIR= `select @@datadir`;
|
||||
--mkdir $MYSQLD_DATADIR/test/subdir/
|
||||
|
||||
--echo #
|
||||
--echo # Testing multiple 1
|
||||
--echo #
|
||||
CREATE TABLE t1 (
|
||||
Chiffre int(3) NOT NULL,
|
||||
Lettre char(16) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE=CSV FILE_NAME='num1.csv' LRECL=20 HEADER=1;
|
||||
INSERT INTO t1 VALUES(1,'One'),(2,'Two'),(3,'Three'),(4,'Four'),(5,'Five'),(6,'Six');
|
||||
SELECT * FROM t1;
|
||||
|
||||
CREATE TABLE t2 (
|
||||
Chiffre int(3) NOT NULL,
|
||||
Lettre char(16) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE='CSV' FILE_NAME='subdir/num2.csv' LRECL=20 HEADER=1;
|
||||
INSERT INTO t2 VALUES(7,'Seven'),(8,'Eight'),(9,'Nine'),(10,'Ten'),(11,'Eleven'),(12,'Twelve');
|
||||
SELECT * FROM t2;
|
||||
|
||||
CREATE TABLE t3 (
|
||||
Chiffre int(3) NOT NULL,
|
||||
Lettre char(16) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE='CSV' FILE_NAME='num3.csv' LRECL=20 HEADER=1;
|
||||
INSERT INTO t3 VALUES(13,'Thirteen'),(14,'Fourteen'),(15,'Fifteen'),(16,'Sixteen'),(17,'Seventeen'),(18,'Eighteen');
|
||||
SELECT * FROM t3;
|
||||
|
||||
CREATE TABLE t4 (
|
||||
Chiffre int(3) NOT NULL,
|
||||
Lettre char(16) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE='CSV' FILE_NAME='subdir/num4.csv' LRECL=20 HEADER=1;
|
||||
INSERT INTO t4 VALUES(19,'Nineteen'),(20,'Twenty'),(21,'Twenty one'),(22,'Twenty two'),(23,'Tenty three'),(24,'Twenty four');
|
||||
SELECT * FROM t4;
|
||||
|
||||
CREATE TABLE t5 (
|
||||
Chiffre int(3) NOT NULL,
|
||||
Lettre char(16) NOT NULL)
|
||||
ENGINE=CONNECT TABLE_TYPE='CSV' FILE_NAME='num5.csv' LRECL=20 HEADER=1;
|
||||
INSERT INTO t5 VALUES(25,'Twenty five'),(26,'Twenty six'),(27,'Twenty seven'),(28,'Twenty eight'),(29,'Tenty eight'),(30,'Thirty');
|
||||
SELECT * FROM t5;
|
||||
|
||||
CREATE TABLE t_all (
|
||||
Chiffre int(3) not null,
|
||||
Lettre char(16) not null)
|
||||
ENGINE=CONNECT TABLE_TYPE=CSV FILE_NAME='num?.csv' HEADER=1 LRECL=20 MULTIPLE=1;
|
||||
SELECT * FROM t_all ORDER BY Chiffre;
|
||||
|
||||
--echo #
|
||||
--echo # Testing multiple 3
|
||||
--echo #
|
||||
ALTER TABLE t_all MULTIPLE=3;
|
||||
SELECT * FROM t_all ORDER BY Chiffre;
|
||||
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
DROP TABLE t3;
|
||||
DROP TABLE t4;
|
||||
DROP TABLE t5;
|
||||
DROP TABLE t_all;
|
||||
|
||||
--remove_file $MYSQLD_DATADIR/test/subdir/num2.csv
|
||||
--remove_file $MYSQLD_DATADIR/test/subdir/num4.csv
|
||||
--rmdir $MYSQLD_DATADIR/test/subdir/
|
||||
--remove_file $MYSQLD_DATADIR/test/num1.csv
|
||||
--remove_file $MYSQLD_DATADIR/test/num3.csv
|
||||
--remove_file $MYSQLD_DATADIR/test/num5.csv
|
||||
|
@@ -306,7 +306,7 @@ DROP TABLE t1;
|
||||
|
||||
CREATE TABLE t1 (a date, b datetime, c time, d timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, e year);
|
||||
SHOW CREATE TABLE t1;
|
||||
INSERT IGNORE INTO t1 VALUES('2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23');
|
||||
INSERT INTO t1 VALUES('2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23');
|
||||
SELECT * FROM t1;
|
||||
|
||||
connection master;
|
||||
|
@@ -10,4 +10,4 @@ let $SECUREDIR= `select @@secure_file_priv`;
|
||||
INSERT INTO t1 VALUES (10);
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
--remove_file $MYSQL_TMP_DIR/t1.dbf
|
||||
--remove_file $SECUREDIR/t1.dbf
|
||||
|
@@ -13,9 +13,9 @@ INSERT INTO t1(a,b,c,d) VALUES(255,65535,4294967295,18446744073709551615);
|
||||
SELECT * FROM t1;
|
||||
UPDATE t1 SET e = d;
|
||||
SELECT * FROM t1;
|
||||
UPDATE IGNORE t1 SET c = d;
|
||||
UPDATE t1 SET c = d;
|
||||
SELECT * FROM t1;
|
||||
UPDATE IGNORE t1 SET c = e;
|
||||
UPDATE t1 SET c = e;
|
||||
SELECT * FROM t1;
|
||||
UPDATE t1 SET d = e;
|
||||
SELECT * FROM t1;
|
||||
|
@@ -1,8 +1,6 @@
|
||||
let $MYSQLD_DATADIR= `select @@datadir`;
|
||||
--copy_file $MTR_SUITE_DIR/std_data/employee.dat $MYSQLD_DATADIR/test/employee.dat
|
||||
|
||||
SET sql_mode = 'NO_ENGINE_SUBSTITUTION';
|
||||
|
||||
CREATE TABLE employee
|
||||
(
|
||||
serialno CHAR(5) NOT NULL,
|
||||
@@ -152,6 +150,4 @@ CALL test.tst_up();
|
||||
DROP PROCEDURE test.tst_up;
|
||||
DROP TABLE employee;
|
||||
|
||||
SET sql_mode = DEFAULT;
|
||||
|
||||
--remove_file $MYSQLD_DATADIR/test/employee.dat
|
||||
|
@@ -1,26 +0,0 @@
|
||||
let datadir= `select @@datadir`;
|
||||
--copy_file $MTR_SUITE_DIR/std_data/boys.txt $datadir/test/boys.txt
|
||||
|
||||
create table t1 (
|
||||
#linenum int(6) not null default 0 special=rowid,
|
||||
name char(12) not null,
|
||||
city char(11) not null,
|
||||
birth date not null date_format='DD/MM/YYYY',
|
||||
hired date not null date_format='DD/MM/YYYY' flag=36,
|
||||
agehired int(3) as (floor(datediff(hired,birth)/365.25))
|
||||
)
|
||||
engine=CONNECT table_type=FIX file_name='boys.txt' mapped=YES lrecl=47;
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
||||
--error ER_NULL_COLUMN_IN_INDEX
|
||||
create table t1 (
|
||||
#linenum int(6) not null default 0 special=rowid,
|
||||
name char(12) not null,
|
||||
city char(11) not null,
|
||||
birth date not null date_format='DD/MM/YYYY',
|
||||
hired date not null date_format='DD/MM/YYYY' flag=36,
|
||||
agehired int(3) as (floor(datediff(hired,birth)/365.25)),
|
||||
index (agehired)
|
||||
)
|
||||
engine=CONNECT table_type=FIX file_name='boys.txt' mapped=YES lrecl=47;
|
@@ -83,16 +83,16 @@ DROP TABLE t1,t2,t3,t4;
|
||||
--echo #
|
||||
CREATE TABLE t1 (
|
||||
_id INT(2) NOT NULL,
|
||||
name_first CHAR(9) NOT NULL FIELD_FORMAT='name:first',
|
||||
name_aka CHAR(4) DEFAULT NULL FIELD_FORMAT='name:aka',
|
||||
name_last CHAR(10) NOT NULL FIELD_FORMAT='name:last',
|
||||
name_first CHAR(9) NOT NULL FIELD_FORMAT='$.name.first',
|
||||
name_aka CHAR(4) DEFAULT NULL FIELD_FORMAT='$.name.aka',
|
||||
name_last CHAR(10) NOT NULL FIELD_FORMAT='$.name.last',
|
||||
title CHAR(12) DEFAULT NULL,
|
||||
birth CHAR(20) DEFAULT NULL,
|
||||
death CHAR(20) DEFAULT NULL,
|
||||
contribs CHAR(7) NOT NULL FIELD_FORMAT='contribs:',
|
||||
awards_award CHAR(42) DEFAULT NULL FIELD_FORMAT='awards::award',
|
||||
awards_year CHAR(4) DEFAULT NULL FIELD_FORMAT='awards::year',
|
||||
awards_by CHAR(38) DEFAULT NULL FIELD_FORMAT='awards::by'
|
||||
contribs CHAR(7) NOT NULL FIELD_FORMAT='$.contribs',
|
||||
awards_award CHAR(42) DEFAULT NULL FIELD_FORMAT='$.awards.award',
|
||||
awards_year CHAR(4) DEFAULT NULL FIELD_FORMAT='$.awards.year',
|
||||
awards_by CHAR(38) DEFAULT NULL FIELD_FORMAT='$.awards.by'
|
||||
) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='bios.zip' OPTION_LIST='ENTRY=bios.json,LOAD=bios.json' ZIPPED=YES;
|
||||
SELECT * FROM t1;
|
||||
|
||||
@@ -104,16 +104,16 @@ SELECT * FROM t2;
|
||||
|
||||
CREATE TABLE t3 (
|
||||
_id INT(2) NOT NULL,
|
||||
firstname CHAR(9) NOT NULL FIELD_FORMAT='name:first',
|
||||
aka CHAR(4) DEFAULT NULL FIELD_FORMAT='name:aka',
|
||||
lastname CHAR(10) NOT NULL FIELD_FORMAT='name:last',
|
||||
firstname CHAR(9) NOT NULL FIELD_FORMAT='$.name.first',
|
||||
aka CHAR(4) DEFAULT NULL FIELD_FORMAT='$.name.aka',
|
||||
lastname CHAR(10) NOT NULL FIELD_FORMAT='$.name.last',
|
||||
title CHAR(12) DEFAULT NULL,
|
||||
birth date DEFAULT NULL date_format="YYYY-DD-MM'T'hh:mm:ss'Z'",
|
||||
death date DEFAULT NULL date_format="YYYY-DD-MM'T'hh:mm:ss'Z'",
|
||||
contribs CHAR(64) NOT NULL FIELD_FORMAT='contribs:[", "]',
|
||||
award CHAR(42) DEFAULT NULL FIELD_FORMAT='awards:[x]:award',
|
||||
year CHAR(4) DEFAULT NULL FIELD_FORMAT='awards:[x]:year',
|
||||
`by` CHAR(38) DEFAULT NULL FIELD_FORMAT='awards:[x]:by'
|
||||
contribs CHAR(64) NOT NULL FIELD_FORMAT='$.contribs.[", "]',
|
||||
award CHAR(42) DEFAULT NULL FIELD_FORMAT='$.awards[*].award',
|
||||
year CHAR(4) DEFAULT NULL FIELD_FORMAT='$.awards[*].year',
|
||||
`by` CHAR(38) DEFAULT NULL FIELD_FORMAT='$.awards[*].by'
|
||||
) ENGINE=CONNECT TABLE_TYPE='json' FILE_NAME='bios.zip' ZIPPED=YES;
|
||||
SELECT * FROM t3 WHERE _id = 1;
|
||||
|
||||
|
@@ -42,7 +42,8 @@ int MYSQLtoPLG(char *typname, char *var)
|
||||
type = TYPE_INT;
|
||||
else if (!stricmp(typname, "smallint"))
|
||||
type = TYPE_SHORT;
|
||||
else if (!stricmp(typname, "char") || !stricmp(typname, "varchar"))
|
||||
else if (!stricmp(typname, "char") || !stricmp(typname, "varchar") ||
|
||||
!stricmp(typname, "enum") || !stricmp(typname, "set"))
|
||||
type = TYPE_STRING;
|
||||
else if (!stricmp(typname, "double") || !stricmp(typname, "float") ||
|
||||
!stricmp(typname, "real"))
|
||||
@@ -87,10 +88,12 @@ int MYSQLtoPLG(char *typname, char *var)
|
||||
else if (!stricmp(typname, "year"))
|
||||
*var = 'Y';
|
||||
|
||||
} else if (type == TYPE_STRING && !stricmp(typname, "varchar"))
|
||||
// This is to make the difference between CHAR and VARCHAR
|
||||
*var = 'V';
|
||||
else if (type == TYPE_ERROR && xconv == TPC_SKIP)
|
||||
} else if (type == TYPE_STRING) {
|
||||
if (!stricmp(typname, "varchar"))
|
||||
// This is to make the difference between CHAR and VARCHAR
|
||||
*var = 'V';
|
||||
|
||||
} else if (type == TYPE_ERROR && xconv == TPC_SKIP)
|
||||
*var = 'K';
|
||||
else
|
||||
*var = 0;
|
||||
@@ -266,9 +269,9 @@ int MYSQLtoPLG(int mytype, char *var)
|
||||
/************************************************************************/
|
||||
/* Returns the format corresponding to a MySQL date type number. */
|
||||
/************************************************************************/
|
||||
char *MyDateFmt(int mytype)
|
||||
PCSZ MyDateFmt(int mytype)
|
||||
{
|
||||
char *fmt;
|
||||
PCSZ fmt;
|
||||
|
||||
switch (mytype) {
|
||||
case MYSQL_TYPE_TIMESTAMP:
|
||||
@@ -294,9 +297,9 @@ char *MyDateFmt(int mytype)
|
||||
/************************************************************************/
|
||||
/* Returns the format corresponding to a MySQL date type name. */
|
||||
/************************************************************************/
|
||||
char *MyDateFmt(char *typname)
|
||||
PCSZ MyDateFmt(char *typname)
|
||||
{
|
||||
char *fmt;
|
||||
PCSZ fmt;
|
||||
|
||||
if (!stricmp(typname, "datetime") || !stricmp(typname, "timestamp"))
|
||||
fmt = "YYYY-MM-DD hh:mm:ss";
|
||||
|
@@ -6,9 +6,9 @@
|
||||
|
||||
enum enum_field_types PLGtoMYSQL(int type, bool dbf, char var = 0);
|
||||
const char *PLGtoMYSQLtype(int type, bool dbf, char var = 0);
|
||||
int MYSQLtoPLG(char *typname, char *var = NULL);
|
||||
int MYSQLtoPLG(int mytype, char *var = NULL);
|
||||
char *MyDateFmt(int mytype);
|
||||
char *MyDateFmt(char *typname);
|
||||
int MYSQLtoPLG(char *typname, char *var = NULL);
|
||||
int MYSQLtoPLG(int mytype, char *var = NULL);
|
||||
PCSZ MyDateFmt(int mytype);
|
||||
PCSZ MyDateFmt(char *typname);
|
||||
|
||||
#endif // __MYUTIL__H
|
||||
|
@@ -3,11 +3,11 @@
|
||||
#define DEFAULT_QUERY_TIMEOUT -1 // means do not set
|
||||
|
||||
typedef struct odbc_parms {
|
||||
char *User; // User connect info
|
||||
char *Pwd; // Password connect info
|
||||
int Cto; // Connect timeout
|
||||
int Qto; // Query timeout
|
||||
bool UseCnc; // Use SQLConnect (!SQLDriverConnect)
|
||||
PCSZ User; // User connect info
|
||||
PCSZ Pwd; // Password connect info
|
||||
int Cto; // Connect timeout
|
||||
int Qto; // Query timeout
|
||||
bool UseCnc; // Use SQLConnect (!SQLDriverConnect)
|
||||
} ODBCPARM, *POPARM;
|
||||
|
||||
/***********************************************************************/
|
||||
@@ -17,9 +17,9 @@ typedef struct odbc_parms {
|
||||
char *ODBCCheckConnection(PGLOBAL g, char *dsn, int cop);
|
||||
#endif // PROMPT_OK
|
||||
PQRYRES ODBCDataSources(PGLOBAL g, int maxres, bool info);
|
||||
PQRYRES ODBCColumns(PGLOBAL g, char *dsn, char *db, char *table,
|
||||
char *colpat, int maxres, bool info, POPARM sop);
|
||||
PQRYRES ODBCColumns(PGLOBAL g, PCSZ dsn, PCSZ db, PCSZ table,
|
||||
PCSZ colpat, int maxres, bool info, POPARM sop);
|
||||
PQRYRES ODBCSrcCols(PGLOBAL g, char *dsn, char *src, POPARM sop);
|
||||
PQRYRES ODBCTables(PGLOBAL g, char *dsn, char *db, char *tabpat,
|
||||
char *tabtyp, int maxres, bool info, POPARM sop);
|
||||
PQRYRES ODBCTables(PGLOBAL g, PCSZ dsn, PCSZ db, PCSZ tabpat,
|
||||
PCSZ tabtyp, int maxres, bool info, POPARM sop);
|
||||
PQRYRES ODBCDrivers(PGLOBAL g, int maxres, bool info);
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/************ Odbconn C++ Functions Source Code File (.CPP) ************/
|
||||
/* Name: ODBCONN.CPP Version 2.2 */
|
||||
/***********************************************************************/
|
||||
/* Name: ODBCONN.CPP Version 2.3 */
|
||||
/* */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 1998-2016 */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 1998-2017 */
|
||||
/* */
|
||||
/* This file contains the ODBC connection classes functions. */
|
||||
/***********************************************************************/
|
||||
@@ -239,47 +239,43 @@ char *ODBCCheckConnection(PGLOBAL g, char *dsn, int cop)
|
||||
/***********************************************************************/
|
||||
/* Allocate the structure used to refer to the result set. */
|
||||
/***********************************************************************/
|
||||
static CATPARM *AllocCatInfo(PGLOBAL g, CATINFO fid, char *db,
|
||||
char *tab, PQRYRES qrp)
|
||||
{
|
||||
size_t i, m, n;
|
||||
CATPARM *cap;
|
||||
static CATPARM *AllocCatInfo(PGLOBAL g, CATINFO fid, PCSZ db,
|
||||
PCSZ tab, PQRYRES qrp)
|
||||
{
|
||||
size_t i, m, n;
|
||||
CATPARM *cap;
|
||||
|
||||
#if defined(_DEBUG)
|
||||
assert(qrp);
|
||||
assert(qrp);
|
||||
#endif
|
||||
|
||||
// Save stack and allocation environment and prepare error return
|
||||
if (g->jump_level == MAX_JUMP) {
|
||||
strcpy(g->Message, MSG(TOO_MANY_JUMPS));
|
||||
return NULL;
|
||||
} // endif jump_level
|
||||
try {
|
||||
m = (size_t)qrp->Maxres;
|
||||
n = (size_t)qrp->Nbcol;
|
||||
cap = (CATPARM *)PlugSubAlloc(g, NULL, sizeof(CATPARM));
|
||||
memset(cap, 0, sizeof(CATPARM));
|
||||
cap->Id = fid;
|
||||
cap->Qrp = qrp;
|
||||
cap->DB = db;
|
||||
cap->Tab = tab;
|
||||
cap->Vlen = (SQLLEN* *)PlugSubAlloc(g, NULL, n * sizeof(SQLLEN *));
|
||||
|
||||
if (setjmp(g->jumper[++g->jump_level]) != 0) {
|
||||
printf("%s\n", g->Message);
|
||||
cap = NULL;
|
||||
goto fin;
|
||||
} // endif rc
|
||||
for (i = 0; i < n; i++)
|
||||
cap->Vlen[i] = (SQLLEN *)PlugSubAlloc(g, NULL, m * sizeof(SQLLEN));
|
||||
|
||||
m = (size_t)qrp->Maxres;
|
||||
n = (size_t)qrp->Nbcol;
|
||||
cap = (CATPARM *)PlugSubAlloc(g, NULL, sizeof(CATPARM));
|
||||
memset(cap, 0, sizeof(CATPARM));
|
||||
cap->Id = fid;
|
||||
cap->Qrp = qrp;
|
||||
cap->DB = (PUCHAR)db;
|
||||
cap->Tab = (PUCHAR)tab;
|
||||
cap->Vlen = (SQLLEN* *)PlugSubAlloc(g, NULL, n * sizeof(SQLLEN *));
|
||||
cap->Status = (UWORD *)PlugSubAlloc(g, NULL, m * sizeof(UWORD));
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
cap->Vlen[i] = (SQLLEN *)PlugSubAlloc(g, NULL, m * sizeof(SQLLEN));
|
||||
} catch (int n) {
|
||||
htrc("Exeption %d: %s\n", n, g->Message);
|
||||
cap = NULL;
|
||||
} catch (const char *msg) {
|
||||
htrc(g->Message, msg);
|
||||
printf("%s\n", g->Message);
|
||||
cap = NULL;
|
||||
} // end catch
|
||||
|
||||
cap->Status = (UWORD *)PlugSubAlloc(g, NULL, m * sizeof(UWORD));
|
||||
|
||||
fin:
|
||||
g->jump_level--;
|
||||
return cap;
|
||||
} // end of AllocCatInfo
|
||||
return cap;
|
||||
} // end of AllocCatInfo
|
||||
|
||||
#if 0
|
||||
/***********************************************************************/
|
||||
@@ -309,8 +305,8 @@ static void ResetNullValues(CATPARM *cap)
|
||||
/* ODBCColumns: constructs the result blocks containing all columns */
|
||||
/* of an ODBC table that will be retrieved by GetData commands. */
|
||||
/***********************************************************************/
|
||||
PQRYRES ODBCColumns(PGLOBAL g, char *dsn, char *db, char *table,
|
||||
char *colpat, int maxres, bool info, POPARM sop)
|
||||
PQRYRES ODBCColumns(PGLOBAL g, PCSZ dsn, PCSZ db, PCSZ table,
|
||||
PCSZ colpat, int maxres, bool info, POPARM sop)
|
||||
{
|
||||
int buftyp[] = {TYPE_STRING, TYPE_STRING, TYPE_STRING, TYPE_STRING,
|
||||
TYPE_SHORT, TYPE_STRING, TYPE_INT, TYPE_INT,
|
||||
@@ -383,7 +379,7 @@ PQRYRES ODBCColumns(PGLOBAL g, char *dsn, char *db, char *table,
|
||||
if (!(cap = AllocCatInfo(g, CAT_COL, db, table, qrp)))
|
||||
return NULL;
|
||||
|
||||
cap->Pat = (PUCHAR)colpat;
|
||||
cap->Pat = colpat;
|
||||
|
||||
/************************************************************************/
|
||||
/* Now get the results into blocks. */
|
||||
@@ -618,8 +614,8 @@ PQRYRES ODBCDataSources(PGLOBAL g, int maxres, bool info)
|
||||
/* ODBCTables: constructs the result blocks containing all tables in */
|
||||
/* an ODBC database that will be retrieved by GetData commands. */
|
||||
/**************************************************************************/
|
||||
PQRYRES ODBCTables(PGLOBAL g, char *dsn, char *db, char *tabpat,
|
||||
char *tabtyp, int maxres, bool info, POPARM sop)
|
||||
PQRYRES ODBCTables(PGLOBAL g, PCSZ dsn, PCSZ db, PCSZ tabpat, PCSZ tabtyp,
|
||||
int maxres, bool info, POPARM sop)
|
||||
{
|
||||
int buftyp[] = {TYPE_STRING, TYPE_STRING, TYPE_STRING,
|
||||
TYPE_STRING, TYPE_STRING};
|
||||
@@ -681,7 +677,7 @@ PQRYRES ODBCTables(PGLOBAL g, char *dsn, char *db, char *tabpat,
|
||||
if (!(cap = AllocCatInfo(g, CAT_TAB, db, tabpat, qrp)))
|
||||
return NULL;
|
||||
|
||||
cap->Pat = (PUCHAR)tabtyp;
|
||||
cap->Pat = tabtyp;
|
||||
|
||||
if (trace)
|
||||
htrc("Getting table results ncol=%d\n", cap->Qrp->Nbcol);
|
||||
@@ -879,7 +875,7 @@ PQRYRES ODBCStatistics(PGLOBAL g, ODBConn *op, char *dsn, char *pat,
|
||||
/***********************************************************************/
|
||||
/* Implementation of DBX class. */
|
||||
/***********************************************************************/
|
||||
DBX::DBX(RETCODE rc, PSZ msg)
|
||||
DBX::DBX(RETCODE rc, PCSZ msg)
|
||||
{
|
||||
m_RC = rc;
|
||||
m_Msg = msg;
|
||||
@@ -1020,7 +1016,7 @@ bool ODBConn::Check(RETCODE rc)
|
||||
/***********************************************************************/
|
||||
/* DB exception throw routines. */
|
||||
/***********************************************************************/
|
||||
void ODBConn::ThrowDBX(RETCODE rc, PSZ msg, HSTMT hstmt)
|
||||
void ODBConn::ThrowDBX(RETCODE rc, PCSZ msg, HSTMT hstmt)
|
||||
{
|
||||
DBX* xp = new(m_G) DBX(rc, msg);
|
||||
|
||||
@@ -1030,7 +1026,7 @@ void ODBConn::ThrowDBX(RETCODE rc, PSZ msg, HSTMT hstmt)
|
||||
|
||||
} // end of ThrowDBX
|
||||
|
||||
void ODBConn::ThrowDBX(PSZ msg)
|
||||
void ODBConn::ThrowDBX(PCSZ msg)
|
||||
{
|
||||
DBX* xp = new(m_G) DBX(0, "Error");
|
||||
|
||||
@@ -1110,7 +1106,7 @@ void ODBConn::OnSetOptions(HSTMT hstmt)
|
||||
/***********************************************************************/
|
||||
/* Open: connect to a data source. */
|
||||
/***********************************************************************/
|
||||
int ODBConn::Open(PSZ ConnectString, POPARM sop, DWORD options)
|
||||
int ODBConn::Open(PCSZ ConnectString, POPARM sop, DWORD options)
|
||||
{
|
||||
PGLOBAL& g = m_G;
|
||||
//ASSERT_VALID(this);
|
||||
@@ -1192,7 +1188,7 @@ void ODBConn::AllocConnect(DWORD Options)
|
||||
|
||||
#if defined(_DEBUG)
|
||||
if (Options & traceSQL) {
|
||||
SQLSetConnectOption(m_hdbc, SQL_OPT_TRACEFILE, (DWORD)"xodbc.out");
|
||||
SQLSetConnectOption(m_hdbc, SQL_OPT_TRACEFILE, (SQLULEN)"xodbc.out");
|
||||
SQLSetConnectOption(m_hdbc, SQL_OPT_TRACE, 1);
|
||||
} // endif
|
||||
#endif // _DEBUG
|
||||
@@ -1215,7 +1211,7 @@ void ODBConn::AllocConnect(DWORD Options)
|
||||
|
||||
// Turn on cursor lib support
|
||||
if (Options & useCursorLib)
|
||||
rc = SQLSetConnectOption(m_hdbc, SQL_ODBC_CURSORS, SQL_CUR_USE_ODBC);
|
||||
rc = SQLSetConnectOption(m_hdbc, SQL_ODBC_CURSORS, SQL_CUR_USE_DRIVER);
|
||||
|
||||
return;
|
||||
} // end of AllocConnect
|
||||
@@ -1921,7 +1917,7 @@ bool ODBConn::ExecSQLcommand(char *sql)
|
||||
/* GetMetaData: constructs the result blocks containing the */
|
||||
/* description of all the columns of an SQL command. */
|
||||
/**************************************************************************/
|
||||
PQRYRES ODBConn::GetMetaData(PGLOBAL g, char *dsn, char *src)
|
||||
PQRYRES ODBConn::GetMetaData(PGLOBAL g, PCSZ dsn, PCSZ src)
|
||||
{
|
||||
static int buftyp[] = {TYPE_STRING, TYPE_SHORT, TYPE_INT,
|
||||
TYPE_SHORT, TYPE_SHORT};
|
||||
@@ -2244,7 +2240,7 @@ int ODBConn::GetCatInfo(CATPARM *cap)
|
||||
void *buffer;
|
||||
int i, irc;
|
||||
bool b;
|
||||
PSZ fnc = "Unknown";
|
||||
PCSZ fnc = "Unknown";
|
||||
UWORD n;
|
||||
SWORD ncol, len, tp;
|
||||
SQLULEN crow = 0;
|
||||
@@ -2283,22 +2279,20 @@ int ODBConn::GetCatInfo(CATPARM *cap)
|
||||
// Now do call the proper ODBC API
|
||||
switch (cap->Id) {
|
||||
case CAT_TAB:
|
||||
// rc = SQLSetStmtAttr(hstmt, SQL_ATTR_METADATA_ID,
|
||||
// (SQLPOINTER)false, 0);
|
||||
fnc = "SQLTables";
|
||||
rc = SQLTables(hstmt, name.ptr(2), name.length(2),
|
||||
name.ptr(1), name.length(1),
|
||||
name.ptr(0), name.length(0),
|
||||
cap->Pat, cap->Pat ? SQL_NTS : 0);
|
||||
(SQLCHAR *)cap->Pat,
|
||||
cap->Pat ? SQL_NTS : 0);
|
||||
break;
|
||||
case CAT_COL:
|
||||
// rc = SQLSetStmtAttr(hstmt, SQL_ATTR_METADATA_ID,
|
||||
// (SQLPOINTER)true, 0);
|
||||
fnc = "SQLColumns";
|
||||
rc = SQLColumns(hstmt, name.ptr(2), name.length(2),
|
||||
name.ptr(1), name.length(1),
|
||||
name.ptr(0), name.length(0),
|
||||
cap->Pat, cap->Pat ? SQL_NTS : 0);
|
||||
(SQLCHAR *)cap->Pat,
|
||||
cap->Pat ? SQL_NTS : 0);
|
||||
break;
|
||||
case CAT_KEY:
|
||||
fnc = "SQLPrimaryKeys";
|
||||
@@ -2346,6 +2340,7 @@ int ODBConn::GetCatInfo(CATPARM *cap)
|
||||
} // endif len
|
||||
|
||||
pval[n] = AllocateValue(g, crp->Type, len);
|
||||
pval[n]->SetNullable(true);
|
||||
|
||||
if (crp->Type == TYPE_STRING) {
|
||||
pbuf[n] = (char*)PlugSubAlloc(g, NULL, len);
|
||||
|
@@ -54,9 +54,9 @@ enum CATINFO {CAT_TAB = 1, /* SQLTables */
|
||||
typedef struct tagCATPARM {
|
||||
CATINFO Id; // Id to indicate function
|
||||
PQRYRES Qrp; // Result set pointer
|
||||
PUCHAR DB; // Database (Schema)
|
||||
PUCHAR Tab; // Table name or pattern
|
||||
PUCHAR Pat; // Table type or column pattern
|
||||
PCSZ DB; // Database (Schema)
|
||||
PCSZ Tab; // Table name or pattern
|
||||
PCSZ Pat; // Table type or column pattern
|
||||
SQLLEN* *Vlen; // To array of indicator values
|
||||
UWORD *Status; // To status block
|
||||
// For SQLStatistics
|
||||
@@ -80,23 +80,23 @@ class DBX : public BLOCK {
|
||||
friend class ODBConn;
|
||||
// Construction (by ThrowDBX only) -- destruction
|
||||
protected:
|
||||
DBX(RETCODE rc, PSZ msg = NULL);
|
||||
DBX(RETCODE rc, PCSZ msg = NULL);
|
||||
public:
|
||||
//virtual ~DBX() {}
|
||||
//void operator delete(void*, PGLOBAL, void*) {};
|
||||
|
||||
// Implementation (use ThrowDBX to create)
|
||||
RETCODE GetRC(void) {return m_RC;}
|
||||
PSZ GetMsg(void) {return m_Msg;}
|
||||
const char *GetErrorMessage(int i);
|
||||
PCSZ GetMsg(void) {return m_Msg;}
|
||||
PCSZ GetErrorMessage(int i);
|
||||
|
||||
protected:
|
||||
bool BuildErrorMessage(ODBConn* pdb, HSTMT hstmt = SQL_NULL_HSTMT);
|
||||
|
||||
// Attributes
|
||||
RETCODE m_RC;
|
||||
PSZ m_Msg;
|
||||
PSZ m_ErrMsg[MAX_NUM_OF_MSG];
|
||||
PCSZ m_Msg;
|
||||
PCSZ m_ErrMsg[MAX_NUM_OF_MSG];
|
||||
}; // end of DBX class definition
|
||||
|
||||
/***********************************************************************/
|
||||
@@ -119,7 +119,7 @@ class ODBConn : public BLOCK {
|
||||
noOdbcDialog = 0x0008, // Don't display ODBC Connect dialog
|
||||
forceOdbcDialog = 0x0010}; // Always display ODBC connect dialog
|
||||
|
||||
int Open(PSZ ConnectString, POPARM sop, DWORD Options = 0);
|
||||
int Open(PCSZ ConnectString, POPARM sop, DWORD Options = 0);
|
||||
int Rewind(char *sql, ODBCCOL *tocols);
|
||||
void Close(void);
|
||||
PQRYRES AllocateResult(PGLOBAL g);
|
||||
@@ -131,7 +131,7 @@ class ODBConn : public BLOCK {
|
||||
bool IsOpen(void) {return m_hdbc != SQL_NULL_HDBC;}
|
||||
PSZ GetStringInfo(ushort infotype);
|
||||
int GetMaxValue(ushort infotype);
|
||||
PSZ GetConnect(void) {return m_Connect;}
|
||||
PCSZ GetConnect(void) {return m_Connect;}
|
||||
|
||||
public:
|
||||
// Operations
|
||||
@@ -149,7 +149,7 @@ class ODBConn : public BLOCK {
|
||||
int GetCatInfo(CATPARM *cap);
|
||||
bool GetDataSources(PQRYRES qrp);
|
||||
bool GetDrivers(PQRYRES qrp);
|
||||
PQRYRES GetMetaData(PGLOBAL g, char *dsn, char *src);
|
||||
PQRYRES GetMetaData(PGLOBAL g, PCSZ dsn, PCSZ src);
|
||||
|
||||
public:
|
||||
// Set special options
|
||||
@@ -162,8 +162,8 @@ class ODBConn : public BLOCK {
|
||||
// ODBC operations
|
||||
protected:
|
||||
bool Check(RETCODE rc);
|
||||
void ThrowDBX(RETCODE rc, PSZ msg, HSTMT hstmt = SQL_NULL_HSTMT);
|
||||
void ThrowDBX(PSZ msg);
|
||||
void ThrowDBX(RETCODE rc, PCSZ msg, HSTMT hstmt = SQL_NULL_HSTMT);
|
||||
void ThrowDBX(PCSZ msg);
|
||||
void AllocConnect(DWORD dwOptions);
|
||||
void Connect(void);
|
||||
bool DriverConnect(DWORD Options);
|
||||
@@ -187,9 +187,9 @@ class ODBConn : public BLOCK {
|
||||
DWORD m_UpdateOptions;
|
||||
DWORD m_RowsetSize;
|
||||
char m_IDQuoteChar[2];
|
||||
PSZ m_Connect;
|
||||
PSZ m_User;
|
||||
PSZ m_Pwd;
|
||||
PCSZ m_Connect;
|
||||
PCSZ m_User;
|
||||
PCSZ m_Pwd;
|
||||
int m_Catver;
|
||||
int m_Rows;
|
||||
int m_Fetch;
|
||||
|
@@ -17,13 +17,16 @@ typedef off_t off64_t;
|
||||
|
||||
#if defined(__WIN__)
|
||||
typedef __int64 BIGINT;
|
||||
typedef _Null_terminated_ const char *PCSZ;
|
||||
#else // !__WIN__
|
||||
typedef longlong BIGINT;
|
||||
#define FILE_BEGIN SEEK_SET
|
||||
#define FILE_CURRENT SEEK_CUR
|
||||
#define FILE_END SEEK_END
|
||||
typedef const char *PCSZ;
|
||||
#endif // !__WIN__
|
||||
|
||||
|
||||
#if !defined(__WIN__)
|
||||
typedef const void *LPCVOID;
|
||||
typedef const char *LPCTSTR;
|
||||
|
@@ -43,34 +43,6 @@ PSZ strlwr(PSZ p)
|
||||
return (p);
|
||||
} /* end of strlwr */
|
||||
|
||||
#if defined(NOT_USED) /*&& !defined(sun) && !defined(LINUX) && !defined(AIX)*/
|
||||
/***********************************************************************/
|
||||
/* Define stricmp function not existing in some UNIX libraries. */
|
||||
/***********************************************************************/
|
||||
int stricmp(char *str1, char *str2)
|
||||
{
|
||||
register int i;
|
||||
int n;
|
||||
char c;
|
||||
char *sup1 = malloc(strlen(str1) + 1);
|
||||
char *sup2 = malloc(strlen(str2) + 1);
|
||||
|
||||
for (i = 0; c = str1[i]; i++)
|
||||
sup1[i] = toupper(c);
|
||||
|
||||
sup1[i] = 0;
|
||||
|
||||
for (i = 0; c = str2[i]; i++)
|
||||
sup2[i] = toupper(c);
|
||||
|
||||
sup2[i] = 0;
|
||||
n = strcmp(sup1, sup2);
|
||||
free(sup1);
|
||||
free(sup2);
|
||||
return (n);
|
||||
} /* end of stricmp */
|
||||
#endif /* sun */
|
||||
|
||||
/***********************************************************************/
|
||||
/* Define the splitpath function not existing in the UNIX library. */
|
||||
/***********************************************************************/
|
||||
@@ -143,13 +115,6 @@ my_bool CloseFileHandle(HANDLE h)
|
||||
return (close(h)) ? TRUE : FALSE;
|
||||
} /* end of CloseFileHandle */
|
||||
|
||||
#if 0
|
||||
void Sleep(DWORD time)
|
||||
{
|
||||
//FIXME: TODO
|
||||
} /* end of Sleep */
|
||||
#endif
|
||||
|
||||
int GetLastError()
|
||||
{
|
||||
return errno;
|
||||
@@ -210,21 +175,4 @@ BOOL MessageBeep(uint i __attribute__((unused)))
|
||||
return TRUE;
|
||||
} /* end of MessageBeep */
|
||||
|
||||
#if 0
|
||||
/* This function is ridiculous and should be revisited */
|
||||
DWORD FormatMessage(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId,
|
||||
DWORD dwLanguageId, LPSTR lpBuffer, DWORD nSize, ...)
|
||||
{
|
||||
char buff[32];
|
||||
int n;
|
||||
|
||||
//if (dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER)
|
||||
// return 0; /* means error */
|
||||
|
||||
n = sprintf(buff, "Error code: %d", (int) dwMessageId);
|
||||
strncpy(lpBuffer, buff, nSize);
|
||||
return min(n, nSize);
|
||||
} /* end of FormatMessage */
|
||||
#endif
|
||||
|
||||
#endif // UNIX
|
||||
|
@@ -36,8 +36,6 @@ enum BLKTYP {TYPE_TABLE = 50, /* Table Name/Srcdef/... Block */
|
||||
TYPE_COLCRT = 71, /* Column creation block */
|
||||
TYPE_CONST = 72, /* Constant */
|
||||
|
||||
/*-------------------- type tokenized string --------------------------*/
|
||||
TYPE_DATE = 8, /* Timestamp */
|
||||
/*-------------------- additional values used by LNA ------------------*/
|
||||
TYPE_COLIST = 14, /* Column list */
|
||||
TYPE_COL = 41, /* Column */
|
||||
@@ -80,7 +78,8 @@ enum TABTYPE {TAB_UNDEF = 0, /* Table of undefined type */
|
||||
TAB_DMY = 25, /* DMY Dummy tables NIY */
|
||||
TAB_JDBC = 26, /* Table accessed via JDBC */
|
||||
TAB_ZIP = 27, /* ZIP file info table */
|
||||
TAB_NIY = 28}; /* Table not implemented yet */
|
||||
TAB_MONGO = 28, /* Table retrieved from MongoDB */
|
||||
TAB_NIY = 30}; /* Table not implemented yet */
|
||||
|
||||
enum AMT {TYPE_AM_ERROR = 0, /* Type not defined */
|
||||
TYPE_AM_ROWID = 1, /* ROWID type (special column) */
|
||||
@@ -143,7 +142,8 @@ enum AMT {TYPE_AM_ERROR = 0, /* Type not defined */
|
||||
TYPE_AM_MYX = 193, /* MYSQL EXEC access method type */
|
||||
TYPE_AM_CAT = 195, /* Catalog access method type no */
|
||||
TYPE_AM_ZIP = 198, /* ZIP access method type no */
|
||||
TYPE_AM_OUT = 200}; /* Output relations (storage) */
|
||||
TYPE_AM_MGO = 199, /* MGO access method type no */
|
||||
TYPE_AM_OUT = 200}; /* Output relations (storage) */
|
||||
|
||||
enum RECFM {RECFM_NAF = -2, /* Not a file */
|
||||
RECFM_OEM = -1, /* OEM file access method */
|
||||
@@ -553,7 +553,7 @@ typedef struct _qryres {
|
||||
typedef struct _colres {
|
||||
PCOLRES Next; /* To next result column */
|
||||
PCOL Colp; /* To matching column block */
|
||||
PSZ Name; /* Column header */
|
||||
PCSZ Name; /* Column header */
|
||||
PVBLK Kdata; /* Column block of values */
|
||||
char *Nulls; /* Column null value array */
|
||||
int Type; /* Internal type */
|
||||
@@ -583,7 +583,7 @@ void PlugLineDB(PGLOBAL, PSZ, short, void *, uint);
|
||||
char *SetPath(PGLOBAL g, const char *path);
|
||||
char *ExtractFromPath(PGLOBAL, char *, char *, OPVAL);
|
||||
void AddPointer(PTABS, void *);
|
||||
PDTP MakeDateFormat(PGLOBAL, PSZ, bool, bool, int);
|
||||
PDTP MakeDateFormat(PGLOBAL, PCSZ, bool, bool, int);
|
||||
int ExtractDate(char *, PDTP, int, int val[6]);
|
||||
|
||||
/**************************************************************************/
|
||||
@@ -615,11 +615,10 @@ DllExport void *PlgDBrealloc(PGLOBAL, void *, MBLOCK&, size_t);
|
||||
DllExport void NewPointer(PTABS, void *, void *);
|
||||
//lExport char *GetIni(int n= 0); // Not used anymore
|
||||
DllExport void SetTrc(void);
|
||||
DllExport char *GetListOption(PGLOBAL, const char *, const char *,
|
||||
const char *def=NULL);
|
||||
DllExport char *GetStringTableOption(PGLOBAL, PTOS, char *, char *);
|
||||
DllExport bool GetBooleanTableOption(PGLOBAL, PTOS, char *, bool);
|
||||
DllExport int GetIntegerTableOption(PGLOBAL, PTOS, char *, int);
|
||||
DllExport PCSZ GetListOption(PGLOBAL, PCSZ, PCSZ, PCSZ def=NULL);
|
||||
DllExport PCSZ GetStringTableOption(PGLOBAL, PTOS, PCSZ, PCSZ);
|
||||
DllExport bool GetBooleanTableOption(PGLOBAL, PTOS, PCSZ, bool);
|
||||
DllExport int GetIntegerTableOption(PGLOBAL, PTOS, PCSZ, int);
|
||||
|
||||
#define MSGID_NONE 0
|
||||
#define MSGID_CANNOT_OPEN 1
|
||||
|
@@ -238,88 +238,84 @@ void ptrc(char const *fmt, ...)
|
||||
PQRYRES PlgAllocResult(PGLOBAL g, int ncol, int maxres, int ids,
|
||||
int *buftyp, XFLD *fldtyp,
|
||||
unsigned int *length, bool blank, bool nonull)
|
||||
{
|
||||
{
|
||||
char cname[NAM_LEN+1];
|
||||
int i;
|
||||
PCOLRES *pcrp, crp;
|
||||
PQRYRES qrp;
|
||||
|
||||
// Save stack and allocation environment and prepare error return
|
||||
if (g->jump_level == MAX_JUMP) {
|
||||
strcpy(g->Message, MSG(TOO_MANY_JUMPS));
|
||||
return NULL;
|
||||
} // endif jump_level
|
||||
try {
|
||||
/**********************************************************************/
|
||||
/* Allocate the structure used to contain the result set. */
|
||||
/**********************************************************************/
|
||||
qrp = (PQRYRES)PlugSubAlloc(g, NULL, sizeof(QRYRES));
|
||||
pcrp = &qrp->Colresp;
|
||||
qrp->Continued = false;
|
||||
qrp->Truncated = false;
|
||||
qrp->Info = false;
|
||||
qrp->Suball = true;
|
||||
qrp->Maxres = maxres;
|
||||
qrp->Maxsize = 0;
|
||||
qrp->Nblin = 0;
|
||||
qrp->Nbcol = 0; // will be ncol
|
||||
qrp->Cursor = 0;
|
||||
qrp->BadLines = 0;
|
||||
|
||||
if (setjmp(g->jumper[++g->jump_level]) != 0) {
|
||||
printf("%s\n", g->Message);
|
||||
qrp = NULL;
|
||||
goto fin;
|
||||
} // endif rc
|
||||
for (i = 0; i < ncol; i++) {
|
||||
*pcrp = (PCOLRES)PlugSubAlloc(g, NULL, sizeof(COLRES));
|
||||
crp = *pcrp;
|
||||
pcrp = &crp->Next;
|
||||
memset(crp, 0, sizeof(COLRES));
|
||||
crp->Colp = NULL;
|
||||
crp->Ncol = ++qrp->Nbcol;
|
||||
crp->Type = buftyp[i];
|
||||
crp->Length = length[i];
|
||||
crp->Clen = GetTypeSize(crp->Type, length[i]);
|
||||
crp->Prec = 0;
|
||||
|
||||
/************************************************************************/
|
||||
/* Allocate the structure used to contain the result set. */
|
||||
/************************************************************************/
|
||||
qrp = (PQRYRES)PlugSubAlloc(g, NULL, sizeof(QRYRES));
|
||||
pcrp = &qrp->Colresp;
|
||||
qrp->Continued = false;
|
||||
qrp->Truncated = false;
|
||||
qrp->Info = false;
|
||||
qrp->Suball = true;
|
||||
qrp->Maxres = maxres;
|
||||
qrp->Maxsize = 0;
|
||||
qrp->Nblin = 0;
|
||||
qrp->Nbcol = 0; // will be ncol
|
||||
qrp->Cursor = 0;
|
||||
qrp->BadLines = 0;
|
||||
|
||||
for (i = 0; i < ncol; i++) {
|
||||
*pcrp = (PCOLRES)PlugSubAlloc(g, NULL, sizeof(COLRES));
|
||||
crp = *pcrp;
|
||||
pcrp = &crp->Next;
|
||||
memset(crp, 0, sizeof(COLRES));
|
||||
crp->Colp = NULL;
|
||||
crp->Ncol = ++qrp->Nbcol;
|
||||
crp->Type = buftyp[i];
|
||||
crp->Length = length[i];
|
||||
crp->Clen = GetTypeSize(crp->Type, length[i]);
|
||||
crp->Prec = 0;
|
||||
|
||||
if (ids > 0) {
|
||||
if (ids > 0) {
|
||||
#if defined(XMSG)
|
||||
// Get header from message file
|
||||
strncpy(cname, PlugReadMessage(g, ids + crp->Ncol, NULL), NAM_LEN);
|
||||
cname[NAM_LEN] = 0; // for truncated long names
|
||||
// Get header from message file
|
||||
strncpy(cname, PlugReadMessage(g, ids + crp->Ncol, NULL), NAM_LEN);
|
||||
cname[NAM_LEN] = 0; // for truncated long names
|
||||
#else // !XMSG
|
||||
GetRcString(ids + crp->Ncol, cname, sizeof(cname));
|
||||
GetRcString(ids + crp->Ncol, cname, sizeof(cname));
|
||||
#endif // !XMSG
|
||||
crp->Name = (PSZ)PlugDup(g, cname);
|
||||
} else
|
||||
crp->Name = NULL; // Will be set by caller
|
||||
crp->Name = (PSZ)PlugDup(g, cname);
|
||||
} else
|
||||
crp->Name = NULL; // Will be set by caller
|
||||
|
||||
if (fldtyp)
|
||||
crp->Fld = fldtyp[i];
|
||||
else
|
||||
crp->Fld = FLD_NO;
|
||||
if (fldtyp)
|
||||
crp->Fld = fldtyp[i];
|
||||
else
|
||||
crp->Fld = FLD_NO;
|
||||
|
||||
// Allocate the Value Block that will contain data
|
||||
if (crp->Length || nonull)
|
||||
crp->Kdata = AllocValBlock(g, NULL, crp->Type, maxres,
|
||||
crp->Length, 0, true, blank, false);
|
||||
else
|
||||
crp->Kdata = NULL;
|
||||
// Allocate the Value Block that will contain data
|
||||
if (crp->Length || nonull)
|
||||
crp->Kdata = AllocValBlock(g, NULL, crp->Type, maxres,
|
||||
crp->Length, 0, true, blank, false);
|
||||
else
|
||||
crp->Kdata = NULL;
|
||||
|
||||
if (trace)
|
||||
htrc("Column(%d) %s type=%d len=%d value=%p\n",
|
||||
crp->Ncol, crp->Name, crp->Type, crp->Length, crp->Kdata);
|
||||
if (trace)
|
||||
htrc("Column(%d) %s type=%d len=%d value=%p\n",
|
||||
crp->Ncol, crp->Name, crp->Type, crp->Length, crp->Kdata);
|
||||
|
||||
} // endfor i
|
||||
} // endfor i
|
||||
|
||||
*pcrp = NULL;
|
||||
*pcrp = NULL;
|
||||
|
||||
fin:
|
||||
g->jump_level--;
|
||||
return qrp;
|
||||
} // end of PlgAllocResult
|
||||
} catch (int n) {
|
||||
htrc("Exception %d: %s\n", n, g->Message);
|
||||
qrp = NULL;
|
||||
} catch (const char *msg) {
|
||||
strcpy(g->Message, msg);
|
||||
htrc("%s\n", g->Message);
|
||||
qrp = NULL;
|
||||
} // end catch
|
||||
|
||||
return qrp;
|
||||
} // end of PlgAllocResult
|
||||
|
||||
/***********************************************************************/
|
||||
/* Allocate and initialize the new DB User Block. */
|
||||
@@ -365,8 +361,8 @@ PCATLG PlgGetCatalog(PGLOBAL g, bool jump)
|
||||
if (!cat && jump) {
|
||||
// Raise exception so caller doesn't have to check return value
|
||||
strcpy(g->Message, MSG(NO_ACTIVE_DB));
|
||||
longjmp(g->jumper[g->jump_level], 1);
|
||||
} // endif cat
|
||||
throw 1;
|
||||
} // endif cat
|
||||
|
||||
return cat;
|
||||
} // end of PlgGetCatalog
|
||||
@@ -391,26 +387,27 @@ char *SetPath(PGLOBAL g, const char *path)
|
||||
char *buf= NULL;
|
||||
|
||||
if (path) {
|
||||
size_t len= strlen(path) + (*path != '.' ? 4 : 1);
|
||||
size_t len = strlen(path) + (*path != '.' ? 4 : 1);
|
||||
|
||||
if (!(buf = (char*)PlgDBSubAlloc(g, NULL, len)))
|
||||
return NULL;
|
||||
|
||||
buf= (char*)PlugSubAlloc(g, NULL, len);
|
||||
|
||||
if (PlugIsAbsolutePath(path)) {
|
||||
strcpy(buf, path);
|
||||
return buf;
|
||||
} // endif path
|
||||
strcpy(buf, path);
|
||||
return buf;
|
||||
} // endif path
|
||||
|
||||
if (*path != '.') {
|
||||
#if defined(__WIN__)
|
||||
char *s= "\\";
|
||||
const char *s = "\\";
|
||||
#else // !__WIN__
|
||||
char *s= "/";
|
||||
const char *s = "/";
|
||||
#endif // !__WIN__
|
||||
strcat(strcat(strcat(strcpy(buf, "."), s), path), s);
|
||||
} else
|
||||
strcpy(buf, path);
|
||||
|
||||
} // endif path
|
||||
} // endif path
|
||||
|
||||
return buf;
|
||||
} // end of SetPath
|
||||
@@ -448,7 +445,7 @@ char *ExtractFromPath(PGLOBAL g, char *pBuff, char *FileName, OPVAL op)
|
||||
static bool PlugCheckPattern(PGLOBAL g, LPCSTR string, LPCSTR pat)
|
||||
{
|
||||
if (pat && strlen(pat)) {
|
||||
// This leaves 512 bytes (MAX_STR / 2) for each components
|
||||
// This leaves 2048 bytes (MAX_STR / 2) for each components
|
||||
LPSTR name = g->Message + MAX_STR / 2;
|
||||
|
||||
strlwr(strcpy(name, string));
|
||||
@@ -476,8 +473,8 @@ bool PlugEvalLike(PGLOBAL g, LPCSTR strg, LPCSTR pat, bool ci)
|
||||
tp = g->Message;
|
||||
else if (!(tp = new char[strlen(pat) + strlen(strg) + 2])) {
|
||||
strcpy(g->Message, MSG(NEW_RETURN_NULL));
|
||||
longjmp(g->jumper[g->jump_level], OP_LIKE);
|
||||
} /* endif tp */
|
||||
throw OP_LIKE;
|
||||
} /* endif tp */
|
||||
|
||||
sp = tp + strlen(pat) + 1;
|
||||
strlwr(strcpy(tp, pat)); /* Make a lower case copy of pat */
|
||||
@@ -487,8 +484,8 @@ bool PlugEvalLike(PGLOBAL g, LPCSTR strg, LPCSTR pat, bool ci)
|
||||
tp = g->Message; /* Use this as temporary work space. */
|
||||
else if (!(tp = new char[strlen(pat) + 1])) {
|
||||
strcpy(g->Message, MSG(NEW_RETURN_NULL));
|
||||
longjmp(g->jumper[g->jump_level], OP_LIKE);
|
||||
} /* endif tp */
|
||||
throw OP_LIKE;
|
||||
} /* endif tp */
|
||||
|
||||
strcpy(tp, pat); /* Make a copy to be worked into */
|
||||
sp = (char*)strg;
|
||||
@@ -676,7 +673,7 @@ void PlugConvertConstant(PGLOBAL g, void* & value, short& type)
|
||||
/* format and a Strftime output format. Flag if not 0 indicates that */
|
||||
/* non quoted blanks are not included in the output format. */
|
||||
/***********************************************************************/
|
||||
PDTP MakeDateFormat(PGLOBAL g, PSZ dfmt, bool in, bool out, int flag)
|
||||
PDTP MakeDateFormat(PGLOBAL g, PCSZ dfmt, bool in, bool out, int flag)
|
||||
{
|
||||
int rc;
|
||||
PDTP pdp = (PDTP)PlugSubAlloc(g, NULL, sizeof(DATPAR));
|
||||
@@ -685,7 +682,7 @@ PDTP MakeDateFormat(PGLOBAL g, PSZ dfmt, bool in, bool out, int flag)
|
||||
htrc("MakeDateFormat: dfmt=%s\n", dfmt);
|
||||
|
||||
memset(pdp, 0, sizeof(DATPAR));
|
||||
pdp->Format = pdp->Curp = dfmt;
|
||||
pdp->Format = pdp->Curp = PlugDup(g, dfmt);
|
||||
pdp->Outsize = 2 * strlen(dfmt) + 1;
|
||||
|
||||
if (in)
|
||||
@@ -727,10 +724,11 @@ PDTP MakeDateFormat(PGLOBAL g, PSZ dfmt, bool in, bool out, int flag)
|
||||
/***********************************************************************/
|
||||
int ExtractDate(char *dts, PDTP pdp, int defy, int val[6])
|
||||
{
|
||||
char *fmt, c, d, e, W[8][12];
|
||||
int i, k, m, numval;
|
||||
int n, y = 30;
|
||||
bool b = true; // true for null dates
|
||||
PCSZ fmt;
|
||||
char c, d, e, W[8][12];
|
||||
int i, k, m, numval;
|
||||
int n, y = 30;
|
||||
bool b = true; // true for null dates
|
||||
|
||||
if (pdp)
|
||||
fmt = pdp->InFmt;
|
||||
@@ -1255,7 +1253,7 @@ void *PlgDBalloc(PGLOBAL g, void *area, MBLOCK& mp)
|
||||
// in the area, do allocate from virtual storage.
|
||||
#if defined(__WIN__)
|
||||
if (mp.Size >= BIGMEM)
|
||||
mp.Memp = VirtualAlloc(NULL, mp.Size, MEM_COMMIT, PAGE_READWRITE);
|
||||
mp.Memp = VirtualAlloc(NULL, mp.Size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
|
||||
else
|
||||
#endif
|
||||
mp.Memp = malloc(mp.Size);
|
||||
@@ -1494,7 +1492,7 @@ void PlugPutOut(PGLOBAL g, FILE *f, short t, void *v, uint n)
|
||||
case TYPE_TABLE:
|
||||
case TYPE_TDB:
|
||||
case TYPE_XOBJECT:
|
||||
((PBLOCK)v)->Print(g, f, n-2);
|
||||
((PBLOCK)v)->Printf(g, f, n-2);
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -1520,8 +1518,8 @@ DllExport void NewPointer(PTABS t, void *oldv, void *newv)
|
||||
PGLOBAL g = t->G;
|
||||
|
||||
sprintf(g->Message, "NewPointer: %s", MSG(MEM_ALLOC_ERROR));
|
||||
longjmp(g->jumper[g->jump_level], 3);
|
||||
} else {
|
||||
throw 3;
|
||||
} else {
|
||||
tp->Next = t->P1;
|
||||
tp->Num = 0;
|
||||
t->P1 = tp;
|
||||
@@ -1557,15 +1555,15 @@ int FileComp(PGLOBAL g, char *file1, char *file2)
|
||||
sprintf(g->Message, MSG(OPEN_MODE_ERROR),
|
||||
"rb", (int)errno, fn[i]);
|
||||
strcat(strcat(g->Message, ": "), strerror(errno));
|
||||
longjmp(g->jumper[g->jump_level], 666);
|
||||
// } else
|
||||
throw 666;
|
||||
// } else
|
||||
// len[i] = 0; // File does not exist yet
|
||||
|
||||
} else {
|
||||
if ((len[i] = _filelength(h[i])) < 0) {
|
||||
sprintf(g->Message, MSG(FILELEN_ERROR), "_filelength", fn[i]);
|
||||
longjmp(g->jumper[g->jump_level], 666);
|
||||
} // endif len
|
||||
throw 666;
|
||||
} // endif len
|
||||
|
||||
} // endif h
|
||||
|
||||
|
@@ -45,7 +45,7 @@ XMLDOCUMENT::XMLDOCUMENT(char *nsl, char *nsdf, char *enc)
|
||||
/******************************************************************/
|
||||
/* Initialize zipped file processing. */
|
||||
/******************************************************************/
|
||||
bool XMLDOCUMENT::InitZip(PGLOBAL g, char *entry)
|
||||
bool XMLDOCUMENT::InitZip(PGLOBAL g, PCSZ entry)
|
||||
{
|
||||
#if defined(ZIP_SUPPORT)
|
||||
bool mul = (entry) ? strchr(entry, '*') || strchr(entry, '?') : false;
|
||||
@@ -173,7 +173,7 @@ void XMLNODE::Delete(PXNODE dnp)
|
||||
/******************************************************************/
|
||||
/* Store a string in Buf, enventually reallocating it. */
|
||||
/******************************************************************/
|
||||
char *XMLNODE::BufAlloc(PGLOBAL g, char *p, int n)
|
||||
char *XMLNODE::BufAlloc(PGLOBAL g, const char *p, int n)
|
||||
{
|
||||
if (Len < n) {
|
||||
Len = n;
|
||||
|
@@ -76,9 +76,9 @@ class XMLDOCUMENT : public BLOCK {
|
||||
virtual void SetNofree(bool b) = 0;
|
||||
|
||||
// Methods
|
||||
virtual bool Initialize(PGLOBAL, char *, bool) = 0;
|
||||
virtual bool Initialize(PGLOBAL, PCSZ, bool) = 0;
|
||||
virtual bool ParseFile(PGLOBAL, char *) = 0;
|
||||
virtual bool NewDoc(PGLOBAL, char *) = 0;
|
||||
virtual bool NewDoc(PGLOBAL, PCSZ) = 0;
|
||||
virtual void AddComment(PGLOBAL, char *) = 0;
|
||||
virtual PXNODE GetRoot(PGLOBAL) = 0;
|
||||
virtual PXNODE NewRoot(PGLOBAL, char *) = 0;
|
||||
@@ -95,7 +95,7 @@ class XMLDOCUMENT : public BLOCK {
|
||||
|
||||
// Utility
|
||||
bool MakeNSlist(PGLOBAL g);
|
||||
bool InitZip(PGLOBAL g, char *entry);
|
||||
bool InitZip(PGLOBAL g, PCSZ entry);
|
||||
char *GetMemDoc(PGLOBAL g, char *fn);
|
||||
void CloseZip(void);
|
||||
|
||||
@@ -131,15 +131,15 @@ class XMLNODE : public BLOCK {
|
||||
virtual PXLIST SelectNodes(PGLOBAL, char *, PXLIST = NULL) = 0;
|
||||
virtual PXNODE SelectSingleNode(PGLOBAL, char *, PXNODE = NULL) = 0;
|
||||
virtual PXATTR GetAttribute(PGLOBAL, char *, PXATTR = NULL) = 0;
|
||||
virtual PXNODE AddChildNode(PGLOBAL, char *, PXNODE = NULL) = 0;
|
||||
virtual PXNODE AddChildNode(PGLOBAL, PCSZ, PXNODE = NULL) = 0;
|
||||
virtual PXATTR AddProperty(PGLOBAL, char *, PXATTR = NULL) = 0;
|
||||
virtual void AddText(PGLOBAL, char *) = 0;
|
||||
virtual void AddText(PGLOBAL, PCSZ) = 0;
|
||||
virtual void DeleteChild(PGLOBAL, PXNODE) = 0;
|
||||
|
||||
protected:
|
||||
PXNODE NewChild(PXNODE ncp);
|
||||
void Delete(PXNODE dnp);
|
||||
char *BufAlloc(PGLOBAL g, char *p, int n);
|
||||
char *BufAlloc(PGLOBAL g, const char *p, int n);
|
||||
|
||||
// Constructor
|
||||
XMLNODE(PXDOC dp);
|
||||
|
@@ -139,31 +139,39 @@ PGLOBAL PlugInit(LPCSTR Language, uint worksize)
|
||||
htrc("PlugInit: Language='%s'\n",
|
||||
((!Language) ? "Null" : (char*)Language));
|
||||
|
||||
if (!(g = malloc(sizeof(GLOBAL)))) {
|
||||
fprintf(stderr, MSG(GLOBAL_ERROR), (int)sizeof(GLOBAL));
|
||||
return NULL;
|
||||
} else {
|
||||
try {
|
||||
g = new GLOBAL;
|
||||
} catch (...) {
|
||||
fprintf(stderr, MSG(GLOBAL_ERROR), (int)sizeof(GLOBAL));
|
||||
return NULL;
|
||||
} // end try/catch
|
||||
|
||||
//if (!(g = (PGLOBAL)malloc(sizeof(GLOBAL)))) {
|
||||
// fprintf(stderr, MSG(GLOBAL_ERROR), (int)sizeof(GLOBAL));
|
||||
// return NULL;
|
||||
// } else {
|
||||
g->Sarea = NULL;
|
||||
g->Createas = 0;
|
||||
g->Alchecked = 0;
|
||||
g->Mrr = 0;
|
||||
g->Activityp = g->ActivityStart = NULL;
|
||||
g->Activityp = NULL;
|
||||
g->Xchk = NULL;
|
||||
g->N = 0;
|
||||
g->More = 0;
|
||||
strcpy(g->Message, "");
|
||||
|
||||
/*******************************************************************/
|
||||
/* Allocate the main work segment. */
|
||||
/*******************************************************************/
|
||||
if (worksize && !(g->Sarea = PlugAllocMem(g, worksize))) {
|
||||
char errmsg[256];
|
||||
char errmsg[MAX_STR];
|
||||
sprintf(errmsg, MSG(WORK_AREA), g->Message);
|
||||
strcpy(g->Message, errmsg);
|
||||
g->Sarea_Size = 0;
|
||||
} else
|
||||
g->Sarea_Size = worksize;
|
||||
|
||||
} /* endif g */
|
||||
//} /* endif g */
|
||||
|
||||
g->jump_level = -1; /* New setting to allow recursive call of Plug */
|
||||
return(g);
|
||||
@@ -182,7 +190,7 @@ int PlugExit(PGLOBAL g)
|
||||
if (g->Sarea)
|
||||
free(g->Sarea);
|
||||
|
||||
free(g);
|
||||
delete g;
|
||||
return rc;
|
||||
} /* end of PlugExit */
|
||||
|
||||
@@ -475,7 +483,7 @@ void *PlugAllocMem(PGLOBAL g, uint size)
|
||||
/***********************************************************************/
|
||||
BOOL PlugSubSet(PGLOBAL g __attribute__((unused)), void *memp, uint size)
|
||||
{
|
||||
PPOOLHEADER pph = memp;
|
||||
PPOOLHEADER pph = (PPOOLHEADER)memp;
|
||||
|
||||
pph->To_Free = (OFFSET)sizeof(POOLHEADER);
|
||||
pph->FreeBlk = size - pph->To_Free;
|
||||
@@ -501,7 +509,6 @@ void *PlugSubAlloc(PGLOBAL g, void *memp, size_t size)
|
||||
/*******************************************************************/
|
||||
memp = g->Sarea;
|
||||
|
||||
//size = ((size + 3) / 4) * 4; /* Round up size to multiple of 4 */
|
||||
size = ((size + 7) / 8) * 8; /* Round up size to multiple of 8 */
|
||||
pph = (PPOOLHEADER)memp;
|
||||
|
||||
@@ -510,26 +517,24 @@ void *PlugSubAlloc(PGLOBAL g, void *memp, size_t size)
|
||||
memp, size, pph->To_Free, pph->FreeBlk);
|
||||
|
||||
if ((uint)size > pph->FreeBlk) { /* Not enough memory left in pool */
|
||||
char *pname = "Work";
|
||||
PCSZ pname = "Work";
|
||||
|
||||
sprintf(g->Message,
|
||||
"Not enough memory in %s area for request of %u (used=%d free=%d)",
|
||||
pname, (uint) size, pph->To_Free, pph->FreeBlk);
|
||||
pname, (uint)size, pph->To_Free, pph->FreeBlk);
|
||||
|
||||
if (trace)
|
||||
htrc("PlugSubAlloc: %s\n", g->Message);
|
||||
|
||||
/* Nothing we can do if longjmp is not initialized. */
|
||||
assert(g->jump_level >= 0);
|
||||
longjmp(g->jumper[g->jump_level], 1);
|
||||
throw 1234;
|
||||
} /* endif size OS32 code */
|
||||
|
||||
/*********************************************************************/
|
||||
/* Do the suballocation the simplest way. */
|
||||
/*********************************************************************/
|
||||
memp = MakePtr(memp, pph->To_Free); /* Points to suballocated block */
|
||||
pph->To_Free += size; /* New offset of pool free block */
|
||||
pph->FreeBlk -= size; /* New size of pool free block */
|
||||
pph->To_Free += (OFFSET)size; /* New offset of pool free block */
|
||||
pph->FreeBlk -= (uint)size; /* New size of pool free block */
|
||||
|
||||
if (trace > 3)
|
||||
htrc("Done memp=%p used=%d free=%d\n",
|
@@ -7,14 +7,14 @@
|
||||
/* Struct of variables used by the date format pre-parser. */
|
||||
/***********************************************************************/
|
||||
typedef struct _datpar {
|
||||
char *Format; // Points to format to decode
|
||||
const char *Format; // Points to format to decode
|
||||
char *Curp; // Points to current parsing position
|
||||
char *InFmt; // Start of input format
|
||||
char *OutFmt; // Start of output format
|
||||
int Index[8]; // Indexes of date values
|
||||
int Num; // Number of values to retrieve
|
||||
int Flag; // 1: Input, 2: Output, 4: no output blank
|
||||
int Outsize; // Size of output buffers
|
||||
int Outsize; // Size of output buffers
|
||||
} DATPAR, *PDTP;
|
||||
|
||||
/***********************************************************************/
|
||||
|
@@ -88,7 +88,7 @@ PTOS RELDEF::GetTopt(void)
|
||||
/***********************************************************************/
|
||||
/* This function sets an integer table information. */
|
||||
/***********************************************************************/
|
||||
bool RELDEF::SetIntCatInfo(PSZ what, int n)
|
||||
bool RELDEF::SetIntCatInfo(PCSZ what, int n)
|
||||
{
|
||||
return Hc->SetIntegerOption(what, n);
|
||||
} // end of SetIntCatInfo
|
||||
@@ -96,7 +96,7 @@ bool RELDEF::SetIntCatInfo(PSZ what, int n)
|
||||
/***********************************************************************/
|
||||
/* This function returns integer table information. */
|
||||
/***********************************************************************/
|
||||
int RELDEF::GetIntCatInfo(PSZ what, int idef)
|
||||
int RELDEF::GetIntCatInfo(PCSZ what, int idef)
|
||||
{
|
||||
int n= Hc->GetIntegerOption(what);
|
||||
|
||||
@@ -106,7 +106,7 @@ int RELDEF::GetIntCatInfo(PSZ what, int idef)
|
||||
/***********************************************************************/
|
||||
/* This function returns Boolean table information. */
|
||||
/***********************************************************************/
|
||||
bool RELDEF::GetBoolCatInfo(PSZ what, bool bdef)
|
||||
bool RELDEF::GetBoolCatInfo(PCSZ what, bool bdef)
|
||||
{
|
||||
bool b= Hc->GetBooleanOption(what, bdef);
|
||||
|
||||
@@ -116,9 +116,10 @@ bool RELDEF::GetBoolCatInfo(PSZ what, bool bdef)
|
||||
/***********************************************************************/
|
||||
/* This function returns size catalog information. */
|
||||
/***********************************************************************/
|
||||
int RELDEF::GetSizeCatInfo(PSZ what, PSZ sdef)
|
||||
int RELDEF::GetSizeCatInfo(PCSZ what, PCSZ sdef)
|
||||
{
|
||||
char * s, c;
|
||||
char c;
|
||||
PCSZ s;
|
||||
int i, n= 0;
|
||||
|
||||
if (!(s= Hc->GetStringOption(what)))
|
||||
@@ -138,9 +139,9 @@ int RELDEF::GetSizeCatInfo(PSZ what, PSZ sdef)
|
||||
/***********************************************************************/
|
||||
/* This function sets char table information in buf. */
|
||||
/***********************************************************************/
|
||||
int RELDEF::GetCharCatInfo(PSZ what, PSZ sdef, char *buf, int size)
|
||||
int RELDEF::GetCharCatInfo(PCSZ what, PCSZ sdef, char *buf, int size)
|
||||
{
|
||||
char *s= Hc->GetStringOption(what);
|
||||
PCSZ s= Hc->GetStringOption(what);
|
||||
|
||||
strncpy(buf, ((s) ? s : sdef), size);
|
||||
return size;
|
||||
@@ -158,9 +159,10 @@ bool RELDEF::Partitioned(void)
|
||||
/* This function returns string table information. */
|
||||
/* Default parameter is "*" to get the handler default. */
|
||||
/***********************************************************************/
|
||||
char *RELDEF::GetStringCatInfo(PGLOBAL g, PSZ what, PSZ sdef)
|
||||
char *RELDEF::GetStringCatInfo(PGLOBAL g, PCSZ what, PCSZ sdef)
|
||||
{
|
||||
char *name, *sval= NULL, *s= Hc->GetStringOption(what, sdef);
|
||||
char *sval = NULL;
|
||||
PCSZ name, s= Hc->GetStringOption(what, sdef);
|
||||
|
||||
if (s) {
|
||||
if (!Hc->IsPartitioned() ||
|
||||
@@ -168,12 +170,12 @@ char *RELDEF::GetStringCatInfo(PGLOBAL g, PSZ what, PSZ sdef)
|
||||
&& stricmp(what, "connect")))
|
||||
sval= PlugDup(g, s);
|
||||
else
|
||||
sval= s;
|
||||
sval= (char*)s;
|
||||
|
||||
} else if (!stricmp(what, "filename")) {
|
||||
// Return default file name
|
||||
char *ftype= Hc->GetStringOption("Type", "*");
|
||||
int i, n;
|
||||
PCSZ ftype= Hc->GetStringOption("Type", "*");
|
||||
int i, n;
|
||||
|
||||
if (IsFileType(GetTypeID(ftype))) {
|
||||
name= Hc->GetPartName();
|
||||
@@ -251,9 +253,9 @@ bool TABDEF::Define(PGLOBAL g, PCATLG cat,
|
||||
/***********************************************************************/
|
||||
/* This function returns the database data path. */
|
||||
/***********************************************************************/
|
||||
PSZ TABDEF::GetPath(void)
|
||||
PCSZ TABDEF::GetPath(void)
|
||||
{
|
||||
return (Database) ? (PSZ)Database : (Hc) ? Hc->GetDataPath() : NULL;
|
||||
return (Database) ? Database : (Hc) ? Hc->GetDataPath() : NULL;
|
||||
} // end of GetPath
|
||||
|
||||
/***********************************************************************/
|
||||
@@ -277,8 +279,13 @@ int TABDEF::GetColCatInfo(PGLOBAL g)
|
||||
// Take care of the column definitions
|
||||
i= poff= nof= nlg= 0;
|
||||
|
||||
#if defined(__WIN__)
|
||||
// Offsets of HTML and DIR tables start from 0, DBF at 1
|
||||
loff= (tc == TAB_DBF) ? 1 : (tc == TAB_XML || tc == TAB_DIR) ? -1 : 0;
|
||||
loff= (tc == TAB_DBF) ? 1 : (tc == TAB_XML || tc == TAB_DIR) ? -1 : 0;
|
||||
#else // !__WIN__
|
||||
// Offsets of HTML tables start from 0, DIR and DBF at 1
|
||||
loff = (tc == TAB_DBF || tc == TAB_DIR) ? 1 : (tc == TAB_XML) ? -1 : 0;
|
||||
#endif // !__WIN__
|
||||
|
||||
while (true) {
|
||||
// Default Offset depends on table type
|
||||
@@ -540,7 +547,7 @@ PTABDEF OEMDEF::GetXdef(PGLOBAL g)
|
||||
#endif // 0
|
||||
|
||||
// Is the library already loaded?
|
||||
if (!Hdll)
|
||||
if (!Hdll && !(Hdll = dlopen(soname, RTLD_NOLOAD)))
|
||||
// Load the desired shared library
|
||||
if (!(Hdll = dlopen(soname, RTLD_LAZY))) {
|
||||
error = dlerror();
|
||||
@@ -610,9 +617,10 @@ bool OEMDEF::DefineAM(PGLOBAL g, LPCSTR, int)
|
||||
if (!*Module)
|
||||
Module = Subtype;
|
||||
|
||||
Desc = (char*)PlugSubAlloc(g, NULL, strlen(Module)
|
||||
+ strlen(Subtype) + 3);
|
||||
sprintf(Desc, "%s(%s)", Module, Subtype);
|
||||
char *desc = (char*)PlugSubAlloc(g, NULL, strlen(Module)
|
||||
+ strlen(Subtype) + 3);
|
||||
sprintf(desc, "%s(%s)", Module, Subtype);
|
||||
Desc = desc;
|
||||
return false;
|
||||
} // end of DefineAM
|
||||
|
||||
|
@@ -42,13 +42,13 @@ class DllExport RELDEF : public BLOCK { // Relation definition block
|
||||
|
||||
// Methods
|
||||
PTOS GetTopt(void);
|
||||
bool GetBoolCatInfo(PSZ what, bool bdef);
|
||||
bool SetIntCatInfo(PSZ what, int ival);
|
||||
bool GetBoolCatInfo(PCSZ what, bool bdef);
|
||||
bool SetIntCatInfo(PCSZ what, int ival);
|
||||
bool Partitioned(void);
|
||||
int GetIntCatInfo(PSZ what, int idef);
|
||||
int GetSizeCatInfo(PSZ what, PSZ sdef);
|
||||
int GetCharCatInfo(PSZ what, PSZ sdef, char *buf, int size);
|
||||
char *GetStringCatInfo(PGLOBAL g, PSZ what, PSZ sdef);
|
||||
int GetIntCatInfo(PCSZ what, int idef);
|
||||
int GetSizeCatInfo(PCSZ what, PCSZ sdef);
|
||||
int GetCharCatInfo(PCSZ what, PCSZ sdef, char *buf, int size);
|
||||
char *GetStringCatInfo(PGLOBAL g, PCSZ what, PCSZ sdef);
|
||||
virtual int Indexable(void) {return 0;}
|
||||
virtual bool Define(PGLOBAL g, PCATLG cat,
|
||||
LPCSTR name, LPCSTR schema, LPCSTR am) = 0;
|
||||
@@ -84,7 +84,7 @@ public:
|
||||
void SetNext(PTABDEF tdfp) {Next = tdfp;}
|
||||
int GetMultiple(void) {return Multiple;}
|
||||
int GetPseudo(void) {return Pseudo;}
|
||||
PSZ GetPath(void);
|
||||
PCSZ GetPath(void);
|
||||
//PSZ GetPath(void)
|
||||
// {return (Database) ? (PSZ)Database : Cat->GetDataPath();}
|
||||
bool SepIndex(void) {return GetBoolCatInfo("SepIndex", false);}
|
||||
@@ -105,8 +105,8 @@ public:
|
||||
|
||||
protected:
|
||||
// Members
|
||||
PSZ Schema; /* Table schema (for ODBC) */
|
||||
PSZ Desc; /* Table description */
|
||||
PCSZ Schema; /* Table schema (for ODBC) */
|
||||
PCSZ Desc; /* Table description */
|
||||
uint Catfunc; /* Catalog function ID */
|
||||
int Card; /* (max) number of rows in table */
|
||||
int Elemt; /* Number of rows in blocks or rowset */
|
||||
|
@@ -73,7 +73,7 @@ PTABLE XTAB::Link(PTABLE tab2)
|
||||
/***********************************************************************/
|
||||
/* Make file output of XTAB contents. */
|
||||
/***********************************************************************/
|
||||
void XTAB::Print(PGLOBAL g, FILE *f, uint n)
|
||||
void XTAB::Printf(PGLOBAL g, FILE *f, uint n)
|
||||
{
|
||||
char m[64];
|
||||
|
||||
@@ -86,12 +86,12 @@ void XTAB::Print(PGLOBAL g, FILE *f, uint n)
|
||||
PlugPutOut(g, f, TYPE_TDB, tp->To_Tdb, n + 2);
|
||||
} /* endfor tp */
|
||||
|
||||
} /* end of Print */
|
||||
} /* end of Printf */
|
||||
|
||||
/***********************************************************************/
|
||||
/* Make string output of XTAB contents. */
|
||||
/***********************************************************************/
|
||||
void XTAB::Print(PGLOBAL, char *ps, uint z)
|
||||
void XTAB::Prints(PGLOBAL, char *ps, uint z)
|
||||
{
|
||||
char buf[128];
|
||||
int i, n = (int)z - 1;
|
||||
@@ -105,7 +105,7 @@ void XTAB::Print(PGLOBAL, char *ps, uint z)
|
||||
n -= i;
|
||||
} // endif tp
|
||||
|
||||
} /* end of Print */
|
||||
} /* end of Prints */
|
||||
|
||||
|
||||
/***********************************************************************/
|
||||
@@ -134,7 +134,7 @@ bool COLUMN::SetFormat(PGLOBAL g, FORMAT&)
|
||||
/***********************************************************************/
|
||||
/* Make file output of COLUMN contents. */
|
||||
/***********************************************************************/
|
||||
void COLUMN::Print(PGLOBAL g, FILE *f, uint n)
|
||||
void COLUMN::Printf(PGLOBAL g, FILE *f, uint n)
|
||||
{
|
||||
char m[64];
|
||||
|
||||
@@ -149,12 +149,12 @@ void COLUMN::Print(PGLOBAL g, FILE *f, uint n)
|
||||
|
||||
PlugPutOut(g, f, TYPE_TABLE, To_Table, n + 2);
|
||||
PlugPutOut(g, f, TYPE_XOBJECT, To_Col, n + 2);
|
||||
} /* end of Print */
|
||||
} /* end of Printf */
|
||||
|
||||
/***********************************************************************/
|
||||
/* Make string output of COLUMN contents. */
|
||||
/***********************************************************************/
|
||||
void COLUMN::Print(PGLOBAL, char *ps, uint z)
|
||||
void COLUMN::Prints(PGLOBAL, char *ps, uint z)
|
||||
{
|
||||
char buf[80];
|
||||
|
||||
@@ -166,4 +166,4 @@ void COLUMN::Print(PGLOBAL, char *ps, uint z)
|
||||
|
||||
strncpy(ps, buf, z);
|
||||
ps[z - 1] = '\0';
|
||||
} /* end of Print */
|
||||
} /* end of Prints */
|
||||
|
@@ -38,8 +38,8 @@ class DllExport XTAB: public BLOCK { // Table Name-Schema-Srcdef block.
|
||||
|
||||
// Methods
|
||||
PTABLE Link(PTABLE);
|
||||
void Print(PGLOBAL g, FILE *f, uint n);
|
||||
void Print(PGLOBAL g, char *ps, uint z);
|
||||
void Printf(PGLOBAL g, FILE *f, uint n);
|
||||
void Prints(PGLOBAL g, char *ps, uint z);
|
||||
|
||||
protected:
|
||||
// Members
|
||||
@@ -78,8 +78,8 @@ class DllExport COLUMN: public XOBJECT { // Column Name/Qualifier block.
|
||||
void SetTo_Col(PCOL colp) {To_Col = colp;}
|
||||
|
||||
// Methods
|
||||
virtual void Print(PGLOBAL g, FILE *f, uint n);
|
||||
virtual void Print(PGLOBAL g, char *ps, uint z);
|
||||
virtual void Printf(PGLOBAL g, FILE *f, uint n);
|
||||
virtual void Prints(PGLOBAL g, char *ps, uint z);
|
||||
// All methods below should never be used for COLUMN's
|
||||
virtual void Reset(void) {assert(false);}
|
||||
virtual bool Compare(PXOB) {assert(false); return false;}
|
||||
|
@@ -1,11 +1,11 @@
|
||||
/************* TabDos C++ Program Source Code File (.CPP) **************/
|
||||
/* PROGRAM NAME: TABDOS */
|
||||
/* ------------- */
|
||||
/* Version 4.9.2 */
|
||||
/* Version 4.9.3 */
|
||||
/* */
|
||||
/* COPYRIGHT: */
|
||||
/* ---------- */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 1998-2016 */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 1998-2017 */
|
||||
/* */
|
||||
/* WHAT THIS PROGRAM DOES: */
|
||||
/* ----------------------- */
|
||||
@@ -98,6 +98,7 @@ DOSDEF::DOSDEF(void)
|
||||
Ofn = NULL;
|
||||
Entry = NULL;
|
||||
To_Indx = NULL;
|
||||
Pwd = NULL;
|
||||
Recfm = RECFM_VAR;
|
||||
Mapped = false;
|
||||
Zipped = false;
|
||||
@@ -131,7 +132,8 @@ bool DOSDEF::DefineAM(PGLOBAL g, LPCSTR am, int)
|
||||
bool map = (am && (*am == 'M' || *am == 'm'));
|
||||
LPCSTR dfm = (am && (*am == 'F' || *am == 'f')) ? "F"
|
||||
: (am && (*am == 'B' || *am == 'b')) ? "B"
|
||||
: (am && !stricmp(am, "DBF")) ? "D" : "V";
|
||||
: (am && (*am == 'X' || *am == 'x')) ? "X"
|
||||
: (am && !stricmp(am, "DBF")) ? "D" : "V";
|
||||
|
||||
if ((Zipped = GetBoolCatInfo("Zipped", false))) {
|
||||
Entry = GetStringCatInfo(g, "Entry", NULL);
|
||||
@@ -139,14 +141,16 @@ bool DOSDEF::DefineAM(PGLOBAL g, LPCSTR am, int)
|
||||
: false;
|
||||
Mulentries = GetBoolCatInfo("Mulentries", Mulentries);
|
||||
Append = GetBoolCatInfo("Append", false);
|
||||
}
|
||||
Pwd = GetStringCatInfo(g, "Password", NULL);
|
||||
} // endif Zipped
|
||||
|
||||
Desc = Fn = GetStringCatInfo(g, "Filename", NULL);
|
||||
Ofn = GetStringCatInfo(g, "Optname", Fn);
|
||||
GetCharCatInfo("Recfm", (PSZ)dfm, buf, sizeof(buf));
|
||||
Recfm = (toupper(*buf) == 'F') ? RECFM_FIX :
|
||||
(toupper(*buf) == 'B') ? RECFM_BIN :
|
||||
(toupper(*buf) == 'D') ? RECFM_DBF : RECFM_VAR;
|
||||
(toupper(*buf) == 'X') ? RECFM_NAF : // MGO
|
||||
(toupper(*buf) == 'D') ? RECFM_DBF : RECFM_VAR;
|
||||
Lrecl = GetIntCatInfo("Lrecl", 0);
|
||||
|
||||
if (Recfm != RECFM_DBF)
|
||||
@@ -180,7 +184,7 @@ bool DOSDEF::DefineAM(PGLOBAL g, LPCSTR am, int)
|
||||
/***********************************************************************/
|
||||
bool DOSDEF::GetOptFileName(PGLOBAL g, char *filename)
|
||||
{
|
||||
char *ftype;
|
||||
PCSZ ftype;
|
||||
|
||||
switch (Recfm) {
|
||||
case RECFM_VAR: ftype = ".dop"; break;
|
||||
@@ -237,9 +241,9 @@ void DOSDEF::RemoveOptValues(PGLOBAL g)
|
||||
/***********************************************************************/
|
||||
bool DOSDEF::DeleteIndexFile(PGLOBAL g, PIXDEF pxdf)
|
||||
{
|
||||
char *ftype;
|
||||
char filename[_MAX_PATH];
|
||||
bool sep, rc = false;
|
||||
PCSZ ftype;
|
||||
char filename[_MAX_PATH];
|
||||
bool sep, rc = false;
|
||||
|
||||
if (!To_Indx)
|
||||
return false; // No index
|
||||
@@ -351,7 +355,7 @@ PTDB DOSDEF::GetTable(PGLOBAL g, MODE mode)
|
||||
if (Zipped) {
|
||||
#if defined(ZIP_SUPPORT)
|
||||
if (Recfm == RECFM_VAR) {
|
||||
if (mode == MODE_READ || mode == MODE_ANY) {
|
||||
if (mode == MODE_READ || mode == MODE_ANY || mode == MODE_ALTER) {
|
||||
txfp = new(g) UNZFAM(this);
|
||||
} else if (mode == MODE_INSERT) {
|
||||
txfp = new(g) ZIPFAM(this);
|
||||
@@ -362,7 +366,7 @@ PTDB DOSDEF::GetTable(PGLOBAL g, MODE mode)
|
||||
|
||||
tdbp = new(g) TDBDOS(this, txfp);
|
||||
} else {
|
||||
if (mode == MODE_READ || mode == MODE_ANY) {
|
||||
if (mode == MODE_READ || mode == MODE_ANY || mode == MODE_ALTER) {
|
||||
txfp = new(g) UZXFAM(this);
|
||||
} else if (mode == MODE_INSERT) {
|
||||
txfp = new(g) ZPXFAM(this);
|
||||
@@ -1509,8 +1513,8 @@ PBF TDBDOS::CheckBlockFilari(PGLOBAL g, PXOB *arg, int op, bool *cnv)
|
||||
if (n == 8 && ctype != TYPE_LIST) {
|
||||
// Should never happen
|
||||
strcpy(g->Message, "Block opt: bad constant");
|
||||
longjmp(g->jumper[g->jump_level], 99);
|
||||
} // endif Conv
|
||||
throw 99;
|
||||
} // endif Conv
|
||||
|
||||
if (type[0] == 1) {
|
||||
// Make it always as Column-op-Value
|
||||
@@ -1790,8 +1794,8 @@ err:
|
||||
/* Make a dynamic index. */
|
||||
/***********************************************************************/
|
||||
bool TDBDOS::InitialyzeIndex(PGLOBAL g, volatile PIXDEF xdp, bool sorted)
|
||||
{
|
||||
int k, rc;
|
||||
{
|
||||
int k;
|
||||
volatile bool dynamic;
|
||||
bool brc;
|
||||
PCOL colp;
|
||||
@@ -1861,13 +1865,7 @@ bool TDBDOS::InitialyzeIndex(PGLOBAL g, volatile PIXDEF xdp, bool sorted)
|
||||
} else // Column contains same values as ROWID
|
||||
kxp = new(g) XXROW(this);
|
||||
|
||||
// Prepare error return
|
||||
if (g->jump_level == MAX_JUMP) {
|
||||
strcpy(g->Message, MSG(TOO_MANY_JUMPS));
|
||||
return true;
|
||||
} // endif
|
||||
|
||||
if (!(rc = setjmp(g->jumper[++g->jump_level])) != 0) {
|
||||
try {
|
||||
if (dynamic) {
|
||||
ResetBlockFilter(g);
|
||||
kxp->SetDynamic(dynamic);
|
||||
@@ -1892,12 +1890,17 @@ bool TDBDOS::InitialyzeIndex(PGLOBAL g, volatile PIXDEF xdp, bool sorted)
|
||||
|
||||
} // endif brc
|
||||
|
||||
} else
|
||||
brc = true;
|
||||
} catch (int n) {
|
||||
if (trace)
|
||||
htrc("Exception %d: %s\n", n, g->Message);
|
||||
brc = true;
|
||||
} catch (const char *msg) {
|
||||
strcpy(g->Message, msg);
|
||||
brc = true;
|
||||
} // end catch
|
||||
|
||||
g->jump_level--;
|
||||
return brc;
|
||||
} // end of InitialyzeIndex
|
||||
return brc;
|
||||
} // end of InitialyzeIndex
|
||||
|
||||
/***********************************************************************/
|
||||
/* DOS GetProgMax: get the max value for progress information. */
|
||||
@@ -2118,7 +2121,8 @@ bool TDBDOS::OpenDB(PGLOBAL g)
|
||||
return false;
|
||||
} // endif use
|
||||
|
||||
if (Mode == MODE_DELETE && !Next && Txfp->GetAmType() != TYPE_AM_DOS) {
|
||||
if (Mode == MODE_DELETE && !Next && Txfp->GetAmType() != TYPE_AM_DOS
|
||||
&& Txfp->GetAmType() != TYPE_AM_MGO) {
|
||||
// Delete all lines. Not handled in MAP or block mode
|
||||
Txfp = new(g) DOSFAM((PDOSDEF)To_Def);
|
||||
Txfp->SetTdbp(this);
|
||||
@@ -2156,16 +2160,18 @@ bool TDBDOS::OpenDB(PGLOBAL g)
|
||||
To_BlkFil = InitBlockFilter(g, To_Filter);
|
||||
|
||||
/*********************************************************************/
|
||||
/* Allocate the line buffer plus a null character. */
|
||||
/*********************************************************************/
|
||||
To_Line = (char*)PlugSubAlloc(g, NULL, Lrecl + 1);
|
||||
/* Lrecl does not include line ending */
|
||||
/*********************************************************************/
|
||||
size_t linelen = Lrecl + ((PDOSDEF)To_Def)->Ending + 1;
|
||||
|
||||
To_Line = (char*)PlugSubAlloc(g, NULL, linelen);
|
||||
|
||||
if (Mode == MODE_INSERT) {
|
||||
// Spaces between fields must be filled with blanks
|
||||
memset(To_Line, ' ', Lrecl);
|
||||
To_Line[Lrecl] = '\0';
|
||||
} else
|
||||
memset(To_Line, 0, Lrecl + 1);
|
||||
memset(To_Line, 0, linelen);
|
||||
|
||||
if (trace)
|
||||
htrc("OpenDos: R%hd mode=%d To_Line=%p\n", Tdb_No, Mode, To_Line);
|
||||
@@ -2304,8 +2310,8 @@ void TDBDOS::CloseDB(PGLOBAL g)
|
||||
/***********************************************************************/
|
||||
/* DOSCOL public constructor (also called by MAPCOL). */
|
||||
/***********************************************************************/
|
||||
DOSCOL::DOSCOL(PGLOBAL g, PCOLDEF cdp, PTDB tp, PCOL cp, int i, PSZ am)
|
||||
: COLBLK(cdp, tp, i)
|
||||
DOSCOL::DOSCOL(PGLOBAL g, PCOLDEF cdp, PTDB tp, PCOL cp, int i, PCSZ am)
|
||||
: COLBLK(cdp, tp, i)
|
||||
{
|
||||
char *p;
|
||||
int prec = Format.Prec;
|
||||
@@ -2335,7 +2341,7 @@ DOSCOL::DOSCOL(PGLOBAL g, PCOLDEF cdp, PTDB tp, PCOL cp, int i, PSZ am)
|
||||
Dval = NULL;
|
||||
Buf = NULL;
|
||||
|
||||
if (txfp->Blocked && Opt && (cdp->GetMin() || cdp->GetDval())) {
|
||||
if (txfp && txfp->Blocked && Opt && (cdp->GetMin() || cdp->GetDval())) {
|
||||
int nblk = txfp->GetBlock();
|
||||
|
||||
Clustered = (cdp->GetXdb2()) ? 2 : 1;
|
||||
@@ -2514,8 +2520,8 @@ void DOSCOL::ReadColumn(PGLOBAL g)
|
||||
if (rc == RC_EF)
|
||||
sprintf(g->Message, MSG(INV_DEF_READ), rc);
|
||||
|
||||
longjmp(g->jumper[g->jump_level], 11);
|
||||
} // endif
|
||||
throw 11;
|
||||
} // endif
|
||||
|
||||
p = tdbp->To_Line + Deplac;
|
||||
field = Long;
|
||||
@@ -2570,8 +2576,8 @@ void DOSCOL::ReadColumn(PGLOBAL g)
|
||||
break;
|
||||
default:
|
||||
sprintf(g->Message, MSG(BAD_RECFM), tdbp->Ftype);
|
||||
longjmp(g->jumper[g->jump_level], 34);
|
||||
} // endswitch Ftype
|
||||
throw 34;
|
||||
} // endswitch Ftype
|
||||
|
||||
// Set null when applicable
|
||||
if (Nullable)
|
||||
@@ -2679,8 +2685,8 @@ void DOSCOL::WriteColumn(PGLOBAL g)
|
||||
break;
|
||||
default:
|
||||
sprintf(g->Message, "Invalid field format for column %s", Name);
|
||||
longjmp(g->jumper[g->jump_level], 31);
|
||||
} // endswitch BufType
|
||||
throw 31;
|
||||
} // endswitch BufType
|
||||
|
||||
p2 = Buf;
|
||||
} else // Standard CONNECT format
|
||||
@@ -2691,8 +2697,8 @@ void DOSCOL::WriteColumn(PGLOBAL g)
|
||||
|
||||
if ((len = strlen(p2)) > field) {
|
||||
sprintf(g->Message, MSG(VALUE_TOO_LONG), p2, Name, field);
|
||||
longjmp(g->jumper[g->jump_level], 31);
|
||||
} else if (Dsp)
|
||||
throw 31;
|
||||
} else if (Dsp)
|
||||
for (i = 0; i < len; i++)
|
||||
if (p2[i] == '.')
|
||||
p2[i] = Dsp;
|
||||
@@ -2863,13 +2869,5 @@ bool DOSCOL::AddDistinctValue(PGLOBAL g)
|
||||
return false;
|
||||
} // end of AddDistinctValue
|
||||
|
||||
/***********************************************************************/
|
||||
/* Make file output of a Dos column descriptor block. */
|
||||
/***********************************************************************/
|
||||
void DOSCOL::Print(PGLOBAL g, FILE *f, uint n)
|
||||
{
|
||||
COLBLK::Print(g, f, n);
|
||||
} // end of Print
|
||||
|
||||
/* ------------------------------------------------------------------- */
|
||||
|
||||
|
@@ -39,9 +39,9 @@ class DllExport DOSDEF : public TABDEF { /* Logical table description */
|
||||
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;}
|
||||
PSZ GetEntry(void) {return Entry;}
|
||||
PCSZ GetFn(void) {return Fn;}
|
||||
PCSZ GetOfn(void) {return Ofn;}
|
||||
PCSZ GetEntry(void) {return Entry;}
|
||||
bool GetMul(void) {return Mulentries;}
|
||||
bool GetAppend(void) {return Append;}
|
||||
void SetBlock(int block) { Block = block; }
|
||||
@@ -74,9 +74,10 @@ class DllExport DOSDEF : public TABDEF { /* Logical table description */
|
||||
//virtual bool Erase(char *filename);
|
||||
|
||||
// Members
|
||||
PSZ Fn; /* Path/Name of corresponding file */
|
||||
PSZ Ofn; /* Base Path/Name of matching index files*/
|
||||
PSZ Entry; /* Zip entry name or pattern */
|
||||
PCSZ Fn; /* Path/Name of corresponding file */
|
||||
PCSZ Ofn; /* Base Path/Name of matching index files*/
|
||||
PCSZ Entry; /* Zip entry name or pattern */
|
||||
PCSZ Pwd; /* Zip password */
|
||||
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 */
|
||||
@@ -132,8 +133,8 @@ class DllExport TDBDOS : public TDBASE {
|
||||
|
||||
// Implementation
|
||||
virtual AMT GetAmType(void) {return Txfp->GetAmType();}
|
||||
virtual PSZ GetFile(PGLOBAL) {return Txfp->To_File;}
|
||||
virtual void SetFile(PGLOBAL, PSZ fn) {Txfp->To_File = fn;}
|
||||
virtual PCSZ GetFile(PGLOBAL) {return Txfp->To_File;}
|
||||
virtual void SetFile(PGLOBAL, PCSZ fn) {Txfp->To_File = fn;}
|
||||
virtual void SetAbort(bool b) {Abort = b;}
|
||||
virtual RECFM GetFtype(void) {return Ftype;}
|
||||
virtual bool SkipHeader(PGLOBAL) {return false;}
|
||||
@@ -213,7 +214,7 @@ class DllExport DOSCOL : public COLBLK {
|
||||
friend class TDBFIX;
|
||||
public:
|
||||
// Constructors
|
||||
DOSCOL(PGLOBAL g, PCOLDEF cdp, PTDB tp, PCOL cp, int i, PSZ am = "DOS");
|
||||
DOSCOL(PGLOBAL g, PCOLDEF cdp, PTDB tp, PCOL cp, int i, PCSZ am = "DOS");
|
||||
DOSCOL(DOSCOL *colp, PTDB tdbp); // Constructor used in copy process
|
||||
|
||||
// Implementation
|
||||
@@ -231,12 +232,10 @@ class DllExport DOSCOL : public COLBLK {
|
||||
virtual PVBLK GetDval(void) {return Dval;}
|
||||
|
||||
// Methods
|
||||
using COLBLK::Print;
|
||||
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);
|
||||
|
@@ -35,9 +35,9 @@
|
||||
/***********************************************************************/
|
||||
/* CONDFIL Constructor. */
|
||||
/***********************************************************************/
|
||||
CONDFIL::CONDFIL(const Item *cond, uint idx, AMT type)
|
||||
CONDFIL::CONDFIL(uint idx, AMT type)
|
||||
{
|
||||
Cond = cond;
|
||||
//Cond = cond;
|
||||
Idx = idx;
|
||||
Type = type;
|
||||
Op = OP_XX;
|
||||
@@ -61,7 +61,7 @@ int CONDFIL::Init(PGLOBAL g, PHC hc)
|
||||
bool h;
|
||||
|
||||
if (options)
|
||||
alt = GetListOption(g, "Alias", options->oplist, NULL);
|
||||
alt = (char*)GetListOption(g, "Alias", options->oplist, NULL);
|
||||
|
||||
while (alt) {
|
||||
if (!(p = strchr(alt, '='))) {
|
||||
@@ -267,7 +267,7 @@ TDBEXT::TDBEXT(PTDBEXT tdbp) : TDB(tdbp)
|
||||
/******************************************************************/
|
||||
/* Convert an UTF-8 string to latin characters. */
|
||||
/******************************************************************/
|
||||
int TDBEXT::Decode(char *txt, char *buf, size_t n)
|
||||
int TDBEXT::Decode(PCSZ txt, char *buf, size_t n)
|
||||
{
|
||||
uint dummy_errors;
|
||||
uint32 len = copy_and_convert(buf, n, &my_charset_latin1,
|
||||
@@ -285,20 +285,20 @@ int TDBEXT::Decode(char *txt, char *buf, size_t n)
|
||||
/***********************************************************************/
|
||||
bool TDBEXT::MakeSQL(PGLOBAL g, bool cnt)
|
||||
{
|
||||
char *schmp = NULL, *catp = NULL, buf[NAM_LEN * 3];
|
||||
PCSZ schmp = NULL;
|
||||
char *catp = NULL, buf[NAM_LEN * 3];
|
||||
int len;
|
||||
bool oom = false, first = true;
|
||||
bool first = true;
|
||||
PTABLE tablep = To_Table;
|
||||
PCOL colp;
|
||||
|
||||
if (Srcdef) {
|
||||
if ((catp = strstr(Srcdef, "%s"))) {
|
||||
char *fil1, *fil2;
|
||||
PSZ ph = ((EXTDEF*)To_Def)->Phpos;
|
||||
PCSZ ph = ((EXTDEF*)To_Def)->Phpos;
|
||||
|
||||
if (!ph)
|
||||
ph = (strstr(catp + 2, "%s")) ? const_cast<char*>("WH") :
|
||||
const_cast<char*>("W");
|
||||
ph = (strstr(catp + 2, "%s")) ? "WH" : "W";
|
||||
|
||||
if (stricmp(ph, "H")) {
|
||||
fil1 = (To_CondFil && *To_CondFil->Body)
|
||||
@@ -342,7 +342,7 @@ bool TDBEXT::MakeSQL(PGLOBAL g, bool cnt)
|
||||
for (colp = Columns; colp; colp = colp->GetNext())
|
||||
if (!colp->IsSpecial()) {
|
||||
if (!first)
|
||||
oom |= Query->Append(", ");
|
||||
Query->Append(", ");
|
||||
else
|
||||
first = false;
|
||||
|
||||
@@ -351,11 +351,11 @@ bool TDBEXT::MakeSQL(PGLOBAL g, bool cnt)
|
||||
|
||||
if (Quote) {
|
||||
// Put column name between identifier quotes in case in contains blanks
|
||||
oom |= Query->Append(Quote);
|
||||
oom |= Query->Append(buf);
|
||||
oom |= Query->Append(Quote);
|
||||
Query->Append(Quote);
|
||||
Query->Append(buf);
|
||||
Query->Append(Quote);
|
||||
} else
|
||||
oom |= Query->Append(buf);
|
||||
Query->Append(buf);
|
||||
|
||||
((PEXTCOL)colp)->SetRank(++Ncol);
|
||||
} // endif colp
|
||||
@@ -363,13 +363,13 @@ bool TDBEXT::MakeSQL(PGLOBAL g, bool cnt)
|
||||
} else
|
||||
// !Columns can occur for queries such that sql count(*) from...
|
||||
// for which we will count the rows from sql * from...
|
||||
oom |= Query->Append('*');
|
||||
Query->Append('*');
|
||||
|
||||
} else
|
||||
// SQL statement used to retrieve the size of the result
|
||||
oom |= Query->Append("count(*)");
|
||||
Query->Append("count(*)");
|
||||
|
||||
oom |= Query->Append(" FROM ");
|
||||
Query->Append(" FROM ");
|
||||
|
||||
if (Catalog && *Catalog)
|
||||
catp = Catalog;
|
||||
@@ -381,17 +381,17 @@ bool TDBEXT::MakeSQL(PGLOBAL g, bool cnt)
|
||||
schmp = Schema;
|
||||
|
||||
if (catp) {
|
||||
oom |= Query->Append(catp);
|
||||
Query->Append(catp);
|
||||
|
||||
if (schmp) {
|
||||
oom |= Query->Append('.');
|
||||
oom |= Query->Append(schmp);
|
||||
Query->Append('.');
|
||||
Query->Append(schmp);
|
||||
} // endif schmp
|
||||
|
||||
oom |= Query->Append('.');
|
||||
Query->Append('.');
|
||||
} else if (schmp) {
|
||||
oom |= Query->Append(schmp);
|
||||
oom |= Query->Append('.');
|
||||
Query->Append(schmp);
|
||||
Query->Append('.');
|
||||
} // endif schmp
|
||||
|
||||
// Table name can be encoded in UTF-8
|
||||
@@ -399,18 +399,18 @@ bool TDBEXT::MakeSQL(PGLOBAL g, bool cnt)
|
||||
|
||||
if (Quote) {
|
||||
// Put table name between identifier quotes in case in contains blanks
|
||||
oom |= Query->Append(Quote);
|
||||
oom |= Query->Append(buf);
|
||||
oom |= Query->Append(Quote);
|
||||
Query->Append(Quote);
|
||||
Query->Append(buf);
|
||||
Query->Append(Quote);
|
||||
} else
|
||||
oom |= Query->Append(buf);
|
||||
Query->Append(buf);
|
||||
|
||||
len = Query->GetLength();
|
||||
|
||||
if (To_CondFil) {
|
||||
if (Mode == MODE_READ) {
|
||||
oom |= Query->Append(" WHERE ");
|
||||
oom |= Query->Append(To_CondFil->Body);
|
||||
Query->Append(" WHERE ");
|
||||
Query->Append(To_CondFil->Body);
|
||||
len = Query->GetLength() + 1;
|
||||
} else
|
||||
len += (strlen(To_CondFil->Body) + 256);
|
||||
@@ -418,10 +418,11 @@ bool TDBEXT::MakeSQL(PGLOBAL g, bool cnt)
|
||||
} else
|
||||
len += ((Mode == MODE_READX) ? 256 : 1);
|
||||
|
||||
if (oom || Query->Resize(len)) {
|
||||
if (Query->IsTruncated()) {
|
||||
strcpy(g->Message, "MakeSQL: Out of memory");
|
||||
return true;
|
||||
} // endif oom
|
||||
} else
|
||||
Query->Resize(len);
|
||||
|
||||
if (trace)
|
||||
htrc("Query=%s\n", Query->GetStr());
|
||||
@@ -435,15 +436,17 @@ bool TDBEXT::MakeSQL(PGLOBAL g, bool cnt)
|
||||
/***********************************************************************/
|
||||
bool TDBEXT::MakeCommand(PGLOBAL g)
|
||||
{
|
||||
char *p, *stmt, name[68], *body = NULL;
|
||||
PCSZ schmp = NULL;
|
||||
char *p, *stmt, name[132], *body = NULL;
|
||||
char *qrystr = (char*)PlugSubAlloc(g, NULL, strlen(Qrystr) + 1);
|
||||
bool qtd = Quoted > 0;
|
||||
char q = qtd ? *Quote : ' ';
|
||||
int i = 0, k = 0;
|
||||
|
||||
// Make a lower case copy of the originale query and change
|
||||
// back ticks to the data source identifier quoting character
|
||||
do {
|
||||
qrystr[i] = (Qrystr[i] == '`') ? *Quote : tolower(Qrystr[i]);
|
||||
qrystr[i] = (Qrystr[i] == '`') ? q : tolower(Qrystr[i]);
|
||||
} while (Qrystr[i++]);
|
||||
|
||||
if (To_CondFil && (p = strstr(qrystr, " where "))) {
|
||||
@@ -460,27 +463,50 @@ bool TDBEXT::MakeCommand(PGLOBAL g)
|
||||
strlwr(strcat(strcat(strcpy(name, " "), Name), " "));
|
||||
|
||||
if (strstr(" update delete low_priority ignore quick from ", name)) {
|
||||
strlwr(strcat(strcat(strcpy(name, Quote), Name), Quote));
|
||||
k += 2;
|
||||
if (Quote) {
|
||||
strlwr(strcat(strcat(strcpy(name, Quote), Name), Quote));
|
||||
k += 2;
|
||||
} else {
|
||||
strcpy(g->Message, "Quoted must be specified");
|
||||
return true;
|
||||
} // endif Quote
|
||||
|
||||
} else
|
||||
strlwr(strcpy(name, Name)); // Not a keyword
|
||||
|
||||
if ((p = strstr(qrystr, name))) {
|
||||
for (i = 0; i < p - qrystr; i++)
|
||||
stmt[i] = (Qrystr[i] == '`') ? *Quote : Qrystr[i];
|
||||
stmt[i] = (Qrystr[i] == '`') ? q : Qrystr[i];
|
||||
|
||||
stmt[i] = 0;
|
||||
|
||||
k += i + (int)strlen(Name);
|
||||
|
||||
if (qtd && *(p - 1) == ' ')
|
||||
if (Schema && *Schema)
|
||||
schmp = Schema;
|
||||
|
||||
if (qtd && *(p - 1) == ' ') {
|
||||
if (schmp)
|
||||
strcat(strcat(stmt, schmp), ".");
|
||||
|
||||
strcat(strcat(strcat(stmt, Quote), TableName), Quote);
|
||||
else
|
||||
} else {
|
||||
if (schmp) {
|
||||
if (qtd && *(p - 1) != ' ') {
|
||||
stmt[i - 1] = 0;
|
||||
strcat(strcat(strcat(stmt, schmp), "."), Quote);
|
||||
} else
|
||||
strcat(strcat(stmt, schmp), ".");
|
||||
|
||||
} // endif schmp
|
||||
|
||||
strcat(stmt, TableName);
|
||||
} // endif's
|
||||
|
||||
i = (int)strlen(stmt);
|
||||
|
||||
do {
|
||||
stmt[i++] = (Qrystr[k] == '`') ? *Quote : Qrystr[k];
|
||||
stmt[i++] = (Qrystr[k] == '`') ? q : Qrystr[k];
|
||||
} while (Qrystr[k++]);
|
||||
|
||||
if (body)
|
||||
@@ -539,7 +565,7 @@ int TDBEXT::GetProgMax(PGLOBAL g)
|
||||
/***********************************************************************/
|
||||
/* EXTCOL public constructor. */
|
||||
/***********************************************************************/
|
||||
EXTCOL::EXTCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am)
|
||||
EXTCOL::EXTCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am)
|
||||
: COLBLK(cdp, tdbp, i)
|
||||
{
|
||||
if (cprec) {
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user