示例#1
0
        /// <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);
        }
示例#2
0
 void ReadDimensions()
 {
     if (!File.Exists(FilePath))
     {
         return;
     }
     using (Stream s = File.OpenRead(FilePath))
         BlockDBFile.ReadHeader(s, out Dims);
 }
示例#3
0
        /// <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);
                        }
                    });
                }
            }
        }
示例#4
0
        /// <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);
        }
示例#5
0
        /// <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);
                }
            }
        }
示例#6
0
        /// <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));
            }
        }
示例#7
0
        /// <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);
                }
            }
        }