public Result Get(out SaveDataIndexerValue value, ref SaveDataAttribute key) { value = default; lock (Locker) { Result rc = Initialize(); if (rc.IsFailure()) { return(rc); } rc = EnsureKvDatabaseLoaded(false); if (rc.IsFailure()) { return(rc); } rc = KvDatabase.Get(ref key, SpanHelpers.AsByteSpan(ref value)); if (rc.IsFailure()) { return(ResultFs.TargetNotFound.LogConverted(rc)); } return(Result.Success); } }
public Result Add(out ulong saveDataId, ref SaveDataAttribute key) { saveDataId = default; lock (Locker) { Result rc = Initialize(); if (rc.IsFailure()) { return(rc); } rc = EnsureKvDatabaseLoaded(false); if (rc.IsFailure()) { return(rc); } SaveDataIndexerValue value = default; rc = KvDatabase.Get(ref key, SpanHelpers.AsByteSpan(ref value)); if (rc.IsSuccess()) { return(ResultFs.SaveDataPathAlreadyExists.Log()); } LastPublishedId++; ulong newSaveDataId = LastPublishedId; value = new SaveDataIndexerValue { SaveDataId = newSaveDataId }; rc = KvDatabase.Set(ref key, SpanHelpers.AsByteSpan(ref value)); if (rc.IsFailure()) { LastPublishedId--; return(rc); } rc = AdjustOpenedInfoReaders(ref key); if (rc.IsFailure()) { return(rc); } saveDataId = newSaveDataId; return(Result.Success); } }
public Result AddSystemSaveData(ref SaveDataAttribute key) { lock (Locker) { Result rc = Initialize(); if (rc.IsFailure()) { return(rc); } rc = EnsureKvDatabaseLoaded(false); if (rc.IsFailure()) { return(rc); } foreach (KeyValuePair <SaveDataAttribute, byte[]> kvp in KvDatabase) { ref SaveDataIndexerValue value = ref Unsafe.As <byte, SaveDataIndexerValue>(ref kvp.Value[0]); if (key.SaveDataId == value.SaveDataId) { return(ResultFs.SaveDataPathAlreadyExists.Log()); } } var newValue = new SaveDataIndexerValue { SaveDataId = key.SaveDataId }; rc = KvDatabase.Set(ref key, SpanHelpers.AsByteSpan(ref newValue)); if (rc.IsFailure()) { return(rc); } rc = AdjustOpenedInfoReaders(ref key); if (rc.IsFailure()) { return(rc); } 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(); } } }