Exemplo n.º 1
0
    private void LookupDesc()
    {
        var lookup = Database.CreateStatement(Transaction);

        try
        {
            lookup.Prepare(GetArrayDesc());
            lookup.Execute(0, EmptyDescriptorFiller.Instance);

            _descriptor = new ArrayDesc();
            var values = lookup.Fetch();
            if (values != null && values.Length > 0)
            {
                _descriptor.RelationName = _tableName;
                _descriptor.FieldName    = _fieldName;
                _descriptor.DataType     = values[0].GetByte();
                _descriptor.Scale        = values[1].GetInt16();
                _descriptor.Length       = values[2].GetInt16();
                _descriptor.Dimensions   = values[3].GetInt16();
                _descriptor.Flags        = 0;

                _rdbFieldName = (values[4].GetString()).Trim();
            }
            else
            {
                throw new InvalidOperationException();
            }
        }
        finally
        {
            lookup.Dispose2();
        }
    }
Exemplo n.º 2
0
    private async ValueTask LookupDescAsync(CancellationToken cancellationToken = default)
    {
        var lookup = Database.CreateStatement(Transaction);

        try
        {
            await lookup.PrepareAsync(GetArrayDesc(), cancellationToken).ConfigureAwait(false);

            await lookup.ExecuteAsync(0, EmptyDescriptorFiller.Instance, cancellationToken).ConfigureAwait(false);

            _descriptor = new ArrayDesc();
            var values = await lookup.FetchAsync(cancellationToken).ConfigureAwait(false);

            if (values != null && values.Length > 0)
            {
                _descriptor.RelationName = _tableName;
                _descriptor.FieldName    = _fieldName;
                _descriptor.DataType     = values[0].GetByte();
                _descriptor.Scale        = values[1].GetInt16();
                _descriptor.Length       = values[2].GetInt16();
                _descriptor.Dimensions   = values[3].GetInt16();
                _descriptor.Flags        = 0;

                _rdbFieldName = (await values[4].GetStringAsync(cancellationToken).ConfigureAwait(false)).Trim();
            }
            else
            {
                throw new InvalidOperationException();
            }
        }
        finally
        {
            await lookup.Dispose2Async(cancellationToken).ConfigureAwait(false);
        }
    }
        public static IntPtr MarshalManagedToNative(ArrayDesc descriptor)
        {
            ArrayDescMarshal arrayDesc = new ArrayDescMarshal();

            arrayDesc.DataType     = descriptor.DataType;
            arrayDesc.Scale        = (byte)descriptor.Scale;
            arrayDesc.Length       = descriptor.Length;
            arrayDesc.FieldName    = descriptor.FieldName;
            arrayDesc.RelationName = descriptor.RelationName;
            arrayDesc.Dimensions   = descriptor.Dimensions;
            arrayDesc.Flags        = descriptor.Flags;

            ArrayBoundMarshal[] arrayBounds = new ArrayBoundMarshal[descriptor.Bounds.Length];

            for (int i = 0; i < descriptor.Dimensions; i++)
            {
                arrayBounds[i].LowerBound = (short)descriptor.Bounds[i].LowerBound;
                arrayBounds[i].UpperBound = (short)descriptor.Bounds[i].UpperBound;
            }

            return(MarshalManagedToNative(arrayDesc, arrayBounds));
        }
