1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

Add mongoDB access to json tables.

Filalize replacement oflongjmp by throw.
  modified:   storage/connect/CMakeLists.txt
  modified:   storage/connect/array.cpp
  modified:   storage/connect/blkfil.cpp
  modified:   storage/connect/colblk.cpp
  modified:   storage/connect/connect.cc
  modified:   storage/connect/filamtxt.cpp
  modified:   storage/connect/filamvct.cpp
  modified:   storage/connect/filter.cpp
  modified:   storage/connect/ha_connect.cc
  modified:   storage/connect/jdbconn.cpp
  modified:   storage/connect/json.cpp
  modified:   storage/connect/jsonudf.cpp
  modified:   storage/connect/odbconn.cpp
  modified:   storage/connect/plgdbsem.h
  modified:   storage/connect/plgdbutl.cpp
  modified:   storage/connect/plugutil.cpp
  modified:   storage/connect/tabdos.cpp
  modified:   storage/connect/tabfix.cpp
  modified:   storage/connect/tabfmt.cpp
  modified:   storage/connect/tabjson.cpp
  modified:   storage/connect/tabjson.h
  modified:   storage/connect/tabmul.cpp
  modified:   storage/connect/tabmysql.cpp
  modified:   storage/connect/tabpivot.cpp
  modified:   storage/connect/tabsys.cpp
  modified:   storage/connect/tabvct.cpp
  modified:   storage/connect/tabvir.cpp
  modified:   storage/connect/tabxml.cpp
  modified:   storage/connect/valblk.cpp
  modified:   storage/connect/value.cpp
  modified:   storage/connect/xindex.cpp
  modified:   storage/connect/xobject.cpp
This commit is contained in:
Olivier Bertrand
2017-04-13 21:30:33 +02:00
parent 2c16792995
commit 9262ae65fc
34 changed files with 2072 additions and 2222 deletions

View File

@@ -38,7 +38,7 @@ user_connect.h valblk.h value.h xindex.h xobject.h xtable.h)
# Definitions that are shared for all OSes # Definitions that are shared for all OSes
# #
add_definitions( -DMARIADB -DFORCE_INIT_OF_VARS -Dconnect_EXPORTS) add_definitions( -DMARIADB -DFORCE_INIT_OF_VARS -Dconnect_EXPORTS)
add_definitions( -DHUGE_SUPPORT -DGZ_SUPPORT -DPIVOT_SUPPORT -DUSE_TRY ) add_definitions( -DHUGE_SUPPORT -DGZ_SUPPORT -DPIVOT_SUPPORT )
# #
@@ -291,6 +291,31 @@ IF(CONNECT_WITH_ZIP)
add_definitions(-DZIP_SUPPORT -DNOCRYPT) add_definitions(-DZIP_SUPPORT -DNOCRYPT)
ENDIF(CONNECT_WITH_ZIP) 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 # XMAP
@@ -310,6 +335,6 @@ MYSQL_ADD_PLUGIN(connect ${CONNECT_SOURCES}
STORAGE_ENGINE STORAGE_ENGINE
COMPONENT connect-engine COMPONENT connect-engine
RECOMPILE_FOR_EMBEDDED RECOMPILE_FOR_EMBEDDED
LINK_LIBRARIES ${ZLIB_LIBRARY} ${XML_LIBRARY} ${ICONV_LIBRARY} LINK_LIBRARIES ${ZLIB_LIBRARY} ${XML_LIBRARY} ${ICONV_LIBRARY} $(MONGO_LIBRARY)
${ODBC_LIBRARY} ${JDBC_LIBRARY} ${IPHLPAPI_LIBRARY}) ${ODBC_LIBRARY} ${JDBC_LIBRARY} ${IPHLPAPI_LIBRARY})

View File

@@ -519,11 +519,7 @@ bool ARRAY::FilTest(PGLOBAL g, PVAL valp, OPVAL opc, int opm)
} else if (opc != OP_EXIST) { } else if (opc != OP_EXIST) {
sprintf(g->Message, MSG(MISSING_ARG), opc); sprintf(g->Message, MSG(MISSING_ARG), opc);
#if defined(USE_TRY)
throw TYPE_ARRAY; throw TYPE_ARRAY;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_ARRAY);
#endif // !USE_TRY
} else // OP_EXIST } else // OP_EXIST
return Nval > 0; return Nval > 0;
@@ -685,22 +681,14 @@ void ARRAY::SetPrecision(PGLOBAL g, int p)
{ {
if (Vblp == NULL) { if (Vblp == NULL) {
strcpy(g->Message, MSG(PREC_VBLP_NULL)); strcpy(g->Message, MSG(PREC_VBLP_NULL));
#if defined(USE_TRY)
throw TYPE_ARRAY; throw TYPE_ARRAY;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_ARRAY);
#endif // !USE_TRY
} // endif Vblp } // endif Vblp
bool was = Vblp->IsCi(); bool was = Vblp->IsCi();
if (was && !p) { if (was && !p) {
strcpy(g->Message, MSG(BAD_SET_CASE)); strcpy(g->Message, MSG(BAD_SET_CASE));
#if defined(USE_TRY)
throw TYPE_ARRAY; throw TYPE_ARRAY;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_ARRAY);
#endif // !USE_TRY
} // endif Vblp } // endif Vblp
if (was || !p) if (was || !p)
@@ -711,11 +699,7 @@ void ARRAY::SetPrecision(PGLOBAL g, int p)
if (!was && Type == TYPE_STRING) if (!was && Type == TYPE_STRING)
// Must be resorted to eliminate duplicate strings // Must be resorted to eliminate duplicate strings
if (Sort(g)) if (Sort(g))
#if defined(USE_TRY)
throw TYPE_ARRAY; throw TYPE_ARRAY;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_ARRAY);
#endif // !USE_TRY
} // end of SetPrecision } // end of SetPrecision

View File

@@ -595,11 +595,7 @@ BLKFILIN::BLKFILIN(PGLOBAL g, PTDBDOS tdbp, int op, int opm, PXOB *xp)
if (Colp->GetResultType() != Type) { if (Colp->GetResultType() != Type) {
sprintf(g->Message, "BLKFILIN: %s", MSG(VALTYPE_NOMATCH)); sprintf(g->Message, "BLKFILIN: %s", MSG(VALTYPE_NOMATCH));
#if defined(USE_TRY)
throw g->Message; throw g->Message;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 99);
#endif // !USE_TRY
} else if (Colp->GetValue()->IsCi()) } else if (Colp->GetValue()->IsCi())
Arap->SetPrecision(g, 1); // Case insensitive Arap->SetPrecision(g, 1); // Case insensitive

View File

@@ -195,13 +195,9 @@ int COLBLK::GetLengthEx(void)
/* corresponding to this column and convert it to buffer type. */ /* corresponding to this column and convert it to buffer type. */
/***********************************************************************/ /***********************************************************************/
void COLBLK::ReadColumn(PGLOBAL g) void COLBLK::ReadColumn(PGLOBAL g)
{ {
sprintf(g->Message, MSG(UNDEFINED_AM), "ReadColumn"); sprintf(g->Message, MSG(UNDEFINED_AM), "ReadColumn");
#if defined(USE_TRY)
throw TYPE_COLBLK; throw TYPE_COLBLK;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_COLBLK);
#endif // !USE_TRY
} // end of ReadColumn } // end of ReadColumn
/***********************************************************************/ /***********************************************************************/
@@ -210,13 +206,9 @@ void COLBLK::ReadColumn(PGLOBAL g)
/* corresponding to this column from the column buffer and type. */ /* corresponding to this column from the column buffer and type. */
/***********************************************************************/ /***********************************************************************/
void COLBLK::WriteColumn(PGLOBAL g) void COLBLK::WriteColumn(PGLOBAL g)
{ {
sprintf(g->Message, MSG(UNDEFINED_AM), "WriteColumn"); sprintf(g->Message, MSG(UNDEFINED_AM), "WriteColumn");
#if defined(USE_TRY)
throw TYPE_COLBLK; throw TYPE_COLBLK;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_COLBLK);
#endif // !USE_TRY
} // end of WriteColumn } // end of WriteColumn
/***********************************************************************/ /***********************************************************************/
@@ -268,13 +260,9 @@ SPCBLK::SPCBLK(PCOLUMN cp)
/* corresponding to this column from the column buffer and type. */ /* corresponding to this column from the column buffer and type. */
/***********************************************************************/ /***********************************************************************/
void SPCBLK::WriteColumn(PGLOBAL g) void SPCBLK::WriteColumn(PGLOBAL g)
{ {
sprintf(g->Message, MSG(SPCOL_READONLY), Name); sprintf(g->Message, MSG(SPCOL_READONLY), Name);
#if defined(USE_TRY)
throw TYPE_COLBLK; throw TYPE_COLBLK;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_COLBLK);
#endif // !USE_TRY
} // end of WriteColumn } // end of WriteColumn
/***********************************************************************/ /***********************************************************************/

View File

