コード例 #1
0
ファイル: BlobStore.cs プロジェクト: enjoycode/appbox.clr
        private static async ValueTask <BlobFile> GetFileMetaAsync(byte appId, string path)
        {
            if (string.IsNullOrEmpty(path))
            {
                throw new ArgumentNullException(nameof(path));
            }
            var pathData = System.Text.Encoding.UTF8.GetBytes(path);

            if (pathData.Length > MaxPathSize)
            {
                throw new ArgumentException("Path length out of range", nameof(path));
            }

            IntPtr pathPtr;

            unsafe
            {
                //暂复制路径
                var pathDataPtr = stackalloc byte[pathData.Length + 1];
                pathDataPtr[0] = (byte)BlobReadType.kGetFileMeta;
                pathPtr        = new IntPtr(pathDataPtr);
                Marshal.Copy(pathData, 0, pathPtr + 1, pathData.Length);
            }

            ulong       metaRaftGroupId = (ulong)appId << IdUtil.RAFTGROUPID_APPID_OFFSET;
            INativeData res             = await StoreApi.Api.ReadIndexByGetAsync(metaRaftGroupId, pathPtr, (uint)(pathData.Length + 1));

            unsafe
            {
                BlobFile *srcPtr = (BlobFile *)res.DataPtr.ToPointer();
                return(*srcPtr);
            }
        }
コード例 #2
0
        public unsafe static ulong ToUInt64(this INativeData data)
        {
            if (data.Size != 8)
            {
                throw new InvalidCastException();
            }

            ulong *ptr = (ulong *)data.DataPtr.ToPointer();

            return(*ptr);
        }
コード例 #3
0
ファイル: BlobStore.cs プロジェクト: enjoycode/appbox.clr
        private static void ParseAndWriteToStream(INativeData segmentData, ref uint fileSize, ref uint curRead, Stream stream)
        {
            curRead = (uint)segmentData.Size - 4;
            IntPtr dataPtr = segmentData.DataPtr;

            unsafe
            {
                uint *fileSizePtr = (uint *)dataPtr.ToPointer();
                fileSize = *fileSizePtr;
                var span = new ReadOnlySpan <byte>((dataPtr + 4).ToPointer(), (int)curRead);
                stream.Write(span);
            }
        }
コード例 #4
0
ファイル: BlobStore.cs プロジェクト: enjoycode/appbox.clr
        private static PrepareWriteResult ParsePrepareResult(INativeData data)
        {
            PrepareWriteResult res = new PrepareWriteResult();

            unsafe
            {
                byte * dataPtr        = (byte *)data.DataPtr.ToPointer();
                ulong *raftGroupIdPtr = (ulong *)dataPtr;
                res.ChunkRaftGroupId = *raftGroupIdPtr;
                Guid *pathIdPtr = (Guid *)(dataPtr + 8);
                res.ParentPathId = *pathIdPtr;
            }
            return(res);
        }
コード例 #5
0
 public static string ToHexString(this INativeData data)
 {
     return(StringHelper.ToHexString(data.DataPtr, (int)data.Size));
 }
コード例 #6
0
ファイル: IndexRow.cs プロジェクト: enjoycode/appbox.clr
 public void Dispose()
 {
     _value.Dispose();
     _value = null;
 }
コード例 #7
0
ファイル: IndexRow.cs プロジェクト: enjoycode/appbox.clr
 internal IndexRow(INativeData value)
 {
     _value = value;
     ValueTuple = new KVTuple();
     ValueTuple.ReadFrom(_value.DataPtr, (int)_value.Size);
 }
コード例 #8
0
 public NaDataDebugger(INativeData data)
     : base(data)
 {
 }