Exemplo n.º 4
0
        private byte[] EncodeSlice(ArrayDesc desc, Array sourceArray, int length)
        {
            var writer  = new BinaryWriter(new MemoryStream());
            var charset = _db.Charset;
            var dbType  = DbDataType.Array;
            var subType = (Descriptor.Scale < 0) ? 2 : 0;
            var type    = 0;

            type   = TypeHelper.GetSqlTypeFromBlrType(Descriptor.DataType);
            dbType = TypeHelper.GetDbDataTypeFromBlrType(Descriptor.DataType, subType, Descriptor.Scale);

            foreach (var source in sourceArray)
            {
                switch (dbType)
                {
                case DbDataType.Char:
                {
                    var value  = source != null ? (string)source : string.Empty;
                    var buffer = charset.GetBytes(value);

                    writer.Write(buffer);

                    if (desc.Length > buffer.Length)
                    {
                        for (var j = buffer.Length; j < desc.Length; j++)
                        {
                            writer.Write((byte)32);
                        }
                    }
                }
                break;

                case DbDataType.VarChar:
                {
                    var value = source != null ? (string)source : string.Empty;

                    var buffer = charset.GetBytes(value);
                    writer.Write(buffer);

                    if (desc.Length > buffer.Length)
                    {
                        for (var j = buffer.Length; j < desc.Length; j++)
                        {
                            writer.Write((byte)0);
                        }
                    }
                    writer.Write((short)0);
                }
                break;

                case DbDataType.SmallInt:
                    writer.Write((short)source);
                    break;

                case DbDataType.Integer:
                    writer.Write((int)source);
                    break;

                case DbDataType.BigInt:
                    writer.Write((long)source);
                    break;

                case DbDataType.Float:
                    writer.Write((float)source);
                    break;

                case DbDataType.Double:
                    writer.Write((double)source);
                    break;

                case DbDataType.Numeric:
                case DbDataType.Decimal:
                {
                    var numeric = TypeEncoder.EncodeDecimal((decimal)source, desc.Scale, type);

                    switch (type)
                    {
                    case IscCodes.SQL_SHORT:
                        writer.Write((short)numeric);
                        break;

                    case IscCodes.SQL_LONG:
                        writer.Write((int)numeric);
                        break;

                    case IscCodes.SQL_QUAD:
                    case IscCodes.SQL_INT64:
                        writer.Write((long)numeric);
                        break;
                    }
                }
                break;

                case DbDataType.Date:
                    writer.Write(TypeEncoder.EncodeDate(Convert.ToDateTime(source, CultureInfo.CurrentCulture.DateTimeFormat)));
                    break;

                case DbDataType.Time:
                    writer.Write(TypeEncoder.EncodeTime((TimeSpan)source));
                    break;

                case DbDataType.TimeStamp:
                    var dt = Convert.ToDateTime(source, CultureInfo.CurrentCulture.DateTimeFormat);
                    writer.Write(TypeEncoder.EncodeDate(dt));
                    writer.Write(TypeEncoder.EncodeTime(TypeHelper.DateTimeToTimeSpan(dt)));
                    break;

                default:
                    throw TypeHelper.InvalidDataType((int)dbType);
                }
            }

            return(((MemoryStream)writer.BaseStream).ToArray());
        }
Exemplo n.º 5
0
 /// <summary>Create an array from a header description.
 /// This is typically how data will be created when reading
 /// FITS data from a file where the header is read first.
 /// This creates an empty array.</summary>
 /// <param name="h">header to be used as a template.</param>
 /// <exception cref="FitsException"> FitsException if there was a problem with the header description.</exception>
 public ImageData(Header h)
 {
     dataDescription = ParseHeader(h);
 }
Exemplo n.º 6
0
 internal ImageDataTiler(ImageData enclosingInstance, RandomAccess o, long offset, ArrayDesc d) : base(o, offset, d.dims, d.type)
 {
     InitBlock(enclosingInstance);
 }
Exemplo n.º 7
0
        private byte[] EncodeSlice(ArrayDesc desc, Array sourceArray, int length)
        {
            BinaryWriter writer  = new BinaryWriter(new MemoryStream());
            Charset      charset = this.db.Charset;
            DbDataType   dbType  = DbDataType.Array;
            int          subType = (this.Descriptor.Scale < 0) ? 2 : 0;
            int          type    = 0;

            // Infer data types
            type   = TypeHelper.GetFbType(this.Descriptor.DataType);
            dbType = TypeHelper.GetDbDataType(this.Descriptor.DataType, subType, this.Descriptor.Scale);

            foreach (object source in sourceArray)
            {
                switch (dbType)
                {
                case DbDataType.Char:
                {
                    string value  = source != null ? (string)source : string.Empty;
                    byte[] buffer = charset.GetBytes(value);

                    writer.Write(buffer);

                    if (desc.Length > buffer.Length)
                    {
                        for (int j = buffer.Length; j < desc.Length; j++)
                        {
                            writer.Write((byte)32);
                        }
                    }
                }
                break;

                case DbDataType.VarChar:
                {
                    string value = source != null ? (string)source : string.Empty;

                    byte[] buffer = charset.GetBytes(value);
                    writer.Write(buffer);

                    if (desc.Length > buffer.Length)
                    {
                        for (int j = buffer.Length; j < desc.Length; j++)
                        {
                            writer.Write((byte)0);
                        }
                    }
                    writer.Write((short)0);
                }
                break;

                case DbDataType.SmallInt:
                    writer.Write((short)source);
                    break;

                case DbDataType.Integer:
                    writer.Write((int)source);
                    break;

                case DbDataType.BigInt:
                    writer.Write((long)source);
                    break;

                case DbDataType.Float:
                    writer.Write((float)source);
                    break;

                case DbDataType.Double:
                    writer.Write((double)source);
                    break;

                case DbDataType.Numeric:
                case DbDataType.Decimal:
                {
                    object numeric = TypeEncoder.EncodeDecimal((decimal)source, desc.Scale, type);

                    switch (type)
                    {
                    case IscCodes.SQL_SHORT:
                        writer.Write((short)numeric);
                        break;

                    case IscCodes.SQL_LONG:
                        writer.Write((int)numeric);
                        break;

                    case IscCodes.SQL_QUAD:
                    case IscCodes.SQL_INT64:
                        writer.Write((long)numeric);
                        break;
                    }
                }
                break;

                case DbDataType.Date:
                    writer.Write(TypeEncoder.EncodeDate(Convert.ToDateTime(source, CultureInfo.CurrentCulture.DateTimeFormat)));
                    break;

                case DbDataType.Time:
                    writer.Write(TypeEncoder.EncodeTime((TimeSpan)source));
                    break;

                case DbDataType.TimeStamp:
                    var dt = Convert.ToDateTime(source, CultureInfo.CurrentCulture.DateTimeFormat);
                    writer.Write(TypeEncoder.EncodeDate(dt));
                    writer.Write(TypeEncoder.EncodeTime(TypeHelper.DateTimeToTimeSpan(dt)));
                    break;

                default:
                    throw new NotSupportedException("Unknown data type");
                }
            }

            return(((MemoryStream)writer.BaseStream).ToArray());
        }