@@ -200,50 +200,31 @@ PTDB CntGetTDB(PGLOBAL g, LPCSTR name, MODE mode, PHC h)
if (!cat) if (!cat)
return NULL; return NULL;
#if defined(USE_TRY)
try { try {
#else // !USE_TRY // Get table object from the catalog
// Save stack and allocation environment and prepare error return tabp = new(g) XTAB(name);
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])) { if (trace)
tdbp = NULL; printf("CntGetTDB: tabp=%p\n", tabp);
goto err;
} // endif rc
#endif // !USE_TRY
// Get table object from the catalog // Perhaps this should be made thread safe
tabp = new(g) XTAB(name); ((MYCAT*)cat)->SetHandler(h);
if (trace) if (!(tdbp = cat->GetTable(g, tabp, mode)))
printf("CntGetTDB: tabp=%p\n", tabp); printf("CntGetTDB: %s\n", g->Message);
// Perhaps this should be made thread safe
((MYCAT*)cat)->SetHandler(h);
if (!(tdbp = cat->GetTable(g, tabp, mode)))
printf("CntGetTDB: %s\n", g->Message);
#if defined(USE_TRY)
} catch (int n) { } catch (int n) {
if (trace) if (trace)
htrc("Exception %d: %s\n", n, g->Message); htrc("Exception %d: %s\n", n, g->Message);
} catch (const char *msg) { } catch (const char *msg) {
strcpy(g->Message, msg); strcpy(g->Message, msg);
} // end catch } // end catch
#else // !USE_TRY
err:
g->jump_level--;
#endif // !USE_TRY
if (trace) if (trace)
printf("Returning tdbp=%p mode=%d\n", tdbp, mode); printf("Returning tdbp=%p mode=%d\n", tdbp, mode);
return tdbp; return tdbp;
} // end of CntGetTDB } // end of CntGetTDB
/***********************************************************************/ /***********************************************************************/
/* OPENTAB: Open a Table. */ /* OPENTAB: Open a Table. */
@@ -267,161 +248,116 @@ bool CntOpenTable(PGLOBAL g, PTDB tdbp, MODE mode, char *c1, char *c2,
return true; return true;
} // endif tdbp } // endif tdbp
#if defined(USE_TRY)
try { try {
#else // !USE_TRY if (!c1) {
// Save stack and allocation environment and prepare error return if (mode == MODE_INSERT)
if (g->jump_level == MAX_JUMP) { // Allocate all column blocks for that table
strcpy(g->Message, MSG(TOO_MANY_JUMPS)); tdbp->ColDB(g, NULL, 0);
return true;
} // endif jump_level
if (setjmp(g->jumper[++g->jump_level])) { } else for (p = c1; *p; p += n) {
goto err; // Allocate only used column blocks
} // endif rc if (trace)
#endif // !USE_TRY printf("Allocating column %s\n", p);
if (!c1) { g->Message[0] = 0; // To check whether ColDB made an error message
if (mode == MODE_INSERT) colp = tdbp->ColDB(g, p, 0);
// Allocate all column blocks for that table
tdbp->ColDB(g, NULL, 0);
} else for (p= c1; *p; p+= n) { if (!colp && !(mode == MODE_INSERT && tdbp->IsSpecial(p))) {
// Allocate only used column blocks if (g->Message[0] == 0)
if (trace) sprintf(g->Message, MSG(COL_ISNOT_TABLE), p, tdbp->GetName());
printf("Allocating column %s\n", p);
g->Message[0] = 0; // To check whether ColDB made an error message throw 1;
colp= tdbp->ColDB(g, p, 0); } // endif colp
if (!colp && !(mode == MODE_INSERT && tdbp->IsSpecial(p))) { n = strlen(p) + 1;
if (g->Message[0] == 0) } // endfor p
sprintf(g->Message, MSG(COL_ISNOT_TABLE), p, tdbp->GetName());
#if defined(USE_TRY) for (i = 0, colp = tdbp->GetColumns(); colp; i++, colp = colp->GetNext()) {
throw 1; if (colp->InitValue(g))
#else // !USE_TRY throw 2;
goto err;
#endif // !USE_TRY
} // endif colp
n= strlen(p) + 1; if (mode == MODE_INSERT)
} // endfor p // Allow type conversion
if (colp->SetBuffer(g, colp->GetValue(), true, false))
throw 3;
for (i= 0, colp= tdbp->GetColumns(); colp; i++, colp= colp->GetNext()) { colp->AddColUse(U_P); // For PLG tables
if (colp->InitValue(g)) } // endfor colp
#if defined(USE_TRY)
throw 2;
#else // !USE_TRY
goto err;
#endif // !USE_TRY
if (mode == MODE_INSERT) /*******************************************************************/
// Allow type conversion /* In Update mode, the updated column blocks must be distinct from */
if (colp->SetBuffer(g, colp->GetValue(), true, false)) /* the read column blocks. So make a copy of the TDB and allocate */
#if defined(USE_TRY) /* its column blocks in mode write (required by XML tables). */
throw 3; /*******************************************************************/
#else // !USE_TRY if (mode == MODE_UPDATE) {
goto err; PTDBASE utp;
#endif // !USE_TRY
colp->AddColUse(U_P); // For PLG tables if (!(utp = (PTDBASE)tdbp->Duplicate(g))) {
} // endfor colp sprintf(g->Message, MSG(INV_UPDT_TABLE), tdbp->GetName());
throw 4;
} // endif tp
/*********************************************************************/ if (!c2)
/* In Update mode, the updated column blocks must be distinct from */ // Allocate all column blocks for that table
/* the read column blocks. So make a copy of the TDB and allocate */ utp->ColDB(g, NULL, 0);
/* its column blocks in mode write (required by XML tables). */ else for (p = c2; *p; p += n) {
/*********************************************************************/ // Allocate only used column blocks
if (mode == MODE_UPDATE) { colp = utp->ColDB(g, p, 0);
PTDBASE utp; n = strlen(p) + 1;
} // endfor p
if (!(utp= (PTDBASE)tdbp->Duplicate(g))) { for (i = 0, colp = utp->GetColumns(); colp; i++, colp = colp->GetNext()) {
sprintf(g->Message, MSG(INV_UPDT_TABLE), tdbp->GetName()); if (colp->InitValue(g))
#if defined(USE_TRY) throw 5;
throw 4;
#else // !USE_TRY
goto err;
#endif // !USE_TRY
} // endif tp
if (!c2) if (colp->SetBuffer(g, colp->GetValue(), true, false))
// Allocate all column blocks for that table throw 6;
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
for (i= 0, colp= utp->GetColumns(); colp; i++, colp= colp->GetNext()) { } // endfor colp
if (colp->InitValue(g))
#if defined(USE_TRY)
throw 5;
#else // !USE_TRY
goto err;
#endif // !USE_TRY
if (colp->SetBuffer(g, colp->GetValue(), true, false)) // Attach the updated columns list to the main table
#if defined(USE_TRY) tdbp->SetSetCols(utp->GetColumns());
throw 6; } else if (tdbp && mode == MODE_INSERT)
#else // !USE_TRY tdbp->SetSetCols(tdbp->GetColumns());
goto err;
#endif // !USE_TRY
} // 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->SetMode(mode);
tdbp->SetSetCols(utp->GetColumns());
} else if (tdbp && mode == MODE_INSERT)
tdbp->SetSetCols(tdbp->GetColumns());
// Now do open the physical table if (del/* && (tdbp->GetFtype() != RECFM_NAF*/) {
if (trace) // To avoid erasing the table when doing a partial delete
printf("Opening table %s in mode %d tdbp=%p\n", // make a fake Next
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
// PDOSDEF ddp= new(g) DOSDEF; // PDOSDEF ddp= new(g) DOSDEF;
// PTDB tp= new(g) TDBDOS(ddp, NULL); // PTDB tp= new(g) TDBDOS(ddp, NULL);
tdbp->SetNext((PTDB)1); tdbp->SetNext((PTDB)1);
dup->Check &= ~CHK_DELETE; dup->Check &= ~CHK_DELETE;
} // endif del } // endif del
if (trace) if (trace)
printf("About to open the table: tdbp=%p\n", tdbp); printf("About to open the table: tdbp=%p\n", tdbp);
if (mode != MODE_ANY && mode != MODE_ALTER) { if (mode != MODE_ANY && mode != MODE_ALTER) {
if (tdbp->OpenDB(g)) { if (tdbp->OpenDB(g)) {
printf("%s\n", g->Message); printf("%s\n", g->Message);
#if defined(USE_TRY) throw 7;
throw 7; } else
#else // !USE_TRY tdbp->SetNext(NULL);
goto err;
#endif // !USE_TRY
} else
tdbp->SetNext(NULL);
} // endif mode } // endif mode
rcop= false; rcop = false;
#if defined(USE_TRY)
} catch (int n) { } catch (int n) {
if (trace) if (trace)
htrc("Exception %d: %s\n", n, g->Message); htrc("Exception %d: %s\n", n, g->Message);
} catch (const char *msg) { } catch (const char *msg) {
strcpy(g->Message, msg); strcpy(g->Message, msg);
} // end catch } // end catch
#else // !USE_TRY
err:
g->jump_level--;
#endif // !USE_TRY
return rcop; return rcop;
} // end of CntOpenTable } // end of CntOpenTable
@@ -441,65 +377,40 @@ bool CntRewindTable(PGLOBAL g, PTDB tdbp)
/* Evaluate all columns after a record is read. */ /* Evaluate all columns after a record is read. */
/***********************************************************************/ /***********************************************************************/
RCODE EvalColumns(PGLOBAL g, PTDB tdbp, bool reset, bool mrr) RCODE EvalColumns(PGLOBAL g, PTDB tdbp, bool reset, bool mrr)
{ {
RCODE rc= RC_OK; RCODE rc= RC_OK;
PCOL colp; PCOL colp;
#if defined(USE_TRY)
try { try {
#else // !USE_TRY for (colp = tdbp->GetColumns(); rc == RC_OK && colp;
// Save stack and allocation environment and prepare error return colp = colp->GetNext()) {
if (g->jump_level == MAX_JUMP) { if (reset)
if (trace) { colp->Reset();
strcpy(g->Message, MSG(TOO_MANY_JUMPS));
printf("EvalColumns: %s\n", g->Message);
} // endif
return RC_FX; // Virtual columns are computed by MariaDB
} // endif jump_level if (!colp->GetColUse(U_VIRTUAL) && (!mrr || colp->GetKcol()))
if (colp->Eval(g))
rc = RC_FX;
if (setjmp(g->jumper[++g->jump_level]) != 0) { } // endfor colp
} catch (int n) {
if (trace) if (trace)
printf("Error reading columns: %s\n", g->Message); printf("Error %d reading columns: %s\n", n, g->Message);
rc = RC_FX; rc = RC_FX;
goto err; } catch (const char *msg) {
} // endif rc strcpy(g->Message, msg);
#endif // !USE_TRY } // end catch
for (colp= tdbp->GetColumns(); rc == RC_OK && colp;
colp= colp->GetNext()) {
if (reset)
colp->Reset();
// Virtual columns are computed by MariaDB
if (!colp->GetColUse(U_VIRTUAL) && (!mrr || colp->GetKcol()))
if (colp->Eval(g))
rc= RC_FX;
} // endfor colp
#if defined(USE_TRY)
} catch (int n) {
if (trace)
printf("Error %d reading columns: %s\n", n, g->Message);
rc = RC_FX;
} catch (const char *msg) {
strcpy(g->Message, msg);
} // end catch
#else // !USE_TRY
err:
g->jump_level--;
#endif // !USE_TRY
return rc; return rc;
} // end of EvalColumns } // end of EvalColumns
/***********************************************************************/ /***********************************************************************/
/* ReadNext: Read next record sequentially. */ /* ReadNext: Read next record sequentially. */
/***********************************************************************/ /***********************************************************************/
RCODE CntReadNext(PGLOBAL g, PTDB tdbp) RCODE CntReadNext(PGLOBAL g, PTDB tdbp)
{ {
RCODE rc; RCODE rc;
if (!tdbp) if (!tdbp)
@@ -514,103 +425,66 @@ RCODE CntReadNext(PGLOBAL g, PTDB tdbp)
((PTDBASE)tdbp)->ResetKindex(g, NULL); ((PTDBASE)tdbp)->ResetKindex(g, NULL);
} // endif index } // endif index
#if defined(USE_TRY)
try { try {
#else // !USE_TRY // Do it now to avoid double eval when filtering
// Save stack and allocation environment and prepare error return for (PCOL colp = tdbp->GetColumns(); colp; colp = colp->GetNext())
if (g->jump_level == MAX_JUMP) { colp->Reset();
strcpy(g->Message, MSG(TOO_MANY_JUMPS));
return RC_FX;
} // endif jump_level
if ((setjmp(g->jumper[++g->jump_level])) != 0) { do {
rc = RC_FX; if ((rc = (RCODE)tdbp->ReadDB(g)) == RC_OK)
goto err; if (!ApplyFilter(g, tdbp->GetFilter()))
} // endif rc rc = RC_NF;
#endif // !USE_TRY
// Do it now to avoid double eval when filtering } while (rc == RC_NF);
for (PCOL colp= tdbp->GetColumns(); colp; colp= colp->GetNext())
colp->Reset();
do { if (rc == RC_OK)
if ((rc= (RCODE)tdbp->ReadDB(g)) == RC_OK) rc = EvalColumns(g, tdbp, false);
if (!ApplyFilter(g, tdbp->GetFilter()))
rc= RC_NF;
} while (rc == RC_NF); } catch (int) {
if (rc == RC_OK)
rc= EvalColumns(g, tdbp, false);
#if defined(USE_TRY)
} catch (int) {
rc = RC_FX; rc = RC_FX;
} catch (const char *msg) { } catch (const char *msg) {
strcpy(g->Message, msg); strcpy(g->Message, msg);
rc = RC_FX; rc = RC_FX;
} // end catch } // end catch
#else // !USE_TRY
err:
g->jump_level--;
#endif // !USE_TRY
return rc; return rc;
} // end of CntReadNext } // end of CntReadNext
/***********************************************************************/ /***********************************************************************/
/* WriteRow: Insert a new row into a table. */ /* WriteRow: Insert a new row into a table. */
/***********************************************************************/ /***********************************************************************/
RCODE CntWriteRow(PGLOBAL g, PTDB tdbp) RCODE CntWriteRow(PGLOBAL g, PTDB tdbp)
{ {
RCODE rc; RCODE rc;
PCOL colp; PCOL colp;
//PTDBASE tp= (PTDBASE)tdbp; //PTDBASE tp= (PTDBASE)tdbp;
if (!tdbp) if (!tdbp)
return RC_FX;
#if defined(USE_TRY)
try {
#else // !USE_TRY
// 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; return RC_FX;
} // endif jump_level
if (setjmp(g->jumper[++g->jump_level]) != 0) { try {
printf("%s\n", g->Message); // 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 (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);
} catch (int n) {
printf("Exception %d: %s\n", n, g->Message);
rc = RC_FX; rc = RC_FX;
goto err; } catch (const char *msg) {
} // endif rc strcpy(g->Message, msg);
#endif // !USE_TRY rc = RC_FX;
} // end catch
// Store column values in table write buffer(s) return rc;
for (colp= tdbp->GetSetCols(); colp; colp= colp->GetNext()) } // end of CntWriteRow
if (!colp->GetColUse(U_VIRTUAL))
colp->WriteColumn(g);
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);
#if defined(USE_TRY)
} 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
#else // !USE_TRY
err:
g->jump_level--;
#endif // !USE_TRY
return rc;
} // end of CntWriteRow
/***********************************************************************/ /***********************************************************************/
/* UpdateRow: Update a row into a table. */ /* UpdateRow: Update a row into a table. */
@@ -658,98 +532,78 @@ RCODE CntDeleteRow(PGLOBAL g, PTDB tdbp, bool all)
/* CLOSETAB: Close a table. */ /* CLOSETAB: Close a table. */
/***********************************************************************/ /***********************************************************************/
int CntCloseTable(PGLOBAL g, PTDB tdbp, bool nox, bool abort) int CntCloseTable(PGLOBAL g, PTDB tdbp, bool nox, bool abort)
{ {
int rc= RC_OK; int rc = RC_OK;
//TDBASE *tbxp= (PTDBASE)tdbp; //TDBASE *tbxp= (PTDBASE)tdbp;
if (!tdbp) if (!tdbp)
return rc; // Nothing to do return rc; // Nothing to do
else if (tdbp->GetUse() != USE_OPEN) { else if (tdbp->GetUse() != USE_OPEN) {
if (tdbp->GetAmType() == TYPE_AM_XML) if (tdbp->GetAmType() == TYPE_AM_XML)
tdbp->CloseDB(g); // Opened by GetMaxSize tdbp->CloseDB(g); // Opened by GetMaxSize
return rc; return rc;
} // endif !USE_OPEN } // endif !USE_OPEN
if (trace) if (trace)
printf("CntCloseTable: tdbp=%p mode=%d nox=%d abort=%d\n", printf("CntCloseTable: tdbp=%p mode=%d nox=%d abort=%d\n",
tdbp, tdbp->GetMode(), nox, abort); tdbp, tdbp->GetMode(), nox, abort);
if (tdbp->GetMode() == MODE_DELETE && tdbp->GetUse() == USE_OPEN) { if (tdbp->GetMode() == MODE_DELETE && tdbp->GetUse() == USE_OPEN) {
if (tdbp->IsIndexed()) if (tdbp->IsIndexed())
rc= ((PTDBDOS)tdbp)->GetTxfp()->DeleteSortedRows(g); rc = ((PTDBDOS)tdbp)->GetTxfp()->DeleteSortedRows(g);
if (!rc) if (!rc)
rc= tdbp->DeleteDB(g, RC_EF); // Specific A.M. delete routine rc = tdbp->DeleteDB(g, RC_EF); // Specific A.M. delete routine
} else if (tdbp->GetMode() == MODE_UPDATE && tdbp->IsIndexed()) } else if (tdbp->GetMode() == MODE_UPDATE && tdbp->IsIndexed())
rc= ((PTDBDOX)tdbp)->Txfp->UpdateSortedRows(g); rc = ((PTDBDOX)tdbp)->Txfp->UpdateSortedRows(g);
switch(rc) { switch (rc) {
case RC_FX: case RC_FX:
abort= true; abort = true;
break; break;
case RC_INFO: case RC_INFO:
PushWarning(g, tdbp); PushWarning(g, tdbp);
break; break;
} // endswitch rc } // endswitch rc
#if defined(USE_TRY)
try { try {
#else // !USE_TRY // This will close the table file(s) and also finalize write
// Prepare error return // operations such as Insert, Update, or Delete.
if (g->jump_level == MAX_JUMP) { tdbp->SetAbort(abort);
strcpy(g->Message, MSG(TOO_MANY_JUMPS)); tdbp->CloseDB(g);
rc = RC_FX; tdbp->SetAbort(false);
goto err;
} // endif
if ((rc = setjmp(g->jumper[++g->jump_level])) != 0) {
rc = RC_FX;
goto err;
} // endif
#endif // !USE_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 (trace > 1)
printf("Table %s closed\n", tdbp->GetName());
if (!nox && tdbp->GetMode() != MODE_READ && tdbp->GetMode() != MODE_ANY) {
if (trace > 1) if (trace > 1)
printf("About to reset opt\n"); printf("Table %s closed\n", tdbp->GetName());
if (!tdbp->IsRemote()) { if (!nox && tdbp->GetMode() != MODE_READ && tdbp->GetMode() != MODE_ANY) {
// Make all the eventual indexes if (trace > 1)
PTDBDOX tbxp = (PTDBDOX)tdbp; printf("About to reset opt\n");
tbxp->ResetKindex(g, NULL);
tbxp->SetKey_Col(NULL);
rc = tbxp->ResetTableOpt(g, true, tbxp->GetDef()->Indexable() == 1);
} // endif remote
} // endif nox 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 defined(USE_TRY) } // endif nox
} catch (int) {
rc = RC_FX;
} catch (const char *msg) {
strcpy(g->Message, msg);
rc = RC_FX;
} // end catch
#else // !USE_TRY
err:
g->jump_level--;
#endif // !USE_TRY
if (trace > 1) } catch (int) {
htrc("Done rc=%d\n", rc); rc = RC_FX;
} catch (const char *msg) {
strcpy(g->Message, msg);
rc = RC_FX;
} // end catch
return (rc == RC_OK || rc == RC_INFO) ? 0 : rc; if (trace > 1)
} // end of CntCloseTable htrc("Done rc=%d\n", rc);
return (rc == RC_OK || rc == RC_INFO) ? 0 : rc;
} // end of CntCloseTable
/***********************************************************************/ /***********************************************************************/
/* Load and initialize the use of an index. */ /* Load and initialize the use of an index. */

View File

@@ -986,7 +986,7 @@ int DOSFAM::DeleteRecords(PGLOBAL g, int irc)
} else { } 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 target file as being the source file itself. */
/* Set the future Tpos, and give Spos a value to block copying. */ /* Set the future Tpos, and give Spos a value to block copying. */
/*****************************************************************/ /*****************************************************************/
@@ -1174,20 +1174,12 @@ int DOSFAM::RenameTempFile(PGLOBAL g)
if (rename(filename, filetemp)) { // Save file for security if (rename(filename, filetemp)) { // Save file for security
sprintf(g->Message, MSG(RENAME_ERROR), sprintf(g->Message, MSG(RENAME_ERROR),
filename, filetemp, strerror(errno)); filename, filetemp, strerror(errno));
#if defined(USE_TRY)
throw 51; throw 51;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 51);
#endif // !USE_TRY
} else if (rename(tempname, filename)) { } else if (rename(tempname, filename)) {
sprintf(g->Message, MSG(RENAME_ERROR), sprintf(g->Message, MSG(RENAME_ERROR),
tempname, filename, strerror(errno)); tempname, filename, strerror(errno));
rc = rename(filetemp, filename); // Restore saved file rc = rename(filetemp, filename); // Restore saved file
#if defined(USE_TRY)
throw 52; throw 52;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 52);
#endif // !USE_TRY
} else if (remove(filetemp)) { } else if (remove(filetemp)) {
sprintf(g->Message, MSG(REMOVE_ERROR), sprintf(g->Message, MSG(REMOVE_ERROR),
filetemp, strerror(errno)); filetemp, strerror(errno));

View File

@@ -559,7 +559,7 @@ bool VCTFAM::AllocateBuffer(PGLOBAL g)
/* Do initial action when inserting. */ /* Do initial action when inserting. */
/***********************************************************************/ /***********************************************************************/
bool VCTFAM::InitInsert(PGLOBAL g) bool VCTFAM::InitInsert(PGLOBAL g)
{ {
bool rc = false; bool rc = false;
// We come here in MODE_INSERT only // We come here in MODE_INSERT only
@@ -575,26 +575,11 @@ bool VCTFAM::InitInsert(PGLOBAL g)
CurBlk = Block - 1; CurBlk = Block - 1;
CurNum = Last; CurNum = Last;
#if defined(USE_TRY)
try { try {
#else // !USE_TRY // Last block must be updated by new values
// Prepare error return for (; cp; cp = (PVCTCOL)cp->Next)
if (g->jump_level == MAX_JUMP) { cp->ReadBlock(g);
strcpy(g->Message, MSG(TOO_MANY_JUMPS));
return true;
} // endif
if ((rc = setjmp(g->jumper[++g->jump_level])) != 0) {
g->jump_level--;
return true;
} // endif
#endif // !USE_TRY
// Last block must be updated by new values
for (; cp; cp = (PVCTCOL)cp->Next)
cp->ReadBlock(g);
#if defined(USE_TRY)
} catch (int n) { } catch (int n) {
if (trace) if (trace)
htrc("Exception %d: %s\n", n, g->Message); htrc("Exception %d: %s\n", n, g->Message);
@@ -603,9 +588,7 @@ bool VCTFAM::InitInsert(PGLOBAL g)
strcpy(g->Message, msg); strcpy(g->Message, msg);
rc = true; rc = true;
} // end catch } // end catch
#else // !USE_TRY
g->jump_level--;
#endif // !USE_TRY
} // endif Last } // endif Last
if (!rc) if (!rc)
@@ -1126,11 +1109,7 @@ void VCTFAM::CloseTableFile(PGLOBAL g, bool abort)
} else if (AddBlock) { } else if (AddBlock) {
// Last block was not written // Last block was not written
rc = ResetTableSize(g, CurBlk, Nrec); rc = ResetTableSize(g, CurBlk, Nrec);
#if defined(USE_TRY)
throw 44; throw 44;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 44);
#endif // !USE_TRY
} // endif } // endif
} else if (mode == MODE_UPDATE) { } else if (mode == MODE_UPDATE) {
@@ -1550,7 +1529,7 @@ bool VCMFAM::AllocateBuffer(PGLOBAL g)
/* Do initial action when inserting. */ /* Do initial action when inserting. */
/***********************************************************************/ /***********************************************************************/
bool VCMFAM::InitInsert(PGLOBAL g) bool VCMFAM::InitInsert(PGLOBAL g)
{ {
bool rc = false; bool rc = false;
volatile PVCTCOL cp = (PVCTCOL)Tdbp->GetColumns(); volatile PVCTCOL cp = (PVCTCOL)Tdbp->GetColumns();
@@ -1565,27 +1544,12 @@ bool VCMFAM::InitInsert(PGLOBAL g)
CurNum = Last; CurNum = Last;
} // endif Last } // endif Last
#if defined(USE_TRY)
try { try {
#else // !USE_TRY // Initialize the column block pointer
// Prepare error return for (; cp; cp = (PVCTCOL)cp->Next)
if (g->jump_level == MAX_JUMP) { cp->ReadBlock(g);
strcpy(g->Message, MSG(TOO_MANY_JUMPS));
return true;
} // endif
if ((rc = setjmp(g->jumper[++g->jump_level])) != 0) { } catch (int n) {
g->jump_level--;
return true;
} // endif
#endif // !USE_TRY
// Initialize the column block pointer
for (; cp; cp = (PVCTCOL)cp->Next)
cp->ReadBlock(g);
#if defined(USE_TRY)
} catch (int n) {
if (trace) if (trace)
htrc("Exception %d: %s\n", n, g->Message); htrc("Exception %d: %s\n", n, g->Message);
rc = true; rc = true;
@@ -1593,11 +1557,9 @@ bool VCMFAM::InitInsert(PGLOBAL g)
strcpy(g->Message, msg); strcpy(g->Message, msg);
rc = true; rc = true;
} // end catch } // end catch
#else // !USE_TRY
g->jump_level--;
#endif // !USE_TRY
return rc; return rc;
} // end of InitInsert } // end of InitInsert
/***********************************************************************/ /***********************************************************************/
/* Data Base write routine for VMP access method. */ /* Data Base write routine for VMP access method. */
@@ -2541,11 +2503,7 @@ void VECFAM::CloseTableFile(PGLOBAL g, bool abort)
if (wrc != RC_FX) if (wrc != RC_FX)
rc = ResetTableSize(g, Block, Last); rc = ResetTableSize(g, Block, Last);
else else
#if defined(USE_TRY)
throw 44; throw 44;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 44);
#endif // !USE_TRY
} else if (mode == MODE_UPDATE) { } else if (mode == MODE_UPDATE) {
if (UseTemp && !InitUpdate && !Abort) { if (UseTemp && !InitUpdate && !Abort) {
@@ -4206,11 +4164,7 @@ void BGVFAM::CloseTableFile(PGLOBAL g, bool abort)
} else if (AddBlock) { } else if (AddBlock) {
// Last block was not written // Last block was not written
rc = ResetTableSize(g, CurBlk, Nrec); rc = ResetTableSize(g, CurBlk, Nrec);
#if defined(USE_TRY)
throw 44; throw 44;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 44);
#endif // !USE_TRY
} // endif } // endif
} else if (mode == MODE_UPDATE) { } else if (mode == MODE_UPDATE) {

View File

@@ -87,11 +87,7 @@ BYTE OpBmp(PGLOBAL g, OPVAL opc)
case OP_EXIST: bt = 0x00; break; case OP_EXIST: bt = 0x00; break;
default: default:
sprintf(g->Message, MSG(BAD_FILTER_OP), opc); sprintf(g->Message, MSG(BAD_FILTER_OP), opc);
#if defined(USE_TRY)
throw TYPE_ARRAY; throw TYPE_ARRAY;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_ARRAY);
#endif // !USE_TRY
} // endswitch opc } // endswitch opc
return bt; return bt;
@@ -1715,11 +1711,7 @@ PFIL PrepareFilter(PGLOBAL g, PFIL fp, bool having)
break; // Remove eventual ending separator(s) break; // Remove eventual ending separator(s)
// if (fp->Convert(g, having)) // if (fp->Convert(g, having))
//#if defined(USE_TRY)
// throw TYPE_ARRAY; // throw TYPE_ARRAY;
//#else // !USE_TRY
// longjmp(g->jumper[g->jump_level], TYPE_FILTER);
//#endif // !USE_TRY
filp = fp; filp = fp;
fp = fp->Next; fp = fp->Next;
@@ -1752,11 +1744,7 @@ DllExport bool ApplyFilter(PGLOBAL g, PFIL filp)
// return TRUE; // return TRUE;
if (filp->Eval(g)) if (filp->Eval(g))
#if defined(USE_TRY)
throw TYPE_FILTER; throw TYPE_FILTER;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_FILTER);
#endif // !USE_TRY
if (trace > 1) if (trace > 1)
htrc("PlugFilter filp=%p result=%d\n", htrc("PlugFilter filp=%p result=%d\n",

File diff suppressed because it is too large Load Diff

View File

@@ -1200,11 +1200,7 @@ void JDBConn::SetColumnValue(int rank, PSZ name, PVAL val)
if (rank == 0) if (rank == 0)
if (!name || (jn = env->NewStringUTF(name)) == nullptr) { if (!name || (jn = env->NewStringUTF(name)) == nullptr) {
sprintf(g->Message, "Fail to allocate jstring %s", SVP(name)); sprintf(g->Message, "Fail to allocate jstring %s", SVP(name));
#if defined(USE_TRY)
throw TYPE_AM_JDBC; throw TYPE_AM_JDBC;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_AM_JDBC);
#endif // !USE_TRY
} // endif name } // endif name
// Returns 666 is case of error // Returns 666 is case of error
@@ -1212,11 +1208,7 @@ void JDBConn::SetColumnValue(int rank, PSZ name, PVAL val)
if (Check((ctyp == 666) ? -1 : 1)) { if (Check((ctyp == 666) ? -1 : 1)) {
sprintf(g->Message, "Getting ctyp: %s", Msg); sprintf(g->Message, "Getting ctyp: %s", Msg);
#if defined(USE_TRY)
throw TYPE_AM_JDBC; throw TYPE_AM_JDBC;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_AM_JDBC);
#endif // !USE_TRY
} // endif Check } // endif Check
if (val->GetNullable()) if (val->GetNullable())
@@ -1322,11 +1314,7 @@ void JDBConn::SetColumnValue(int rank, PSZ name, PVAL val)
env->DeleteLocalRef(jn); env->DeleteLocalRef(jn);
sprintf(g->Message, "SetColumnValue: %s rank=%d ctyp=%d", Msg, rank, (int)ctyp); sprintf(g->Message, "SetColumnValue: %s rank=%d ctyp=%d", Msg, rank, (int)ctyp);
#if defined(USE_TRY)
throw TYPE_AM_JDBC; throw TYPE_AM_JDBC;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_AM_JDBC);
#endif // !USE_TRY
} // endif Check } // endif Check
if (rank == 0) if (rank == 0)

