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

Commit121792d

Browse files
author
Nikita Glukhov
committed
Extract jsonbFindKeyInObject(), jsonbFindValueInArray(), JsonbArrayIterator
1 parentbe36d1d commit121792d

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
@@ -346,6 +346,85 @@ compareJsonbContainers(JsonbContainer *a, JsonbContainer *b)
346346
returnres;
347347
}
348348

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

382460
Assert((flags& ~(JB_FARRAY |JB_FOBJECT))==0);
@@ -386,27 +464,7 @@ findJsonbValueFromContainer(const JsonbContainer *container, uint32 flags,
386464
returnNULL;
387465

388466
if ((flags&JB_FARRAY)&&JsonContainerIsArray(container))
389-
{
390-
JsonbValue*result=palloc(sizeof(JsonbValue));
391-
char*base_addr= (char*) (children+count);
392-
uint32offset=0;
393-
inti;
394-
395-
for (i=0;i<count;i++)
396-
{
397-
fillJsonbValue(container,i,base_addr,offset,result);
398-
399-
if (key->type==result->type)
400-
{
401-
if (equalsJsonbScalarValue(key,result))
402-
returnresult;
403-
}
404-
405-
JBE_ADVANCE_OFFSET(offset,children[i]);
406-
}
407-
408-
pfree(result);
409-
}
467+
returnjsonbFindValueInArray(container,key);
410468
elseif ((flags&JB_FOBJECT)&&JsonContainerIsObject(container))
411469
{
412470
/* Object key passed by caller must be a string */
@@ -497,28 +555,16 @@ getKeyJsonValueFromContainer(const JsonbContainer *container,
497555
* Returns palloc()'d copy of the value, or NULL if it does not exist.
498556
*/
499557
JsonbValue*
500-
getIthJsonbValueFromContainer(JsonbContainer*container,uint32i)
558+
getIthJsonbValueFromContainer(constJsonbContainer*container,uint32i)
501559
{
502-
JsonbValue*result;
503-
char*base_addr;
504-
uint32nelements;
560+
JsonbArrayIteratorit;
505561

506562
if (!JsonContainerIsArray(container))
507563
elog(ERROR,"not a jsonb array");
508564

509-
nelements=JsonContainerSize(container);
510-
base_addr= (char*)&container->children[nelements];
511-
512-
if (i >=nelements)
513-
returnNULL;
514-
515-
result=palloc(sizeof(JsonbValue));
516-
517-
fillJsonbValue(container,i,base_addr,
518-
getJsonbOffset(container,i),
519-
result);
565+
JsonbArrayIteratorInit(&it,container);
520566

521-
returnresult;
567+
returnJsonbArrayIteratorGetIth(&it,i);
522568
}
523569

524570
/*
@@ -708,7 +754,7 @@ pushJsonbValue(JsonbParseState **pstate, JsonbIteratorToken seq,
708754
* Do the actual pushing, with only scalar or pseudo-scalar-array values
709755
* accepted.
710756
*/
711-
staticJsonbValue*
757+
JsonbValue*
712758
pushJsonbValueScalar(JsonbParseState**pstate,JsonbIteratorTokenseq,
713759
constJsonbValue*scalarVal)
714760
{

‎src/include/utils/jsonb.h‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ extern JsonbValue *findJsonbValueFromContainer(const JsonbContainer *sheader,
369369
externJsonbValue*getKeyJsonValueFromContainer(constJsonbContainer*container,
370370
constchar*keyVal,intkeyLen,
371371
JsonbValue*res);
372-
externJsonbValue*getIthJsonbValueFromContainer(JsonbContainer*sheader,
372+
externJsonbValue*getIthJsonbValueFromContainer(constJsonbContainer*sheader,
373373
uint32i);
374374
externJsonbValue*pushJsonbValue(JsonbParseState**pstate,
375375
JsonbIteratorTokenseq,

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp