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); } }
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); } }
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); } }
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); } }