internal unsafe void ReadFrom(IntPtr kp, int ks, IntPtr vp, int vs) { //Log.Debug($"Key = {StringHelper.ToHexString(kv.KeyPtr, kv.KeySize.ToInt32())}"); //Log.Debug($"Value = {StringHelper.ToHexString(kv.ValuePtr, kv.ValueSize.ToInt32())}"); byte *keyPtr = (byte *)kp.ToPointer(); int keySize = ks - 2; if (keyPtr[0] == BlobStore.KEY_TYPE_PATH) { IsFile = false; var keySpan = new ReadOnlySpan <byte>(keyPtr + 2, keySize); int sepIndex = keySpan.LastIndexOf((byte)0) + 1; Name = new string((sbyte *)(keyPtr + 2), sepIndex, keySize - sepIndex, System.Text.Encoding.UTF8); BlobPath path = new BlobPath(); path.ReadFrom(vp); Size = (int)path.GetChunksUsedSize(); } else if (keyPtr[0] == BlobStore.KEY_TYPE_FILE) { IsFile = true; Name = new string((sbyte *)(keyPtr + 19), 0, keySize - 17, System.Text.Encoding.UTF8); BlobFile *filePtr = (BlobFile *)vp.ToPointer(); Size = (int)filePtr->Size; } else { throw new Exception("Unkonwn key type"); } }
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); } }