diff --git a/src/neo/IO/Data/LevelDB/DB.cs b/src/neo/IO/Data/LevelDB/DB.cs deleted file mode 100644 index 04e8f50e8f..0000000000 --- a/src/neo/IO/Data/LevelDB/DB.cs +++ /dev/null @@ -1,128 +0,0 @@ -using System; - -namespace Neo.IO.Data.LevelDB -{ - public class DB : IDisposable - { - private IntPtr handle; - - /// - /// Return true if haven't got valid handle - /// - public bool IsDisposed => handle == IntPtr.Zero; - - private DB(IntPtr handle) - { - this.handle = handle; - } - - public void Dispose() - { - if (handle != IntPtr.Zero) - { - Native.leveldb_close(handle); - handle = IntPtr.Zero; - } - } - - public void Delete(WriteOptions options, Slice key) - { - IntPtr error; - Native.leveldb_delete(handle, options.handle, key.buffer, (UIntPtr)key.buffer.Length, out error); - NativeHelper.CheckError(error); - } - - public Slice Get(ReadOptions options, Slice key) - { - UIntPtr length; - IntPtr error; - IntPtr value = Native.leveldb_get(handle, options.handle, key.buffer, (UIntPtr)key.buffer.Length, out length, out error); - try - { - NativeHelper.CheckError(error); - if (value == IntPtr.Zero) - throw new LevelDBException("not found"); - return new Slice(value, length); - } - finally - { - if (value != IntPtr.Zero) Native.leveldb_free(value); - } - } - - public Snapshot GetSnapshot() - { - return new Snapshot(handle); - } - - public Iterator NewIterator(ReadOptions options) - { - return new Iterator(Native.leveldb_create_iterator(handle, options.handle)); - } - - public static DB Open(string name) - { - return Open(name, Options.Default); - } - - public static DB Open(string name, Options options) - { - IntPtr error; - IntPtr handle = Native.leveldb_open(options.handle, name, out error); - NativeHelper.CheckError(error); - return new DB(handle); - } - - public void Put(WriteOptions options, Slice key, Slice value) - { - IntPtr error; - Native.leveldb_put(handle, options.handle, key.buffer, (UIntPtr)key.buffer.Length, value.buffer, (UIntPtr)value.buffer.Length, out error); - NativeHelper.CheckError(error); - } - - public bool TryGet(ReadOptions options, Slice key, out Slice value) - { - UIntPtr length; - IntPtr error; - IntPtr v = Native.leveldb_get(handle, options.handle, key.buffer, (UIntPtr)key.buffer.Length, out length, out error); - if (error != IntPtr.Zero) - { - Native.leveldb_free(error); - value = default(Slice); - return false; - } - if (v == IntPtr.Zero) - { - value = default(Slice); - return false; - } - value = new Slice(v, length); - Native.leveldb_free(v); - return true; - } - - public void Write(WriteOptions options, WriteBatch write_batch) - { - // There's a bug in .Net Core. - // When calling DB.Write(), it will throw LevelDBException sometimes. - // But when you try to catch the exception, the bug disappears. - // We shall remove the "try...catch" clause when Microsoft fix the bug. - byte retry = 0; - while (true) - { - try - { - IntPtr error; - Native.leveldb_write(handle, options.handle, write_batch.handle, out error); - NativeHelper.CheckError(error); - break; - } - catch (LevelDBException ex) - { - if (++retry >= 4) throw; - System.IO.File.AppendAllText("leveldb.log", ex.Message + "\r\n"); - } - } - } - } -} diff --git a/src/neo/IO/Data/LevelDB/Helper.cs b/src/neo/IO/Data/LevelDB/Helper.cs deleted file mode 100644 index 585d282414..0000000000 --- a/src/neo/IO/Data/LevelDB/Helper.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Neo.IO.Data.LevelDB -{ - public static class Helper - { - public static void Delete(this WriteBatch batch, byte prefix, ISerializable key) - { - batch.Delete(SliceBuilder.Begin(prefix).Add(key)); - } - - public static IEnumerable Find(this DB db, ReadOptions options, byte prefix) where T : class, ISerializable, new() - { - return Find(db, options, SliceBuilder.Begin(prefix), (k, v) => v.ToArray().AsSerializable()); - } - - public static IEnumerable Find(this DB db, ReadOptions options, Slice prefix, Func resultSelector) - { - using (Iterator it = db.NewIterator(options)) - { - for (it.Seek(prefix); it.Valid(); it.Next()) - { - Slice key = it.Key(); - byte[] x = key.ToArray(); - byte[] y = prefix.ToArray(); - if (x.Length < y.Length) break; - if (!x.AsSpan().StartsWith(y)) break; - yield return resultSelector(key, it.Value()); - } - } - } - - public static T Get(this DB db, ReadOptions options, byte prefix, ISerializable key) where T : class, ISerializable, new() - { - return db.Get(options, SliceBuilder.Begin(prefix).Add(key)).ToArray().AsSerializable(); - } - - public static T Get(this DB db, ReadOptions options, byte prefix, ISerializable key, Func resultSelector) - { - return resultSelector(db.Get(options, SliceBuilder.Begin(prefix).Add(key))); - } - - public static void Put(this WriteBatch batch, byte prefix, ISerializable key, ISerializable value) - { - batch.Put(SliceBuilder.Begin(prefix).Add(key), value.ToArray()); - } - - public static T TryGet(this DB db, ReadOptions options, byte prefix, ISerializable key) where T : class, ISerializable, new() - { - Slice slice; - if (!db.TryGet(options, SliceBuilder.Begin(prefix).Add(key), out slice)) - return null; - return slice.ToArray().AsSerializable(); - } - - public static T TryGet(this DB db, ReadOptions options, byte prefix, ISerializable key, Func resultSelector) where T : class - { - Slice slice; - if (!db.TryGet(options, SliceBuilder.Begin(prefix).Add(key), out slice)) - return null; - return resultSelector(slice); - } - } -} diff --git a/src/neo/IO/Data/LevelDB/Iterator.cs b/src/neo/IO/Data/LevelDB/Iterator.cs deleted file mode 100644 index b3a6a0bfe0..0000000000 --- a/src/neo/IO/Data/LevelDB/Iterator.cs +++ /dev/null @@ -1,78 +0,0 @@ -using System; - -namespace Neo.IO.Data.LevelDB -{ - public class Iterator : IDisposable - { - private IntPtr handle; - - internal Iterator(IntPtr handle) - { - this.handle = handle; - } - - private void CheckError() - { - IntPtr error; - Native.leveldb_iter_get_error(handle, out error); - NativeHelper.CheckError(error); - } - - public void Dispose() - { - if (handle != IntPtr.Zero) - { - Native.leveldb_iter_destroy(handle); - handle = IntPtr.Zero; - } - } - - public Slice Key() - { - UIntPtr length; - IntPtr key = Native.leveldb_iter_key(handle, out length); - CheckError(); - return new Slice(key, length); - } - - public void Next() - { - Native.leveldb_iter_next(handle); - CheckError(); - } - - public void Prev() - { - Native.leveldb_iter_prev(handle); - CheckError(); - } - - public void Seek(Slice target) - { - Native.leveldb_iter_seek(handle, target.buffer, (UIntPtr)target.buffer.Length); - } - - public void SeekToFirst() - { - Native.leveldb_iter_seek_to_first(handle); - } - - public void SeekToLast() - { - Native.leveldb_iter_seek_to_last(handle); - } - - public bool Valid() - { - return Native.leveldb_iter_valid(handle); - } - - public Slice Value() - { - UIntPtr length; - IntPtr value = Native.leveldb_iter_value(handle, out length); - CheckError(); - return new Slice(value, length); - } - } -} diff --git a/src/neo/IO/Data/LevelDB/LevelDBException.cs b/src/neo/IO/Data/LevelDB/LevelDBException.cs deleted file mode 100644 index 8804f1f7f2..0000000000 --- a/src/neo/IO/Data/LevelDB/LevelDBException.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Data.Common; - -namespace Neo.IO.Data.LevelDB -{ - public class LevelDBException : DbException - { - internal LevelDBException(string message) - : base(message) - { - } - } -} diff --git a/src/neo/IO/Data/LevelDB/Native.cs b/src/neo/IO/Data/LevelDB/Native.cs deleted file mode 100644 index c83d3913f8..0000000000 --- a/src/neo/IO/Data/LevelDB/Native.cs +++ /dev/null @@ -1,249 +0,0 @@ -using System; -using System.IO; -using System.Runtime.InteropServices; - -namespace Neo.IO.Data.LevelDB -{ - public enum CompressionType : byte - { - kNoCompression = 0x0, - kSnappyCompression = 0x1 - } - - public static class Native - { - #region Logger - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr leveldb_logger_create(IntPtr /* Action */ logger); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_logger_destroy(IntPtr /* logger*/ option); - #endregion - - #region DB - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr leveldb_open(IntPtr /* Options*/ options, string name, out IntPtr error); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_close(IntPtr /*DB */ db); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_put(IntPtr /* DB */ db, IntPtr /* WriteOptions*/ options, byte[] key, UIntPtr keylen, byte[] val, UIntPtr vallen, out IntPtr errptr); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_delete(IntPtr /* DB */ db, IntPtr /* WriteOptions*/ options, byte[] key, UIntPtr keylen, out IntPtr errptr); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_write(IntPtr /* DB */ db, IntPtr /* WriteOptions*/ options, IntPtr /* WriteBatch */ batch, out IntPtr errptr); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr leveldb_get(IntPtr /* DB */ db, IntPtr /* ReadOptions*/ options, byte[] key, UIntPtr keylen, out UIntPtr vallen, out IntPtr errptr); - - //[DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - //static extern void leveldb_approximate_sizes(IntPtr /* DB */ db, int num_ranges, byte[] range_start_key, long range_start_key_len, byte[] range_limit_key, long range_limit_key_len, out long sizes); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr leveldb_create_iterator(IntPtr /* DB */ db, IntPtr /* ReadOption */ options); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr leveldb_create_snapshot(IntPtr /* DB */ db); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_release_snapshot(IntPtr /* DB */ db, IntPtr /* SnapShot*/ snapshot); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr leveldb_property_value(IntPtr /* DB */ db, string propname); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_repair_db(IntPtr /* Options*/ options, string name, out IntPtr error); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_destroy_db(IntPtr /* Options*/ options, string name, out IntPtr error); - - #region extensions - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_free(IntPtr /* void */ ptr); - - #endregion - - - #endregion - - #region Env - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr leveldb_create_default_env(); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_env_destroy(IntPtr /*Env*/ cache); - #endregion - - #region Iterator - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_iter_destroy(IntPtr /*Iterator*/ iterator); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - [return: MarshalAs(UnmanagedType.U1)] - public static extern bool leveldb_iter_valid(IntPtr /*Iterator*/ iterator); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_iter_seek_to_first(IntPtr /*Iterator*/ iterator); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_iter_seek_to_last(IntPtr /*Iterator*/ iterator); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_iter_seek(IntPtr /*Iterator*/ iterator, byte[] key, UIntPtr length); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_iter_next(IntPtr /*Iterator*/ iterator); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_iter_prev(IntPtr /*Iterator*/ iterator); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr leveldb_iter_key(IntPtr /*Iterator*/ iterator, out UIntPtr length); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr leveldb_iter_value(IntPtr /*Iterator*/ iterator, out UIntPtr length); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_iter_get_error(IntPtr /*Iterator*/ iterator, out IntPtr error); - #endregion - - #region Options - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr leveldb_options_create(); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_options_destroy(IntPtr /*Options*/ options); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_options_set_create_if_missing(IntPtr /*Options*/ options, [MarshalAs(UnmanagedType.U1)] bool o); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_options_set_error_if_exists(IntPtr /*Options*/ options, [MarshalAs(UnmanagedType.U1)] bool o); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_options_set_info_log(IntPtr /*Options*/ options, IntPtr /* Logger */ logger); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_options_set_paranoid_checks(IntPtr /*Options*/ options, [MarshalAs(UnmanagedType.U1)] bool o); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_options_set_env(IntPtr /*Options*/ options, IntPtr /*Env*/ env); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_options_set_write_buffer_size(IntPtr /*Options*/ options, UIntPtr size); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_options_set_max_open_files(IntPtr /*Options*/ options, int max); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_options_set_cache(IntPtr /*Options*/ options, IntPtr /*Cache*/ cache); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_options_set_block_size(IntPtr /*Options*/ options, UIntPtr size); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_options_set_block_restart_interval(IntPtr /*Options*/ options, int interval); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_options_set_compression(IntPtr /*Options*/ options, CompressionType level); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_options_set_comparator(IntPtr /*Options*/ options, IntPtr /*Comparator*/ comparer); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_options_set_filter_policy(IntPtr /*Options*/ options, IntPtr /*FilterPolicy*/ policy); - #endregion - - #region ReadOptions - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr leveldb_readoptions_create(); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_readoptions_destroy(IntPtr /*ReadOptions*/ options); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_readoptions_set_verify_checksums(IntPtr /*ReadOptions*/ options, [MarshalAs(UnmanagedType.U1)] bool o); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_readoptions_set_fill_cache(IntPtr /*ReadOptions*/ options, [MarshalAs(UnmanagedType.U1)] bool o); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_readoptions_set_snapshot(IntPtr /*ReadOptions*/ options, IntPtr /*SnapShot*/ snapshot); - #endregion - - #region WriteBatch - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr leveldb_writebatch_create(); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_writebatch_destroy(IntPtr /* WriteBatch */ batch); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_writebatch_clear(IntPtr /* WriteBatch */ batch); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_writebatch_put(IntPtr /* WriteBatch */ batch, byte[] key, UIntPtr keylen, byte[] val, UIntPtr vallen); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_writebatch_delete(IntPtr /* WriteBatch */ batch, byte[] key, UIntPtr keylen); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_writebatch_iterate(IntPtr /* WriteBatch */ batch, object state, Action put, Action deleted); - #endregion - - #region WriteOptions - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr leveldb_writeoptions_create(); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_writeoptions_destroy(IntPtr /*WriteOptions*/ options); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_writeoptions_set_sync(IntPtr /*WriteOptions*/ options, [MarshalAs(UnmanagedType.U1)] bool o); - #endregion - - #region Cache - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr leveldb_cache_create_lru(int capacity); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_cache_destroy(IntPtr /*Cache*/ cache); - #endregion - - #region Comparator - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr /* leveldb_comparator_t* */ - leveldb_comparator_create( - IntPtr /* void* */ state, - IntPtr /* void (*)(void*) */ destructor, - IntPtr - /* int (*compare)(void*, - const char* a, size_t alen, - const char* b, size_t blen) */ - compare, - IntPtr /* const char* (*)(void*) */ name); - - [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] - public static extern void leveldb_comparator_destroy(IntPtr /* leveldb_comparator_t* */ cmp); - - #endregion - } - - internal static class NativeHelper - { - public static void CheckError(IntPtr error) - { - if (error != IntPtr.Zero) - { - string message = Marshal.PtrToStringAnsi(error); - Native.leveldb_free(error); - throw new LevelDBException(message); - } - } - } -} diff --git a/src/neo/IO/Data/LevelDB/Options.cs b/src/neo/IO/Data/LevelDB/Options.cs deleted file mode 100644 index 53dd6e488b..0000000000 --- a/src/neo/IO/Data/LevelDB/Options.cs +++ /dev/null @@ -1,87 +0,0 @@ -using System; - -namespace Neo.IO.Data.LevelDB -{ - public class Options - { - public static readonly Options Default = new Options(); - internal readonly IntPtr handle = Native.leveldb_options_create(); - - public bool CreateIfMissing - { - set - { - Native.leveldb_options_set_create_if_missing(handle, value); - } - } - - public bool ErrorIfExists - { - set - { - Native.leveldb_options_set_error_if_exists(handle, value); - } - } - - public bool ParanoidChecks - { - set - { - Native.leveldb_options_set_paranoid_checks(handle, value); - } - } - - public int WriteBufferSize - { - set - { - Native.leveldb_options_set_write_buffer_size(handle, (UIntPtr)value); - } - } - - public int MaxOpenFiles - { - set - { - Native.leveldb_options_set_max_open_files(handle, value); - } - } - - public int BlockSize - { - set - { - Native.leveldb_options_set_block_size(handle, (UIntPtr)value); - } - } - - public int BlockRestartInterval - { - set - { - Native.leveldb_options_set_block_restart_interval(handle, value); - } - } - - public CompressionType Compression - { - set - { - Native.leveldb_options_set_compression(handle, value); - } - } - - public IntPtr FilterPolicy - { - set - { - Native.leveldb_options_set_filter_policy(handle, value); - } - } - - ~Options() - { - Native.leveldb_options_destroy(handle); - } - } -} diff --git a/src/neo/IO/Data/LevelDB/ReadOptions.cs b/src/neo/IO/Data/LevelDB/ReadOptions.cs deleted file mode 100644 index 9c198cfba1..0000000000 --- a/src/neo/IO/Data/LevelDB/ReadOptions.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; - -namespace Neo.IO.Data.LevelDB -{ - public class ReadOptions - { - public static readonly ReadOptions Default = new ReadOptions(); - internal readonly IntPtr handle = Native.leveldb_readoptions_create(); - - public bool VerifyChecksums - { - set - { - Native.leveldb_readoptions_set_verify_checksums(handle, value); - } - } - - public bool FillCache - { - set - { - Native.leveldb_readoptions_set_fill_cache(handle, value); - } - } - - public Snapshot Snapshot - { - set - { - Native.leveldb_readoptions_set_snapshot(handle, value.handle); - } - } - - ~ReadOptions() - { - Native.leveldb_readoptions_destroy(handle); - } - } -} diff --git a/src/neo/IO/Data/LevelDB/Slice.cs b/src/neo/IO/Data/LevelDB/Slice.cs deleted file mode 100644 index 83b3fe78d3..0000000000 --- a/src/neo/IO/Data/LevelDB/Slice.cs +++ /dev/null @@ -1,243 +0,0 @@ -using Neo.Cryptography; -using System; -using System.Runtime.InteropServices; -using System.Text; - -namespace Neo.IO.Data.LevelDB -{ - public struct Slice : IComparable, IEquatable - { - internal byte[] buffer; - - internal Slice(IntPtr data, UIntPtr length) - { - buffer = new byte[(int)length]; - Marshal.Copy(data, buffer, 0, (int)length); - } - - public int CompareTo(Slice other) - { - for (int i = 0; i < buffer.Length && i < other.buffer.Length; i++) - { - int r = buffer[i].CompareTo(other.buffer[i]); - if (r != 0) return r; - } - return buffer.Length.CompareTo(other.buffer.Length); - } - - public bool Equals(Slice other) - { - if (buffer.Length != other.buffer.Length) return false; - return MemoryExtensions.SequenceEqual(buffer, other.buffer); - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) return false; - if (!(obj is Slice)) return false; - return Equals((Slice)obj); - } - - public override int GetHashCode() - { - return (int)buffer.Murmur32(0); - } - - public byte[] ToArray() - { - return buffer ?? Array.Empty(); - } - - unsafe public bool ToBoolean() - { - if (buffer.Length != sizeof(bool)) - throw new InvalidCastException(); - fixed (byte* pbyte = &buffer[0]) - { - return *((bool*)pbyte); - } - } - - public byte ToByte() - { - if (buffer.Length != sizeof(byte)) - throw new InvalidCastException(); - return buffer[0]; - } - - unsafe public double ToDouble() - { - if (buffer.Length != sizeof(double)) - throw new InvalidCastException(); - fixed (byte* pbyte = &buffer[0]) - { - return *((double*)pbyte); - } - } - - unsafe public short ToInt16() - { - if (buffer.Length != sizeof(short)) - throw new InvalidCastException(); - fixed (byte* pbyte = &buffer[0]) - { - return *((short*)pbyte); - } - } - - unsafe public int ToInt32() - { - if (buffer.Length != sizeof(int)) - throw new InvalidCastException(); - fixed (byte* pbyte = &buffer[0]) - { - return *((int*)pbyte); - } - } - - unsafe public long ToInt64() - { - if (buffer.Length != sizeof(long)) - throw new InvalidCastException(); - fixed (byte* pbyte = &buffer[0]) - { - return *((long*)pbyte); - } - } - - unsafe public float ToSingle() - { - if (buffer.Length != sizeof(float)) - throw new InvalidCastException(); - fixed (byte* pbyte = &buffer[0]) - { - return *((float*)pbyte); - } - } - - public override string ToString() - { - return Encoding.UTF8.GetString(buffer); - } - - unsafe public ushort ToUInt16() - { - if (buffer.Length != sizeof(ushort)) - throw new InvalidCastException(); - fixed (byte* pbyte = &buffer[0]) - { - return *((ushort*)pbyte); - } - } - - unsafe public uint ToUInt32(int index = 0) - { - if (buffer.Length != sizeof(uint) + index) - throw new InvalidCastException(); - fixed (byte* pbyte = &buffer[index]) - { - return *((uint*)pbyte); - } - } - - unsafe public ulong ToUInt64() - { - if (buffer.Length != sizeof(ulong)) - throw new InvalidCastException(); - fixed (byte* pbyte = &buffer[0]) - { - return *((ulong*)pbyte); - } - } - - public static implicit operator Slice(byte[] data) - { - return new Slice { buffer = data }; - } - - public static implicit operator Slice(bool data) - { - return new Slice { buffer = BitConverter.GetBytes(data) }; - } - - public static implicit operator Slice(byte data) - { - return new Slice { buffer = new[] { data } }; - } - - public static implicit operator Slice(double data) - { - return new Slice { buffer = BitConverter.GetBytes(data) }; - } - - public static implicit operator Slice(short data) - { - return new Slice { buffer = BitConverter.GetBytes(data) }; - } - - public static implicit operator Slice(int data) - { - return new Slice { buffer = BitConverter.GetBytes(data) }; - } - - public static implicit operator Slice(long data) - { - return new Slice { buffer = BitConverter.GetBytes(data) }; - } - - public static implicit operator Slice(float data) - { - return new Slice { buffer = BitConverter.GetBytes(data) }; - } - - public static implicit operator Slice(string data) - { - return new Slice { buffer = Encoding.UTF8.GetBytes(data) }; - } - - public static implicit operator Slice(ushort data) - { - return new Slice { buffer = BitConverter.GetBytes(data) }; - } - - public static implicit operator Slice(uint data) - { - return new Slice { buffer = BitConverter.GetBytes(data) }; - } - - public static implicit operator Slice(ulong data) - { - return new Slice { buffer = BitConverter.GetBytes(data) }; - } - - public static bool operator <(Slice x, Slice y) - { - return x.CompareTo(y) < 0; - } - - public static bool operator <=(Slice x, Slice y) - { - return x.CompareTo(y) <= 0; - } - - public static bool operator >(Slice x, Slice y) - { - return x.CompareTo(y) > 0; - } - - public static bool operator >=(Slice x, Slice y) - { - return x.CompareTo(y) >= 0; - } - - public static bool operator ==(Slice x, Slice y) - { - return x.Equals(y); - } - - public static bool operator !=(Slice x, Slice y) - { - return !x.Equals(y); - } - } -} diff --git a/src/neo/IO/Data/LevelDB/SliceBuilder.cs b/src/neo/IO/Data/LevelDB/SliceBuilder.cs deleted file mode 100644 index cf1cff0264..0000000000 --- a/src/neo/IO/Data/LevelDB/SliceBuilder.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Neo.IO.Data.LevelDB -{ - public class SliceBuilder - { - private List data = new List(); - - private SliceBuilder() - { - } - - public SliceBuilder Add(byte value) - { - data.Add(value); - return this; - } - - public SliceBuilder Add(ushort value) - { - data.AddRange(BitConverter.GetBytes(value)); - return this; - } - - public SliceBuilder Add(uint value) - { - data.AddRange(BitConverter.GetBytes(value)); - return this; - } - - public SliceBuilder Add(long value) - { - data.AddRange(BitConverter.GetBytes(value)); - return this; - } - - public SliceBuilder Add(IEnumerable value) - { - if (value != null) - data.AddRange(value); - return this; - } - - public SliceBuilder Add(string value) - { - if (value != null) - data.AddRange(Encoding.UTF8.GetBytes(value)); - return this; - } - - public SliceBuilder Add(ISerializable value) - { - if (value != null) - data.AddRange(value.ToArray()); - return this; - } - - public static SliceBuilder Begin() - { - return new SliceBuilder(); - } - - public static SliceBuilder Begin(byte prefix) - { - return new SliceBuilder().Add(prefix); - } - - public static implicit operator Slice(SliceBuilder value) - { - return value.data.ToArray(); - } - } -} diff --git a/src/neo/IO/Data/LevelDB/Snapshot.cs b/src/neo/IO/Data/LevelDB/Snapshot.cs deleted file mode 100644 index d651098388..0000000000 --- a/src/neo/IO/Data/LevelDB/Snapshot.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; - -namespace Neo.IO.Data.LevelDB -{ - public class Snapshot : IDisposable - { - internal IntPtr db, handle; - - internal Snapshot(IntPtr db) - { - this.db = db; - this.handle = Native.leveldb_create_snapshot(db); - } - - public void Dispose() - { - if (handle != IntPtr.Zero) - { - Native.leveldb_release_snapshot(db, handle); - handle = IntPtr.Zero; - } - } - } -} diff --git a/src/neo/IO/Data/LevelDB/WriteBatch.cs b/src/neo/IO/Data/LevelDB/WriteBatch.cs deleted file mode 100644 index b3a9782108..0000000000 --- a/src/neo/IO/Data/LevelDB/WriteBatch.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; - -namespace Neo.IO.Data.LevelDB -{ - public class WriteBatch - { - internal readonly IntPtr handle = Native.leveldb_writebatch_create(); - - ~WriteBatch() - { - Native.leveldb_writebatch_destroy(handle); - } - - public void Clear() - { - Native.leveldb_writebatch_clear(handle); - } - - public void Delete(Slice key) - { - Native.leveldb_writebatch_delete(handle, key.buffer, (UIntPtr)key.buffer.Length); - } - - public void Put(Slice key, Slice value) - { - Native.leveldb_writebatch_put(handle, key.buffer, (UIntPtr)key.buffer.Length, value.buffer, (UIntPtr)value.buffer.Length); - } - } -} diff --git a/src/neo/IO/Data/LevelDB/WriteOptions.cs b/src/neo/IO/Data/LevelDB/WriteOptions.cs deleted file mode 100644 index 8d120c3997..0000000000 --- a/src/neo/IO/Data/LevelDB/WriteOptions.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; - -namespace Neo.IO.Data.LevelDB -{ - public class WriteOptions - { - public static readonly WriteOptions Default = new WriteOptions(); - internal readonly IntPtr handle = Native.leveldb_writeoptions_create(); - - public bool Sync - { - set - { - Native.leveldb_writeoptions_set_sync(handle, value); - } - } - - ~WriteOptions() - { - Native.leveldb_writeoptions_destroy(handle); - } - } -} diff --git a/src/neo/NeoSystem.cs b/src/neo/NeoSystem.cs index 2ec0ae29cb..047ee71604 100644 --- a/src/neo/NeoSystem.cs +++ b/src/neo/NeoSystem.cs @@ -4,7 +4,6 @@ using Neo.Network.P2P; using Neo.Network.RPC; using Neo.Persistence; -using Neo.Persistence.Memory; using Neo.Plugins; using Neo.Wallets; using System; @@ -34,7 +33,7 @@ public class NeoSystem : IDisposable public NeoSystem(string storageEngine = null) { Plugin.LoadPlugins(this); - this.store = storageEngine is null ? new Store() : Plugin.Storages[storageEngine].GetStore(); + this.store = storageEngine is null ? new MemoryStore() : Plugin.Storages[storageEngine].GetStore(); this.Blockchain = ActorSystem.ActorOf(Ledger.Blockchain.Props(this, store)); this.LocalNode = ActorSystem.ActorOf(Network.P2P.LocalNode.Props(this)); this.TaskManager = ActorSystem.ActorOf(Network.P2P.TaskManager.Props(this)); diff --git a/src/neo/Persistence/Memory/ByteArrayEqualityComparer.cs b/src/neo/Persistence/ByteArrayEqualityComparer.cs similarity index 97% rename from src/neo/Persistence/Memory/ByteArrayEqualityComparer.cs rename to src/neo/Persistence/ByteArrayEqualityComparer.cs index 97096498aa..29d6acbe1e 100644 --- a/src/neo/Persistence/Memory/ByteArrayEqualityComparer.cs +++ b/src/neo/Persistence/ByteArrayEqualityComparer.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace Neo.Persistence.Memory +namespace Neo.Persistence { internal class ByteArrayEqualityComparer : IEqualityComparer { diff --git a/src/neo/Persistence/Memory/Helper.cs b/src/neo/Persistence/Helper.cs similarity index 85% rename from src/neo/Persistence/Memory/Helper.cs rename to src/neo/Persistence/Helper.cs index e25a44d699..51d9314bfc 100644 --- a/src/neo/Persistence/Memory/Helper.cs +++ b/src/neo/Persistence/Helper.cs @@ -1,6 +1,6 @@ using System; -namespace Neo.Persistence.Memory +namespace Neo.Persistence { internal static class Helper { diff --git a/src/neo/Persistence/LevelDB/Snapshot.cs b/src/neo/Persistence/LevelDB/Snapshot.cs deleted file mode 100644 index 712268924c..0000000000 --- a/src/neo/Persistence/LevelDB/Snapshot.cs +++ /dev/null @@ -1,54 +0,0 @@ -using Neo.IO.Data.LevelDB; -using System.Collections.Generic; -using LSnapshot = Neo.IO.Data.LevelDB.Snapshot; - -namespace Neo.Persistence.LevelDB -{ - internal class Snapshot : ISnapshot - { - private readonly DB db; - private readonly LSnapshot snapshot; - private readonly ReadOptions options; - private readonly WriteBatch batch; - - public Snapshot(DB db) - { - this.db = db; - this.snapshot = db.GetSnapshot(); - this.options = new ReadOptions { FillCache = false, Snapshot = snapshot }; - this.batch = new WriteBatch(); - } - - public void Commit() - { - db.Write(WriteOptions.Default, batch); - } - - public void Delete(byte table, byte[] key) - { - batch.Delete(SliceBuilder.Begin(table).Add(key)); - } - - public void Dispose() - { - snapshot.Dispose(); - } - - public IEnumerable<(byte[] Key, byte[] Value)> Find(byte table, byte[] prefix) - { - return db.Find(options, SliceBuilder.Begin(table).Add(prefix), (k, v) => (k.ToArray()[1..], v.ToArray())); - } - - public void Put(byte table, byte[] key, byte[] value) - { - batch.Put(SliceBuilder.Begin(table).Add(key), value); - } - - public byte[] TryGet(byte table, byte[] key) - { - if (!db.TryGet(options, SliceBuilder.Begin(table).Add(key), out Slice slice)) - return null; - return slice.ToArray(); - } - } -} diff --git a/src/neo/Persistence/LevelDB/Store.cs b/src/neo/Persistence/LevelDB/Store.cs deleted file mode 100644 index 6758744281..0000000000 --- a/src/neo/Persistence/LevelDB/Store.cs +++ /dev/null @@ -1,68 +0,0 @@ -using Neo.IO.Data.LevelDB; -using System; -using System.Collections.Generic; -using System.Reflection; - -namespace Neo.Persistence.LevelDB -{ - public class Store : IStore - { - private const byte SYS_Version = 0xf0; - private readonly DB db; - - public Store(string path) - { - this.db = DB.Open(path, new Options { CreateIfMissing = true }); - if (db.TryGet(ReadOptions.Default, SliceBuilder.Begin(SYS_Version), out Slice value) && Version.TryParse(value.ToString(), out Version version) && version >= Version.Parse("2.9.1")) - return; - WriteBatch batch = new WriteBatch(); - ReadOptions options = new ReadOptions { FillCache = false }; - using (Iterator it = db.NewIterator(options)) - { - for (it.SeekToFirst(); it.Valid(); it.Next()) - { - batch.Delete(it.Key()); - } - } - db.Put(WriteOptions.Default, SliceBuilder.Begin(SYS_Version), Assembly.GetExecutingAssembly().GetName().Version.ToString()); - db.Write(WriteOptions.Default, batch); - } - - public void Delete(byte table, byte[] key) - { - db.Delete(WriteOptions.Default, SliceBuilder.Begin(table).Add(key)); - } - - public void Dispose() - { - db.Dispose(); - } - - public IEnumerable<(byte[], byte[])> Find(byte table, byte[] prefix) - { - return db.Find(ReadOptions.Default, SliceBuilder.Begin(table).Add(prefix), (k, v) => (k.ToArray()[1..], v.ToArray())); - } - - public ISnapshot GetSnapshot() - { - return new Snapshot(db); - } - - public void Put(byte table, byte[] key, byte[] value) - { - db.Put(WriteOptions.Default, SliceBuilder.Begin(table).Add(key), value); - } - - public void PutSync(byte table, byte[] key, byte[] value) - { - db.Put(new WriteOptions { Sync = true }, SliceBuilder.Begin(table).Add(key), value); - } - - public byte[] TryGet(byte table, byte[] key) - { - if (!db.TryGet(ReadOptions.Default, SliceBuilder.Begin(table).Add(key), out Slice slice)) - return null; - return slice.ToArray(); - } - } -} diff --git a/src/neo/Persistence/Memory/Snapshot.cs b/src/neo/Persistence/MemorySnapshot.cs similarity index 93% rename from src/neo/Persistence/Memory/Snapshot.cs rename to src/neo/Persistence/MemorySnapshot.cs index a8edf8cf05..5b1dc35742 100644 --- a/src/neo/Persistence/Memory/Snapshot.cs +++ b/src/neo/Persistence/MemorySnapshot.cs @@ -5,15 +5,15 @@ using System.Collections.Immutable; using System.Linq; -namespace Neo.Persistence.Memory +namespace Neo.Persistence { - internal class Snapshot : ISnapshot + internal class MemorySnapshot : ISnapshot { private readonly ConcurrentDictionary[] innerData; private readonly ImmutableDictionary[] immutableData; private readonly ConcurrentDictionary[] writeBatch; - public Snapshot(ConcurrentDictionary[] innerData) + public MemorySnapshot(ConcurrentDictionary[] innerData) { this.innerData = innerData; this.immutableData = innerData.Select(p => p.ToImmutableDictionary(ByteArrayEqualityComparer.Default)).ToArray(); diff --git a/src/neo/Persistence/Memory/Store.cs b/src/neo/Persistence/MemoryStore.cs similarity index 91% rename from src/neo/Persistence/Memory/Store.cs rename to src/neo/Persistence/MemoryStore.cs index 73e7dc5719..5b6c09c58f 100644 --- a/src/neo/Persistence/Memory/Store.cs +++ b/src/neo/Persistence/MemoryStore.cs @@ -4,13 +4,13 @@ using System.Collections.Generic; using System.Linq; -namespace Neo.Persistence.Memory +namespace Neo.Persistence { - public class Store : IStore + public class MemoryStore : IStore { private readonly ConcurrentDictionary[] innerData; - public Store() + public MemoryStore() { innerData = new ConcurrentDictionary[256]; for (int i = 0; i < innerData.Length; i++) @@ -38,7 +38,7 @@ public IEnumerable<(byte[] Key, byte[] Value)> Find(byte table, byte[] prefix) public ISnapshot GetSnapshot() { - return new Snapshot(innerData); + return new MemorySnapshot(innerData); } public void Put(byte table, byte[] key, byte[] value) diff --git a/tests/neo.UnitTests/IO/Data/LevelDb/UT_Slice.cs b/tests/neo.UnitTests/IO/Data/LevelDb/UT_Slice.cs deleted file mode 100644 index d9ad5af951..0000000000 --- a/tests/neo.UnitTests/IO/Data/LevelDb/UT_Slice.cs +++ /dev/null @@ -1,408 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Neo.Cryptography; -using Neo.IO.Data.LevelDB; -using System; -using System.Runtime.InteropServices; -using System.Text; - -namespace Neo.UnitTests.IO.Data.LevelDb -{ - public class Test { } - - [TestClass] - public class UT_Slice - { - private Slice sliceTest; - - [TestMethod] - public void TestConstructor() - { - IntPtr parr = Marshal.AllocHGlobal(1); - Marshal.WriteByte(parr, 0x01); - UIntPtr plength = new UIntPtr(1); - sliceTest = new Slice(parr, plength); - Assert.IsNotNull(sliceTest); - Assert.IsInstanceOfType(sliceTest, typeof(Slice)); - Slice slice = (byte)0x01; - Assert.AreEqual(slice, sliceTest); - Marshal.FreeHGlobal(parr); - } - - [TestMethod] - public void TestCompareTo() - { - Slice slice = new byte[] { 0x01, 0x02 }; - sliceTest = new byte[] { 0x01, 0x02 }; - int result = sliceTest.CompareTo(slice); - Assert.AreEqual(0, result); - sliceTest = new byte[] { 0x01 }; - result = sliceTest.CompareTo(slice); - Assert.AreEqual(-1, result); - sliceTest = new byte[] { 0x01, 0x02, 0x03 }; - result = sliceTest.CompareTo(slice); - Assert.AreEqual(1, result); - sliceTest = new byte[] { 0x01, 0x03 }; - result = sliceTest.CompareTo(slice); - Assert.AreEqual(1, result); - sliceTest = new byte[] { 0x01, 0x01 }; - result = sliceTest.CompareTo(slice); - Assert.AreEqual(-1, result); - } - - [TestMethod] - public void TestEqualsSlice() - { - byte[] arr1 = { 0x01, 0x02 }; - byte[] arr2 = { 0x01, 0x02 }; - Slice slice = arr1; - sliceTest = arr1; - Assert.IsTrue(sliceTest.Equals(slice)); - sliceTest = arr2; - Assert.IsTrue(sliceTest.Equals(slice)); - sliceTest = new byte[] { 0x01, 0x03 }; - Assert.IsFalse(sliceTest.Equals(slice)); - } - - [TestMethod] - public void TestEqualsObj() - { - sliceTest = new byte[] { 0x01 }; - object slice = null; - bool result = sliceTest.Equals(slice); - Assert.AreEqual(false, result); - slice = new Test(); - result = sliceTest.Equals(slice); - Assert.AreEqual(false, result); - slice = sliceTest; - result = sliceTest.Equals(slice); - Assert.AreEqual(true, result); - Slice s = new byte[] { 0x01 }; - result = sliceTest.Equals(s); - Assert.AreEqual(true, result); - s = new byte[] { 0x01, 0x02 }; - result = sliceTest.Equals(s); - Assert.AreEqual(false, result); - } - - [TestMethod] - public void TestGetHashCode() - { - byte[] arr = new byte[] { 0x01, 0x02 }; - sliceTest = arr; - int hash1 = (int)arr.Murmur32(0); - int hash2 = sliceTest.GetHashCode(); - Assert.AreEqual(hash2, hash1); - } - - [TestMethod] - public void TestFromArray() - { - byte[] arr = new byte[]{ - 0x01,0x01,0x01,0x01, - }; - IntPtr parr = Marshal.AllocHGlobal(arr.Length); - for (int i = 0; i < arr.Length; i++) - { - Marshal.WriteByte(parr + i, 0x01); - } - UIntPtr plength = new UIntPtr((uint)arr.Length); - Slice slice = new Slice(parr, plength); - sliceTest = arr; - Assert.AreEqual(slice, sliceTest); - Marshal.FreeHGlobal(parr); - } - - [TestMethod] - public void TestToArray() - { - sliceTest = new Slice(); - byte[] arr = sliceTest.ToArray(); - Assert.AreEqual(0, arr.Length); - arr = new byte[] { 0x01, 0x02 }; - sliceTest = arr; - byte[] parr = sliceTest.ToArray(); - Assert.AreSame(parr, arr); - } - - [TestMethod] - public void TestToBoolean() - { - sliceTest = new byte[] { 0x01, 0x02 }; - Assert.ThrowsException(() => sliceTest.ToBoolean()); - sliceTest = (byte)0x01; - bool result = sliceTest.ToBoolean(); - Assert.AreEqual(true, result); - } - - [TestMethod] - public void TestToByte() - { - sliceTest = new byte[] { 0x01, 0x02 }; - Assert.ThrowsException(() => sliceTest.ToByte()); - sliceTest = (byte)0x01; - byte result = sliceTest.ToByte(); - Assert.AreEqual((byte)0x01, result); - } - - [TestMethod] - public void TestToDouble() - { - sliceTest = new byte[] { 0x01 }; - Assert.ThrowsException(() => sliceTest.ToDouble()); - byte[] arr = new byte[sizeof(double)]; - sliceTest = arr; - double result = sliceTest.ToDouble(); - Assert.AreEqual(0D, result); - sliceTest = 0.5D; - Assert.AreEqual(0.5D, sliceTest.ToDouble()); - } - - [TestMethod] - public void TestToInt16() - { - sliceTest = new byte[] { 0x01 }; - Assert.ThrowsException(() => sliceTest.ToInt16()); - sliceTest = (Int16)(-15); - Assert.AreEqual((Int16)(-15), sliceTest.ToInt16()); - } - - [TestMethod] - public void TestToInt32() - { - sliceTest = new byte[] { 0x01 }; - Assert.ThrowsException(() => sliceTest.ToInt32()); - sliceTest = (Int32)(-15); - Assert.AreEqual((Int32)(-15), sliceTest.ToInt32()); - } - - [TestMethod] - public void TestToInt64() - { - sliceTest = new byte[] { 0x01 }; - Assert.ThrowsException(() => sliceTest.ToInt64()); - sliceTest = Int64.MaxValue; - Assert.AreEqual(Int64.MaxValue, sliceTest.ToInt64()); - } - - [TestMethod] - public void TestToSingle() - { - sliceTest = new byte[] { 0x01 }; - Assert.ThrowsException(() => sliceTest.ToSingle()); - sliceTest = (float)(-15.5); - Assert.AreEqual((float)(-15.5), sliceTest.ToSingle()); - } - - [TestMethod] - public void TestToString() - { - sliceTest = "abc你好"; - Assert.AreEqual("abc你好", sliceTest.ToString()); - } - - [TestMethod] - public void TestToUint16() - { - sliceTest = new byte[] { 0x01 }; - Assert.ThrowsException(() => sliceTest.ToUInt16()); - sliceTest = (UInt16)(25); - Assert.AreEqual((UInt16)25, sliceTest.ToUInt16()); - } - - [TestMethod] - public void TestToUint32() - { - sliceTest = new byte[] { 0x01 }; - Assert.ThrowsException(() => sliceTest.ToUInt32()); - sliceTest = (UInt32)(2525252525); - Assert.AreEqual((UInt32)2525252525, sliceTest.ToUInt32()); - } - - [TestMethod] - public void TestToUint64() - { - sliceTest = new byte[] { 0x01 }; - Assert.ThrowsException(() => sliceTest.ToUInt64()); - sliceTest = (UInt64)(0x2525252525252525); - Assert.AreEqual((UInt64)(0x2525252525252525), sliceTest.ToUInt64()); - } - - [TestMethod] - public void TestFromBool() - { - byte[] arr = { 0x01 }; - Slice slice = arr; - sliceTest = true; - Assert.AreEqual(slice, sliceTest); - } - - [TestMethod] - public void TestFromByte() - { - sliceTest = (byte)0x01; - byte[] arr = { 0x01 }; - Slice slice = arr; - Assert.AreEqual(slice, sliceTest); - } - - [TestMethod] - public void TestFromDouble() - { - Slice slice = BitConverter.GetBytes(1.23D); - sliceTest = 1.23D; - Assert.AreEqual(slice, sliceTest); - } - - [TestMethod] - public void TestFromShort() - { - Slice slice = BitConverter.GetBytes((short)1234); - sliceTest = (short)1234; - Assert.AreEqual(slice, sliceTest); - } - - [TestMethod] - public void TestFromInt() - { - Slice slice = BitConverter.GetBytes(-1234); - sliceTest = -1234; - Assert.AreEqual(slice, sliceTest); - } - - [TestMethod] - public void TestFromLong() - { - Slice slice = BitConverter.GetBytes(-1234L); - sliceTest = -1234L; - Assert.AreEqual(slice, sliceTest); - } - - [TestMethod] - public void TestFromFloat() - { - Slice slice = BitConverter.GetBytes(1.234F); - sliceTest = 1.234F; - Assert.AreEqual(slice, sliceTest); - } - - [TestMethod] - public void TestFromString() - { - string str = "abcdefghijklmnopqrstuvwxwz!@#$%^&*&()_+?><你好"; - Slice slice = Encoding.UTF8.GetBytes(str); - sliceTest = str; - Assert.AreEqual(slice, sliceTest); - } - - [TestMethod] - public void TestFromUnshort() - { - Slice slice = BitConverter.GetBytes((ushort)12345); - sliceTest = (ushort)12345; - Assert.AreEqual(slice, sliceTest); - } - - [TestMethod] - public void TestFromUint() - { - Slice slice = BitConverter.GetBytes((uint)12345); - sliceTest = (uint)12345; - Assert.AreEqual(slice, sliceTest); - } - - [TestMethod] - public void TestFromUlong() - { - Slice slice = BitConverter.GetBytes(12345678UL); - sliceTest = 12345678UL; - Assert.AreEqual(slice, sliceTest); - } - - [TestMethod] - public void TestLessThan() - { - sliceTest = new byte[] { 0x01 }; - Slice slice = new byte[] { 0x02 }; - bool result = sliceTest < slice; - Assert.AreEqual(true, result); - slice = new byte[] { 0x01 }; - result = sliceTest < slice; - Assert.AreEqual(false, result); - slice = new byte[] { 0x00 }; - result = sliceTest < slice; - Assert.AreEqual(false, result); - } - - [TestMethod] - public void TestLessThanAndEqual() - { - sliceTest = new byte[] { 0x01 }; - Slice slice = new byte[] { 0x02 }; - bool result = sliceTest <= slice; - Assert.AreEqual(true, result); - slice = new byte[] { 0x01 }; - result = sliceTest <= slice; - Assert.AreEqual(true, result); - slice = new byte[] { 0x00 }; - result = sliceTest <= slice; - Assert.AreEqual(false, result); - } - - [TestMethod] - public void TestGreatThan() - { - sliceTest = new byte[] { 0x01 }; - Slice slice = new byte[] { 0x00 }; - bool result = sliceTest > slice; - Assert.AreEqual(true, result); - slice = new byte[] { 0x01 }; - result = sliceTest > slice; - Assert.AreEqual(false, result); - slice = new byte[] { 0x02 }; - result = sliceTest > slice; - Assert.AreEqual(false, result); - } - - [TestMethod] - public void TestGreatThanAndEqual() - { - sliceTest = new byte[] { 0x01 }; - Slice slice = new byte[] { 0x00 }; - bool result = sliceTest >= slice; - Assert.AreEqual(true, result); - slice = new byte[] { 0x01 }; - result = sliceTest >= slice; - Assert.AreEqual(true, result); - slice = new byte[] { 0x02 }; - result = sliceTest >= slice; - Assert.AreEqual(false, result); - } - - [TestMethod] - public void TestEqual() - { - sliceTest = new byte[] { 0x01 }; - Slice slice = new byte[] { 0x00 }; - bool result = sliceTest == slice; - Assert.AreEqual(false, result); - slice = new byte[] { 0x01 }; - result = sliceTest == slice; - Assert.AreEqual(true, result); - slice = new byte[] { 0x02 }; - result = sliceTest == slice; - Assert.AreEqual(false, result); - } - - [TestMethod] - public void TestUnequal() - { - sliceTest = new byte[] { 0x01 }; - Slice slice = new byte[] { 0x00 }; - bool result = sliceTest != slice; - Assert.AreEqual(true, result); - slice = new byte[] { 0x01 }; - result = sliceTest != slice; - Assert.AreEqual(false, result); - } - } -}