public NativeArray <T> GetRaw <T>(NativeArray key, ReadOptions options) where T : struct { IntPtr error; IntPtr length; var handle = new LevelDbFreeHandle(); // TODO: Remove typecast to int var v = (Ptr <T>)LevelDbInterop.leveldb_get( Handle, options.Handle, key.BaseAddr, key.ByteLength, out length, out error); handle.SetHandle((IntPtr)v); // round down, truncating the array slightly if needed var count = (IntPtr)((ulong)length / Ptr <T> .SizeofT); return(new NativeArray <T>(v, count, handle)); }
/// <summary> /// If the database contains an entry for "key" return the value, /// otherwise return null. /// </summary> public byte[] Get(byte[] key, ReadOptions options) { IntPtr error; IntPtr length; var v = LevelDbInterop.leveldb_get(Handle, options.Handle, key, (IntPtr)key.LongLength, out length, out error); Throw(error); if (v == IntPtr.Zero) { return(null); } try { var bytes = new byte[(long)length]; // TODO: Consider copy loop, as Marshal.Copy has 2GB-1 limit, or native pointers Marshal.Copy(v, bytes, 0, (int)length); return(bytes); } finally { LevelDbInterop.leveldb_free(v); } }
/// <summary> /// If the database contains an entry for "key" return the value, /// otherwise return null. /// </summary> public int[] Get(int key, ReadOptions options) { IntPtr error; IntPtr length; IntPtr v; v = LevelDbInterop.leveldb_get(Handle, options.Handle, ref key, (IntPtr)sizeof(int), out length, out error); Throw(error); if (v == IntPtr.Zero) { return(null); } try { var bytes = new int[(long)length / 4]; // TODO: consider >2GB-1 Marshal.Copy(v, bytes, 0, checked ((int)bytes.LongLength)); return(bytes); } finally { LevelDbInterop.leveldb_free(v); } }