protected override void Write(object value, WriteBuffer buf, NpgsqlParameter parameter = null) { var v = (NpgsqlPoint)value; buf.WriteDouble(v.X); buf.WriteDouble(v.Y); }
public override bool Write(ref DirectBuffer directBuf) { if (_index == -1) { if (_writeBuf.WriteSpaceLeft < 4) { return(false); } _writeBuf.WriteInt32(_value.Count); _index = 0; } for (; _index < _value.Count; _index++) { if (_writeBuf.WriteSpaceLeft < 16) { return(false); } var p = _value[_index]; _writeBuf.WriteDouble(p.X); _writeBuf.WriteDouble(p.Y); } _writeBuf = null; _value = default(NpgsqlPolygon); return(true); }
public override void Write(object value, WriteBuffer buf, NpgsqlParameter parameter) { var v = (NpgsqlCircle)value; buf.WriteDouble(v.X); buf.WriteDouble(v.Y); buf.WriteDouble(v.Radius); }
protected override void Write(object value, WriteBuffer buf, NpgsqlParameter parameter = null) { var v = (NpgsqlLine)value; buf.WriteDouble(v.A); buf.WriteDouble(v.B); buf.WriteDouble(v.C); }
protected override void Write(object value, WriteBuffer buf, NpgsqlParameter parameter = null) { var v = (NpgsqlBox)value; buf.WriteDouble(v.Right); buf.WriteDouble(v.Top); buf.WriteDouble(v.Left); buf.WriteDouble(v.Bottom); }
protected override void Write(object value, WriteBuffer buf, NpgsqlParameter parameter = null) { var v = (NpgsqlLSeg)value; buf.WriteDouble(v.Start.X); buf.WriteDouble(v.Start.Y); buf.WriteDouble(v.End.X); buf.WriteDouble(v.End.Y); }
public override void Write(object value, WriteBuffer buf, NpgsqlParameter parameter) { if (parameter?.ConvertedValue != null) { value = parameter.ConvertedValue; } buf.WriteDouble((double)value); }
protected override async Task Write(object value, WriteBuffer buf, LengthCache lengthCache, NpgsqlParameter parameter, bool async, CancellationToken cancellationToken) { var polygon = (NpgsqlPolygon)value; if (buf.WriteSpaceLeft < 4) { await buf.Flush(async, cancellationToken); } buf.WriteInt32(polygon.Count); foreach (var p in polygon) { if (buf.WriteSpaceLeft < 16) { await buf.Flush(async, cancellationToken); } buf.WriteDouble(p.X); buf.WriteDouble(p.Y); } }
protected override async Task Write(object value, WriteBuffer buf, LengthCache lengthCache, NpgsqlParameter parameter, bool async, CancellationToken cancellationToken) { var path = (NpgsqlPath)value; if (buf.WriteSpaceLeft < 5) { await buf.Flush(async, cancellationToken); } buf.WriteByte((byte)(path.Open ? 0 : 1)); buf.WriteInt32(path.Count); foreach (var p in path) { if (buf.WriteSpaceLeft < 16) { await buf.Flush(async, cancellationToken); } buf.WriteDouble(p.X); buf.WriteDouble(p.Y); } }
bool Write(PostgisGeometry geom) { if (_newGeom & _icol.Count == 0) { if (geom.SRID == 0) { if (_writeBuf.WriteSpaceLeft < 5) { return(false); } _writeBuf.WriteByte(0); // We choose to ouput only XDR structure _writeBuf.WriteInt32((int)geom.Identifier); } else { if (_writeBuf.WriteSpaceLeft < 9) { return(false); } _writeBuf.WriteByte(0); _writeBuf.WriteInt32((int)((uint)geom.Identifier | (uint)EwkbModifier.HasSRID)); _writeBuf.WriteInt32((int)geom.SRID); } _newGeom = false; } switch (geom.Identifier) { case WkbIdentifier.Point: if (_writeBuf.WriteSpaceLeft < 16) { return(false); } var p = (PostgisPoint)geom; _writeBuf.WriteDouble(p.X); _writeBuf.WriteDouble(p.Y); return(true); case WkbIdentifier.LineString: var l = (PostgisLineString)geom; if (_ipts == -1) { if (_writeBuf.WriteSpaceLeft < 4) { return(false); } _writeBuf.WriteInt32(l.PointCount); _ipts = 0; } for (; _ipts < l.PointCount; _ipts++) { if (_writeBuf.WriteSpaceLeft < 16) { return(false); } _writeBuf.WriteDouble(l[_ipts].X); _writeBuf.WriteDouble(l[_ipts].Y); } return(true); case WkbIdentifier.Polygon: var pol = (PostgisPolygon)geom; if (_irng == -1) { if (_writeBuf.WriteSpaceLeft < 4) { return(false); } _writeBuf.WriteInt32(pol.RingCount); _irng = 0; } for (; _irng < pol.RingCount; _irng++) { if (_ipts == -1) { if (_writeBuf.WriteSpaceLeft < 4) { return(false); } _writeBuf.WriteInt32(pol[_irng].Length); _ipts = 0; } for (; _ipts < pol[_irng].Length; _ipts++) { if (_writeBuf.WriteSpaceLeft < 16) { return(false); } _writeBuf.WriteDouble(pol[_irng][_ipts].X); _writeBuf.WriteDouble(pol[_irng][_ipts].Y); } _ipts = -1; } return(true); case WkbIdentifier.MultiPoint: var mp = (PostgisMultiPoint)geom; if (_ipts == -1) { if (_writeBuf.WriteSpaceLeft < 4) { return(false); } _writeBuf.WriteInt32(mp.PointCount); _ipts = 0; } for (; _ipts < mp.PointCount; _ipts++) { if (_writeBuf.WriteSpaceLeft < 21) { return(false); } _writeBuf.WriteByte(0); _writeBuf.WriteInt32((int)WkbIdentifier.Point); _writeBuf.WriteDouble(mp[_ipts].X); _writeBuf.WriteDouble(mp[_ipts].Y); } return(true); case WkbIdentifier.MultiLineString: var ml = (PostgisMultiLineString)geom; if (_irng == -1) { if (_writeBuf.WriteSpaceLeft < 4) { return(false); } _writeBuf.WriteInt32(ml.LineCount); _irng = 0; } for (; _irng < ml.LineCount; _irng++) { if (_ipts == -1) { if (_writeBuf.WriteSpaceLeft < 9) { return(false); } _writeBuf.WriteByte(0); _writeBuf.WriteInt32((int)WkbIdentifier.LineString); _writeBuf.WriteInt32(ml[_irng].PointCount); _ipts = 0; } for (; _ipts < ml[_irng].PointCount; _ipts++) { if (_writeBuf.WriteSpaceLeft < 16) { return(false); } _writeBuf.WriteDouble(ml[_irng][_ipts].X); _writeBuf.WriteDouble(ml[_irng][_ipts].Y); } _ipts = -1; } return(true); case WkbIdentifier.MultiPolygon: var mpl = (PostgisMultiPolygon)geom; if (_ipol == -1) { if (_writeBuf.WriteSpaceLeft < 4) { return(false); } _writeBuf.WriteInt32(mpl.PolygonCount); _ipol = 0; } for (; _ipol < mpl.PolygonCount; _ipol++) { if (_irng == -1) { if (_writeBuf.WriteSpaceLeft < 9) { return(false); } _writeBuf.WriteByte(0); _writeBuf.WriteInt32((int)WkbIdentifier.Polygon); _writeBuf.WriteInt32(mpl[_ipol].RingCount); _irng = 0; } for (; _irng < mpl[_ipol].RingCount; _irng++) { if (_ipts == -1) { if (_writeBuf.WriteSpaceLeft < 4) { return(false); } _writeBuf.WriteInt32(mpl[_ipol][_irng].Length); _ipts = 0; } for (; _ipts < mpl[_ipol][_irng].Length; _ipts++) { if (_writeBuf.WriteSpaceLeft < 16) { return(false); } _writeBuf.WriteDouble(mpl[_ipol][_irng][_ipts].X); _writeBuf.WriteDouble(mpl[_ipol][_irng][_ipts].Y); } _ipts = -1; } _irng = -1; } _ipol = -1; return(true); case WkbIdentifier.GeometryCollection: var coll = (PostgisGeometryCollection)geom; if (_icol.Count == 0) { if (_writeBuf.WriteSpaceLeft < 4) { return(false); } _writeBuf.WriteInt32(coll.GeometryCount); _newGeom = true; } for (var i = _icol.Count > 0 ? _icol.Pop() : 0; i < coll.GeometryCount; i++) { if (!Write(coll[i])) { _icol.Push(i); return(false); } Reset(); } return(true); default: throw new InvalidOperationException("Unknown Postgis identifier."); } }
async Task Write(PostgisGeometry geom, WriteBuffer buf, LengthCache lengthCache, NpgsqlParameter parameter, bool async, CancellationToken cancellationToken) { // Common header if (geom.SRID == 0) { if (buf.WriteSpaceLeft < 5) { await buf.Flush(async, cancellationToken); } buf.WriteByte(0); // We choose to ouput only XDR structure buf.WriteInt32((int)geom.Identifier); } else { if (buf.WriteSpaceLeft < 9) { await buf.Flush(async, cancellationToken); } buf.WriteByte(0); buf.WriteInt32((int)((uint)geom.Identifier | (uint)EwkbModifiers.HasSRID)); buf.WriteInt32((int)geom.SRID); } switch (geom.Identifier) { case WkbIdentifier.Point: if (buf.WriteSpaceLeft < 16) { await buf.Flush(async, cancellationToken); } var p = (PostgisPoint)geom; buf.WriteDouble(p.X); buf.WriteDouble(p.Y); return; case WkbIdentifier.LineString: var l = (PostgisLineString)geom; 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)geom; 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)geom; 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)geom; 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)geom; 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)geom; 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."); } }