Exemplo n.º 8
0
        private byte[] GenerateSDL(ArrayDesc desc)
        {
            int          n;
            int          from;
            int          to;
            int          increment;
            int          dimensions;
            ArrayBound   tail;
            BinaryWriter sdl;

            dimensions = desc.Dimensions;

            if (dimensions > 16)
            {
                throw IscException.ForErrorCode(IscCodes.isc_invalid_dimension);
            }

            sdl = new BinaryWriter(new MemoryStream());
            Stuff(
                sdl, 4, IscCodes.isc_sdl_version1,
                IscCodes.isc_sdl_struct, 1, desc.DataType);

            switch (desc.DataType)
            {
            case IscCodes.blr_short:
            case IscCodes.blr_long:
            case IscCodes.blr_int64:
            case IscCodes.blr_quad:
                StuffSdl(sdl, (byte)desc.Scale);
                break;

            case IscCodes.blr_text:
            case IscCodes.blr_cstring:
            case IscCodes.blr_varying:
                StuffWord(sdl, desc.Length);
                break;

            default:
                break;
            }

            StuffString(sdl, IscCodes.isc_sdl_relation, desc.RelationName);
            StuffString(sdl, IscCodes.isc_sdl_field, desc.FieldName);

            if ((desc.Flags & IscCodes.ARRAY_DESC_COLUMN_MAJOR) == IscCodes.ARRAY_DESC_COLUMN_MAJOR)
            {
                from      = dimensions - 1;
                to        = -1;
                increment = -1;
            }
            else
            {
                from      = 0;
                to        = dimensions;
                increment = 1;
            }

            for (n = from; n != to; n += increment)
            {
                tail = desc.Bounds[n];
                if (tail.LowerBound == 1)
                {
                    Stuff(sdl, 2, IscCodes.isc_sdl_do1, n);
                }
                else
                {
                    Stuff(sdl, 2, IscCodes.isc_sdl_do2, n);

                    StuffLiteral(sdl, tail.LowerBound);
                }

                StuffLiteral(sdl, tail.UpperBound);
            }

            Stuff(sdl, 5, IscCodes.isc_sdl_element, 1, IscCodes.isc_sdl_scalar, 0, dimensions);

            for (n = 0; n < dimensions; n++)
            {
                Stuff(sdl, 2, IscCodes.isc_sdl_variable, n);
            }

            StuffSdl(sdl, IscCodes.isc_sdl_eoc);

            return(((MemoryStream)sdl.BaseStream).ToArray());
        }
Exemplo n.º 9
0
    public override ValueTask <ArrayBase> CreateArrayAsync(ArrayDesc descriptor, CancellationToken cancellationToken = default)
    {
        var array = new FesArray(descriptor);

        return(ValueTask2.FromResult <ArrayBase>(array));
    }
