public override async Task Write(PostgisGeometry value, NpgsqlWriteBuffer buf, NpgsqlLengthCache?lengthCache, NpgsqlParameter?parameter, bool async, CancellationToken cancellationToken = default) { // Common header if (value.SRID == 0) { if (buf.WriteSpaceLeft < 5) { await buf.Flush(async, cancellationToken); } buf.WriteByte(0); // We choose to ouput only XDR structure buf.WriteInt32((int)value.Identifier); } else { if (buf.WriteSpaceLeft < 9) { await buf.Flush(async, cancellationToken); } buf.WriteByte(0); buf.WriteInt32((int)((uint)value.Identifier | (uint)EwkbModifiers.HasSRID)); buf.WriteInt32((int)value.SRID); } switch (value.Identifier) { case WkbIdentifier.Point: if (buf.WriteSpaceLeft < 16) { await buf.Flush(async, cancellationToken); } var p = (PostgisPoint)value; buf.WriteDouble(p.X); buf.WriteDouble(p.Y); return; case WkbIdentifier.LineString: var l = (PostgisLineString)value; if (buf.WriteSpaceLeft < 4) { await buf.Flush(async, cancellationToken); } buf.WriteInt32(l.PointCount); for (var ipts = 0; ipts < l.PointCount; ipts++) { if (buf.WriteSpaceLeft < 16) { await buf.Flush(async, cancellationToken); } buf.WriteDouble(l[ipts].X); buf.WriteDouble(l[ipts].Y); } return; case WkbIdentifier.Polygon: var pol = (PostgisPolygon)value; if (buf.WriteSpaceLeft < 4) { await buf.Flush(async, cancellationToken); } buf.WriteInt32(pol.RingCount); for (var irng = 0; irng < pol.RingCount; irng++) { if (buf.WriteSpaceLeft < 4) { await buf.Flush(async, cancellationToken); } buf.WriteInt32(pol[irng].Length); for (var ipts = 0; ipts < pol[irng].Length; ipts++) { if (buf.WriteSpaceLeft < 16) { await buf.Flush(async, cancellationToken); } buf.WriteDouble(pol[irng][ipts].X); buf.WriteDouble(pol[irng][ipts].Y); } } return; case WkbIdentifier.MultiPoint: var mp = (PostgisMultiPoint)value; if (buf.WriteSpaceLeft < 4) { await buf.Flush(async, cancellationToken); } buf.WriteInt32(mp.PointCount); for (var ipts = 0; ipts < mp.PointCount; ipts++) { if (buf.WriteSpaceLeft < 21) { await buf.Flush(async, cancellationToken); } buf.WriteByte(0); buf.WriteInt32((int)WkbIdentifier.Point); buf.WriteDouble(mp[ipts].X); buf.WriteDouble(mp[ipts].Y); } return; case WkbIdentifier.MultiLineString: var ml = (PostgisMultiLineString)value; if (buf.WriteSpaceLeft < 4) { await buf.Flush(async, cancellationToken); } buf.WriteInt32(ml.LineCount); for (var irng = 0; irng < ml.LineCount; irng++) { if (buf.WriteSpaceLeft < 9) { await buf.Flush(async, cancellationToken); } buf.WriteByte(0); buf.WriteInt32((int)WkbIdentifier.LineString); buf.WriteInt32(ml[irng].PointCount); for (var ipts = 0; ipts < ml[irng].PointCount; ipts++) { if (buf.WriteSpaceLeft < 16) { await buf.Flush(async, cancellationToken); } buf.WriteDouble(ml[irng][ipts].X); buf.WriteDouble(ml[irng][ipts].Y); } } return; case WkbIdentifier.MultiPolygon: var mpl = (PostgisMultiPolygon)value; if (buf.WriteSpaceLeft < 4) { await buf.Flush(async, cancellationToken); } buf.WriteInt32(mpl.PolygonCount); for (var ipol = 0; ipol < mpl.PolygonCount; ipol++) { if (buf.WriteSpaceLeft < 9) { await buf.Flush(async, cancellationToken); } buf.WriteByte(0); buf.WriteInt32((int)WkbIdentifier.Polygon); buf.WriteInt32(mpl[ipol].RingCount); for (var irng = 0; irng < mpl[ipol].RingCount; irng++) { if (buf.WriteSpaceLeft < 4) { await buf.Flush(async, cancellationToken); } buf.WriteInt32(mpl[ipol][irng].Length); for (var ipts = 0; ipts < mpl[ipol][irng].Length; ipts++) { if (buf.WriteSpaceLeft < 16) { await buf.Flush(async, cancellationToken); } buf.WriteDouble(mpl[ipol][irng][ipts].X); buf.WriteDouble(mpl[ipol][irng][ipts].Y); } } } return; case WkbIdentifier.GeometryCollection: var coll = (PostgisGeometryCollection)value; if (buf.WriteSpaceLeft < 4) { await buf.Flush(async, cancellationToken); } buf.WriteInt32(coll.GeometryCount); foreach (var x in coll) { await Write(x, buf, lengthCache, null, async, cancellationToken); } return; default: throw new InvalidOperationException("Unknown Postgis identifier."); } }
/// <inheritdoc /> public override void Write(NpgsqlLine value, NpgsqlWriteBuffer buf, NpgsqlParameter?parameter) { buf.WriteDouble(value.A); buf.WriteDouble(value.B); buf.WriteDouble(value.C); }
/// <inheritdoc /> public override void Write(NpgsqlCircle value, NpgsqlWriteBuffer buf, NpgsqlParameter?parameter) { buf.WriteDouble(value.X); buf.WriteDouble(value.Y); buf.WriteDouble(value.Radius); }
/// <inheritdoc /> public override void Write(NpgsqlPoint value, NpgsqlWriteBuffer buf, NpgsqlParameter?parameter) { buf.WriteDouble(value.X); buf.WriteDouble(value.Y); }
public override void Write(double value, NpgsqlWriteBuffer buf, NpgsqlParameter parameter) => buf.WriteDouble(value);