View File

@@ -81,123 +81,70 @@ PJSON ParseJson(PGLOBAL g, char *s, int len, int *ptyp, bool *comma)
if (s[0] == '[' && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n'))) if (s[0] == '[' && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n')))
pty[0] = false; pty[0] = false;
#if defined(USE_TRY)
try {
#else // !USE_TRY
// 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 { try {
#endif // SE_CATCH --------------------- try section -------------------- for (i = 0; i < len; i++)
if (setjmp(g->jumper[++g->jump_level])) { switch (s[i]) {
goto fin; case '[':
} // endif rc if (jsp)
goto tryit;
else if (!(jsp = ParseArray(g, ++i, src, pty)))
throw 1;
#if defined(SE_CATCH) // ------------- end of try section ----------------- break;
} catch (SE_Exception e) { case '{':
sprintf(g->Message, "ParseJson: exception doing setjmp: %s (rc=%hd)", if (jsp)
GetExceptionDesc(g, e.nSE), e.nSE); goto tryit;
_set_se_translator(f); else if (!(jsp = ParseObject(g, ++i, src, pty)))
goto err; throw 2;
} catch (...) {
strcpy(g->Message, "Exception doing setjmp");
_set_se_translator(f);
goto err;
} // end of try-catches
_set_se_translator(f); break;
#endif // SE_CATCH case ' ':
#endif // !USE_TRY case '\t':
case '\n':
case '\r':
break;
case ',':
if (jsp && (pretty == 1 || pretty == 3)) {
if (comma)
*comma = true;
for (i = 0; i < len; i++) pty[0] = pty[2] = false;
switch (s[i]) { break;
case '[': } // endif pretty
if (jsp)
goto tryit;
else if (!(jsp = ParseArray(g, ++i, src, pty)))
#if defined(USE_TRY)
throw 1;
#else // !USE_TRY
goto fin;
#endif // !USE_TRY
break; sprintf(g->Message, "Unexpected ',' (pretty=%d)", pretty);
case '{': throw 3;
if (jsp) case '(':
goto tryit; b = true;
else if (!(jsp = ParseObject(g, ++i, src, pty))) break;
#if defined(USE_TRY) case ')':
throw 2; if (b) {
#else // !USE_TRY b = false;
goto fin; break;
#endif // !USE_TRY } // endif b
break; default:
case ' ': if (jsp)
case '\t': goto tryit;
case '\n': else if (!(jsp = ParseValue(g, i, src, pty)))
case '\r': throw 4;
break;
case ',':
if (jsp && (pretty == 1 || pretty == 3)) {
if (comma)
*comma = true;
pty[0] = pty[2] = false; break;
break; }; // endswitch s[i]
} // endif pretty
sprintf(g->Message, "Unexpected ',' (pretty=%d)", pretty); if (!jsp)
#if defined(USE_TRY) sprintf(g->Message, "Invalid Json string '%.*s'", 50, s);
throw 3; else if (ptyp && pretty == 3) {
#else // !USE_TRY *ptyp = 3; // Not recognized pretty
jsp = NULL;
goto fin;
#endif // !USE_TRY
case '(':
b = true;
break;
case ')':
if (b) {
b = false;
break;
} // endif b
default: for (i = 0; i < 3; i++)
if (jsp) if (pty[i]) {
goto tryit; *ptyp = i;
else if (!(jsp = ParseValue(g, i, src, pty))) break;
#if defined(USE_TRY) } // endif pty
throw 4;
#else // !USE_TRY
goto fin;
#endif // !USE_TRY
break; } // endif ptyp
}; // endswitch s[i]
if (!jsp)
sprintf(g->Message, "Invalid Json string '%.*s'", 50, s);
else if (ptyp && pretty == 3) {
*ptyp = 3; // Not recognized pretty
for (i = 0; i < 3; i++)
if (pty[i]) {
*ptyp = i;
break;
} // endif pty
} // endif ptyp
#if defined(USE_TRY)
} catch (int n) { } catch (int n) {
if (trace) if (trace)
htrc("Exception %d: %s\n", n, g->Message); htrc("Exception %d: %s\n", n, g->Message);
@@ -208,20 +155,12 @@ _set_se_translator(f);
} // end catch } // end catch
return jsp; return jsp;
#else // !USE_TRY
fin:
g->jump_level--;
return jsp;
#endif // !USE_TRY
tryit: tryit:
if (pty[0] && (!pretty || pretty > 2)) { if (pty[0] && (!pretty || pretty > 2)) {
if ((jsp = ParseArray(g, (i = 0), src, pty)) && ptyp && pretty == 3) if ((jsp = ParseArray(g, (i = 0), src, pty)) && ptyp && pretty == 3)
*ptyp = (pty[0]) ? 0 : 3; *ptyp = (pty[0]) ? 0 : 3;
#if !defined(USE_TRY)
g->jump_level--;
#endif // !USE_TRY
return jsp; return jsp;
} else } else
strcpy(g->Message, "More than one item in file"); strcpy(g->Message, "More than one item in file");
@@ -620,101 +559,75 @@ PVAL ParseNumeric(PGLOBAL g, int& i, STRG& src)
PSZ Serialize(PGLOBAL g, PJSON jsp, char *fn, int pretty) PSZ Serialize(PGLOBAL g, PJSON jsp, char *fn, int pretty)
{ {
PSZ str = NULL; PSZ str = NULL;
bool b = false, err = true; bool b = false, err = true;
JOUT *jp; JOUT *jp;
FILE *fs = NULL; FILE *fs = NULL;
g->Message[0] = 0; g->Message[0] = 0;
#if defined(USE_TRY)
try { try {
#else // !USE_TRY if (!jsp) {
// Save stack and allocation environment and prepare error return strcpy(g->Message, "Null json tree");
if (g->jump_level == MAX_JUMP) { throw 1;
strcpy(g->Message, MSG(TOO_MANY_JUMPS)); } else if (!fn) {
return NULL; // Serialize to a string
} // endif jump_level jp = new(g) JOUTSTR(g);
b = pretty == 1;
if (setjmp(g->jumper[++g->jump_level])) {
str = NULL;
goto fin;
} // endif jmp
#endif // !USE_TRY
if (!jsp) {
strcpy(g->Message, "Null json tree");
#if defined(USE_TRY)
throw 1;
#else // !USE_TRY
goto fin;
#endif // !USE_TRY
} 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));
#if defined(USE_TRY)
throw 2;
#else // !USE_TRY
goto fin;
#endif // !USE_TRY
} else if (pretty >= 2) {
// Serialize to a pretty file
jp = new(g)JOUTPRT(g, fs);
} else { } else {
// Serialize to a flat file if (!(fs = fopen(fn, "wb"))) {
b = true; sprintf(g->Message, MSG(OPEN_MODE_ERROR),
jp = new(g)JOUTFILE(g, fs, pretty); "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
} // 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
#if defined(USE_TRY)
} 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
#else // !USE_TRY
fin:
g->jump_level--;
#endif // !USE_TRY
return str; return str;
} // end of Serialize } // end of Serialize

View File

@@ -2921,70 +2921,53 @@ char *jsonget_string(UDF_INIT *initid, UDF_ARGS *args, char *result,
if (g->N) { if (g->N) {
str = (char*)g->Activityp; str = (char*)g->Activityp;
goto fin; goto err;
} else if (initid->const_item) } else if (initid->const_item)
g->N = 1; g->N = 1;
#if defined(USE_TRY)
try { try {
#else // !USE_TRY if (!g->Xchk) {
// Save stack and allocation environment and prepare error return if (CheckMemory(g, initid, args, 1, true)) {
if (g->jump_level == MAX_JUMP) { PUSH_WARNING("CheckMemory error");
PUSH_WARNING(MSG(TOO_MANY_JUMPS));
*is_null = 1;
return NULL;
} // endif jump_level
if (setjmp(g->jumper[++g->jump_level])) {
PUSH_WARNING(g->Message);
str = NULL;
goto err;
} // endif rc
#endif // !USE_TRY
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; goto err;
} // endif jsp } 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 } else
jsp = jvp->GetJson(); jsp = (PJSON)g->Xchk;
if (g->Mrr) { // First argument is a constant path = MakePSZ(g, args, 1);
g->Xchk = jsp; jsx = new(g) JSNX(g, jsp, TYPE_STRING, initid->max_length);
JsonMemSave(g);
} // endif Mrr
} else if (jsx->SetJpath(g, path)) {
jsp = (PJSON)g->Xchk; PUSH_WARNING(g->Message);
goto err;
} // endif SetJpath
path = MakePSZ(g, args, 1); jsx->ReadValue(g);
jsx = new(g) JSNX(g, jsp, TYPE_STRING, initid->max_length);
if (jsx->SetJpath(g, path)) { if (!jsx->GetValue()->IsNull())
PUSH_WARNING(g->Message); str = jsx->GetValue()->GetCharValue();
goto err;
} // endif SetJpath
jsx->ReadValue(g); if (initid->const_item)
// Keep result of constant function
g->Activityp = (PACTIVITY)str;
if (!jsx->GetValue()->IsNull()) } catch (int n) {
str = jsx->GetValue()->GetCharValue();
if (initid->const_item)
// Keep result of constant function
g->Activityp = (PACTIVITY)str;
#if defined(USE_TRY)
} catch (int n) {
if (trace) if (trace)
htrc("Exception %d: %s\n", n, g->Message); htrc("Exception %d: %s\n", n, g->Message);
PUSH_WARNING(g->Message); PUSH_WARNING(g->Message);
@@ -2996,12 +2979,6 @@ char *jsonget_string(UDF_INIT *initid, UDF_ARGS *args, char *result,
} // end catch } // end catch
err: err:
#else // !USE_TRY
err:
g->jump_level--;
#endif // !USE_TRY
fin:
if (!str) { if (!str) {
*is_null = 1; *is_null = 1;
*res_length = 0; *res_length = 0;
@@ -3292,64 +3269,45 @@ char *jsonlocate(UDF_INIT *initid, UDF_ARGS *args, char *result,
} else if (initid->const_item) } else if (initid->const_item)
g->N = 1; g->N = 1;
#if defined(USE_TRY)
try { try {
#else // !USE_TRY if (!g->Xchk) {
// Save stack and allocation environment and prepare error return if (CheckMemory(g, initid, args, 1, !g->Xchk)) {
if (g->jump_level == MAX_JUMP) { PUSH_WARNING("CheckMemory error");
PUSH_WARNING(MSG(TOO_MANY_JUMPS)); *error = 1;
*error = 1;
*is_null = 1;
return NULL;
} // endif jump_level
if (setjmp(g->jumper[++g->jump_level])) {
PUSH_WARNING(g->Message);
*error = 1;
path = NULL;
goto err;
} // endif rc
#endif // !USE_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 ((p = jvp->GetString())) {
if (!(jsp = ParseJson(g, p, strlen(p)))) {
PUSH_WARNING(g->Message);
goto err; goto err;
} // endif jsp } 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 } else
jsp = jvp->GetJson(); jsp = (PJSON)g->Xchk;
if (g->Mrr) { // First argument is a constant // The item to locate
g->Xchk = jsp; jvp2 = MakeValue(g, args, 1);
JsonMemSave(g);
} // endif Mrr
} else k = (args->arg_count > 2) ? (int)*(long long*)args->args[2] : 1;
jsp = (PJSON)g->Xchk;
// The item to locate jsx = new(g) JSNX(g, jsp, TYPE_STRING);
jvp2 = MakeValue(g, args, 1); path = jsx->Locate(g, jsp, jvp2, k);
k = (args->arg_count > 2) ? (int)*(long long*)args->args[2] : 1; if (initid->const_item)
// Keep result of constant function
g->Activityp = (PACTIVITY)path;
jsx = new(g) JSNX(g, jsp, TYPE_STRING); } catch (int n) {
path = jsx->Locate(g, jsp, jvp2, k);
if (initid->const_item)
// Keep result of constant function
g->Activityp = (PACTIVITY)path;
#if defined(USE_TRY)
} catch (int n) {
if (trace) if (trace)
htrc("Exception %d: %s\n", n, g->Message); htrc("Exception %d: %s\n", n, g->Message);
PUSH_WARNING(g->Message); PUSH_WARNING(g->Message);
@@ -3363,11 +3321,6 @@ char *jsonlocate(UDF_INIT *initid, UDF_ARGS *args, char *result,
} // end catch } // end catch
err: err:
#else // !USE_TRY
err:
g->jump_level--;
#endif // !USE_TRY
if (!path) { if (!path) {
*res_length = 0; *res_length = 0;
*is_null = 1; *is_null = 1;
@@ -3439,65 +3392,46 @@ char *json_locate_all(UDF_INIT *initid, UDF_ARGS *args, char *result,
} else if (initid->const_item) } else if (initid->const_item)
g->N = 1; g->N = 1;
#if defined(USE_TRY)
try { try {
#else // !USE_TRY if (!g->Xchk) {
// Save stack and allocation environment and prepare error return if (CheckMemory(g, initid, args, 1, true)) {
if (g->jump_level == MAX_JUMP) { PUSH_WARNING("CheckMemory error");
PUSH_WARNING(MSG(TOO_MANY_JUMPS)); *error = 1;
*error = 1;
*is_null = 1;
return NULL;
} // endif jump_level
if (setjmp(g->jumper[++g->jump_level])) {
PUSH_WARNING(g->Message);
*error = 1;
path = NULL;
goto err;
} // endif rc
#endif // !USE_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 ((p = jvp->GetString())) {
if (!(jsp = ParseJson(g, p, strlen(p)))) {
PUSH_WARNING(g->Message);
goto err; goto err;
} // endif jsp } 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 } else
jsp = jvp->GetJson(); jsp = (PJSON)g->Xchk;
if (g->Mrr) { // First argument is a constant // The item to locate
g->Xchk = jsp; jvp2 = MakeValue(g, args, 1);
JsonMemSave(g);
} // endif Mrr
} else if (args->arg_count > 2)
jsp = (PJSON)g->Xchk; mx = (int)*(long long*)args->args[2];
// The item to locate jsx = new(g) JSNX(g, jsp, TYPE_STRING);
jvp2 = MakeValue(g, args, 1); path = jsx->LocateAll(g, jsp, jvp2, mx);
if (args->arg_count > 2) if (initid->const_item)
mx = (int)*(long long*)args->args[2]; // Keep result of constant function
g->Activityp = (PACTIVITY)path;
jsx = new(g) JSNX(g, jsp, TYPE_STRING); } catch (int n) {
path = jsx->LocateAll(g, jsp, jvp2, mx);
if (initid->const_item)
// Keep result of constant function
g->Activityp = (PACTIVITY)path;
#if defined(USE_TRY)
} catch (int n) {
if (trace) if (trace)
htrc("Exception %d: %s\n", n, g->Message); htrc("Exception %d: %s\n", n, g->Message);
PUSH_WARNING(g->Message); PUSH_WARNING(g->Message);
@@ -3511,11 +3445,6 @@ char *json_locate_all(UDF_INIT *initid, UDF_ARGS *args, char *result,
} // end catch } // end catch
err: err:
#else // !USE_TRY
err:
g->jump_level--;
#endif // !USE_TRY
if (!path) { if (!path) {
*res_length = 0; *res_length = 0;
*is_null = 1; *is_null = 1;
@@ -3722,87 +3651,61 @@ char *handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result,
goto fin; goto fin;
} // endelse } // endelse
#if defined(USE_TRY)
try { try {
#else // !USE_TRY if (!g->Xchk) {
// Save stack and allocation environment and prepare error return if (CheckMemory(g, initid, args, 1, true, false, true)) {
if (g->jump_level == MAX_JUMP) { PUSH_WARNING("CheckMemory error");
PUSH_WARNING(MSG(TOO_MANY_JUMPS)); throw 1;
*error = 1; } else
goto fin; jvp = MakeValue(g, args, 0);
} // endif jump_level
if (setjmp(g->jumper[++g->jump_level])) { if ((p = jvp->GetString())) {
PUSH_WARNING(g->Message); if (!(jsp = ParseJson(g, p, strlen(p)))) {
str = NULL; throw 2;
goto err; } // endif jsp
} // endif rc
#endif // !USE_TRY } else
jsp = jvp->GetJson();
if (g->Mrr) { // First argument is a constant
g->Xchk = jsp;
JsonMemSave(g);
} // endif Mrr
if (!g->Xchk) {
if (CheckMemory(g, initid, args, 1, true, false, true)) {
PUSH_WARNING("CheckMemory error");
#if defined(USE_TRY)
throw 1;
#else // !USE_TRY
goto err;
#endif // !USE_TRY
} else } else
jvp = MakeValue(g, args, 0); jsp = (PJSON)g->Xchk;
if ((p = jvp->GetString())) { jsx = new(g)JSNX(g, jsp, TYPE_STRING, initid->max_length, 0, true);
if (!(jsp = ParseJson(g, p, strlen(p)))) {
#if defined(USE_TRY) for (uint i = 1; i + 1 < args->arg_count; i += 2) {
throw 2; jvp = MakeValue(gb, args, i);
#else // !USE_TRY path = MakePSZ(g, args, i + 1);
if (jsx->SetJpath(g, path, false)) {
PUSH_WARNING(g->Message); PUSH_WARNING(g->Message);
goto err; continue;
#endif // !USE_TRY } // endif SetJpath
} // endif jsp
} else if (w) {
jsp = jvp->GetJson(); jsx->ReadValue(g);
b = jsx->GetValue()->IsNull();
b = (w == 1) ? b : !b;
} // endif w
if (g->Mrr) { // First argument is a constant if (b && jsx->WriteValue(gb, jvp))
g->Xchk = jsp; PUSH_WARNING(g->Message);
JsonMemSave(g);
} // endif Mrr
} else } // endfor i
jsp = (PJSON)g->Xchk;
jsx = new(g)JSNX(g, jsp, TYPE_STRING, initid->max_length, 0, true); // In case of error or file, return unchanged argument
if (!(str = MakeResult(g, args, jsp, INT_MAX32)))
str = MakePSZ(g, args, 0);
for (uint i = 1; i+1 < args->arg_count; i += 2) { if (g->N)
jvp = MakeValue(gb, args, i); // Keep result of constant function
path = MakePSZ(g, args, i+1); g->Activityp = (PACTIVITY)str;
if (jsx->SetJpath(g, path, false)) { } catch (int n) {
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;
#if defined(USE_TRY)
} catch (int n) {
if (trace) if (trace)
htrc("Exception %d: %s\n", n, g->Message); htrc("Exception %d: %s\n", n, g->Message);
PUSH_WARNING(g->Message); PUSH_WARNING(g->Message);
@@ -3812,10 +3715,6 @@ char *handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result,
PUSH_WARNING(g->Message); PUSH_WARNING(g->Message);
str = NULL; str = NULL;
} // end catch } // end catch
#else // !USE_TRY
err:
g->jump_level--;
#endif // !USE_TRY
fin: fin:
if (!str) { if (!str) {

View File

@@ -0,0 +1,609 @@
/************ MONGO FAM C++ Program Source Code File (.CPP) ************/
/* PROGRAM NAME: mongofam.cpp */
/* ------------- */
/* Version 1.0 */
/* */
/* 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
//PGLOBAL MGOFAM::G = NULL;
// Required to initialize libmongoc's internals
void mongo_init(bool init)
{
if (init) {
//bson_mem_vtable_t vtable;
//vtable.malloc = MGOFAM::mgo_alloc;
//vtable.calloc = MGOFAM::mgo_calloc;
//vtable.realloc = MGOFAM::mgo_realloc;
//vtable.free = MGOFAM::mgo_free;
mongoc_init();
//bson_mem_set_vtable(&vtable);
} else {
//bson_mem_restore_vtable();
mongoc_cleanup();
} // endif init
} // 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;
Lrecl = tdp->Lrecl + tdp->Ending;
} // end of MGOFAM standard constructor
MGOFAM::MGOFAM(PMGOFAM tdfp) : DOSFAM(tdfp)
{
//G = tdfp->G;
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;
Done = tdfp->Done;
} // 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)) {
int64_t card = mongoc_collection_count(Collection,
MONGOC_QUERY_NONE, Query, 0, 0, NULL, &Error);
if (card < 0)
sprintf(g->Message, "Cardinality: %s", Error.message);
return (int)card;
} else
return -1;
} else
return 1;
} // end of Cardinality
/***********************************************************************/
/* Use BlockTest to reduce the table estimated size. */
/* 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) {
char *p = (char*)strchr(options, ';');
if (p) {
*p++ = 0;
filter = p;
} // endif p
} // endif opts
if (filter && *filter) {
if (trace)
htrc("filter=%s\n", filter);
Query = bson_new_from_json((const uint8_t *)filter, -1, &Error);
if (!Query) {
sprintf(g->Message, "Wrong filter: %s", Error.message);
return true;
} // endif Query
} else
Query = bson_new();
if (options && *options) {
if (trace)
htrc("options=%s\n", options);
Opts = bson_new_from_json((const uint8_t *)options, -1, &Error);
if (!Opts) {
sprintf(g->Message, "Wrong options: %s", Error.message);
return true;
} // endif Opts
} // 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 /*&& Mode != MODE_INSERT*/) {
sprintf(g->Message, "Failed to get Collection %s.%s", db_name, coll_name);
return true;
} // endif Collection
Done = true;
return false;
} // end of Init
/***********************************************************************/
/* OpenTableFile: Open a MongoDB table. */
/***********************************************************************/
bool MGOFAM::OpenTableFile(PGLOBAL g)
{
//if (!G) {
// G = g;
// Vtable.malloc = mgo_alloc;
// Vtable.calloc = mgo_calloc;
// Vtable.realloc = mgo_realloc;
// Vtable.free = mgo_free;
// bson_mem_set_vtable(&Vtable);
//} else {
// strcpy(g->Message, "G is not usable");
// return true;
//} // endif G
Mode = Tdbp->GetMode();
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)
Cursor = mongoc_collection_find_with_opts(Collection, Query, Opts, NULL);
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)
{
// TODO implement me
} // end of Rewind

View File

@@ -0,0 +1,95 @@
/************** 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);
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
}; // end of class MGOFAM

View File

@@ -239,62 +239,43 @@ char *ODBCCheckConnection(PGLOBAL g, char *dsn, int cop)
/***********************************************************************/ /***********************************************************************/
/* Allocate the structure used to refer to the result set. */ /* Allocate the structure used to refer to the result set. */
/***********************************************************************/ /***********************************************************************/
static CATPARM *AllocCatInfo(PGLOBAL g, CATINFO fid, char *db, static CATPARM *AllocCatInfo(PGLOBAL g, CATINFO fid, char *db,
char *tab, PQRYRES qrp) char *tab, PQRYRES qrp)
{ {
size_t i, m, n; size_t i, m, n;
CATPARM *cap; CATPARM *cap;
#if defined(_DEBUG) #if defined(_DEBUG)
assert(qrp); assert(qrp);
#endif #endif
#if defined(USE_TRY)
try { try {
#else // !USE_TRY m = (size_t)qrp->Maxres;
// Save stack and allocation environment and prepare error return n = (size_t)qrp->Nbcol;
if (g->jump_level == MAX_JUMP) { cap = (CATPARM *)PlugSubAlloc(g, NULL, sizeof(CATPARM));
strcpy(g->Message, MSG(TOO_MANY_JUMPS)); memset(cap, 0, sizeof(CATPARM));
return NULL; cap->Id = fid;
} // endif jump_level cap->Qrp = qrp;
cap->DB = (PUCHAR)db;
cap->Tab = (PUCHAR)tab;
cap->Vlen = (SQLLEN* *)PlugSubAlloc(g, NULL, n * sizeof(SQLLEN *));
if (setjmp(g->jumper[++g->jump_level]) != 0) { for (i = 0; i < n; i++)
cap->Vlen[i] = (SQLLEN *)PlugSubAlloc(g, NULL, m * sizeof(SQLLEN));
cap->Status = (UWORD *)PlugSubAlloc(g, NULL, m * sizeof(UWORD));
} 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); printf("%s\n", g->Message);
cap = NULL; cap = NULL;
goto fin; } // end catch
} // endif rc
#endif // !USE_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 = (PUCHAR)db;
cap->Tab = (PUCHAR)tab;
cap->Vlen = (SQLLEN* *)PlugSubAlloc(g, NULL, n * sizeof(SQLLEN *));
for (i = 0; i < n; i++)
cap->Vlen[i] = (SQLLEN *)PlugSubAlloc(g, NULL, m * sizeof(SQLLEN));
cap->Status = (UWORD *)PlugSubAlloc(g, NULL, m * sizeof(UWORD));
#if defined(USE_TRY)
} 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
#else // !USE_TRY
fin:
g->jump_level--;
#endif // !USE_TRY
return cap; return cap;
} // end of AllocCatInfo } // end of AllocCatInfo
#if 0 #if 0
/***********************************************************************/ /***********************************************************************/

View File

@@ -143,7 +143,8 @@ enum AMT {TYPE_AM_ERROR = 0, /* Type not defined */
TYPE_AM_MYX = 193, /* MYSQL EXEC access method type */ TYPE_AM_MYX = 193, /* MYSQL EXEC access method type */
TYPE_AM_CAT = 195, /* Catalog access method type no */ TYPE_AM_CAT = 195, /* Catalog access method type no */
TYPE_AM_ZIP = 198, /* ZIP 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 */ enum RECFM {RECFM_NAF = -2, /* Not a file */
RECFM_OEM = -1, /* OEM file access method */ RECFM_OEM = -1, /* OEM file access method */

View File

@@ -238,90 +238,74 @@ void ptrc(char const *fmt, ...)
PQRYRES PlgAllocResult(PGLOBAL g, int ncol, int maxres, int ids, PQRYRES PlgAllocResult(PGLOBAL g, int ncol, int maxres, int ids,
int *buftyp, XFLD *fldtyp, int *buftyp, XFLD *fldtyp,
unsigned int *length, bool blank, bool nonull) unsigned int *length, bool blank, bool nonull)
{ {
char cname[NAM_LEN+1]; char cname[NAM_LEN+1];
int i; int i;
PCOLRES *pcrp, crp; PCOLRES *pcrp, crp;
PQRYRES qrp; PQRYRES qrp;
#if defined(USE_TRY)
try { try {
#else // !USE_TRY /**********************************************************************/
// Save stack and allocation environment and prepare error return /* Allocate the structure used to contain the result set. */
if (g->jump_level == MAX_JUMP) { /**********************************************************************/
strcpy(g->Message, MSG(TOO_MANY_JUMPS)); qrp = (PQRYRES)PlugSubAlloc(g, NULL, sizeof(QRYRES));
return NULL; pcrp = &qrp->Colresp;
} // endif jump_level 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) { for (i = 0; i < ncol; i++) {
printf("%s\n", g->Message); *pcrp = (PCOLRES)PlugSubAlloc(g, NULL, sizeof(COLRES));
qrp = NULL; crp = *pcrp;
goto fin; pcrp = &crp->Next;
} // endif rc memset(crp, 0, sizeof(COLRES));
#endif // !USE_TRY 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) {
/* 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 defined(XMSG) #if defined(XMSG)
// Get header from message file // Get header from message file
strncpy(cname, PlugReadMessage(g, ids + crp->Ncol, NULL), NAM_LEN); strncpy(cname, PlugReadMessage(g, ids + crp->Ncol, NULL), NAM_LEN);
cname[NAM_LEN] = 0; // for truncated long names cname[NAM_LEN] = 0; // for truncated long names
#else // !XMSG #else // !XMSG
GetRcString(ids + crp->Ncol, cname, sizeof(cname)); GetRcString(ids + crp->Ncol, cname, sizeof(cname));
#endif // !XMSG #endif // !XMSG
crp->Name = (PSZ)PlugDup(g, cname); crp->Name = (PSZ)PlugDup(g, cname);
} else } else
crp->Name = NULL; // Will be set by caller crp->Name = NULL; // Will be set by caller
if (fldtyp) if (fldtyp)
crp->Fld = fldtyp[i]; crp->Fld = fldtyp[i];
else else
crp->Fld = FLD_NO; crp->Fld = FLD_NO;
// Allocate the Value Block that will contain data // Allocate the Value Block that will contain data
if (crp->Length || nonull) if (crp->Length || nonull)
crp->Kdata = AllocValBlock(g, NULL, crp->Type, maxres, crp->Kdata = AllocValBlock(g, NULL, crp->Type, maxres,
crp->Length, 0, true, blank, false); crp->Length, 0, true, blank, false);
else else
crp->Kdata = NULL; crp->Kdata = NULL;
if (trace) if (trace)
htrc("Column(%d) %s type=%d len=%d value=%p\n", htrc("Column(%d) %s type=%d len=%d value=%p\n",
crp->Ncol, crp->Name, crp->Type, crp->Length, crp->Kdata); crp->Ncol, crp->Name, crp->Type, crp->Length, crp->Kdata);
} // endfor i } // endfor i
*pcrp = NULL; *pcrp = NULL;
#if defined(USE_TRY) } catch (int n) {
} catch (int n) {
htrc("Exception %d: %s\n", n, g->Message); htrc("Exception %d: %s\n", n, g->Message);
qrp = NULL; qrp = NULL;
} catch (const char *msg) { } catch (const char *msg) {
@@ -329,12 +313,9 @@ PQRYRES PlgAllocResult(PGLOBAL g, int ncol, int maxres, int ids,
htrc("%s\n", g->Message); htrc("%s\n", g->Message);
qrp = NULL; qrp = NULL;
} // end catch } // end catch
#else // !USE_TRY
fin:
g->jump_level--;
#endif // !USE_TRY
return qrp; return qrp;
} // end of PlgAllocResult } // end of PlgAllocResult
/***********************************************************************/ /***********************************************************************/
/* Allocate and initialize the new DB User Block. */ /* Allocate and initialize the new DB User Block. */
@@ -380,11 +361,7 @@ PCATLG PlgGetCatalog(PGLOBAL g, bool jump)
if (!cat && jump) { if (!cat && jump) {
// Raise exception so caller doesn't have to check return value // Raise exception so caller doesn't have to check return value
strcpy(g->Message, MSG(NO_ACTIVE_DB)); strcpy(g->Message, MSG(NO_ACTIVE_DB));
#if defined(USE_TRY)
throw 1; throw 1;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 1);
#endif // !USE_TRY
} // endif cat } // endif cat
return cat; return cat;
@@ -495,11 +472,7 @@ bool PlugEvalLike(PGLOBAL g, LPCSTR strg, LPCSTR pat, bool ci)
tp = g->Message; tp = g->Message;
else if (!(tp = new char[strlen(pat) + strlen(strg) + 2])) { else if (!(tp = new char[strlen(pat) + strlen(strg) + 2])) {
strcpy(g->Message, MSG(NEW_RETURN_NULL)); strcpy(g->Message, MSG(NEW_RETURN_NULL));
#if defined(USE_TRY)
throw OP_LIKE; throw OP_LIKE;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], OP_LIKE);
#endif // !USE_TRY
} /* endif tp */ } /* endif tp */
sp = tp + strlen(pat) + 1; sp = tp + strlen(pat) + 1;
@@ -510,11 +483,7 @@ bool PlugEvalLike(PGLOBAL g, LPCSTR strg, LPCSTR pat, bool ci)
tp = g->Message; /* Use this as temporary work space. */ tp = g->Message; /* Use this as temporary work space. */
else if (!(tp = new char[strlen(pat) + 1])) { else if (!(tp = new char[strlen(pat) + 1])) {
strcpy(g->Message, MSG(NEW_RETURN_NULL)); strcpy(g->Message, MSG(NEW_RETURN_NULL));
#if defined(USE_TRY)
throw OP_LIKE; throw OP_LIKE;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], OP_LIKE);
#endif // !USE_TRY
} /* endif tp */ } /* endif tp */
strcpy(tp, pat); /* Make a copy to be worked into */ strcpy(tp, pat); /* Make a copy to be worked into */
@@ -1547,11 +1516,7 @@ DllExport void NewPointer(PTABS t, void *oldv, void *newv)
PGLOBAL g = t->G; PGLOBAL g = t->G;
sprintf(g->Message, "NewPointer: %s", MSG(MEM_ALLOC_ERROR)); sprintf(g->Message, "NewPointer: %s", MSG(MEM_ALLOC_ERROR));
#if defined(USE_TRY)
throw 3; throw 3;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 3);
#endif // !USE_TRY
} else { } else {
tp->Next = t->P1; tp->Next = t->P1;
tp->Num = 0; tp->Num = 0;
@@ -1588,22 +1553,14 @@ int FileComp(PGLOBAL g, char *file1, char *file2)
sprintf(g->Message, MSG(OPEN_MODE_ERROR), sprintf(g->Message, MSG(OPEN_MODE_ERROR),
"rb", (int)errno, fn[i]); "rb", (int)errno, fn[i]);
strcat(strcat(g->Message, ": "), strerror(errno)); strcat(strcat(g->Message, ": "), strerror(errno));
#if defined(USE_TRY)
throw 666; throw 666;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 666);
#endif // !USE_TRY
// } else // } else
// len[i] = 0; // File does not exist yet // len[i] = 0; // File does not exist yet
} else { } else {
if ((len[i] = _filelength(h[i])) < 0) { if ((len[i] = _filelength(h[i])) < 0) {
sprintf(g->Message, MSG(FILELEN_ERROR), "_filelength", fn[i]); sprintf(g->Message, MSG(FILELEN_ERROR), "_filelength", fn[i]);
#if defined(USE_TRY)
throw 666; throw 666;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 666);
#endif // !USE_TRY
} // endif len } // endif len
} // endif h } // endif h

View File

@@ -519,13 +519,7 @@ void *PlugSubAlloc(PGLOBAL g, void *memp, size_t size)
if (trace) if (trace)
htrc("PlugSubAlloc: %s\n", g->Message); htrc("PlugSubAlloc: %s\n", g->Message);
#if defined(USE_TRY)
throw 1234; throw 1234;
#else // !USE_TRY
/* Nothing we can do if longjmp is not initialized. */
assert(g->jump_level >= 0);
longjmp(g->jumper[g->jump_level], 1);
#endif // !USE_TRY
} /* endif size OS32 code */ } /* endif size OS32 code */
/*********************************************************************/ /*********************************************************************/

View File

@@ -132,7 +132,8 @@ bool DOSDEF::DefineAM(PGLOBAL g, LPCSTR am, int)
bool map = (am && (*am == 'M' || *am == 'm')); bool map = (am && (*am == 'M' || *am == 'm'));
LPCSTR dfm = (am && (*am == 'F' || *am == 'f')) ? "F" LPCSTR dfm = (am && (*am == 'F' || *am == 'f')) ? "F"
: (am && (*am == 'B' || *am == 'b')) ? "B" : (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))) { if ((Zipped = GetBoolCatInfo("Zipped", false))) {
Entry = GetStringCatInfo(g, "Entry", NULL); Entry = GetStringCatInfo(g, "Entry", NULL);
@@ -148,7 +149,8 @@ bool DOSDEF::DefineAM(PGLOBAL g, LPCSTR am, int)
GetCharCatInfo("Recfm", (PSZ)dfm, buf, sizeof(buf)); GetCharCatInfo("Recfm", (PSZ)dfm, buf, sizeof(buf));
Recfm = (toupper(*buf) == 'F') ? RECFM_FIX : Recfm = (toupper(*buf) == 'F') ? RECFM_FIX :
(toupper(*buf) == 'B') ? RECFM_BIN : (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); Lrecl = GetIntCatInfo("Lrecl", 0);
if (Recfm != RECFM_DBF) if (Recfm != RECFM_DBF)
@@ -1511,11 +1513,7 @@ PBF TDBDOS::CheckBlockFilari(PGLOBAL g, PXOB *arg, int op, bool *cnv)
if (n == 8 && ctype != TYPE_LIST) { if (n == 8 && ctype != TYPE_LIST) {
// Should never happen // Should never happen
strcpy(g->Message, "Block opt: bad constant"); strcpy(g->Message, "Block opt: bad constant");
#if defined(USE_TRY)
throw 99; throw 99;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 99);
#endif // !USE_TRY
} // endif Conv } // endif Conv
if (type[0] == 1) { if (type[0] == 1) {
@@ -1796,7 +1794,7 @@ err:
/* Make a dynamic index. */ /* Make a dynamic index. */
/***********************************************************************/ /***********************************************************************/
bool TDBDOS::InitialyzeIndex(PGLOBAL g, volatile PIXDEF xdp, bool sorted) bool TDBDOS::InitialyzeIndex(PGLOBAL g, volatile PIXDEF xdp, bool sorted)
{ {
int k; int k;
volatile bool dynamic; volatile bool dynamic;
bool brc; bool brc;
@@ -1867,17 +1865,7 @@ bool TDBDOS::InitialyzeIndex(PGLOBAL g, volatile PIXDEF xdp, bool sorted)
} else // Column contains same values as ROWID } else // Column contains same values as ROWID
kxp = new(g) XXROW(this); kxp = new(g) XXROW(this);
#if defined(USE_TRY)
try { try {
#else // !USE_TRY
// Prepare error return
if (g->jump_level == MAX_JUMP) {
strcpy(g->Message, MSG(TOO_MANY_JUMPS));
return true;
} // endif
if (!setjmp(g->jumper[++g->jump_level])) {
#endif // !USE_TRY
if (dynamic) { if (dynamic) {
ResetBlockFilter(g); ResetBlockFilter(g);
kxp->SetDynamic(dynamic); kxp->SetDynamic(dynamic);
@@ -1902,7 +1890,6 @@ bool TDBDOS::InitialyzeIndex(PGLOBAL g, volatile PIXDEF xdp, bool sorted)
} // endif brc } // endif brc
#if defined(USE_TRY)
} catch (int n) { } catch (int n) {
if (trace) if (trace)
htrc("Exception %d: %s\n", n, g->Message); htrc("Exception %d: %s\n", n, g->Message);
@@ -1911,14 +1898,9 @@ bool TDBDOS::InitialyzeIndex(PGLOBAL g, volatile PIXDEF xdp, bool sorted)
strcpy(g->Message, msg); strcpy(g->Message, msg);
brc = true; brc = true;
} // end catch } // end catch
#else // !USE_TRY
} else
brc = true;
g->jump_level--;
#endif // !USE_TRY
return brc; return brc;
} // end of InitialyzeIndex } // end of InitialyzeIndex
/***********************************************************************/ /***********************************************************************/
/* DOS GetProgMax: get the max value for progress information. */ /* DOS GetProgMax: get the max value for progress information. */
@@ -2139,7 +2121,8 @@ bool TDBDOS::OpenDB(PGLOBAL g)
return false; return false;
} // endif use } // 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 // Delete all lines. Not handled in MAP or block mode
Txfp = new(g) DOSFAM((PDOSDEF)To_Def); Txfp = new(g) DOSFAM((PDOSDEF)To_Def);
Txfp->SetTdbp(this); Txfp->SetTdbp(this);
@@ -2537,11 +2520,7 @@ void DOSCOL::ReadColumn(PGLOBAL g)
if (rc == RC_EF) if (rc == RC_EF)
sprintf(g->Message, MSG(INV_DEF_READ), rc); sprintf(g->Message, MSG(INV_DEF_READ), rc);
#if defined(USE_TRY)
throw 11; throw 11;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 11);
#endif // !USE_TRY
} // endif } // endif
p = tdbp->To_Line + Deplac; p = tdbp->To_Line + Deplac;
@@ -2597,11 +2576,7 @@ void DOSCOL::ReadColumn(PGLOBAL g)
break; break;
default: default:
sprintf(g->Message, MSG(BAD_RECFM), tdbp->Ftype); sprintf(g->Message, MSG(BAD_RECFM), tdbp->Ftype);
#if defined(USE_TRY)
throw 34; throw 34;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 34);
#endif // !USE_TRY
} // endswitch Ftype } // endswitch Ftype
// Set null when applicable // Set null when applicable
@@ -2710,11 +2685,7 @@ void DOSCOL::WriteColumn(PGLOBAL g)
break; break;
default: default:
sprintf(g->Message, "Invalid field format for column %s", Name); sprintf(g->Message, "Invalid field format for column %s", Name);
#if defined(USE_TRY)
throw 31; throw 31;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 31);
#endif // !USE_TRY
} // endswitch BufType } // endswitch BufType
p2 = Buf; p2 = Buf;
@@ -2726,11 +2697,7 @@ void DOSCOL::WriteColumn(PGLOBAL g)
if ((len = strlen(p2)) > field) { if ((len = strlen(p2)) > field) {
sprintf(g->Message, MSG(VALUE_TOO_LONG), p2, Name, field); sprintf(g->Message, MSG(VALUE_TOO_LONG), p2, Name, field);
#if defined(USE_TRY)
throw 31; throw 31;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 31);
#endif // !USE_TRY
} else if (Dsp) } else if (Dsp)
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
if (p2[i] == '.') if (p2[i] == '.')

