summaryrefslogtreecommitdiff
path: root/storage/connect/tabbson.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'storage/connect/tabbson.cpp')
-rw-r--r--storage/connect/tabbson.cpp128
1 files changed, 74 insertions, 54 deletions
diff --git a/storage/connect/tabbson.cpp b/storage/connect/tabbson.cpp
index ba4380c5f89..db63b8e78db 100644
--- a/storage/connect/tabbson.cpp
+++ b/storage/connect/tabbson.cpp
@@ -719,7 +719,10 @@ void BCUTIL::SetJsonValue(PGLOBAL g, PVAL vp, PBVAL jvp)
if (jvp) {
vp->SetNull(false);
- switch (jvp->Type) {
+ if (Jb) {
+ vp->SetValue_psz(Serialize(g, jvp, NULL, 0));
+ Jb = false;
+ } else switch (jvp->Type) {
case TYPE_STRG:
case TYPE_INTG:
case TYPE_BINT:
@@ -727,29 +730,29 @@ void BCUTIL::SetJsonValue(PGLOBAL g, PVAL vp, PBVAL jvp)
case TYPE_DTM:
case TYPE_FLOAT:
switch (vp->GetType()) {
- case TYPE_STRING:
- case TYPE_DATE:
- case TYPE_DECIM:
- vp->SetValue_psz(GetString(jvp));
- break;
- case TYPE_INT:
- case TYPE_SHORT:
- case TYPE_TINY:
- vp->SetValue(GetInteger(jvp));
- break;
- case TYPE_BIGINT:
- vp->SetValue(GetBigint(jvp));
- break;
- case TYPE_DOUBLE:
- vp->SetValue(GetDouble(jvp));
+ case TYPE_STRING:
+ case TYPE_DATE:
+ case TYPE_DECIM:
+ vp->SetValue_psz(GetString(jvp));
+ break;
+ case TYPE_INT:
+ case TYPE_SHORT:
+ case TYPE_TINY:
+ vp->SetValue(GetInteger(jvp));
+ break;
+ case TYPE_BIGINT:
+ vp->SetValue(GetBigint(jvp));
+ break;
+ case TYPE_DOUBLE:
+ vp->SetValue(GetDouble(jvp));
- if (jvp->Type == TYPE_DBL || jvp->Type == TYPE_FLOAT)
- vp->SetPrec(jvp->Nd);
+ if (jvp->Type == TYPE_DBL || jvp->Type == TYPE_FLOAT)
+ vp->SetPrec(jvp->Nd);
- break;
- default:
- sprintf(G->Message, "Unsupported column type %d", vp->GetType());
- throw 888;
+ break;
+ default:
+ sprintf(G->Message, "Unsupported column type %d", vp->GetType());
+ throw 888;
} // endswitch Type
break;
@@ -780,53 +783,59 @@ void BCUTIL::SetJsonValue(PGLOBAL g, PVAL vp, PBVAL jvp)
/***********************************************************************/
/* MakeJson: Serialize the json item and set value to it. */
/***********************************************************************/
-PVAL BCUTIL::MakeBson(PGLOBAL g, PBVAL jsp)
+PBVAL BCUTIL::MakeBson(PGLOBAL g, PBVAL jsp, int n)
{
- if (Cp->Value->IsTypeNum()) {
- strcpy(g->Message, "Cannot make Json for a numeric column");
+ PBVAL vlp, jvp = jsp;
- if (!Cp->Warned) {
- PushWarning(g, Tp);
- Cp->Warned = true;
- } // endif Warned
+ if (n < Cp->Nod - 1) {
+ if (jsp->Type == TYPE_JAR) {
+ int ars = GetArraySize(jsp);
+ PJNODE jnp = &Cp->Nodes[n];
- Cp->Value->Reset();
-#if 0
- } else if (Value->GetType() == TYPE_BIN) {
- if ((unsigned)Value->GetClen() >= sizeof(BSON)) {
- ulong len = Tjp->Lrecl ? Tjp->Lrecl : 500;
- PBSON bsp = JbinAlloc(g, NULL, len, jsp);
+ jvp = NewVal(TYPE_JAR);
+ jnp->Op = OP_EQ;
- strcat(bsp->Msg, " column");
- ((BINVAL*)Value)->SetBinValue(bsp, sizeof(BSON));
- } else {
- strcpy(g->Message, "Column size too small");
- Value->SetValue_char(NULL, 0);
- } // endif Clen
-#endif // 0
- } else
- Cp->Value->SetValue_psz(Serialize(g, jsp, NULL, 0));
+ for (int i = 0; i < ars; i++) {
+ jnp->Rank = i;
+ vlp = GetRowValue(g, jsp, n);
+ AddArrayValue(jvp,DupVal(vlp));
+ } // endfor i
+
+ jnp->Op = OP_XX;
+ jnp->Rank = 0;
+ } else if (jsp->Type == TYPE_JOB) {
+ jvp = NewVal(TYPE_JOB);
- return Cp->Value;
-} // end of MakeJson
+ for (PBPR prp = GetObject(jsp); prp; prp = GetNext(prp)) {
+ vlp = GetRowValue(g, GetVlp(prp), n + 1);
+ SetKeyValue(jvp, vlp, MZP(prp->Key));
+ } // endfor prp
+
+ } // endif Type
+
+ } // endif's
+
+ Jb = true;
+ return jvp;
+} // end of MakeBson
/***********************************************************************/
-/* GetColumnValue: */
+/* GetRowValue: */
/***********************************************************************/
-PVAL BCUTIL::GetColumnValue(PGLOBAL g, PBVAL row, int i)
+PBVAL BCUTIL::GetRowValue(PGLOBAL g, PBVAL row, int i)
{
int nod = Cp->Nod, n = nod - 1;
JNODE *nodes = Cp->Nodes;
- PVAL value = Cp->Value;
PBVAL arp;
PBVAL bvp = NULL;
for (; i < nod && row; i++) {
if (nodes[i].Op == OP_NUM) {
- value->SetValue(row->Type == TYPE_JAR ? GetSize(row) : 1);
- return(value);
+ bvp = NewVal(TYPE_INT);
+ bvp->N = (row->Type == TYPE_JAR) ? GetSize(row) : 1;
+ return(bvp);
} else if (nodes[i].Op == OP_XX) {
- return MakeBson(g, row);
+ return MakeBson(g, row, i);
} else switch (row->Type) {
case TYPE_JOB:
if (!nodes[i].Key) {
@@ -847,9 +856,9 @@ PVAL BCUTIL::GetColumnValue(PGLOBAL g, PBVAL row, int i)
if (nodes[i].Op == OP_EQ)
bvp = GetArrayValue(arp, nodes[i].Rank);
else if (nodes[i].Op == OP_EXP)
- return ExpandArray(g, arp, i);
+ return NewVal(ExpandArray(g, arp, i));
else
- return CalculateArray(g, arp, i);
+ return NewVal(CalculateArray(g, arp, i));
} else {
// Unexpected array, unwrap it as [0]
@@ -871,6 +880,17 @@ PVAL BCUTIL::GetColumnValue(PGLOBAL g, PBVAL row, int i)
} // endfor i
+ return bvp;
+} // end of GetColumnValue
+
+/***********************************************************************/
+/* GetColumnValue: */
+/***********************************************************************/
+PVAL BCUTIL::GetColumnValue(PGLOBAL g, PBVAL row, int i)
+{
+ PVAL value = Cp->Value;
+ PBVAL bvp = GetRowValue(g, row, i);
+
SetJsonValue(g, value, bvp);
return value;
} // end of GetColumnValue