Skip to content

Commit

Permalink
- Continue BSON implementation + fix create modified ha_connect.cc
Browse files Browse the repository at this point in the history
  • Loading branch information
Buggynours committed Dec 26, 2020
1 parent 2113cab commit a354248
Show file tree
Hide file tree
Showing 5 changed files with 132 additions and 125 deletions.
174 changes: 90 additions & 84 deletions storage/connect/bson.cpp
Expand Up @@ -59,38 +59,6 @@ void trans_func(unsigned int u, _EXCEPTION_POINTERS* pExp) {
char* GetExceptionDesc(PGLOBAL g, unsigned int e);
#endif // SE_CATCH

#if 0
char* GetJsonNull(void);

/***********************************************************************/
/* IsNum: check whether this string is all digits. */
/***********************************************************************/
bool IsNum(PSZ s) {
for (char* p = s; *p; p++)
if (*p == ']')
break;
else if (!isdigit(*p) || *p == '-')
return false;

return true;
} // end of IsNum

/***********************************************************************/
/* NextChr: return the first found '[' or Sep pointer. */
/***********************************************************************/
char* NextChr(PSZ s, char sep) {
char* p1 = strchr(s, '[');
char* p2 = strchr(s, sep);

if (!p2)
return p1;
else if (p1)
return MY_MIN(p1, p2);

return p2;
} // end of NextChr
#endif // 0

/* --------------------------- Class BDOC ---------------------------- */

/***********************************************************************/
Expand Down Expand Up @@ -180,7 +148,7 @@ PBVAL BDOC::ParseJson(PGLOBAL g, char* js, size_t lng)
if (bvp->Type != TYPE_UNKNOWN) {
bvp->To_Val = ParseAsArray(i);
bvp->Type = TYPE_JAR;
} else if ((bvp->To_Val = MOF(ParseValue(i))))
} else if ((bvp->To_Val = MOF(ParseValue(i, NewVal()))))
bvp->Type = TYPE_JVAL;
else
throw 4;
Expand Down Expand Up @@ -269,11 +237,11 @@ OFFSET BDOC::ParseArray(int& i)
sprintf(G->Message, "Unexpected value near %.*s", ARGS);
throw 1;
} else if (lastvlp) {
vlp = ParseValue(i);
vlp = ParseValue(i, NewVal());
lastvlp->Next = MOF(vlp);
lastvlp = vlp;
} else
firstvlp = lastvlp = ParseValue(i);
firstvlp = lastvlp = ParseValue(i, NewVal());