View File

@@ -411,11 +411,7 @@ BINCOL::BINCOL(PGLOBAL g, PCOLDEF cdp, PTDB tp, PCOL cp, int i, PSZ am)
case 'D': M = sizeof(double); break; case 'D': M = sizeof(double); break;
default: default:
sprintf(g->Message, MSG(BAD_BIN_FMT), Fmt, Name); sprintf(g->Message, MSG(BAD_BIN_FMT), Fmt, Name);
#if defined(USE_TRY)
throw 11; throw 11;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 11);
#endif // !USE_TRY
} // endswitch Fmt } // endswitch Fmt
} else if (IsTypeChar(Buf_Type)) } else if (IsTypeChar(Buf_Type))
@@ -490,11 +486,7 @@ void BINCOL::ReadColumn(PGLOBAL g)
if (rc == RC_EF) if (rc == RC_EF)
sprintf(g->Message, MSG(INV_DEF_READ), rc); sprintf(g->Message, MSG(INV_DEF_READ), rc);
#if defined(USE_TRY)
throw 11; throw 11;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 11);
#endif // !USE_TRY
} // endif } // endif
p = tdbp->To_Line + Deplac; p = tdbp->To_Line + Deplac;
@@ -553,11 +545,7 @@ void BINCOL::ReadColumn(PGLOBAL g)
break; break;
default: default:
sprintf(g->Message, MSG(BAD_BIN_FMT), Fmt, Name); sprintf(g->Message, MSG(BAD_BIN_FMT), Fmt, Name);
#if defined(USE_TRY)
throw 11; throw 11;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 11);
#endif // !USE_TRY
} // endswitch Fmt } // endswitch Fmt
// Set null when applicable // Set null when applicable
@@ -607,11 +595,7 @@ void BINCOL::WriteColumn(PGLOBAL g)
} else if (Value->GetBinValue(p, Long, Status)) { } else if (Value->GetBinValue(p, Long, Status)) {
sprintf(g->Message, MSG(BIN_F_TOO_LONG), sprintf(g->Message, MSG(BIN_F_TOO_LONG),
Name, Value->GetSize(), Long); Name, Value->GetSize(), Long);
#if defined(USE_TRY)
throw 31; throw 31;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 31);
#endif // !USE_TRY
} // endif p } // endif p
break; break;
@@ -620,11 +604,7 @@ void BINCOL::WriteColumn(PGLOBAL g)
if (n > 32767LL || n < -32768LL) { if (n > 32767LL || n < -32768LL) {
sprintf(g->Message, MSG(VALUE_TOO_BIG), n, Name); sprintf(g->Message, MSG(VALUE_TOO_BIG), n, Name);
#if defined(USE_TRY)
throw 31; throw 31;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 31);
#endif // !USE_TRY
} else if (Status) } else if (Status)
Value->GetValueNonAligned<short>(p, (short)n); Value->GetValueNonAligned<short>(p, (short)n);
@@ -634,11 +614,7 @@ void BINCOL::WriteColumn(PGLOBAL g)
if (n > 255LL || n < -256LL) { if (n > 255LL || n < -256LL) {
sprintf(g->Message, MSG(VALUE_TOO_BIG), n, Name); sprintf(g->Message, MSG(VALUE_TOO_BIG), n, Name);
#if defined(USE_TRY)
throw 31; throw 31;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 31);
#endif // !USE_TRY
} else if (Status) } else if (Status)
*p = (char)n; *p = (char)n;
@@ -648,11 +624,7 @@ void BINCOL::WriteColumn(PGLOBAL g)
if (n > INT_MAX || n < INT_MIN) { if (n > INT_MAX || n < INT_MIN) {
sprintf(g->Message, MSG(VALUE_TOO_BIG), n, Name); sprintf(g->Message, MSG(VALUE_TOO_BIG), n, Name);
#if defined(USE_TRY)
throw 31; throw 31;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 31);
#endif // !USE_TRY
} else if (Status) } else if (Status)
Value->GetValueNonAligned<int>(p, (int)n); Value->GetValueNonAligned<int>(p, (int)n);
@@ -676,11 +648,7 @@ void BINCOL::WriteColumn(PGLOBAL g)
case 'C': // Characters case 'C': // Characters
if ((n = (signed)strlen(Value->GetCharString(Buf))) > Long) { if ((n = (signed)strlen(Value->GetCharString(Buf))) > Long) {
sprintf(g->Message, MSG(BIN_F_TOO_LONG), Name, (int) n, Long); sprintf(g->Message, MSG(BIN_F_TOO_LONG), Name, (int) n, Long);
#if defined(USE_TRY)
throw 31; throw 31;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 31);
#endif // !USE_TRY
} // endif n } // endif n
if (Status) { if (Status) {
@@ -692,11 +660,7 @@ void BINCOL::WriteColumn(PGLOBAL g)
break; break;
default: default:
sprintf(g->Message, MSG(BAD_BIN_FMT), Fmt, Name); sprintf(g->Message, MSG(BAD_BIN_FMT), Fmt, Name);
#if defined(USE_TRY)
throw 31; throw 31;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 31);
#endif // !USE_TRY
} // endswitch Fmt } // endswitch Fmt
if (Eds && Status) { if (Eds && Status) {

View File

@@ -1435,11 +1435,7 @@ void CSVCOL::ReadColumn(PGLOBAL g)
if (rc == RC_EF) if (rc == RC_EF)
sprintf(g->Message, MSG(INV_DEF_READ), rc); sprintf(g->Message, MSG(INV_DEF_READ), rc);
#if defined(USE_TRY)
throw 34; throw 34;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 34);
#endif // !USE_TRY
} // endif } // endif
if (tdbp->Mode != MODE_UPDATE) { if (tdbp->Mode != MODE_UPDATE) {
@@ -1457,11 +1453,7 @@ void CSVCOL::ReadColumn(PGLOBAL g)
Long = colen; // Restore column length Long = colen; // Restore column length
sprintf(g->Message, MSG(FLD_TOO_LNG_FOR), sprintf(g->Message, MSG(FLD_TOO_LNG_FOR),
Fldnum + 1, Name, To_Tdb->RowNumber(g), tdbp->GetFile(g)); Fldnum + 1, Name, To_Tdb->RowNumber(g), tdbp->GetFile(g));
#if defined(USE_TRY)
throw 34; throw 34;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 34);
#endif // !USE_TRY
} // endif Long } // endif Long
// Now do the reading // Now do the reading
@@ -1524,11 +1516,7 @@ void CSVCOL::WriteColumn(PGLOBAL g)
if ((signed)strlen(p) > flen) { if ((signed)strlen(p) > flen) {
sprintf(g->Message, MSG(BAD_FLD_LENGTH), Name, p, flen, sprintf(g->Message, MSG(BAD_FLD_LENGTH), Name, p, flen,
tdbp->RowNumber(g), tdbp->GetFile(g)); tdbp->RowNumber(g), tdbp->GetFile(g));
#if defined(USE_TRY)
throw 34; throw 34;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 34);
#endif // !USE_TRY
} else if (Dsp) } else if (Dsp)
for (int i = 0; p[i]; i++) for (int i = 0; p[i]; i++)
if (p[i] == '.') if (p[i] == '.')
@@ -1544,11 +1532,7 @@ void CSVCOL::WriteColumn(PGLOBAL g)
if (Fldnum < 0) { if (Fldnum < 0) {
// This can happen for wrong offset value in XDB files // This can happen for wrong offset value in XDB files
sprintf(g->Message, MSG(BAD_FIELD_RANK), Fldnum + 1, Name); sprintf(g->Message, MSG(BAD_FIELD_RANK), Fldnum + 1, Name);
#if defined(USE_TRY)
throw 34; throw 34;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 34);
#endif // !USE_TRY
} else } else
strncpy(tdbp->Field[Fldnum], p, flen); strncpy(tdbp->Field[Fldnum], p, flen);

