static void _outList(StringInfo str, List *node) { ListCell *lc; if (node == NULL) { int16 tg = 0; appendBinaryStringInfo(str, (const char *)&tg, sizeof(int16)); return; } WRITE_NODE_TYPE(""); WRITE_INT_FIELD(length); foreach(lc, node) { if (IsA(node, List)) { _outNode(str, lfirst(lc)); } else if (IsA(node, IntList)) { int n = lfirst_int(lc); appendBinaryStringInfo(str, (const char *)&n, sizeof(int)); } else if (IsA(node, OidList)) { Oid n = lfirst_oid(lc); appendBinaryStringInfo(str, (const char *)&n, sizeof(Oid)); } } }
/* * nodeToBinaryStringFast - * returns a binary representation of the Node as a palloc'd string */ char * nodeToBinaryStringFast(void *obj, int * length) { StringInfoData str; int16 tg = (int16) 0xDEAD; /* see stringinfo.h for an explanation of this maneuver */ initStringInfoOfSize(&str, 4096); _outNode(&str, obj); /* Add something special at the end that we can check in readfast.c */ appendBinaryStringInfo(&str, (const char *)&tg, sizeof(int16)); *length = str.len; return str.data; }