Exemple #1
0
        private Result WriteFile(ReadOnlySpan <byte> data)
        {
            Debug.Assert(FsClient != null);
            Debug.Assert(!string.IsNullOrWhiteSpace(FileName));

            FsClient.DeleteFile(FileName);

            Result rc = FsClient.CreateFile(FileName, data.Length);

            if (rc.IsFailure())
            {
                return(rc);
            }

            rc = FsClient.OpenFile(out FileHandle handle, FileName, OpenMode.Write);
            if (rc.IsFailure())
            {
                return(rc);
            }

            rc = FsClient.WriteFile(handle, 0, data, WriteOption.Flush);
            FsClient.CloseFile(handle);

            return(rc);
        }
Exemple #2
0
 protected override void Dispose(bool disposing)
 {
     if (CloseHandle)
     {
         FsClient.CloseFile(Handle);
     }
 }
Exemple #3
0
        private Result ReadFile(out byte[] data)
        {
            Debug.Assert(FsClient != null);
            Debug.Assert(!string.IsNullOrWhiteSpace(FileName));

            data = default;

            Result rc = FsClient.OpenFile(out FileHandle handle, FileName, OpenMode.Read);

            if (rc.IsFailure())
            {
                return(rc);
            }

            rc = FsClient.GetFileSize(out long fileSize, handle);

            if (rc.IsSuccess())
            {
                data = new byte[fileSize];

                rc = FsClient.ReadFile(handle, 0, data);
            }

            FsClient.CloseFile(handle);
            return(rc);
        }
        public Result Commit()
        {
            lock (Locker)
            {
                Result rc = Initialize();
                if (rc.IsFailure())
                {
                    return(rc);
                }

                rc = EnsureKvDatabaseLoaded(false);
                if (rc.IsFailure())
                {
                    return(rc);
                }

                var mount = new Mounter();

                try
                {
                    rc = mount.Initialize(FsClient, MountName, SpaceId, SaveDataId);
                    if (rc.IsFailure())
                    {
                        return(rc);
                    }

                    rc = KvDatabase.WriteDatabaseToFile();
                    if (rc.IsFailure())
                    {
                        return(rc);
                    }

                    string idFilePath = $"{MountName}:/{LastIdFileName}";

                    rc = FsClient.OpenFile(out FileHandle handle, idFilePath, OpenMode.Write);
                    if (rc.IsFailure())
                    {
                        return(rc);
                    }

                    bool fileAlreadyClosed = false;

                    try
                    {
                        ulong lastId = LastPublishedId;

                        rc = FsClient.WriteFile(handle, 0, SpanHelpers.AsByteSpan(ref lastId), WriteOption.None);
                        if (rc.IsFailure())
                        {
                            return(rc);
                        }

                        rc = FsClient.FlushFile(handle);
                        if (rc.IsFailure())
                        {
                            return(rc);
                        }

                        FsClient.CloseFile(handle);
                        fileAlreadyClosed = true;

                        return(FsClient.Commit(MountName));
                    }
                    finally
                    {
                        if (!fileAlreadyClosed)
                        {
                            FsClient.CloseFile(handle);
                        }
                    }
                }
                finally
                {
                    mount.Dispose();
                }
            }
        }