View File

@@ -31,6 +31,9 @@
#if defined(ZIP_SUPPORT) #if defined(ZIP_SUPPORT)
#include "filamzip.h" #include "filamzip.h"
#endif // ZIP_SUPPORT #endif // ZIP_SUPPORT
#if defined(MONGO_SUPPORT)
#include "mongofam.h"
#endif // MONGO_SUPPORT
#include "tabmul.h" #include "tabmul.h"
#include "checklvl.h" #include "checklvl.h"
#include "resource.h" #include "resource.h"
@@ -63,7 +66,7 @@ typedef struct _jncol {
/* JSONColumns: construct the result blocks containing the description */ /* JSONColumns: construct the result blocks containing the description */
/* of all the columns of a table contained inside a JSON file. */ /* of all the columns of a table contained inside a JSON file. */
/***********************************************************************/ /***********************************************************************/
PQRYRES JSONColumns(PGLOBAL g, char *db, PTOS topt, bool info) PQRYRES JSONColumns(PGLOBAL g, char *db, char *dsn, PTOS topt, bool info)
{ {
static int buftyp[] = {TYPE_STRING, TYPE_SHORT, TYPE_STRING, TYPE_INT, static int buftyp[] = {TYPE_STRING, TYPE_SHORT, TYPE_STRING, TYPE_INT,
TYPE_INT, TYPE_SHORT, TYPE_SHORT, TYPE_STRING}; TYPE_INT, TYPE_SHORT, TYPE_SHORT, TYPE_STRING};
@@ -112,7 +115,7 @@ PQRYRES JSONColumns(PGLOBAL g, char *db, PTOS topt, bool info)
#endif // ZIP_SUPPORT #endif // ZIP_SUPPORT
tdp->Fn = GetStringTableOption(g, topt, "Filename", NULL); tdp->Fn = GetStringTableOption(g, topt, "Filename", NULL);
if (!tdp->Fn) { if (!tdp->Fn && !dsn) {
strcpy(g->Message, MSG(MISSING_FNAME)); strcpy(g->Message, MSG(MISSING_FNAME));
return NULL; return NULL;
} // endif Fn } // endif Fn
@@ -126,6 +129,19 @@ PQRYRES JSONColumns(PGLOBAL g, char *db, PTOS topt, bool info)
htrc("File %s objname=%s pretty=%d lvl=%d\n", htrc("File %s objname=%s pretty=%d lvl=%d\n",
tdp->Fn, tdp->Objname, tdp->Pretty, lvl); tdp->Fn, tdp->Objname, tdp->Pretty, lvl);
if (tdp->Uri = dsn) {
#if defined(MONGO_SUPPORT)
tdp->Collname = GetStringTableOption(g, topt, "Name", NULL);
tdp->Collname = GetStringTableOption(g, topt, "Tabname", tdp->Collname);
tdp->Schema = GetStringTableOption(g, topt, "Dbname", "test");
tdp->Options = GetStringTableOption(g, topt, "Colist", NULL);
tdp->Pretty = 0;
#else // !MONGO_SUPPORT
sprintf(g->Message, MSG(NO_FEAT_SUPPORT), "MONGO");
return NULL;
#endif // !MONGO_SUPPORT
} // endif Uri
if (tdp->Pretty == 2) { if (tdp->Pretty == 2) {
if (tdp->Zipped) { if (tdp->Zipped) {
#if defined(ZIP_SUPPORT) #if defined(ZIP_SUPPORT)
@@ -151,12 +167,14 @@ PQRYRES JSONColumns(PGLOBAL g, char *db, PTOS topt, bool info)
if (tdp->Zipped) { if (tdp->Zipped) {
#if defined(ZIP_SUPPORT) #if defined(ZIP_SUPPORT)
tjnp = new(g)TDBJSN(tdp, new(g)UNZFAM(tdp)); tjnp = new(g)TDBJSN(tdp, new(g) UNZFAM(tdp));
#else // !ZIP_SUPPORT #else // !ZIP_SUPPORT
sprintf(g->Message, MSG(NO_FEAT_SUPPORT), "ZIP"); sprintf(g->Message, MSG(NO_FEAT_SUPPORT), "ZIP");
return NULL; return NULL;
#endif // !ZIP_SUPPORT #endif // !ZIP_SUPPORT
} else } else if (tdp->Uri)
tjnp = new(g) TDBJSN(tdp, new(g) MGOFAM(tdp));
else
tjnp = new(g) TDBJSN(tdp, new(g) DOSFAM(tdp)); tjnp = new(g) TDBJSN(tdp, new(g) DOSFAM(tdp));
tjnp->SetMode(MODE_READ); tjnp->SetMode(MODE_READ);
@@ -404,6 +422,10 @@ JSONDEF::JSONDEF(void)
Limit = 1; Limit = 1;
Base = 0; Base = 0;
Strict = false; Strict = false;
#if defined(MONGO_SUPPORT)
Uri = NULL;
Collname = Schema = Options = NULL;
#endif // MONGO_SUPPORT
} // end of JSONDEF constructor } // end of JSONDEF constructor
/***********************************************************************/ /***********************************************************************/
@@ -417,7 +439,22 @@ bool JSONDEF::DefineAM(PGLOBAL g, LPCSTR, int poff)
Pretty = GetIntCatInfo("Pretty", 2); Pretty = GetIntCatInfo("Pretty", 2);
Limit = GetIntCatInfo("Limit", 10); Limit = GetIntCatInfo("Limit", 10);
Base = GetIntCatInfo("Base", 0) ? 1 : 0; Base = GetIntCatInfo("Base", 0) ? 1 : 0;
return DOSDEF::DefineAM(g, "DOS", poff);
if (Uri = GetStringCatInfo(g, "Connect", NULL)) {
#if defined(MONGO_SUPPORT)
Collname = GetStringCatInfo(g, "Name",
(Catfunc & (FNC_TABLE | FNC_COL)) ? NULL : Name);
Collname = GetStringCatInfo(g, "Tabname", Collname);
Schema = GetStringCatInfo(g, "Dbname", "test");
Options = GetStringCatInfo(g, "Colist", NULL);
Pretty = 0;
#else // !MONGO_SUPPORT
sprintf(g->Message, MSG(NO_FEAT_SUPPORT), "MONGO");
return true;
#endif // !MONGO_SUPPORT
} // endif Uri
return DOSDEF::DefineAM(g, (Uri ? "XMGO" : "DOS"), poff);
} // end of DefineAM } // end of DefineAM
/***********************************************************************/ /***********************************************************************/
@@ -463,7 +500,9 @@ PTDB JSONDEF::GetTable(PGLOBAL g, MODE m)
sprintf(g->Message, MSG(NO_FEAT_SUPPORT), "GZ"); sprintf(g->Message, MSG(NO_FEAT_SUPPORT), "GZ");
return NULL; return NULL;
#endif // !GZ_SUPPORT #endif // !GZ_SUPPORT
} else if (map) } else if (Uri)
txfp = new(g) MGOFAM(this);
else if (map)
txfp = new(g) MAPFAM(this); txfp = new(g) MAPFAM(this);
else else
txfp = new(g) DOSFAM(this); txfp = new(g) DOSFAM(this);
@@ -527,6 +566,7 @@ TDBJSN::TDBJSN(PJDEF tdp, PTXF txfp) : TDBDOS(tdp, txfp)
if (tdp) { if (tdp) {
Jmode = tdp->Jmode; Jmode = tdp->Jmode;
Objname = tdp->Objname; Objname = tdp->Objname;
Amtype = (tdp->Uri ? TYPE_AM_MGO : TYPE_AM_JSN);
Xcol = tdp->Xcol; Xcol = tdp->Xcol;
Limit = tdp->Limit; Limit = tdp->Limit;
Pretty = tdp->Pretty; Pretty = tdp->Pretty;
@@ -535,7 +575,8 @@ TDBJSN::TDBJSN(PJDEF tdp, PTXF txfp) : TDBDOS(tdp, txfp)
} else { } else {
Jmode = MODE_OBJECT; Jmode = MODE_OBJECT;
Objname = NULL; Objname = NULL;
Xcol = NULL; Amtype = TYPE_AM_JSN;
Xcol = NULL;
Limit = 1; Limit = 1;
Pretty = 0; Pretty = 0;
B = 0; B = 0;
@@ -865,16 +906,16 @@ int TDBJSN::MakeTopTree(PGLOBAL g, PJSON jsp)
} // end of PrepareWriting } // end of PrepareWriting
/***********************************************************************/ /***********************************************************************/
/* WriteDB: Data Base write routine for DOS access method. */ /* WriteDB: Data Base write routine for DOS access method. */
/***********************************************************************/ /***********************************************************************/
int TDBJSN::WriteDB(PGLOBAL g) int TDBJSN::WriteDB(PGLOBAL g)
{ {
int rc = TDBDOS::WriteDB(g); int rc = TDBDOS::WriteDB(g);
#if USE_G #if USE_G
if (rc == RC_FX) //if (rc == RC_FX)
strcpy(g->Message, G->Message); // strcpy(g->Message, G->Message);
PlugSubSet(G, G->Sarea, G->Sarea_Size); PlugSubSet(G, G->Sarea, G->Sarea_Size);
#endif #endif
@@ -882,7 +923,7 @@ int TDBJSN::MakeTopTree(PGLOBAL g, PJSON jsp)
return rc; return rc;
} // end of WriteDB } // end of WriteDB
/* ---------------------------- JSONCOL ------------------------------ */ /* ---------------------------- JSONCOL ------------------------------ */
/***********************************************************************/ /***********************************************************************/
/* JSONCOL public constructor. */ /* JSONCOL public constructor. */
@@ -1290,11 +1331,7 @@ PVAL JSONCOL::ExpandArray(PGLOBAL g, PJAR arp, int n)
if (!(jvp = arp->GetValue((Nodes[n].Rx = Nodes[n].Nx)))) { if (!(jvp = arp->GetValue((Nodes[n].Rx = Nodes[n].Nx)))) {
strcpy(g->Message, "Logical error expanding array"); strcpy(g->Message, "Logical error expanding array");
#if defined(USE_TRY)
throw 666; throw 666;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 666);
#endif // !USE_TRY
} // endif jvp } // endif jvp
if (n < Nod - 1 && jvp->GetJson()) { if (n < Nod - 1 && jvp->GetJson()) {
@@ -1480,11 +1517,7 @@ void JSONCOL::WriteColumn(PGLOBAL g)
{ {
if (Xpd && Tjp->Pretty < 2) { if (Xpd && Tjp->Pretty < 2) {
strcpy(g->Message, "Cannot write expanded column when Pretty is not 2"); strcpy(g->Message, "Cannot write expanded column when Pretty is not 2");
#if defined(USE_TRY)
throw 666; throw 666;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 666);
#endif // !USE_TRY
} // endif Xpd } // endif Xpd
/*********************************************************************/ /*********************************************************************/
@@ -1519,11 +1552,7 @@ void JSONCOL::WriteColumn(PGLOBAL g)
if (!(jsp = ParseJson(G, s, (int)strlen(s)))) { if (!(jsp = ParseJson(G, s, (int)strlen(s)))) {
strcpy(g->Message, s); strcpy(g->Message, s);
#if defined(USE_TRY)
throw 666; throw 666;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 666);
#endif // !USE_TRY
} // endif jsp } // endif jsp
if (arp) { if (arp) {
@@ -1996,6 +2025,7 @@ TDBJCL::TDBJCL(PJDEF tdp) : TDBCAT(tdp)
{ {
Topt = tdp->GetTopt(); Topt = tdp->GetTopt();
Db = (char*)tdp->GetDB(); Db = (char*)tdp->GetDB();
Dsn = (char*)tdp->Uri;
} // end of TDBJCL constructor } // end of TDBJCL constructor
/***********************************************************************/ /***********************************************************************/
@@ -2003,7 +2033,7 @@ TDBJCL::TDBJCL(PJDEF tdp) : TDBCAT(tdp)
/***********************************************************************/ /***********************************************************************/
PQRYRES TDBJCL::GetResult(PGLOBAL g) PQRYRES TDBJCL::GetResult(PGLOBAL g)
{ {
return JSONColumns(g, Db, Topt, false); return JSONColumns(g, Db, Dsn, Topt, false);
} // end of GetResult } // end of GetResult
/* --------------------------- End of json --------------------------- */ /* --------------------------- End of json --------------------------- */

View File

@@ -1,5 +1,5 @@
/*************** tabjson H Declares Source Code File (.H) **************/ /*************** tabjson H Declares Source Code File (.H) **************/
/* Name: tabjson.h Version 1.2 */ /* Name: tabjson.h Version 1.3 */
/* */ /* */
/* (C) Copyright to the author Olivier BERTRAND 2014 - 2017 */ /* (C) Copyright to the author Olivier BERTRAND 2014 - 2017 */
/* */ /* */
@@ -36,8 +36,11 @@ class DllExport JSONDEF : public DOSDEF { /* Table description */
friend class TDBJSON; friend class TDBJSON;
friend class TDBJSN; friend class TDBJSN;
friend class TDBJCL; friend class TDBJCL;
friend PQRYRES JSONColumns(PGLOBAL, char*, PTOS, bool); friend PQRYRES JSONColumns(PGLOBAL, char*, char*, PTOS, bool);
public: #if defined(MONGO_SUPPORT)
friend class MGOFAM;
#endif // MONGO_SUPPORT
public:
// Constructor // Constructor
JSONDEF(void); JSONDEF(void);
@@ -58,6 +61,12 @@ class DllExport JSONDEF : public DOSDEF { /* Table description */
int Level; /* Used for catalog table */ int Level; /* Used for catalog table */
int Base; /* Tne array index base */ int Base; /* Tne array index base */
bool Strict; /* Strict syntax checking */ bool Strict; /* Strict syntax checking */
#if defined(MONGO_SUPPORT)
const char *Uri; /* MongoDB connection URI */
PSZ Collname; /* External collection name */
PSZ Schema; /* External schema (DB) name */
PSZ Options; /* Colist ; filter */
#endif // MONGO_SUPPORT
}; // end of JSONDEF }; // end of JSONDEF
/* -------------------------- TDBJSN class --------------------------- */ /* -------------------------- TDBJSN class --------------------------- */
@@ -75,7 +84,7 @@ public:
TDBJSN(TDBJSN *tdbp); TDBJSN(TDBJSN *tdbp);
// Implementation // Implementation
virtual AMT GetAmType(void) {return TYPE_AM_JSN;} virtual AMT GetAmType(void) {return Amtype;}
virtual bool SkipHeader(PGLOBAL g); virtual bool SkipHeader(PGLOBAL g);
virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBJSN(this);} virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBJSN(this);}
PJSON GetRow(void) {return Row;} PJSON GetRow(void) {return Row;}
@@ -107,6 +116,7 @@ public:
PJSON Val; // The value of the current row PJSON Val; // The value of the current row
PJCOL Colp; // The multiple column PJCOL Colp; // The multiple column
JMODE Jmode; // MODE_OBJECT by default JMODE Jmode; // MODE_OBJECT by default
AMT Amtype; // Access method type
char *Objname; // The table object name char *Objname; // The table object name
char *Xcol; // Name of expandable column char *Xcol; // Name of expandable column
int Fpos; // The current row index int Fpos; // The current row index
@@ -233,4 +243,5 @@ class DllExport TDBJCL : public TDBCAT {
// Members // Members
PTOS Topt; PTOS Topt;
char *Db; char *Db;
char *Dsn;
}; // end of class TDBJCL }; // end of class TDBJCL

View File

@@ -1008,11 +1008,7 @@ void DIRCOL::ReadColumn(PGLOBAL g)
#endif // !__WIN__ #endif // !__WIN__
default: default:
sprintf(g->Message, MSG(INV_DIRCOL_OFST), N); sprintf(g->Message, MSG(INV_DIRCOL_OFST), N);
#if defined(USE_TRY)
throw GetAmType(); throw GetAmType();
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], GetAmType());
#endif // !USE_TRY
} // endswitch N } // endswitch N
} // end of ReadColumn } // end of ReadColumn
@@ -1537,11 +1533,7 @@ void TDBDHR::CloseDB(PGLOBAL g)
// Close the search handle. // Close the search handle.
if (!FindClose(Hsearch)) { if (!FindClose(Hsearch)) {
strcpy(g->Message, MSG(SRCH_CLOSE_ERR)); strcpy(g->Message, MSG(SRCH_CLOSE_ERR));
#if defined(USE_TRY)
throw GetAmType(); throw GetAmType();
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], GetAmType());
#endif // !USE_TRY
} // endif FindClose } // endif FindClose
iFile = 0; iFile = 0;

View File

@@ -1407,11 +1407,7 @@ void MYSQLCOL::ReadColumn(PGLOBAL g)
if (rc == RC_EF) if (rc == RC_EF)
sprintf(g->Message, MSG(INV_DEF_READ), rc); sprintf(g->Message, MSG(INV_DEF_READ), rc);
#if defined(USE_TRY)
throw 11; throw 11;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 11);
#endif // !USE_TRY
} else } else
tdbp->Fetched = true; tdbp->Fetched = true;

View File

@@ -106,7 +106,7 @@ bool PIVAID::SkipColumn(PCOLRES crp, char *skc)
/* Make the Pivot table column list. */ /* Make the Pivot table column list. */
/***********************************************************************/ /***********************************************************************/
PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) PQRYRES PIVAID::MakePivotColumns(PGLOBAL g)
{ {
char *p, *query, *colname, *skc, buf[64]; char *p, *query, *colname, *skc, buf[64];
int ndif, nblin, w = 0; int ndif, nblin, w = 0;
bool b = false; bool b = false;
@@ -114,205 +114,190 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g)
PQRYRES qrp; PQRYRES qrp;
PCOLRES *pcrp, crp, fncrp = NULL; PCOLRES *pcrp, crp, fncrp = NULL;
#if defined(USE_TRY)
try { try {
#else // !USE_TRY // Are there columns to skip?
// Save stack and allocation environment and prepare error return if (Skcol) {
if (g->jump_level == MAX_JUMP) { uint n = strlen(Skcol);
strcpy(g->Message, MSG(TOO_MANY_JUMPS));
return NULL;
} // endif jump_level
if (setjmp(g->jumper[++g->jump_level])) { skc = (char*)PlugSubAlloc(g, NULL, n + 2);
goto err; strcpy(skc, Skcol);
} // endif rc skc[n + 1] = 0;
#endif // !USE_TRY
// Are there columns to skip? // Replace ; by nulls in skc
if (Skcol) { for (p = strchr(skc, ';'); p; p = strchr(p, ';'))
uint n = strlen(Skcol); *p++ = 0;
skc = (char*)PlugSubAlloc(g, NULL, n + 2); } else
strcpy(skc, Skcol); skc = NULL;
skc[n + 1] = 0;
// Replace ; by nulls in skc if (!Tabsrc && Tabname) {
for (p = strchr(skc, ';'); p; p = strchr(p, ';')) // Locate the query
*p++ = 0; query = (char*)PlugSubAlloc(g, NULL, strlen(Tabname) + 26);
sprintf(query, "SELECT * FROM `%s` LIMIT 1", Tabname);
} else if (!Tabsrc) {
strcpy(g->Message, MSG(SRC_TABLE_UNDEF));
goto err;
} else
query = Tabsrc;
} else // Open a MySQL connection for this table
skc = NULL; if (!Myc.Open(g, Host, Database, User, Pwd, Port)) {
b = true;
if (!Tabsrc && Tabname) { // Returned values must be in their original character set
// Locate the query if (Myc.ExecSQL(g, "SET character_set_results=NULL", &w) == RC_FX)
query = (char*)PlugSubAlloc(g, NULL, strlen(Tabname) + 26); goto err;
sprintf(query, "SELECT * FROM `%s` LIMIT 1", Tabname); else
} else if (!Tabsrc) { Myc.FreeResult();
strcpy(g->Message, MSG(SRC_TABLE_UNDEF));
goto err;
} else
query = Tabsrc;
// Open a MySQL connection for this table } else
if (!Myc.Open(g, Host, Database, User, Pwd, Port)) {
b = true;
// Returned values must be in their original character set
if (Myc.ExecSQL(g, "SET character_set_results=NULL", &w) == RC_FX)
goto err;
else
Myc.FreeResult();
} else
goto err;
// Send the source command to MySQL
if (Myc.ExecSQL(g, query, &w) == RC_FX)
goto err;
// We must have a storage query to get pivot column values
if (!(Qryp = Myc.GetResult(g, true)))
goto err;
if (!Fncol) {
for (crp = Qryp->Colresp; crp; crp = crp->Next)
if ((!Picol || stricmp(Picol, crp->Name)) && !SkipColumn(crp, skc))
Fncol = crp->Name;
if (!Fncol) {
strcpy(g->Message, MSG(NO_DEF_FNCCOL));
goto err;
} // endif Fncol
} // endif Fncol
if (!Picol) {
// Find default Picol as the last one not equal to Fncol
for (crp = Qryp->Colresp; crp; crp = crp->Next)
if (stricmp(Fncol, crp->Name) && !SkipColumn(crp, skc))
Picol = crp->Name;
if (!Picol) {
strcpy(g->Message, MSG(NO_DEF_PIVOTCOL));
goto err;
} // endif Picol
} // endif picol
// Prepare the column list
for (pcrp = &Qryp->Colresp; crp = *pcrp; )
if (SkipColumn(crp, skc)) {
// Ignore this column
*pcrp = crp->Next;
} else if (!stricmp(Picol, crp->Name)) {
if (crp->Nulls) {
sprintf(g->Message, "Pivot column %s cannot be nullable", Picol);
goto err;
} // endif Nulls
Rblkp = crp->Kdata;
*pcrp = crp->Next;
} else if (!stricmp(Fncol, crp->Name)) {
fncrp = crp;
*pcrp = crp->Next;
} else
pcrp = &crp->Next;
if (!Rblkp) {
strcpy(g->Message, MSG(NO_DEF_PIVOTCOL));
goto err;
} else if (!fncrp) {
strcpy(g->Message, MSG(NO_DEF_FNCCOL));
goto err;
} // endif
if (Tabsrc) {
Myc.Close();
b = false;
// Before calling sort, initialize all
nblin = Qryp->Nblin;
Index.Size = nblin * sizeof(int);
Index.Sub = TRUE; // Should be small enough
if (!PlgDBalloc(g, NULL, Index))
goto err; goto err;
Offset.Size = (nblin + 1) * sizeof(int); // Send the source command to MySQL
Offset.Sub = TRUE; // Should be small enough if (Myc.ExecSQL(g, query, &w) == RC_FX)
if (!PlgDBalloc(g, NULL, Offset))
goto err; goto err;
ndif = Qsort(g, nblin); // We must have a storage query to get pivot column values
if (!(Qryp = Myc.GetResult(g, true)))
if (ndif < 0) // error
goto err; goto err;
} else { if (!Fncol) {
// The query was limited, we must get pivot column values for (crp = Qryp->Colresp; crp; crp = crp->Next)
// Returned values must be in their original character set if ((!Picol || stricmp(Picol, crp->Name)) && !SkipColumn(crp, skc))
// if (Myc.ExecSQL(g, "SET character_set_results=NULL", &w) == RC_FX) Fncol = crp->Name;
// goto err;
query = (char*)PlugSubAlloc(g, NULL, 0); if (!Fncol) {
sprintf(query, "SELECT DISTINCT `%s` FROM `%s`", Picol, Tabname); strcpy(g->Message, MSG(NO_DEF_FNCCOL));
PlugSubAlloc(g, NULL, strlen(query) + 1); goto err;
Myc.FreeResult(); } // endif Fncol
// Send the source command to MySQL } // endif Fncol
if (Myc.ExecSQL(g, query, &w) == RC_FX)
goto err;
// We must have a storage query to get pivot column values if (!Picol) {
if (!(qrp = Myc.GetResult(g, true))) // Find default Picol as the last one not equal to Fncol
goto err; for (crp = Qryp->Colresp; crp; crp = crp->Next)
if (stricmp(Fncol, crp->Name) && !SkipColumn(crp, skc))
Picol = crp->Name;
Myc.Close(); if (!Picol) {
b = false; strcpy(g->Message, MSG(NO_DEF_PIVOTCOL));
goto err;
} // endif Picol
// Get the column list } // endif picol
crp = qrp->Colresp;
Rblkp = crp->Kdata;
ndif = qrp->Nblin;
} // endif Tabsrc
// Allocate the Value used to retieve column names // Prepare the column list
if (!(valp = AllocateValue(g, Rblkp->GetType(), for (pcrp = &Qryp->Colresp; crp = *pcrp; )
Rblkp->GetVlen(), if (SkipColumn(crp, skc)) {
Rblkp->GetPrec()))) // Ignore this column
goto err; *pcrp = crp->Next;
} else if (!stricmp(Picol, crp->Name)) {
if (crp->Nulls) {
sprintf(g->Message, "Pivot column %s cannot be nullable", Picol);
goto err;
} // endif Nulls
// Now make the functional columns Rblkp = crp->Kdata;
for (int i = 0; i < ndif; i++) { *pcrp = crp->Next;
if (i) { } else if (!stricmp(Fncol, crp->Name)) {
crp = (PCOLRES)PlugSubAlloc(g, NULL, sizeof(COLRES)); fncrp = crp;
memcpy(crp, fncrp, sizeof(COLRES)); *pcrp = crp->Next;
} else } else
crp = fncrp; pcrp = &crp->Next;
// Get the value that will be the generated column name if (!Rblkp) {
if (Tabsrc) strcpy(g->Message, MSG(NO_DEF_PIVOTCOL));
valp->SetValue_pvblk(Rblkp, Pex[Pof[i]]); goto err;
else } else if (!fncrp) {
valp->SetValue_pvblk(Rblkp, i); strcpy(g->Message, MSG(NO_DEF_FNCCOL));
goto err;
} // endif
colname = valp->GetCharString(buf); if (Tabsrc) {
crp->Name = PlugDup(g, colname); Myc.Close();
crp->Flag = 1; b = false;
// Add this column // Before calling sort, initialize all
*pcrp = crp; nblin = Qryp->Nblin;
crp->Next = NULL;
pcrp = &crp->Next;
} // endfor i
// We added ndif columns and removed 2 (picol and fncol) Index.Size = nblin * sizeof(int);
Qryp->Nbcol += (ndif - 2); Index.Sub = TRUE; // Should be small enough
#if defined(USE_TRY)
return Qryp;
if (!PlgDBalloc(g, NULL, Index))
goto err;
Offset.Size = (nblin + 1) * sizeof(int);
Offset.Sub = TRUE; // Should be small enough
if (!PlgDBalloc(g, NULL, Offset))
goto err;
ndif = Qsort(g, nblin);
if (ndif < 0) // error
goto err;
} else {
// The query was limited, we must get pivot column values
// Returned values must be in their original character set
// if (Myc.ExecSQL(g, "SET character_set_results=NULL", &w) == RC_FX)
// goto err;
query = (char*)PlugSubAlloc(g, NULL, 0);
sprintf(query, "SELECT DISTINCT `%s` FROM `%s`", Picol, Tabname);
PlugSubAlloc(g, NULL, strlen(query) + 1);
Myc.FreeResult();
// Send the source command to MySQL
if (Myc.ExecSQL(g, query, &w) == RC_FX)
goto err;
// We must have a storage query to get pivot column values
if (!(qrp = Myc.GetResult(g, true)))
goto err;
Myc.Close();
b = false;
// Get the column list
crp = qrp->Colresp;
Rblkp = crp->Kdata;
ndif = qrp->Nblin;
} // endif Tabsrc
// Allocate the Value used to retieve column names
if (!(valp = AllocateValue(g, Rblkp->GetType(),
Rblkp->GetVlen(),
Rblkp->GetPrec())))
goto err;
// Now make the functional columns
for (int i = 0; i < ndif; i++) {
if (i) {
crp = (PCOLRES)PlugSubAlloc(g, NULL, sizeof(COLRES));
memcpy(crp, fncrp, sizeof(COLRES));
} else
crp = fncrp;
// Get the value that will be the generated column name
if (Tabsrc)
valp->SetValue_pvblk(Rblkp, Pex[Pof[i]]);
else
valp->SetValue_pvblk(Rblkp, i);
colname = valp->GetCharString(buf);
crp->Name = PlugDup(g, colname);
crp->Flag = 1;
// Add this column
*pcrp = crp;
crp->Next = NULL;
pcrp = &crp->Next;
} // endfor i
// We added ndif columns and removed 2 (picol and fncol)
Qryp->Nbcol += (ndif - 2);
return Qryp;
} catch (int n) { } catch (int n) {
if (trace) if (trace)
htrc("Exception %d: %s\n", n, g->Message); htrc("Exception %d: %s\n", n, g->Message);
@@ -321,19 +306,11 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g)
} // end catch } // end catch
err: err:
#else // !USE_TRY
g->jump_level--;
return Qryp;
err:
g->jump_level--;
#endif // !USE_TRY
if (b) if (b)
Myc.Close(); Myc.Close();
return NULL; return NULL;
} // end of MakePivotColumns } // end of MakePivotColumns
/***********************************************************************/ /***********************************************************************/
/* PIVAID: Compare routine for sorting pivot column values. */ /* PIVAID: Compare routine for sorting pivot column values. */

View File

@@ -511,19 +511,11 @@ void INICOL::WriteColumn(PGLOBAL g)
if (strlen(p) > (unsigned)Long) { if (strlen(p) > (unsigned)Long) {
sprintf(g->Message, MSG(VALUE_TOO_LONG), p, Name, Long); sprintf(g->Message, MSG(VALUE_TOO_LONG), p, Name, Long);
#if defined(USE_TRY)
throw 31; throw 31;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 31);
#endif // !USE_TRY
} else if (Flag == 1) { } else if (Flag == 1) {
if (tdbp->Mode == MODE_UPDATE) { if (tdbp->Mode == MODE_UPDATE) {
strcpy(g->Message, MSG(NO_SEC_UPDATE)); strcpy(g->Message, MSG(NO_SEC_UPDATE));
#if defined(USE_TRY)
throw 31; throw 31;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 31);
#endif // !USE_TRY
} else if (*p) { } else if (*p) {
tdbp->Section = p; tdbp->Section = p;
} else } else
@@ -532,11 +524,7 @@ void INICOL::WriteColumn(PGLOBAL g)
return; return;
} else if (!tdbp->Section) { } else if (!tdbp->Section) {
strcpy(g->Message, MSG(SEC_NAME_FIRST)); strcpy(g->Message, MSG(SEC_NAME_FIRST));
#if defined(USE_TRY)
throw 31; throw 31;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 31);
#endif // !USE_TRY
} // endif's } // endif's
/*********************************************************************/ /*********************************************************************/
@@ -548,11 +536,7 @@ void INICOL::WriteColumn(PGLOBAL g)
if (!rc) { if (!rc) {
sprintf(g->Message, "Error %d writing to %s", sprintf(g->Message, "Error %d writing to %s",
GetLastError(), tdbp->Ifile); GetLastError(), tdbp->Ifile);
#if defined(USE_TRY)
throw 31; throw 31;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 31);
#endif // !USE_TRY
} // endif rc } // endif rc
} // endif Status } // endif Status
@@ -853,19 +837,11 @@ void XINCOL::WriteColumn(PGLOBAL g)
if (strlen(p) > (unsigned)Long) { if (strlen(p) > (unsigned)Long) {
sprintf(g->Message, MSG(VALUE_TOO_LONG), p, Name, Long); sprintf(g->Message, MSG(VALUE_TOO_LONG), p, Name, Long);
#if defined(USE_TRY)
throw 31; throw 31;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 31);
#endif // !USE_TRY
} else if (Flag == 1) { } else if (Flag == 1) {
if (tdbp->Mode == MODE_UPDATE) { if (tdbp->Mode == MODE_UPDATE) {
strcpy(g->Message, MSG(NO_SEC_UPDATE)); strcpy(g->Message, MSG(NO_SEC_UPDATE));
#if defined(USE_TRY)
throw 31; throw 31;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 31);
#endif // !USE_TRY
} else if (*p) { } else if (*p) {
tdbp->Section = p; tdbp->Section = p;
} else } else
@@ -875,11 +851,7 @@ void XINCOL::WriteColumn(PGLOBAL g)
} else if (Flag == 2) { } else if (Flag == 2) {
if (tdbp->Mode == MODE_UPDATE) { if (tdbp->Mode == MODE_UPDATE) {
strcpy(g->Message, MSG(NO_KEY_UPDATE)); strcpy(g->Message, MSG(NO_KEY_UPDATE));
#if defined(USE_TRY)
throw 31; throw 31;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 31);
#endif // !USE_TRY
} else if (*p) { } else if (*p) {
tdbp->Keycur = p; tdbp->Keycur = p;
} else } else
@@ -888,11 +860,7 @@ void XINCOL::WriteColumn(PGLOBAL g)
return; return;
} else if (!tdbp->Section || !tdbp->Keycur) { } else if (!tdbp->Section || !tdbp->Keycur) {
strcpy(g->Message, MSG(SEC_KEY_FIRST)); strcpy(g->Message, MSG(SEC_KEY_FIRST));
#if defined(USE_TRY)
throw 31; throw 31;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 31);
#endif // !USE_TRY
} // endif's } // endif's
/*********************************************************************/ /*********************************************************************/
@@ -904,11 +872,7 @@ void XINCOL::WriteColumn(PGLOBAL g)
if (!rc) { if (!rc) {
sprintf(g->Message, "Error %d writing to %s", sprintf(g->Message, "Error %d writing to %s",
GetLastError(), tdbp->Ifile); GetLastError(), tdbp->Ifile);
#if defined(USE_TRY)
throw 31; throw 31;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 31);
#endif // !USE_TRY
} // endif rc } // endif rc
} // endif Status } // endif Status