Exemplo n.º 10
0
    public override ArrayBase CreateArray(ArrayDesc descriptor)
    {
        var array = new FesArray(descriptor);

        return(array);
    }
        private async Task <byte[]> ReceiveSliceResponse(ArrayDesc desc, AsyncWrappingCommonArgs async)
        {
            try
            {
                var operation = await _database.ReadOperation(async).ConfigureAwait(false);

                if (operation == IscCodes.op_slice)
                {
                    var isVariying = false;
                    var elements   = 0;
                    var length     = await _database.Xdr.ReadInt32(async).ConfigureAwait(false);

                    length = await _database.Xdr.ReadInt32(async).ConfigureAwait(false);

                    switch (desc.DataType)
                    {
                    case IscCodes.blr_text:
                    case IscCodes.blr_text2:
                    case IscCodes.blr_cstring:
                    case IscCodes.blr_cstring2:
                        elements = length / desc.Length;
                        length  += elements * ((4 - desc.Length) & 3);
                        break;

                    case IscCodes.blr_varying:
                    case IscCodes.blr_varying2:
                        elements   = length / desc.Length;
                        isVariying = true;
                        break;

                    case IscCodes.blr_short:
                        length = length * desc.Length;
                        break;
                    }

                    if (isVariying)
                    {
                        using (var ms = new MemoryStream())
                        {
                            var xdr = new XdrReaderWriter(new DataProviderStreamWrapper(ms));
                            for (var i = 0; i < elements; i++)
                            {
                                var buffer = await _database.Xdr.ReadOpaque(await _database.Xdr.ReadInt32(async).ConfigureAwait(false), async).ConfigureAwait(false);

                                await xdr.WriteBuffer(buffer, buffer.Length, async).ConfigureAwait(false);
                            }
                            await xdr.Flush(async).ConfigureAwait(false);

                            return(ms.ToArray());
                        }
                    }
                    else
                    {
                        return(await _database.Xdr.ReadOpaque(length, async).ConfigureAwait(false));
                    }
                }
                else
                {
                    await _database.ReadResponse(operation, async).ConfigureAwait(false);

                    return(null);
                }
            }
            catch (IOException ex)
            {
                throw IscException.ForIOException(ex);
            }
        }
Exemplo n.º 12
0
        private byte[] ReceiveSliceResponse(ArrayDesc desc)
        {
            try
            {
                var operation = _database.ReadOperation();
                if (operation == IscCodes.op_slice)
                {
                    var isVariying = false;
                    var elements   = 0;
                    var length     = _database.Xdr.ReadInt32();

                    length = _database.Xdr.ReadInt32();

                    switch (desc.DataType)
                    {
                    case IscCodes.blr_text:
                    case IscCodes.blr_text2:
                    case IscCodes.blr_cstring:
                    case IscCodes.blr_cstring2:
                        elements = length / desc.Length;
                        length  += elements * ((4 - desc.Length) & 3);
                        break;

                    case IscCodes.blr_varying:
                    case IscCodes.blr_varying2:
                        elements   = length / desc.Length;
                        isVariying = true;
                        break;

                    case IscCodes.blr_short:
                        length = length * desc.Length;
                        break;
                    }

                    if (isVariying)
                    {
                        using (var ms = new MemoryStream())
                        {
                            var xdr = new XdrReaderWriter(ms);
                            for (var i = 0; i < elements; i++)
                            {
                                var buffer = _database.Xdr.ReadOpaque(_database.Xdr.ReadInt32());
                                xdr.WriteBuffer(buffer, buffer.Length);
                            }
                            xdr.Flush();
                            return(ms.ToArray());
                        }
                    }
                    else
                    {
                        return(_database.Xdr.ReadOpaque(length));
                    }
                }
                else
                {
                    _database.ReadResponse(operation);
                    return(null);
                }
            }
            catch (IOException ex)
            {
                throw IscException.ForErrorCode(IscCodes.isc_network_error, ex);
            }
        }
        public override Task <ArrayBase> CreateArray(ArrayDesc descriptor, AsyncWrappingCommonArgs async)
        {
            var array = new FesArray(descriptor);

            return(Task.FromResult((ArrayBase)array));
        }
