diff options
author | Sergei Golubchik <serg@mariadb.org> | 2017-08-25 10:25:48 +0200 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2017-08-25 10:25:48 +0200 |
commit | 27412877dbcf601676f4515a99b2abee1f19623b (patch) | |
tree | 2cb1a2e1a58ba10f2a96fcdec43f5ed77c326fd0 /storage/connect/cmgoconn.cpp | |
parent | f2033df6ac0f64664d9aad2d56fdd74f4bf9d666 (diff) | |
parent | a544225d0a772bd4b67c96f5861ecc0ef7e69bba (diff) | |
download | mariadb-git-27412877dbcf601676f4515a99b2abee1f19623b.tar.gz |
Merge branch '10.2' into bb-10.2-ext
Diffstat (limited to 'storage/connect/cmgoconn.cpp')
-rw-r--r-- | storage/connect/cmgoconn.cpp | 63 |
1 files changed, 55 insertions, 8 deletions
diff --git a/storage/connect/cmgoconn.cpp b/storage/connect/cmgoconn.cpp index 8367708d4ac..fdd59040257 100644 --- a/storage/connect/cmgoconn.cpp +++ b/storage/connect/cmgoconn.cpp @@ -92,6 +92,32 @@ void INCOL::AddCol(PGLOBAL g, PCOL colp, char *jp) } // end of AddCol +/***********************************************************************/ +/* Clear. */ +/***********************************************************************/ +void INCOL::Init(void) +{ + bson_init(Child); + + for (PKC kp = Klist; kp; kp = kp->Next) + if (kp->Incolp) + kp->Incolp->Init(); + +} // end of init + +/***********************************************************************/ +/* Destroy. */ +/***********************************************************************/ +void INCOL::Destroy(void) +{ + bson_destroy(Child); + + for (PKC kp = Klist; kp; kp = kp->Next) + if (kp->Incolp) + kp->Incolp->Destroy(); + +} // end of Destroy + /* -------------------------- Class CMgoConn ------------------------- */ /***********************************************************************/ @@ -109,6 +135,7 @@ CMgoConn::CMgoConn(PGLOBAL g, PCPARM pcg) Query = NULL; Opts = NULL; Fpc = NULL; + fp = NULL; m_Connected = false; } // end of CMgoConn standard constructor @@ -149,6 +176,24 @@ bool CMgoConn::Connect(PGLOBAL g) return true; } // endif Collection + /*********************************************************************/ + /* Link a Fblock. This make possible to automatically close it */ + /* in case of error (throw). */ + /*********************************************************************/ + PDBUSER dbuserp = (PDBUSER)g->Activityp->Aptr; + + fp = (PFBLOCK)PlugSubAlloc(g, NULL, sizeof(FBLOCK)); + fp->Type = TYPE_FB_MONGO; + fp->Fname = NULL; + fp->Next = dbuserp->Openlist; + dbuserp->Openlist = fp; + fp->Count = 1; + fp->Length = 0; + fp->Memory = NULL; + fp->Mode = MODE_ANY; + fp->File = this; + fp->Handle = 0; + m_Connected = true; return false; } // end of Connect @@ -493,19 +538,19 @@ bool CMgoConn::DocWrite(PGLOBAL g, PINCOL icp) bool isdoc = !kp->Incolp->Array; if (isdoc) - BSON_APPEND_DOCUMENT_BEGIN(&icp->Child, kp->Key, &kp->Incolp->Child); + BSON_APPEND_DOCUMENT_BEGIN(icp->Child, kp->Key, kp->Incolp->Child); else - BSON_APPEND_ARRAY_BEGIN(&icp->Child, kp->Key, &kp->Incolp->Child); + BSON_APPEND_ARRAY_BEGIN(icp->Child, kp->Key, kp->Incolp->Child); if (DocWrite(g, kp->Incolp)) return true; if (isdoc) - bson_append_document_end(&icp->Child, &kp->Incolp->Child); + bson_append_document_end(icp->Child, kp->Incolp->Child); else - bson_append_array_end(&icp->Child, &kp->Incolp->Child); + bson_append_array_end(icp->Child, kp->Incolp->Child); - } else if (AddValue(g, kp->Colp, &icp->Child, kp->Key, false)) + } else if (AddValue(g, kp->Colp, icp->Child, kp->Key, false)) return true; return false; @@ -520,19 +565,19 @@ int CMgoConn::Write(PGLOBAL g) PTDB tp = Pcg->Tdbp; if (tp->GetMode() == MODE_INSERT) { - bson_init(&Fpc->Child); + Fpc->Init(); if (DocWrite(g, Fpc)) return RC_FX; if (trace) { - char *str = bson_as_json(&Fpc->Child, NULL); + char *str = bson_as_json(Fpc->Child, NULL); htrc("Inserting: %s\n", str); bson_free(str); } // endif trace if (!mongoc_collection_insert(Collection, MONGOC_INSERT_NONE, - &Fpc->Child, NULL, &Error)) { + Fpc->Child, NULL, &Error)) { sprintf(g->Message, "Mongo insert: %s", Error.message); rc = RC_FX; } // endif insert @@ -641,6 +686,8 @@ void CMgoConn::Close(void) if (Client) mongoc_client_pool_push(Pool, Client); if (Pool) mongoc_client_pool_destroy(Pool); if (Uri) mongoc_uri_destroy(Uri); + if (Fpc) Fpc->Destroy(); + if (fp) fp->Count = 0; } // end of Close /***********************************************************************/ |