View File

@@ -490,11 +490,7 @@ void VCTCOL::ReadBlock(PGLOBAL g)
#if defined(_DEBUG) #if defined(_DEBUG)
if (!Blk) { if (!Blk) {
strcpy(g->Message, MSG(TO_BLK_IS_NULL)); strcpy(g->Message, MSG(TO_BLK_IS_NULL));
#if defined(USE_TRY)
throw 58; throw 58;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 58);
#endif // !USE_TRY
} // endif } // endif
#endif #endif
@@ -502,11 +498,7 @@ void VCTCOL::ReadBlock(PGLOBAL g)
/* Read column block according to used access method. */ /* Read column block according to used access method. */
/*********************************************************************/ /*********************************************************************/
if (txfp->ReadBlock(g, this)) if (txfp->ReadBlock(g, this))
#if defined(USE_TRY)
throw 6; throw 6;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 6);
#endif // !USE_TRY
ColBlk = txfp->CurBlk; ColBlk = txfp->CurBlk;
ColPos = -1; // Any invalid position ColPos = -1; // Any invalid position
@@ -526,11 +518,7 @@ void VCTCOL::WriteBlock(PGLOBAL g)
#if defined(_DEBUG) #if defined(_DEBUG)
if (!Blk) { if (!Blk) {
strcpy(g->Message, MSG(BLK_IS_NULL)); strcpy(g->Message, MSG(BLK_IS_NULL));
#if defined(USE_TRY)
throw 56; throw 56;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 56);
#endif // !USE_TRY
} // endif } // endif
#endif #endif
@@ -538,11 +526,7 @@ void VCTCOL::WriteBlock(PGLOBAL g)
/* Write column block according to used access method. */ /* Write column block according to used access method. */
/*******************************************************************/ /*******************************************************************/
if (txfp->WriteBlock(g, this)) if (txfp->WriteBlock(g, this))
#if defined(USE_TRY)
throw 6; throw 6;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 6);
#endif // !USE_TRY
Modif = 0; Modif = 0;
} // endif Modif } // endif Modif

