Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitdb8d175

Browse files
author
Nikita Glukhov
committed
Extract jsonbFindKeyInObject(), jsonbFindValueInArray(), JsonbArrayIterator
1 parentc809943 commitdb8d175

File tree

2 files changed

+86
-40
lines changed

2 files changed

+86
-40
lines changed

‎src/backend/utils/adt/jsonb_util.c

Lines changed: 85 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,85 @@ compareJsonbContainers(JsonbContainer *a, JsonbContainer *b)
342342
returnres;
343343
}
344344

345+
staticJsonbValue*
346+
jsonbFindKeyInObject(constJsonbContainer*container,constJsonbValue*key)
347+
{
348+
returngetKeyJsonValueFromContainer(container,key->val.string.val,
349+
key->val.string.len,NULL);
350+
}
351+
352+
typedefstructJsonbArrayIterator
353+
{
354+
constJsonbContainer*container;
355+
char*base_addr;
356+
intindex;
357+
intcount;
358+
uint32offset;
359+
}JsonbArrayIterator;
360+
361+
staticvoid
362+
JsonbArrayIteratorInit(JsonbArrayIterator*it,constJsonbContainer*container)
363+
{
364+
it->container=container;
365+
it->index=0;
366+
it->count= (container->header&JB_CMASK);
367+
it->offset=0;
368+
it->base_addr= (char*) (container->children+it->count);
369+
}
370+
371+
staticbool
372+
JsonbArrayIteratorNext(JsonbArrayIterator*it,JsonbValue*result)
373+
{
374+
if (it->index >=it->count)
375+
return false;
376+
377+
fillJsonbValue(it->container,it->index,it->base_addr,it->offset,result);
378+
379+
JBE_ADVANCE_OFFSET(it->offset,it->container->children[it->index]);
380+
381+
it->index++;
382+
383+
return true;
384+
}
385+
386+
staticJsonbValue*
387+
JsonbArrayIteratorGetIth(JsonbArrayIterator*it,uint32i)
388+
{
389+
JsonbValue*result;
390+
391+
if (i >=it->count)
392+
returnNULL;
393+
394+
result=palloc(sizeof(JsonbValue));
395+
396+
fillJsonbValue(it->container,i,it->base_addr,
397+
getJsonbOffset(it->container,i),
398+
result);
399+
400+
returnresult;
401+
}
402+
403+
staticJsonbValue*
404+
jsonbFindValueInArray(constJsonbContainer*container,constJsonbValue*key)
405+
{
406+
JsonbArrayIteratorit;
407+
JsonbValue*result=palloc(sizeof(JsonbValue));
408+
409+
JsonbArrayIteratorInit(&it,container);
410+
411+
while (JsonbArrayIteratorNext(&it,result))
412+
{
413+
if (key->type==result->type)
414+
{
415+
if (equalsJsonbScalarValue(key,result))
416+
returnresult;
417+
}
418+
}
419+
420+
pfree(result);
421+
returnNULL;
422+
}
423+
345424
/*
346425
* Find value in object (i.e. the "value" part of some key/value pair in an
347426
* object), or find a matching element if we're looking through an array. Do
@@ -372,7 +451,6 @@ JsonbValue *
372451
findJsonbValueFromContainer(constJsonbContainer*container,uint32flags,
373452
JsonbValue*key)
374453
{
375-
constJEntry*children=container->children;
376454
intcount=JsonContainerSize(container);
377455

378456
Assert((flags& ~(JB_FARRAY |JB_FOBJECT))==0);
@@ -382,27 +460,7 @@ findJsonbValueFromContainer(const JsonbContainer *container, uint32 flags,
382460
returnNULL;
383461

384462
if ((flags&JB_FARRAY)&&JsonContainerIsArray(container))
385-
{
386-
JsonbValue*result=palloc(sizeof(JsonbValue));
387-
char*base_addr= (char*) (children+count);
388-
uint32offset=0;
389-
inti;
390-
391-
for (i=0;i<count;i++)
392-
{
393-
fillJsonbValue(container,i,base_addr,offset,result);
394-
395-
if (key->type==result->type)
396-
{
397-
if (equalsJsonbScalarValue(key,result))
398-
returnresult;
399-
}
400-
401-
JBE_ADVANCE_OFFSET(offset,children[i]);
402-
}
403-
404-
pfree(result);
405-
}
463+
returnjsonbFindValueInArray(container,key);
406464
elseif ((flags&JB_FOBJECT)&&JsonContainerIsObject(container))
407465
{
408466
/* Object key passed by caller must be a string */
@@ -493,28 +551,16 @@ getKeyJsonValueFromContainer(const JsonbContainer *container,
493551
* Returns palloc()'d copy of the value, or NULL if it does not exist.
494552
*/
495553
JsonbValue*
496-
getIthJsonbValueFromContainer(JsonbContainer*container,uint32i)
554+
getIthJsonbValueFromContainer(constJsonbContainer*container,uint32i)
497555
{
498-
JsonbValue*result;
499-
char*base_addr;
500-
uint32nelements;
556+
JsonbArrayIteratorit;
501557

502558
if (!JsonContainerIsArray(container))
503559
elog(ERROR,"not a jsonb array");
504560

505-
nelements=JsonContainerSize(container);
506-
base_addr= (char*)&container->children[nelements];
507-
508-
if (i >=nelements)
509-
returnNULL;
510-
511-
result=palloc(sizeof(JsonbValue));
512-
513-
fillJsonbValue(container,i,base_addr,
514-
getJsonbOffset(container,i),
515-
result);
561+
JsonbArrayIteratorInit(&it,container);
516562

517-
returnresult;
563+
returnJsonbArrayIteratorGetIth(&it,i);
518564
}
519565

520566
/*
@@ -690,7 +736,7 @@ pushJsonbValue(JsonbParseState **pstate, JsonbIteratorToken seq,
690736
* Do the actual pushing, with only scalar or pseudo-scalar-array values
691737
* accepted.
692738
*/
693-
staticJsonbValue*
739+
JsonbValue*
694740
pushJsonbValueScalar(JsonbParseState**pstate,JsonbIteratorTokenseq,
695741
constJsonbValue*scalarVal)
696742
{

‎src/include/utils/jsonb.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ extern JsonbValue *findJsonbValueFromContainer(const JsonbContainer *sheader,
353353
externJsonbValue*getKeyJsonValueFromContainer(constJsonbContainer*container,
354354
constchar*keyVal,intkeyLen,
355355
JsonbValue*res);
356-
externJsonbValue*getIthJsonbValueFromContainer(JsonbContainer*sheader,
356+
externJsonbValue*getIthJsonbValueFromContainer(constJsonbContainer*sheader,
357357
uint32i);
358358
externJsonbValue*pushJsonbValue(JsonbParseState**pstate,
359359
JsonbIteratorTokenseq,

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp