Пример #1
0
        public override async ValueTask PutSliceAsync(Array sourceArray, int sliceLength, CancellationToken cancellationToken = default)
        {
            try
            {
                var sdl   = GenerateSDL(Descriptor);
                var slice = await EncodeSliceArrayAsync(sourceArray, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.WriteAsync(IscCodes.op_put_slice, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.WriteAsync(_transaction.Handle, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.WriteAsync(ArrayHandle, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.WriteAsync(sliceLength, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.WriteBufferAsync(sdl, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.WriteAsync(string.Empty, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.WriteAsync(sliceLength, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.WriteBytesAsync(slice, slice.Length, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.FlushAsync(cancellationToken).ConfigureAwait(false);

                var response = (GenericResponse)await _database.ReadResponseAsync(cancellationToken).ConfigureAwait(false);

                _handle = response.BlobId;
            }
            catch (IOException ex)
            {
                throw IscException.ForIOException(ex);
            }
        }
Пример #2
0
        protected override async ValueTask GetSegmentAsync(Stream stream, CancellationToken cancellationToken = default)
        {
            var requested = SegmentSize;

            try
            {
                await _database.Xdr.WriteAsync(IscCodes.op_get_segment, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.WriteAsync(_blobHandle, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.WriteAsync(requested < short.MaxValue - 12?requested : short.MaxValue - 12, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.WriteAsync(DataSegment, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.FlushAsync(cancellationToken).ConfigureAwait(false);

                var response = (GenericResponse)await _database.ReadResponseAsync(cancellationToken).ConfigureAwait(false);

                RblRemoveValue(IscCodes.RBL_segment);
                if (response.ObjectHandle == 1)
                {
                    RblAddValue(IscCodes.RBL_segment);
                }
                else if (response.ObjectHandle == 2)
                {
                    RblAddValue(IscCodes.RBL_eof_pending);
                }

                var buffer = response.Data;

                if (buffer.Length == 0)
                {
                    // previous	segment	was	last, this has no data
                    return;
                }

                var len    = 0;
                var srcpos = 0;

                while (srcpos < buffer.Length)
                {
                    len     = (int)IscHelper.VaxInteger(buffer, srcpos, 2);
                    srcpos += 2;

                    stream.Write(buffer, srcpos, len);
                    srcpos += len;
                }
            }
            catch (IOException ex)
            {
                throw IscException.ForIOException(ex);
            }
        }
Пример #3
0
        public override async ValueTask AttachAsync(ServiceParameterBufferBase spb, string dataSource, int port, string service, byte[] cryptKey, CancellationToken cancellationToken = default)
        {
            try
            {
                await SendAttachToBufferAsync(spb, service, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.FlushAsync(cancellationToken).ConfigureAwait(false);
                await ProcessAttachResponseAsync((GenericResponse)await _database.ReadResponseAsync(cancellationToken).ConfigureAwait(false), cancellationToken).ConfigureAwait(false);
            }
            catch (IOException ex)
            {
                await _database.DetachAsync(cancellationToken).ConfigureAwait(false);

                throw IscException.ForIOException(ex);
            }
        }
Пример #4
0
        public override async ValueTask BeginTransactionAsync(TransactionParameterBuffer tpb, CancellationToken cancellationToken = default)
        {
            if (State != TransactionState.NoTransaction)
            {
                throw new InvalidOperationException();
            }

            try
            {
                await _database.Xdr.WriteAsync(IscCodes.op_transaction, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.WriteAsync(_database.Handle, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.WriteBufferAsync(tpb.ToArray(), cancellationToken).ConfigureAwait(false);

                await _database.Xdr.FlushAsync(cancellationToken).ConfigureAwait(false);

                var response = (GenericResponse)await _database.ReadResponseAsync(cancellationToken).ConfigureAwait(false);

                _database.TransactionCount++;

                _handle = response.ObjectHandle;
                State   = TransactionState.Active;
            }
            catch (IOException ex)
            {
                throw IscException.ForIOException(ex);
            }
        }