View File

@@ -289,11 +289,7 @@ void VIRCOL::ReadColumn(PGLOBAL g)
{ {
// This should never be called // This should never be called
sprintf(g->Message, "ReadColumn: Column %s is not virtual", Name); sprintf(g->Message, "ReadColumn: Column %s is not virtual", Name);
#if defined(USE_TRY)
throw TYPE_COLBLK; throw TYPE_COLBLK;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_COLBLK);
#endif // !USE_TRY
} // end of ReadColumn } // end of ReadColumn
/* ---------------------------TDBVICL class -------------------------- */ /* ---------------------------TDBVICL class -------------------------- */

View File

@@ -1314,11 +1314,7 @@ void TDBXML::CloseDB(PGLOBAL g)
Docp->CloseDoc(g, To_Xb); Docp->CloseDoc(g, To_Xb);
// This causes a crash in Diagnostics_area::set_error_status // This causes a crash in Diagnostics_area::set_error_status
//#if defined(USE_TRY)
// throw TYPE_AM_XML; // throw TYPE_AM_XML;
//#else // !USE_TRY
// longjmp(g->jumper[g->jump_level], TYPE_AM_XML);
//#endif // !USE_TRY
} // endif DumpDoc } // endif DumpDoc
} // endif Changed } // endif Changed
@@ -1641,11 +1637,7 @@ void XMLCOL::ReadColumn(PGLOBAL g)
if (ValNode->GetType() != XML_ELEMENT_NODE && if (ValNode->GetType() != XML_ELEMENT_NODE &&
ValNode->GetType() != XML_ATTRIBUTE_NODE) { ValNode->GetType() != XML_ATTRIBUTE_NODE) {
sprintf(g->Message, MSG(BAD_VALNODE), ValNode->GetType(), Name); sprintf(g->Message, MSG(BAD_VALNODE), ValNode->GetType(), Name);
#if defined(USE_TRY)
throw TYPE_AM_XML; throw TYPE_AM_XML;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_AM_XML);
#endif // !USE_TRY
} // endif type } // endif type
// Get the Xname value from the XML file // Get the Xname value from the XML file
@@ -1656,11 +1648,7 @@ void XMLCOL::ReadColumn(PGLOBAL g)
PushWarning(g, Tdbp); PushWarning(g, Tdbp);
break; break;
default: default:
#if defined(USE_TRY)
throw TYPE_AM_XML; throw TYPE_AM_XML;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_AM_XML);
#endif // !USE_TRY
} // endswitch } // endswitch
Value->SetValue_psz(Valbuf); Value->SetValue_psz(Valbuf);
@@ -1711,11 +1699,7 @@ void XMLCOL::WriteColumn(PGLOBAL g)
/* For columns having an Xpath, the Clist must be updated. */ /* For columns having an Xpath, the Clist must be updated. */
/*********************************************************************/ /*********************************************************************/
if (Tdbp->CheckRow(g, Nod || Tdbp->Colname)) if (Tdbp->CheckRow(g, Nod || Tdbp->Colname))
#if defined(USE_TRY)
throw TYPE_AM_XML; throw TYPE_AM_XML;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_AM_XML);
#endif // !USE_TRY
/*********************************************************************/ /*********************************************************************/
/* Null values are represented by no node. */ /* Null values are represented by no node. */
@@ -1787,15 +1771,7 @@ void XMLCOL::WriteColumn(PGLOBAL g)
if (ColNode == NULL) { if (ColNode == NULL) {
strcpy(g->Message, MSG(COL_ALLOC_ERR)); strcpy(g->Message, MSG(COL_ALLOC_ERR));
#if defined(USE_TRY)
throw TYPE_AM_XML; throw TYPE_AM_XML;
#else // !USE_TRY
#if defined(USE_TRY)
throw TYPE_AM_XML;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_AM_XML);
#endif // !USE_TRY
#endif // !USE_TRY
} // endif ColNode } // endif ColNode
} // endif ColNode } // endif ColNode
@@ -1824,11 +1800,7 @@ void XMLCOL::WriteColumn(PGLOBAL g)
if (strlen(p) > (unsigned)Long) { if (strlen(p) > (unsigned)Long) {
sprintf(g->Message, MSG(VALUE_TOO_LONG), p, Name, Long); sprintf(g->Message, MSG(VALUE_TOO_LONG), p, Name, Long);
#if defined(USE_TRY)
throw TYPE_AM_XML; throw TYPE_AM_XML;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_AM_XML);
#endif // !USE_TRY
} else } else
strcpy(Valbuf, p); strcpy(Valbuf, p);
@@ -1878,11 +1850,7 @@ void XMULCOL::ReadColumn(PGLOBAL g)
if (ValNode->GetType() != XML_ELEMENT_NODE && if (ValNode->GetType() != XML_ELEMENT_NODE &&
ValNode->GetType() != XML_ATTRIBUTE_NODE) { ValNode->GetType() != XML_ATTRIBUTE_NODE) {
sprintf(g->Message, MSG(BAD_VALNODE), ValNode->GetType(), Name); sprintf(g->Message, MSG(BAD_VALNODE), ValNode->GetType(), Name);
#if defined(USE_TRY)
throw TYPE_AM_XML; throw TYPE_AM_XML;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_AM_XML);
#endif // !USE_TRY
} // endif type } // endif type
// Get the Xname value from the XML file // Get the Xname value from the XML file
@@ -1968,11 +1936,7 @@ void XMULCOL::WriteColumn(PGLOBAL g)
/* For columns having an Xpath, the Clist must be updated. */ /* For columns having an Xpath, the Clist must be updated. */
/*********************************************************************/ /*********************************************************************/
if (Tdbp->CheckRow(g, Nod)) if (Tdbp->CheckRow(g, Nod))
#if defined(USE_TRY)
throw TYPE_AM_XML; throw TYPE_AM_XML;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_AM_XML);
#endif // !USE_TRY
/*********************************************************************/ /*********************************************************************/
/* Find the column and value nodes to update or insert. */ /* Find the column and value nodes to update or insert. */
@@ -2021,11 +1985,7 @@ void XMULCOL::WriteColumn(PGLOBAL g)
if (len > 1 && !Tdbp->Xpand) { if (len > 1 && !Tdbp->Xpand) {
sprintf(g->Message, MSG(BAD_VAL_UPDATE), Name); sprintf(g->Message, MSG(BAD_VAL_UPDATE), Name);
#if defined(USE_TRY)
throw TYPE_AM_XML; throw TYPE_AM_XML;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_AM_XML);
#endif // !USE_TRY
} else } else
ValNode = Nlx->GetItem(g, Tdbp->Nsub, Vxnp); ValNode = Nlx->GetItem(g, Tdbp->Nsub, Vxnp);
@@ -2067,11 +2027,7 @@ void XMULCOL::WriteColumn(PGLOBAL g)
if (ColNode == NULL) { if (ColNode == NULL) {
strcpy(g->Message, MSG(COL_ALLOC_ERR)); strcpy(g->Message, MSG(COL_ALLOC_ERR));
#if defined(USE_TRY)
throw TYPE_AM_XML; throw TYPE_AM_XML;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_AM_XML);
#endif // !USE_TRY
} // endif ColNode } // endif ColNode
} // endif ColNode } // endif ColNode
@@ -2100,11 +2056,7 @@ void XMULCOL::WriteColumn(PGLOBAL g)
if (strlen(p) > (unsigned)Long) { if (strlen(p) > (unsigned)Long) {
sprintf(g->Message, MSG(VALUE_TOO_LONG), p, Name, Long); sprintf(g->Message, MSG(VALUE_TOO_LONG), p, Name, Long);
#if defined(USE_TRY)
throw TYPE_AM_XML; throw TYPE_AM_XML;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_AM_XML);
#endif // !USE_TRY
} else } else
strcpy(Valbuf, p); strcpy(Valbuf, p);
@@ -2136,11 +2088,7 @@ void XPOSCOL::ReadColumn(PGLOBAL g)
if (Tdbp->Clist == NULL) { if (Tdbp->Clist == NULL) {
strcpy(g->Message, MSG(MIS_TAG_LIST)); strcpy(g->Message, MSG(MIS_TAG_LIST));
#if defined(USE_TRY)
throw TYPE_AM_XML; throw TYPE_AM_XML;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_AM_XML);
#endif // !USE_TRY
} // endif Clist } // endif Clist
if ((ValNode = Tdbp->Clist->GetItem(g, Rank, Vxnp))) { if ((ValNode = Tdbp->Clist->GetItem(g, Rank, Vxnp))) {
@@ -2152,11 +2100,7 @@ void XPOSCOL::ReadColumn(PGLOBAL g)
PushWarning(g, Tdbp); PushWarning(g, Tdbp);
break; break;
default: default:
#if defined(USE_TRY)
throw TYPE_AM_XML; throw TYPE_AM_XML;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_AM_XML);
#endif // !USE_TRY
} // endswitch } // endswitch
Value->SetValue_psz(Valbuf); Value->SetValue_psz(Valbuf);
@@ -2207,22 +2151,14 @@ void XPOSCOL::WriteColumn(PGLOBAL g)
/* For all columns the Clist must be updated. */ /* For all columns the Clist must be updated. */
/*********************************************************************/ /*********************************************************************/
if (Tdbp->CheckRow(g, true)) if (Tdbp->CheckRow(g, true))
#if defined(USE_TRY)
throw TYPE_AM_XML; throw TYPE_AM_XML;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_AM_XML);
#endif // !USE_TRY
/*********************************************************************/ /*********************************************************************/
/* Find the column and value nodes to update or insert. */ /* Find the column and value nodes to update or insert. */
/*********************************************************************/ /*********************************************************************/
if (Tdbp->Clist == NULL) { if (Tdbp->Clist == NULL) {
strcpy(g->Message, MSG(MIS_TAG_LIST)); strcpy(g->Message, MSG(MIS_TAG_LIST));
#if defined(USE_TRY)
throw TYPE_AM_XML; throw TYPE_AM_XML;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_AM_XML);
#endif // !USE_TRY
} // endif Clist } // endif Clist
n = Tdbp->Clist->GetLength(); n = Tdbp->Clist->GetLength();
@@ -2247,11 +2183,7 @@ void XPOSCOL::WriteColumn(PGLOBAL g)
if (strlen(p) > (unsigned)Long) { if (strlen(p) > (unsigned)Long) {
sprintf(g->Message, MSG(VALUE_TOO_LONG), p, Name, Long); sprintf(g->Message, MSG(VALUE_TOO_LONG), p, Name, Long);
#if defined(USE_TRY)
throw TYPE_AM_XML; throw TYPE_AM_XML;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_AM_XML);
#endif // !USE_TRY
} else } else
strcpy(Valbuf, p); strcpy(Valbuf, p);

