133 HeapTupleData tmptup,
136 bool needsep =
false;
138 StringInfo props = makeStringInfo();
139 StringInfo
id = makeStringInfo();
140 bool geom_column_found =
false;
141 bool id_column_found =
false;
143 sep = use_line_feeds ?
",\n " :
", ";
145 td = DatumGetHeapTupleHeader(composite);
148 tupType = HeapTupleHeaderGetTypeId(td);
149 tupTypmod = HeapTupleHeaderGetTypMod(td);
150 tupdesc = lookup_rowtype_tupdesc(tupType, tupTypmod);
153 tmptup.t_len = HeapTupleHeaderGetDatumLength(td);
157 appendStringInfoString(
result,
"{\"type\": \"Feature\", \"geometry\": ");
159 for (i = 0; i < tupdesc->natts; i++)
166 Form_pg_attribute att = TupleDescAttr(tupdesc, i);
167 bool is_geom_column =
false;
168 bool is_id_column =
false;
170 if (att->attisdropped)
173 attname = NameStr(att->attname);
175 if (geom_column_name)
176 is_geom_column = (strcmp(attname, geom_column_name) == 0);
178 is_geom_column = (att->atttypid == geom_oid || att->atttypid == geog_oid);
181 is_id_column = (strcmp(attname, id_column_name) == 0);
183 if ((!geom_column_found) && is_geom_column)
186 geom_column_found =
true;
188 val = heap_getattr(tuple, i + 1, tupdesc, &isnull);
198 Int32GetDatum(maxdecimaldigits))));
202 appendStringInfoString(
result,
"null");
205 else if (is_id_column)
207 id_column_found =
true;
209 val = heap_getattr(tuple, i + 1, tupdesc, &isnull);
214 outfuncoid = InvalidOid;
219 datum_to_json(val, isnull,
id, tcategory, outfuncoid,
false);
224 appendStringInfoString(props, sep);
227 escape_json(props, attname);
228 appendStringInfoString(props,
": ");
230 val = heap_getattr(tuple, i + 1, tupdesc, &isnull);
235 outfuncoid = InvalidOid;
240 datum_to_json(val, isnull, props, tcategory, outfuncoid,
false);
244 if (!geom_column_found)
246 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
247 errmsg(
"geometry column is missing")));
251 if (!id_column_found)
253 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
254 errmsg(
"Specified id column \"%s\" is missing", id_column_name)));
256 appendStringInfoString(
result,
", \"id\": ");
257 appendStringInfo(
result,
"%s", id->data);
260 appendStringInfoString(
result,
", \"properties\": {");
261 appendStringInfo(
result,
"%s", props->data);
263 appendStringInfoString(
result,
"}}");
264 ReleaseTupleDesc(tupdesc);
char result[OUT_DOUBLE_BUFFER_SIZE]
static void json_categorize_type(Oid typoid, JsonTypeCategory *tcategory, Oid *outfuncoid)
Datum LWGEOM_asGeoJson(PG_FUNCTION_ARGS)
static void datum_to_json(Datum val, bool is_null, StringInfo result, JsonTypeCategory tcategory, Oid outfuncoid, bool key_scalar)