Пример #1
0
        protected override void Write(object value, WriteBuffer buf, NpgsqlParameter parameter = null)
        {
            var v = (NpgsqlPoint)value;

            buf.WriteDouble(v.X);
            buf.WriteDouble(v.Y);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }
Пример #7
0
 public override void Write(object value, WriteBuffer buf, NpgsqlParameter parameter)
 {
     if (parameter?.ConvertedValue != null)
     {
         value = parameter.ConvertedValue;
     }
     buf.WriteDouble((double)value);
 }
Пример #8
0
        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);
            }
        }
Пример #9
0
        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);
            }
        }
Пример #10
0
        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.");
            }
        }
Пример #11
0
        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.");
            }
        }