static int compareJsonbScalarValue(JsonbValue * a, JsonbValue * b);
static int lexicalCompareJsonbStringValue(const void *a, const void *b);
static Size convertJsonb(JsonbValue * v, Jsonb* buffer);
+static inline short addPaddingInt(convertState * state);
static void walkJsonbValueConversion(JsonbValue * value, convertState * state,
uint32 nestlevel);
static void putJsonbValueConversion(convertState * state, JsonbValue * value,
convertJsonb(JsonbValue * v, Jsonb *buffer)
{
convertState state;
- Size len = 0;
+ Size len;
/* Should not already have binary representation */
Assert(v->type != jbvBinary);
}
}
+/*
+ * Add padding sufficient to int-align our access to conversion buffer
+ */
+static inline
+short addPaddingInt(convertState * state)
+{
+ short padlen, p;
+
+ padlen = INTALIGN(state->ptr - VARDATA(state->buffer)) -
+ (state->ptr - VARDATA(state->buffer));
+
+ for (p = padlen; p > 0; p--)
+ {
+ *state->ptr = '\0';
+ state->ptr++;
+ }
+
+ return padlen;
+}
+
/*
* As part of the process of converting an arbitrary JsonbValue to a Jsonb,
* copy an arbitrary individual JsonbValue. This function may copy over any
if (flags & (WJB_BEGIN_ARRAY | WJB_BEGIN_OBJECT))
{
- short padlen, p;
-
Assert(((flags & WJB_BEGIN_ARRAY) && value->type == jbvArray) ||
((flags & WJB_BEGIN_OBJECT) && value->type == jbvObject));
state->curlptr->begin = state->ptr;
- padlen = INTALIGN(state->ptr - VARDATA(state->buffer)) -
- (state->ptr - VARDATA(state->buffer));
-
- /*
- * Add padding as necessary
- */
- for (p = padlen; p > 0; p--)
- {
- *state->ptr = '\0';
- state->ptr++;
- }
+ addPaddingInt(state);
state->curlptr->header = (uint32 *) state->ptr;
/* Advance past header */
putStringConversion(convertState * state, JsonbValue * value,
uint32 level, uint32 i)
{
- short p, padlen;
+ int numlen;
+ short padlen;
state->curlptr = state->levelstate + level;
state->curlptr->meta[i].header |= (value->boolean) ?
JENTRY_ISTRUE : JENTRY_ISFALSE;
+ /*
+ * Store a delta from start of meta array until end (add last
+ * item's offset to length of item to get our offset)
+ */
if (i > 0)
state->curlptr->meta[i].header |=
state->curlptr->meta[i - 1].header & JENTRY_POSMASK;
break;
case jbvNumeric:
- {
- int numlen = VARSIZE_ANY(value->numeric);
-
- padlen = INTALIGN(state->ptr - VARDATA(state->buffer)) -
- (state->ptr - VARDATA(state->buffer));
-
- /*
- * Add padding as necessary
- */
- for (p = padlen; p > 0; p--)
- {
- *state->ptr = '\0';
- state->ptr++;
- }
+ numlen = VARSIZE_ANY(value->numeric);
+ padlen = addPaddingInt(state);
- memcpy(state->ptr, value->numeric, numlen);
- state->ptr += numlen;
+ memcpy(state->ptr, value->numeric, numlen);
+ state->ptr += numlen;
- state->curlptr->meta[i].header |= JENTRY_ISNUMERIC;
- if (i == 0)
- state->curlptr->meta[i].header |= padlen + numlen;
- else
- state->curlptr->meta[i].header |=
- (state->curlptr->meta[i - 1].header & JENTRY_POSMASK) +
- padlen + numlen;
- break;
- }
+ state->curlptr->meta[i].header |= JENTRY_ISNUMERIC;
+ if (i == 0)
+ state->curlptr->meta[i].header |= padlen + numlen;
+ else
+ state->curlptr->meta[i].header |=
+ (state->curlptr->meta[i - 1].header & JENTRY_POSMASK)
+ + padlen + numlen;
+ break;
default:
elog(ERROR, "invalid jsonb scalar type");
}
}
/*
- * Sort and unique-ify pairs in JsonbValue (associative "object" data
- * structure)
+ * Sort and unique-ify pairs in JsonbValue object
*/
static void
uniqueifyJsonbObject(JsonbValue * v)