View File

@@ -138,11 +138,7 @@ PSZ VALBLK::GetCharValue(int)
assert(g); assert(g);
sprintf(g->Message, MSG(NO_CHAR_FROM), Type); sprintf(g->Message, MSG(NO_CHAR_FROM), Type);
#if defined(USE_TRY)
throw Type; throw Type;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], Type);
#endif // !USE_TRY
return NULL; return NULL;
} // end of GetCharValue } // end of GetCharValue
@@ -210,11 +206,7 @@ void VALBLK::ChkIndx(int n)
if (n < 0 || n >= Nval) { if (n < 0 || n >= Nval) {
PGLOBAL& g = Global; PGLOBAL& g = Global;
strcpy(g->Message, MSG(BAD_VALBLK_INDX)); strcpy(g->Message, MSG(BAD_VALBLK_INDX));
#if defined(USE_TRY)
throw Type; throw Type;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], Type);
#endif // !USE_TRY
} // endif n } // endif n
} // end of ChkIndx } // end of ChkIndx
@@ -224,11 +216,7 @@ void VALBLK::ChkTyp(PVAL v)
if (Check && (Type != v->GetType() || Unsigned != v->IsUnsigned())) { if (Check && (Type != v->GetType() || Unsigned != v->IsUnsigned())) {
PGLOBAL& g = Global; PGLOBAL& g = Global;
strcpy(g->Message, MSG(VALTYPE_NOMATCH)); strcpy(g->Message, MSG(VALTYPE_NOMATCH));
#if defined(USE_TRY)
throw Type; throw Type;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], Type);
#endif // !USE_TRY
} // endif Type } // endif Type
} // end of ChkTyp } // end of ChkTyp
@@ -238,11 +226,7 @@ void VALBLK::ChkTyp(PVBLK vb)
if (Check && (Type != vb->GetType() || Unsigned != vb->IsUnsigned())) { if (Check && (Type != vb->GetType() || Unsigned != vb->IsUnsigned())) {
PGLOBAL& g = Global; PGLOBAL& g = Global;
strcpy(g->Message, MSG(VALTYPE_NOMATCH)); strcpy(g->Message, MSG(VALTYPE_NOMATCH));
#if defined(USE_TRY)
throw Type; throw Type;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], Type);
#endif // !USE_TRY
} // endif Type } // endif Type
} // end of ChkTyp } // end of ChkTyp
@@ -358,11 +342,7 @@ void TYPBLK<TYPE>::SetValue(PSZ p, int n)
if (Check) { if (Check) {
PGLOBAL& g = Global; PGLOBAL& g = Global;
strcpy(g->Message, MSG(BAD_SET_STRING)); strcpy(g->Message, MSG(BAD_SET_STRING));
#if defined(USE_TRY)
throw Type; throw Type;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], Type);
#endif // !USE_TRY
} // endif Check } // endif Check
bool minus; bool minus;
@@ -412,11 +392,7 @@ void TYPBLK<double>::SetValue(PSZ p, int n)
if (Check) { if (Check) {
PGLOBAL& g = Global; PGLOBAL& g = Global;
strcpy(g->Message, MSG(BAD_SET_STRING)); strcpy(g->Message, MSG(BAD_SET_STRING));
#if defined(USE_TRY)
throw Type; throw Type;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], Type);
#endif // !USE_TRY
} // endif Check } // endif Check
Typp[n] = atof(p); Typp[n] = atof(p);
@@ -819,11 +795,7 @@ void CHRBLK::SetValue(char *sp, uint len, int n)
if (Check && (signed)len > Long) { if (Check && (signed)len > Long) {
PGLOBAL& g = Global; PGLOBAL& g = Global;
strcpy(g->Message, MSG(SET_STR_TRUNC)); strcpy(g->Message, MSG(SET_STR_TRUNC));
#if defined(USE_TRY)
throw Type; throw Type;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], Type);
#endif // !USE_TRY
} // endif Check } // endif Check
#endif // _DEBUG #endif // _DEBUG
@@ -851,11 +823,7 @@ void CHRBLK::SetValue(PVBLK pv, int n1, int n2)
if (Type != pv->GetType() || Long != ((CHRBLK*)pv)->Long) { if (Type != pv->GetType() || Long != ((CHRBLK*)pv)->Long) {
PGLOBAL& g = Global; PGLOBAL& g = Global;
strcpy(g->Message, MSG(BLKTYPLEN_MISM)); strcpy(g->Message, MSG(BLKTYPLEN_MISM));
#if defined(USE_TRY)
throw Type; throw Type;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], Type);
#endif // !USE_TRY
} // endif Type } // endif Type
if (!(b = pv->IsNull(n2))) if (!(b = pv->IsNull(n2)))
@@ -906,11 +874,7 @@ void CHRBLK::SetValues(PVBLK pv, int k, int n)
if (Type != pv->GetType() || Long != ((CHRBLK*)pv)->Long) { if (Type != pv->GetType() || Long != ((CHRBLK*)pv)->Long) {
PGLOBAL& g = Global; PGLOBAL& g = Global;
strcpy(g->Message, MSG(BLKTYPLEN_MISM)); strcpy(g->Message, MSG(BLKTYPLEN_MISM));
#if defined(USE_TRY)
throw Type; throw Type;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], Type);
#endif // !USE_TRY
} // endif Type } // endif Type
#endif // _DEBUG #endif // _DEBUG
char *p = ((CHRBLK*)pv)->Chrp; char *p = ((CHRBLK*)pv)->Chrp;

View File

@@ -57,17 +57,10 @@
/* Check macro's. */ /* Check macro's. */
/***********************************************************************/ /***********************************************************************/
#if defined(_DEBUG) #if defined(_DEBUG)
#if defined(USE_TRY)
#define CheckType(V) if (Type != V->GetType()) { \ #define CheckType(V) if (Type != V->GetType()) { \
PGLOBAL& g = Global; \ PGLOBAL& g = Global; \
strcpy(g->Message, MSG(VALTYPE_NOMATCH)); \ strcpy(g->Message, MSG(VALTYPE_NOMATCH)); \
throw Type; throw Type;
#else // !USE_TRY
#define CheckType(V) if (Type != V->GetType()) { \
PGLOBAL& g = Global; \
strcpy(g->Message, MSG(VALTYPE_NOMATCH)); \
longjmp(g->jumper[g->jump_level], Type);
#endif // !USE_TRY
#else #else
#define CheckType(V) #define CheckType(V)
#endif #endif
@@ -1026,19 +1019,11 @@ TYPE TYPVAL<TYPE>::SafeAdd(TYPE n1, TYPE n2)
if ((n2 > 0) && (n < n1)) { if ((n2 > 0) && (n < n1)) {
// Overflow // Overflow
strcpy(g->Message, MSG(FIX_OVFLW_ADD)); strcpy(g->Message, MSG(FIX_OVFLW_ADD));
#if defined(USE_TRY)
throw 138; throw 138;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 138);
#endif // !USE_TRY
} else if ((n2 < 0) && (n > n1)) { } else if ((n2 < 0) && (n > n1)) {
// Underflow // Underflow
strcpy(g->Message, MSG(FIX_UNFLW_ADD)); strcpy(g->Message, MSG(FIX_UNFLW_ADD));
#if defined(USE_TRY)
throw 138; throw 138;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 138);
#endif // !USE_TRY
} // endif's n2 } // endif's n2
return n; return n;
@@ -1062,19 +1047,11 @@ TYPE TYPVAL<TYPE>::SafeMult(TYPE n1, TYPE n2)
if (n > MinMaxVal(true)) { if (n > MinMaxVal(true)) {
// Overflow // Overflow
strcpy(g->Message, MSG(FIX_OVFLW_TIMES)); strcpy(g->Message, MSG(FIX_OVFLW_TIMES));
#if defined(USE_TRY)
throw 138; throw 138;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 138);
#endif // !USE_TRY
} else if (n < MinMaxVal(false)) { } else if (n < MinMaxVal(false)) {
// Underflow // Underflow
strcpy(g->Message, MSG(FIX_UNFLW_TIMES)); strcpy(g->Message, MSG(FIX_UNFLW_TIMES));
#if defined(USE_TRY)
throw 138; throw 138;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 138);
#endif // !USE_TRY
} // endif's n2 } // endif's n2
return (TYPE)n; return (TYPE)n;
@@ -1455,15 +1432,7 @@ void TYPVAL<PSZ>::SetValue(int n)
if (k > Len) { if (k > Len) {
sprintf(g->Message, MSG(VALSTR_TOO_LONG), buf, Len); sprintf(g->Message, MSG(VALSTR_TOO_LONG), buf, Len);
#if defined(USE_TRY)
throw 138; throw 138;
#else // !USE_TRY
#if defined(USE_TRY)
throw 138;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 138);
#endif // !USE_TRY
#endif // !USE_TRY
} else } else
SetValue_psz(buf); SetValue_psz(buf);
@@ -1517,11 +1486,7 @@ void TYPVAL<PSZ>::SetValue(longlong n)
if (k > Len) { if (k > Len) {
sprintf(g->Message, MSG(VALSTR_TOO_LONG), buf, Len); sprintf(g->Message, MSG(VALSTR_TOO_LONG), buf, Len);
#if defined(USE_TRY)
throw 138; throw 138;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 138);
#endif // !USE_TRY
} else } else
SetValue_psz(buf); SetValue_psz(buf);
@@ -1564,11 +1529,7 @@ void TYPVAL<PSZ>::SetValue(double f)
if (k > Len) { if (k > Len) {
sprintf(g->Message, MSG(VALSTR_TOO_LONG), buf, Len); sprintf(g->Message, MSG(VALSTR_TOO_LONG), buf, Len);
#if defined(USE_TRY)
throw 138; throw 138;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 138);
#endif // !USE_TRY
} else } else
SetValue_psz(buf); SetValue_psz(buf);

View File

@@ -446,11 +446,7 @@ bool XINDEX::Make(PGLOBAL g, PIXDEF sxp)
#if 0 #if 0
if (!dup->Step) { if (!dup->Step) {
strcpy(g->Message, MSG(QUERY_CANCELLED)); strcpy(g->Message, MSG(QUERY_CANCELLED));
#if defined(USE_TRY)
throw 99; throw 99;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], 99);
#endif // !USE_TRY
} // endif Step } // endif Step
#endif // 0 #endif // 0

View File

@@ -84,11 +84,7 @@ double XOBJECT::GetFloatValue(void)
CONSTANT::CONSTANT(PGLOBAL g, void *value, short type) CONSTANT::CONSTANT(PGLOBAL g, void *value, short type)
{ {
if (!(Value = AllocateValue(g, value, (int)type))) if (!(Value = AllocateValue(g, value, (int)type)))
#if defined(USE_TRY)
throw TYPE_CONST; throw TYPE_CONST;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_CONST);
#endif // !USE_TRY
Constant = true; Constant = true;
} // end of CONSTANT constructor } // end of CONSTANT constructor
@@ -99,11 +95,7 @@ CONSTANT::CONSTANT(PGLOBAL g, void *value, short type)
CONSTANT::CONSTANT(PGLOBAL g, int n) CONSTANT::CONSTANT(PGLOBAL g, int n)
{ {
if (!(Value = AllocateValue(g, &n, TYPE_INT))) if (!(Value = AllocateValue(g, &n, TYPE_INT)))
#if defined(USE_TRY)
throw TYPE_CONST; throw TYPE_CONST;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_CONST);
#endif // !USE_TRY
Constant = true; Constant = true;
} // end of CONSTANT constructor } // end of CONSTANT constructor
@@ -125,11 +117,7 @@ void CONSTANT::Convert(PGLOBAL g, int newtype)
{ {
if (Value->GetType() != newtype) if (Value->GetType() != newtype)
if (!(Value = AllocateValue(g, Value, newtype))) if (!(Value = AllocateValue(g, Value, newtype)))
#if defined(USE_TRY)
throw TYPE_CONST; throw TYPE_CONST;
#else // !USE_TRY
longjmp(g->jumper[g->jump_level], TYPE_CONST);
#endif // !USE_TRY
} // end of Convert } // end of Convert