Esempio n. 1
0
        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");
            }
        }
Esempio n. 2
0
        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);
            }
        }