//----------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. // //----------------------------------------------------------------------- namespace Microsoft.Isam.Esent.Interop { using System; using System.Diagnostics; /// /// A byte array column value. /// public class BytesColumnValue : ColumnValue { /// /// Internal value. /// private byte[] internalValue; /// /// Gets the last set or retrieved value of the column. The /// value is returned as a generic object. /// public override object ValueAsObject { [DebuggerStepThrough] get { return this.Value; } } /// /// Gets or sets the value of the column. Use to update a /// record with the column value. /// public byte[] Value { get { return this.internalValue; } set { this.internalValue = value; this.Error = value == null ? JET_wrn.ColumnNull : JET_wrn.Success; } } /// /// Gets the byte length of a column value, which is zero if column is null, otherwise /// matches the actual length of the byte array. /// public override int Length { get { return this.Value != null ? this.Value.Length : 0; } } /// /// Gets the size of the value in the column. This returns 0 for /// variable sized columns (i.e. binary and string). /// protected override int Size { [DebuggerStepThrough] get { return 0; } } /// /// Returns a that represents the current . /// /// /// A that represents the current . /// public override string ToString() { if (null == this.Value) { return string.Empty; } return BitConverter.ToString(this.Value, 0, Math.Min(this.Value.Length, 16)); } /// /// Recursive SetColumns method for data pinning. This populates the buffer and /// calls the inherited SetColumns method. /// /// The session to use. /// /// The table to set the columns in. An update should be prepared. /// /// /// Column values to set. /// /// /// Structures to put the pinned data in. /// /// Offset of this object in the array. /// An error code. internal override unsafe int SetColumns(JET_SESID sesid, JET_TABLEID tableid, ColumnValue[] columnValues, NATIVE_SETCOLUMN* nativeColumns, int i) { if (null != this.Value) { fixed (void* buffer = this.Value) { return this.SetColumns( sesid, tableid, columnValues, nativeColumns, i, buffer, this.Value.Length, true); } } return this.SetColumns(sesid, tableid, columnValues, nativeColumns, i, null, 0, false); } /// /// Given data retrieved from ESENT, decode the data and set the value in the ColumnValue object. /// /// An array of bytes. /// The starting position within the bytes. /// The number of bytes to decode. /// The error returned from ESENT. protected override void GetValueFromBytes(byte[] value, int startIndex, int count, int err) { if (JET_wrn.ColumnNull == (JET_wrn)err) { this.Value = null; } else { var copiedValue = new byte[count]; Buffer.BlockCopy(value, startIndex, copiedValue, 0, count); this.Value = copiedValue; } } } }