mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 20:12:31 +01:00
ef0829ef40
Fix several bugs, chiefly concerning CURL operations. modified: storage/connect/bson.cpp modified: storage/connect/cmgfam.cpp modified: storage/connect/cmgoconn.cpp modified: storage/connect/cmgoconn.h modified: storage/connect/colblk.h modified: storage/connect/ha_connect.cc modified: storage/connect/jmgfam.cpp modified: storage/connect/jmgoconn.cpp modified: storage/connect/jmgoconn.h modified: storage/connect/json.cpp modified: storage/connect/json.h modified: storage/connect/mysql-test/connect/r/bson_mongo_c.result modified: storage/connect/mysql-test/connect/r/json_mongo_c.result modified: storage/connect/mysql-test/connect/r/mongo_c.result modified: storage/connect/mysql-test/connect/r/mongo_java_2.result modified: storage/connect/mysql-test/connect/r/mongo_java_3.result modified: storage/connect/mysql-test/connect/std_data/Mongo2.jar modified: storage/connect/mysql-test/connect/std_data/Mongo3.jar modified: storage/connect/tabbson.cpp modified: storage/connect/tabbson.h modified: storage/connect/tabcmg.cpp modified: storage/connect/tabcmg.h modified: storage/connect/tabjmg.cpp modified: storage/connect/tabjmg.h modified: storage/connect/tabjson.cpp modified: storage/connect/tabjson.h
315 lines
10 KiB
C++
315 lines
10 KiB
C++
/************** CMGFAM C++ Program Source Code File (.CPP) *************/
|
|
/* PROGRAM NAME: cmgfam.cpp */
|
|
/* ------------- */
|
|
/* Version 1.5 */
|
|
/* */
|
|
/* COPYRIGHT: */
|
|
/* ---------- */
|
|
/* (C) Copyright to the author Olivier BERTRAND 20017 - 2020 */
|
|
/* */
|
|
/* WHAT THIS PROGRAM DOES: */
|
|
/* ----------------------- */
|
|
/* This program are the MongoDB access method classes. */
|
|
/* */
|
|
/***********************************************************************/
|
|
|
|
/***********************************************************************/
|
|
/* Include relevant sections of the System header files. */
|
|
/***********************************************************************/
|
|
#include "my_global.h"
|
|
|
|
/***********************************************************************/
|
|
/* 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"
|
|
#if defined(BSON_SUPPORT)
|
|
#include "tabbson.h"
|
|
#else
|
|
#include "tabjson.h"
|
|
#endif // BSON_SUPPORT
|
|
#include "cmgfam.h"
|
|
|
|
#if defined(UNIX) || defined(UNIV_LINUX)
|
|
#include "osutil.h"
|
|
#endif
|
|
|
|
/* --------------------------- Class CMGFAM -------------------------- */
|
|
|
|
/***********************************************************************/
|
|
/* Constructors. */
|
|
/***********************************************************************/
|
|
CMGFAM::CMGFAM(PJDEF tdp) : DOSFAM((PDOSDEF)NULL)
|
|
{
|
|
Cmgp = NULL;
|
|
Pcg.Tdbp = NULL;
|
|
|
|
if (tdp) {
|
|
Pcg.Uristr = tdp->Uri;
|
|
Pcg.Db_name = tdp->Schema;
|
|
Pcg.Coll_name = tdp->Collname;
|
|
Pcg.Options = tdp->Options;
|
|
Pcg.Filter = tdp->Filter;
|
|
Pcg.Line = NULL;
|
|
Pcg.Pipe = tdp->Pipe && tdp->Options != NULL;
|
|
Lrecl = tdp->Lrecl + tdp->Ending;
|
|
} else {
|
|
Pcg.Uristr = NULL;
|
|
Pcg.Db_name = NULL;
|
|
Pcg.Coll_name = NULL;
|
|
Pcg.Options = NULL;
|
|
Pcg.Filter = NULL;
|
|
Pcg.Line = NULL;
|
|
Pcg.Pipe = false;
|
|
Lrecl = 0;
|
|
} // endif tdp
|
|
|
|
To_Fbt = NULL;
|
|
Mode = MODE_ANY;
|
|
Done = false;
|
|
} // end of CMGFAM standard constructor
|
|
|
|
#if defined(BSON_SUPPORT)
|
|
/***********************************************************************/
|
|
/* Constructors. */
|
|
/***********************************************************************/
|
|
CMGFAM::CMGFAM(PBDEF tdp) : DOSFAM((PDOSDEF)NULL)
|
|
{
|
|
Cmgp = NULL;
|
|
Pcg.Tdbp = NULL;
|
|
|
|
if (tdp) {
|
|
Pcg.Uristr = tdp->Uri;
|
|
Pcg.Db_name = tdp->Schema;
|
|
Pcg.Coll_name = tdp->Collname;
|
|
Pcg.Options = tdp->Options;
|
|
Pcg.Filter = tdp->Filter;
|
|
Pcg.Line = NULL;
|
|
Pcg.Pipe = tdp->Pipe && tdp->Options != NULL;
|
|
Lrecl = tdp->Lrecl + tdp->Ending;
|
|
} else {
|
|
Pcg.Uristr = NULL;
|
|
Pcg.Db_name = NULL;
|
|
Pcg.Coll_name = NULL;
|
|
Pcg.Options = NULL;
|
|
Pcg.Filter = NULL;
|
|
Pcg.Line = NULL;
|
|
Pcg.Pipe = false;
|
|
Lrecl = 0;
|
|
} // endif tdp
|
|
|
|
To_Fbt = NULL;
|
|
Mode = MODE_ANY;
|
|
Done = false;
|
|
} // end of CMGFAM standard constructor
|
|
#endif // BSON_SUPPORT
|
|
|
|
CMGFAM::CMGFAM(PCMGFAM tdfp) : DOSFAM(tdfp)
|
|
{
|
|
Cmgp = tdfp->Cmgp;
|
|
Pcg = tdfp->Pcg;
|
|
To_Fbt = tdfp->To_Fbt;
|
|
Mode = tdfp->Mode;
|
|
Done = tdfp->Done;
|
|
} // end of CMGFAM copy constructor
|
|
|
|
/***********************************************************************/
|
|
/* Reset: reset position values at the beginning of file. */
|
|
/***********************************************************************/
|
|
void CMGFAM::Reset(void)
|
|
{
|
|
TXTFAM::Reset();
|
|
Fpos = Tpos = Spos = 0;
|
|
} // end of Reset
|
|
|
|
/***********************************************************************/
|
|
/* MGO GetFileLength: returns file size in number of bytes. */
|
|
/***********************************************************************/
|
|
int CMGFAM::GetFileLength(PGLOBAL g)
|
|
{
|
|
return 0;
|
|
} // end of GetFileLength
|
|
|
|
/***********************************************************************/
|
|
/* Cardinality: returns the number of documents in the collection. */
|
|
/* This function can be called with a null argument to test the */
|
|
/* availability of Cardinality implementation (1 yes, 0 no). */
|
|
/***********************************************************************/
|
|
int CMGFAM::Cardinality(PGLOBAL g)
|
|
{
|
|
if (!g)
|
|
return 1;
|
|
|
|
return (!Init(g)) ? Cmgp->CollSize(g) : 0;
|
|
} // end of Cardinality
|
|
|
|
/***********************************************************************/
|
|
/* Note: This function is not really implemented yet. */
|
|
/***********************************************************************/
|
|
int CMGFAM::MaxBlkSize(PGLOBAL, int s)
|
|
{
|
|
return s;
|
|
} // end of MaxBlkSize
|
|
|
|
/***********************************************************************/
|
|
/* Init: initialize MongoDB processing. */
|
|
/***********************************************************************/
|
|
bool CMGFAM::Init(PGLOBAL g)
|
|
{
|
|
if (Done)
|
|
return false;
|
|
|
|
/*********************************************************************/
|
|
/* Open an C connection for this table. */
|
|
/*********************************************************************/
|
|
if (!Cmgp) {
|
|
Pcg.Tdbp = Tdbp;
|
|
Cmgp = new(g) CMgoConn(g, &Pcg);
|
|
} else if (Cmgp->IsConnected())
|
|
Cmgp->Close();
|
|
|
|
if (Cmgp->Connect(g))
|
|
return true;
|
|
|
|
Done = true;
|
|
return false;
|
|
} // end of Init
|
|
|
|
/***********************************************************************/
|
|
/* OpenTableFile: Open a MongoDB table. */
|
|
/***********************************************************************/
|
|
bool CMGFAM::OpenTableFile(PGLOBAL g)
|
|
{
|
|
Mode = Tdbp->GetMode();
|
|
|
|
if (Pcg.Pipe && Mode != MODE_READ) {
|
|
strcpy(g->Message, "Pipeline tables are read only");
|
|
return true;
|
|
} // endif Pipe
|
|
|
|
if (Init(g))
|
|
return true;
|
|
|
|
if (Mode == MODE_DELETE && !Tdbp->GetNext())
|
|
// Delete all documents
|
|
return Cmgp->DocDelete(g);
|
|
else if (Mode == MODE_INSERT)
|
|
Cmgp->MakeColumnGroups(g);
|
|
|
|
return false;
|
|
} // end of OpenTableFile
|
|
|
|
/***********************************************************************/
|
|
/* GetRowID: return the RowID of last read record. */
|
|
/***********************************************************************/
|
|
int CMGFAM::GetRowID(void)
|
|
{
|
|
return Rows;
|
|
} // end of GetRowID
|
|
|
|
/***********************************************************************/
|
|
/* GetPos: return the position of last read record. */
|
|
/***********************************************************************/
|
|
int CMGFAM::GetPos(void)
|
|
{
|
|
return Fpos;
|
|
} // end of GetPos
|
|
|
|
/***********************************************************************/
|
|
/* GetNextPos: return the position of next record. */
|
|
/***********************************************************************/
|
|
int CMGFAM::GetNextPos(void)
|
|
{
|
|
return Fpos; // TODO
|
|
} // end of GetNextPos
|
|
|
|
/***********************************************************************/
|
|
/* SetPos: Replace the table at the specified position. */
|
|
/***********************************************************************/
|
|
bool CMGFAM::SetPos(PGLOBAL g, int pos)
|
|
{
|
|
Fpos = pos;
|
|
Placed = true;
|
|
return false;
|
|
} // end of SetPos
|
|
|
|
/***********************************************************************/
|
|
/* Record file position in case of UPDATE or DELETE. */
|
|
/***********************************************************************/
|
|
bool CMGFAM::RecordPos(PGLOBAL g)
|
|
{
|
|
strcpy(g->Message, "CMGFAM::RecordPos NIY");
|
|
return true;
|
|
} // end of RecordPos
|
|
|
|
/***********************************************************************/
|
|
/* Initialize Fpos and the current position for indexed DELETE. */
|
|
/***********************************************************************/
|
|
int CMGFAM::InitDelete(PGLOBAL g, int fpos, int spos)
|
|
{
|
|
strcpy(g->Message, "CMGFAM::InitDelete NIY");
|
|
return RC_FX;
|
|
} // end of InitDelete
|
|
|
|
/***********************************************************************/
|
|
/* Skip one record in file. */
|
|
/***********************************************************************/
|
|
int CMGFAM::SkipRecord(PGLOBAL g, bool header)
|
|
{
|
|
return RC_OK; // Dummy
|
|
} // end of SkipRecord
|
|
|
|
/***********************************************************************/
|
|
/* ReadBuffer: Get next document from a collection. */
|
|
/***********************************************************************/
|
|
int CMGFAM::ReadBuffer(PGLOBAL g)
|
|
{
|
|
int rc = Cmgp->ReadNext(g);
|
|
|
|
if (rc != RC_OK)
|
|
return rc;
|
|
|
|
strncpy(Tdbp->GetLine(), Cmgp->GetDocument(g), Lrecl);
|
|
return RC_OK;
|
|
} // end of ReadBuffer
|
|
|
|
/***********************************************************************/
|
|
/* WriteBuffer: File write routine for MGO access method. */
|
|
/***********************************************************************/
|
|
int CMGFAM::WriteBuffer(PGLOBAL g)
|
|
{
|
|
Pcg.Line = Tdbp->GetLine();
|
|
return Cmgp->Write(g);
|
|
} // end of WriteBuffer
|
|
|
|
/***********************************************************************/
|
|
/* Data Base delete line routine for MGO and BLK access methods. */
|
|
/***********************************************************************/
|
|
int CMGFAM::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 CMGFAM::CloseTableFile(PGLOBAL g, bool)
|
|
{
|
|
Cmgp->Close();
|
|
Done = false;
|
|
} // end of CloseTableFile
|
|
|
|
/***********************************************************************/
|
|
/* Rewind routine for MGO access method. */
|
|
/***********************************************************************/
|
|
void CMGFAM::Rewind(void)
|
|
{
|
|
Cmgp->Rewind();
|
|
} // end of Rewind
|
|
|