/// <summary> Checks if the backing file exists on disc, and if not, creates it. /// Also recreates the backing file if dimensions on disc are less than those in memory. </summary> BlockDBFile ValidateBackingFile() { Vec3U16 fileDims; BlockDBFile format = BlockDBFile.V1; if (!File.Exists(FilePath)) { using (Stream s = OpenWrite()) { fileDims = Dims; BlockDBFile.WriteHeader(s, fileDims); } } else { using (Stream s = OpenRead()) { format = BlockDBFile.ReadHeader(s, out fileDims); } if (fileDims.X < Dims.X || fileDims.Y < Dims.Y || fileDims.Z < Dims.Z) { BlockDBFile.ResizeBackingFile(this); } } return(format); }
void ReadDimensions() { if (!File.Exists(FilePath)) { return; } using (Stream s = File.OpenRead(FilePath)) BlockDBFile.ReadHeader(s, out Dims); }
/// <summary> Finds all block changes by the given player. </summary> public void FindChangesBy(int id, Action <BlockDBEntry> output, out Vec3U16 dims) { dims = default(Vec3U16); using (IDisposable readLock = locker.AccquireReadLock()) { if (!File.Exists(FilePath)) { return; } using (Stream s = File.OpenRead(FilePath)) { BlockDBFile.ReadHeader(s, out dims); BlockDBFile.IterateBackwards(s, e => { if (e.PlayerID == id) { output(e); } }); } } }
/// <summary> Outputs all block changes which affect the given coordinates. </summary> /// <remarks> You must lock using Locker.AccquireRead() **before** entering this method. </remarks> public void FindChangesAt(ushort x, ushort y, ushort z, Action <BlockDBEntry> output) { if (!File.Exists(FilePath)) { FindInMemoryAt(x, y, z, output); return; } Vec3U16 dims; using (Stream s = OpenRead()) { BlockDBFile format = BlockDBFile.ReadHeader(s, out dims); if (x >= dims.X || y >= dims.Y || z >= dims.Z) { return; } int index = (y * dims.Z + z) * dims.X + x; format.FindChangesAt(s, index, output); } FindInMemoryAt(x, y, z, output); }
/// <summary> Finds all block changes which affect the given coordinates. </summary> public void FindChangesAt(ushort x, ushort y, ushort z, Action <BlockDBEntry> output) { using (IDisposable readLock = locker.AccquireReadLock()) { if (!File.Exists(FilePath)) { return; } using (Stream s = File.OpenRead(FilePath)) { Vec3U16 dims; BlockDBFile.ReadHeader(s, out dims); if (x >= dims.X || y >= dims.Y || z >= dims.Z) { return; } int index = (y * dims.Z + z) * dims.X + x; BlockDBFile.FindChangesAt(s, index, output); } } }
/// <summary> Outputs all block changes by the given players. </summary> /// <remarks> You must lock using Locker.AccquireRead() **before** entering this method. </remarks> /// <returns> whether an entry before start time was reached. </returns> public bool FindChangesBy(int[] ids, DateTime start, DateTime end, out Vec3U16 dims, Action <BlockDBEntry> output) { int startDelta = ClampDelta(start.Subtract(Epoch)); int endDelta = ClampDelta(end.Subtract(Epoch)); dims = Dims; if (FindInMemoryBy(ids, startDelta, endDelta, output)) { return(true); } if (!File.Exists(FilePath)) { return(false); } using (Stream s = OpenRead()) { BlockDBFile format = BlockDBFile.ReadHeader(s, out dims); return(format.FindChangesBy(s, ids, startDelta, endDelta, output)); } }
/// <summary> Checks if the backing file exists on disc, and if not, creates it. /// Also recreates the backing file if dimensions on disc are less than those in memory. </summary> void ValidateBackingFile() { Vec3U16 fileDims; if (!File.Exists(FilePath)) { using (Stream s = File.OpenWrite(FilePath)) { fileDims = Dims; BlockDBFile.WriteHeader(s, fileDims); } } else { using (Stream s = File.OpenRead(FilePath)) { BlockDBFile.ReadHeader(s, out fileDims); } if (fileDims.X < Dims.X || fileDims.Y < Dims.Y || fileDims.Z < Dims.Z) { BlockDBFile.ResizeBackingFile(this); } } }