Exemplo n.º 14
0
        private byte[] ReceiveSliceResponse(ArrayDesc desc)
        {
            try
            {
                int operation = this.db.ReadOperation();

                if (operation == IscCodes.op_slice)
                {
                    // Read	slice length
                    bool isVariying = false;
                    int  elements   = 0;
                    int  length     = this.db.Receive.ReadInt32();

                    length = this.db.Receive.ReadInt32();

                    switch (desc.DataType)
                    {
                    case IscCodes.blr_text:
                    case IscCodes.blr_text2:
                    case IscCodes.blr_cstring:
                    case IscCodes.blr_cstring2:
                        elements = length / desc.Length;
                        length  += elements * ((4 - desc.Length) & 3);
                        break;

                    case IscCodes.blr_varying:
                    case IscCodes.blr_varying2:
                        elements   = length / desc.Length;
                        isVariying = true;
                        break;

                    case IscCodes.blr_short:
                        length = length * desc.Length;
                        break;
                    }

                    if (isVariying)
                    {
                        XdrStream xdr = new XdrStream();

                        for (int i = 0; i < elements; i++)
                        {
                            byte[] buffer = this.db.Receive.ReadOpaque(
                                this.db.Receive.ReadInt32());

                            xdr.WriteBuffer(buffer, buffer.Length);
                        }

                        return(xdr.ToArray());
                    }
                    else
                    {
                        return(this.db.Receive.ReadOpaque(length));
                    }
                }
                else
                {
                    this.db.SetOperation(operation);
                    this.db.ReadGenericResponse();

                    return(null);
                }
            }
            catch (IOException)
            {
                throw new IscException(IscCodes.isc_net_read_err);
            }
        }
Exemplo n.º 15
0
 protected ArrayBase(ArrayDesc descriptor)
 {
     _tableName  = descriptor.RelationName;
     _fieldName  = descriptor.FieldName;
     _descriptor = descriptor;
 }
Exemplo n.º 16
0
 public FesArray(ArrayDesc descriptor)
     : base(descriptor)
 {
     _statusVector = new IntPtr[IscCodes.ISC_STATUS_LENGTH];
 }
Exemplo n.º 17
0
        private byte[] ReceiveSliceResponse(ArrayDesc desc)
        {
            try
            {
                int operation = _database.ReadOperation();

                if (operation == IscCodes.op_slice)
                {
                    bool isVariying = false;
                    int  elements   = 0;
                    int  length     = _database.XdrStream.ReadInt32();

                    length = _database.XdrStream.ReadInt32();

                    switch (desc.DataType)
                    {
                    case IscCodes.blr_text:
                    case IscCodes.blr_text2:
                    case IscCodes.blr_cstring:
                    case IscCodes.blr_cstring2:
                        elements = length / desc.Length;
                        length  += elements * ((4 - desc.Length) & 3);
                        break;

                    case IscCodes.blr_varying:
                    case IscCodes.blr_varying2:
                        elements   = length / desc.Length;
                        isVariying = true;
                        break;

                    case IscCodes.blr_short:
                        length = length * desc.Length;
                        break;
                    }

                    if (isVariying)
                    {
                        using (XdrStream xdr = new XdrStream())
                        {
                            for (int i = 0; i < elements; i++)
                            {
                                byte[] buffer = _database.XdrStream.ReadOpaque(_database.XdrStream.ReadInt32());

                                xdr.WriteBuffer(buffer, buffer.Length);
                            }

                            return(xdr.ToArray());
                        }
                    }
                    else
                    {
                        return(_database.XdrStream.ReadOpaque(length));
                    }
                }
                else
                {
                    _database.SetOperation(operation);
                    _database.ReadResponse();

                    return(null);
                }
            }
            catch (IOException ex)
            {
                throw IscException.ForErrorCode(IscCodes.isc_net_read_err, ex);
            }
        }
 public abstract ArrayBase CreateArray(ArrayDesc descriptor);
Exemplo n.º 19
0
 public GdsArray(ArrayDesc descriptor) : base(descriptor)
 {
 }
 public abstract ValueTask <ArrayBase> CreateArrayAsync(ArrayDesc descriptor, CancellationToken cancellationToken = default);
Exemplo n.º 21
0
 public ExtArray(ArrayDesc descriptor)
     : base(descriptor)
 {
 }
Exemplo n.º 22
0
 public override ArrayBase CreateArray(ArrayDesc descriptor)
 {
     return(new GdsArray(descriptor));
 }
Exemplo n.º 23
0
 /// <summary>Create an array from a header description.
 /// This is typically how data will be created when reading
 /// FITS data from a file where the header is read first.
 /// This creates an empty array.</summary>
 /// <param name="h">header to be used as a template.</param>
 /// <exception cref="FitsException"> FitsException if there was a problem with the header description.</exception>
 public ImageData(Header h)
 {
     dataDescription = ParseHeader(h);
 }
Exemplo n.º 24
0
 internal ImageDataTiler(ImageData enclosingInstance, RandomAccess o, long offset, ArrayDesc d)
     : base(o, offset, d.dims, d.type)
 {
     InitBlock(enclosingInstance);
 }