level = (b) ? 1 : 2;
break;
Expand Down Expand Up @@ -303,10 +271,10 @@ OFFSET BDOC::ParseObject(int& i)
case '"':
if (level < 2) {
key = ParseString(++i);
bpp = SubAllocPair(key);
bpp = NewPair(key);

if (lastbpp) {
lastbpp->Next = MOF(bpp);
lastbpp->Vlp.Next = MOF(bpp);
lastbpp = bpp;
} else
firstbpp = lastbpp = bpp;
Expand All @@ -320,7 +288,7 @@ OFFSET BDOC::ParseObject(int& i)
break;
case ':':
if (level == 2) {
lastbpp->Vlp = MOF(ParseValue(++i));
ParseValue(++i, GetVlp(lastbpp));
level = 3;
} else {
sprintf(G->Message, "Unexpected ':' near %.*s", ARGS);
Expand Down Expand Up @@ -362,10 +330,8 @@ OFFSET BDOC::ParseObject(int& i)
/***********************************************************************/
/* Parse a JSON Value. */
/***********************************************************************/
PBVAL BDOC::ParseValue(int& i)
PBVAL BDOC::ParseValue(int& i, PBVAL bvp)
{
PBVAL bvp = NewVal();

for (; i < len; i++)
switch (s[i]) {
case '\n':
Expand Down Expand Up @@ -750,7 +716,7 @@ bool BDOC::SerializeObject(OFFSET obp)
if (jp->WriteChr('{'))
return true;

for (prp; prp; prp = MPP(prp->Next)) {
for (prp; prp; prp = GetNext(prp)) {
if (first)
first = false;
else if (jp->WriteChr(','))
Expand All @@ -760,7 +726,7 @@ bool BDOC::SerializeObject(OFFSET obp)
jp->WriteStr(MZP(prp->Key)) ||
jp->WriteChr('"') ||
jp->WriteChr(':') ||
SerializeValue(MVP(prp->Vlp)))
SerializeValue(GetVlp(prp)))
return true;

} // endfor i
Expand Down Expand Up @@ -883,15 +849,35 @@ void BJSON::MemSet(size_t size)
/* ------------------------ Bobject functions ------------------------ */

/***********************************************************************/
/* Set a pair vlp to some PVAL values. */
/***********************************************************************/
void BJSON::SetPairValue(PBPR brp, PBVAL bvp)
{
if (bvp) {
brp->Vlp.To_Val = bvp->To_Val;
brp->Vlp.Nd = bvp->Nd;
brp->Vlp.Type = bvp->Type;
} else {
brp->Vlp.To_Val = 0;
brp->Vlp.Nd = 0;
brp->Vlp.Type = TYPE_NULL;
} // endif bvp

} // end of SetPairValue

/***********************************************************************/
/* Sub-allocate and initialize a BPAIR. */
/***********************************************************************/
PBPR BJSON::SubAllocPair(OFFSET key, OFFSET val)
PBPR BJSON::NewPair(OFFSET key, int type)
{
PBPR bpp = (PBPR)BsonSubAlloc(sizeof(BPAIR));

bpp->Key = key;
bpp->Vlp = val;
bpp->Next = 0;
bpp->Vlp.Ktp = TYPE_STRG;
bpp->Vlp.Type = type;
bpp->Vlp.To_Val = 0;
bpp->Vlp.Nd = 0;
bpp->Vlp.Next = 0;
return bpp;
} // end of SubAllocPair

Expand All @@ -905,7 +891,7 @@ int BJSON::GetObjectSize(PBVAL bop, bool b)

for (PBPR brp = GetObject(bop); brp; brp = GetNext(brp))
// If b return only non null pairs
if (!b || (brp->Vlp && GetVal(brp)->Type != TYPE_NULL))
if (!b || (brp->Vlp.To_Val && brp->Vlp.Type != TYPE_NULL))
n++;

return n;
Expand All @@ -914,20 +900,21 @@ int BJSON::GetObjectSize(PBVAL bop, bool b)
/***********************************************************************/
/* Add a new pair to an Object and return it. */
/***********************************************************************/
void BJSON::AddPair(PBVAL bop, PSZ key, OFFSET val)
PBVAL BJSON::AddPair(PBVAL bop, PSZ key, int type)
{
CheckType(bop, TYPE_JOB);
PBPR brp;
OFFSET nrp = NewPair(key, val);
OFFSET nrp = NewPair(key, type);

if (bop->To_Val) {
for (brp = GetObject(bop); brp->Next; brp = GetNext(brp));
for (brp = GetObject(bop); brp->Vlp.Next; brp = GetNext(brp));

brp->Next = nrp;
brp->Vlp.Next = nrp;
} else
bop->To_Val = nrp;

bop->Nd++;
return GetVlp(MPP(nrp));
} // end of AddPair

/***********************************************************************/
Expand All @@ -953,7 +940,7 @@ PBVAL BJSON::GetObjectValList(PBVAL bop)
PBVAL arp = NewVal(TYPE_JAR);

for (PBPR brp = GetObject(bop); brp; brp = GetNext(brp))
AddArrayValue(arp, brp->Vlp);
AddArrayValue(arp, GetVlp(brp));

return arp;
} // end of GetObjectValList
Expand All @@ -967,7 +954,7 @@ PBVAL BJSON::GetKeyValue(PBVAL bop, PSZ key)

for (PBPR brp = GetObject(bop); brp; brp = GetNext(brp))
if (!strcmp(GetKey(brp), key))
return GetVal(brp);
return GetVlp(brp);

return NULL;
} // end of GetKeyValue;
Expand All @@ -993,11 +980,11 @@ PSZ BJSON::GetObjectText(PGLOBAL g, PBVAL bop, PSTRG text)
b = false;
} // endif text

if (b && !brp->Next && !strcmp(MZP(brp->Key), "$date")) {
if (b && !brp->Vlp.Next && !strcmp(MZP(brp->Key), "$date")) {
int i;
PSZ s;

GetValueText(g, MVP(brp->Vlp), text);
GetValueText(g, GetVlp(brp), text);
s = text->GetStr();
i = (s[1] == '-' ? 2 : 1);

Expand All @@ -1013,10 +1000,10 @@ PSZ BJSON::GetObjectText(PGLOBAL g, PBVAL bop, PSTRG text)

} // endif text

} else for (PBPR brp = GetObject(bop); brp; brp = GetNext(brp)) {
GetValueText(g, GetVal(brp), text);
} else for (; brp; brp = GetNext(brp)) {
GetValueText(g, GetVlp(brp), text);

if (brp->Next)
if (brp->Vlp.Next)
text->Append(' ');

} // endfor brp
Expand All @@ -1041,18 +1028,18 @@ void BJSON::SetKeyValue(PBVAL bop, OFFSET bvp, PSZ key)

