public void TransactionShouldSupportCustomDupSorter()
        {
            Func <int, int, int> comparison = (l, r) => - Math.Sign(l - r);

            var txn     = _env.BeginTransaction();
            var options = new DatabaseConfiguration {
                Flags = DatabaseOpenFlags.Create | DatabaseOpenFlags.DuplicatesFixed
            };
            Func <MDBValue, MDBValue, int> compareWith = (l, r) => comparison(BitConverter.ToInt32(l.CopyToNewArray(), 0), BitConverter.ToInt32(r.CopyToNewArray(), 0));

            options.FindDuplicatesWith(Comparer <MDBValue> .Create(new Comparison <MDBValue>(compareWith)));
            var db = txn.OpenDatabase(configuration: options);

            var valuesUnsorted = new [] { 2, 10, 5, 0 };
            var valuesSorted   = valuesUnsorted.ToArray();

            Array.Sort(valuesSorted, new Comparison <int>(comparison));

            using (var c = txn.CreateCursor(db))
                c.Put(BitConverter.GetBytes(123), valuesUnsorted.Select(BitConverter.GetBytes).ToArray());

            using (var c = txn.CreateCursor(db))
            {
                int order = 0;

                while (c.Next() == MDBResultCode.Success)
                {
                    Assert.Equal(valuesSorted[order++], BitConverter.ToInt32(c.GetCurrent().value.CopyToNewArray(), 0));
                }
            }
        }
Exemplo n.º 2
0
        public void TransactionShouldSupportCustomDupSorter()
        {
            Func<int, int, int> comparison = (l, r) => -Math.Sign(l - r);

            var txn = _env.BeginTransaction();
            var options = new DatabaseConfiguration {Flags = DatabaseOpenFlags.Create | DatabaseOpenFlags.DuplicatesFixed};
            Func<byte[], byte[], int> compareWith = (l, r) => comparison(BitConverter.ToInt32(l, 0), BitConverter.ToInt32(r, 0));
            options.FindDuplicatesWith(Comparer<byte[]>.Create(new Comparison<byte[]>(compareWith)));
            var db = txn.OpenDatabase(configuration: options);

            var valuesUnsorted = new [] { 2, 10, 5, 0 };
            var valuesSorted = valuesUnsorted.ToArray();
            Array.Sort(valuesSorted, new Comparison<int>(comparison));

            using (var c = txn.CreateCursor(db))
                c.PutMultiple(BitConverter.GetBytes(123), valuesUnsorted.Select(BitConverter.GetBytes).ToArray());

            using (var c = txn.CreateCursor(db))
            {
                int order = 0;

                while (c.MoveNext())
                    Assert.Equal(valuesSorted[order++], BitConverter.ToInt32(c.Current.Value, 0));
            }
        }