if (bop->To_Val) {
for (brp = GetObject(bop); brp; brp = GetNext(brp))
if (!strcmp(GetKey(brp), key)) {
brp->Vlp = bvp;
return;
} else
if (!strcmp(GetKey(brp), key))
break;
else
prp = brp;

if (!brp)
prp->Next = NewPair(key, bvp);
brp = MPP(prp->Vlp.Next = NewPair(key));

} else
bop->To_Val = NewPair(key, bvp);
brp = MPP(bop->To_Val = NewPair(key));

SetPairValue(brp, MVP(bvp));
bop->Nd++;
} // end of SetKeyValue

Expand All @@ -1066,7 +1053,7 @@ PBVAL BJSON::MergeObject(PBVAL bop1, PBVAL bop2)

if (bop1->To_Val)
for (PBPR brp = GetObject(bop2); brp; brp = GetNext(brp))
SetKeyValue(bop1, brp->Vlp, GetKey(brp));
SetKeyValue(bop1, GetVlp(brp), GetKey(brp));

else {
bop1->To_Val = bop2->To_Val;
Expand All @@ -1087,9 +1074,9 @@ void BJSON::DeleteKey(PBVAL bop, PCSZ key)
for (brp = GetObject(bop); brp; brp = GetNext(brp))
if (!strcmp(MZP(brp->Key), key)) {
if (pbrp) {
pbrp->Next = brp->Next;
pbrp->Vlp.Next = brp->Vlp.Next;
} else
bop->To_Val = brp->Next;
bop->To_Val = brp->Vlp.Next;

bop->Nd--;
break;
Expand All @@ -1106,7 +1093,7 @@ bool BJSON::IsObjectNull(PBVAL bop)
CheckType(bop, TYPE_JOB);

for (PBPR brp = GetObject(bop); brp; brp = GetNext(brp))
if (brp->Vlp && (MVP(brp->Vlp))->Type != TYPE_NULL)
if (brp->Vlp.To_Val && brp->Vlp.Type != TYPE_NULL)
return false;

return true;
Expand Down Expand Up @@ -1368,6 +1355,25 @@ int BJSON::GetSize(PBVAL vlp, bool b)

} // end of GetSize

PBVAL BJSON::GetBson(PBVAL bvp)
{
PBVAL bp = NULL;

switch (bvp->Type) {
case TYPE_JAR:
bp = MVP(bvp->To_Val);
break;
case TYPE_JOB:
bp = GetVlp(MPP(bvp->To_Val));
break;
default:
bp = bvp;
break;
} // endswitch Type

return bp;
} // end of GetBson

/***********************************************************************/
/* Return the Value's as a Value struct. */
/***********************************************************************/
Expand All @@ -1378,22 +1384,22 @@ PVAL BJSON::GetValue(PGLOBAL g, PBVAL vp)
PBVAL vlp = vp->Type == TYPE_JVAL ? MVP(vp->To_Val) : vp;

switch (vlp->Type) {
case TYPE_STRG:
case TYPE_DBL:
case TYPE_BINT:
valp = AllocateValue(g, MP(vlp->To_Val), vlp->Type, vlp->Nd);
break;
case TYPE_INTG:
case TYPE_BOOL:
valp = AllocateValue(g, vlp, vlp->Type);
break;
case TYPE_FLOAT:
d = (double)vlp->F;
valp = AllocateValue(g, &d, TYPE_DOUBLE, vlp->Nd);
break;
default:
valp = NULL;
break;
case TYPE_STRG:
case TYPE_DBL:
case TYPE_BINT:
valp = AllocateValue(g, MP(vlp->To_Val), vlp->Type, vlp->Nd);
break;
case TYPE_INTG:
case TYPE_BOOL:
valp = AllocateValue(g, vlp, vlp->Type);
break;
case TYPE_FLOAT:
d = (double)vlp->F;
valp = AllocateValue(g, &d, TYPE_DOUBLE, vlp->Nd);
break;
default:
valp = NULL;
break;
} // endswitch Type

return valp;
Expand Down

0 comments on commit a354248

Please sign in to comment.