private static void BulkDuplicateRead(BerkeleyBulkDuplicateCursor cursor, HashSet <KeyValuePair <int, DateTime> > data, bool blobExists)
        {
            var      checkData = new HashSet <KeyValuePair <int, DateTime> >(data);
            bool     blobFound = false;
            DateTime d1        = new DateTime(2014, 1, 1);

            foreach (int keyIndex in data.Select(d => d.Key).Distinct())
            {
                Byte[] key = Encoding.UTF8.GetBytes(keyIndex.ToString());
                for (BerkeleyBulkEnumerator buffer = cursor.ReadAsync(key, BerkeleyDbOperation.DB_SET).Result;
                     !buffer.NotFound;
                     buffer = cursor.ReadAsync(null, BerkeleyDbOperation.DB_NEXT_DUP).Result)
                {
                    buffer.Error.ThrowIfError();

                    foreach (BerkeleyKeyValueBulk keyValue in buffer)
                    {
                        String   value = Encoding.UTF8.GetString(keyValue.Value.ToArray());
                        DateTime d;
                        if (DateTime.TryParseExact(value, "dddd dd MMMM yyyy", null, DateTimeStyles.None, out d))
                        {
                            Assert.IsTrue(checkData.Remove(new KeyValuePair <int, DateTime>(keyIndex, d)), "key/value: " + "key" + keyIndex + "/" + value + " not exists");
                        }
                        else
                        {
                            blobFound = keyValue.Value.Count == 34123 && CheckByteArray(keyValue.Value);
                            Assert.IsTrue(blobFound, "blod data is bad");
                        }
                    }
                }
            }

            Assert.AreEqual(checkData.Count, 0, "not all values found");
            Assert.IsTrue(blobFound == blobExists, "blob value not found");
        }
        private static HashSet <KeyValuePair <int, DateTime> > BulkDuplicateWrite(BerkeleyBulkDuplicateCursor cursor, out bool blobExists)
        {
            var data = new HashSet <KeyValuePair <int, DateTime> >();

            DateTime d1 = new DateTime(2014, 1, 1);

            for (int i = 0; i < 1000; i++)
            {
                int    keyIndex = (i / 100) + 1;
                Byte[] key      = Encoding.UTF8.GetBytes(keyIndex.ToString());
                if (i == 500)
                {
                    cursor.AddWrite(key, GenerateByteArray(34123));
                }

                String svalue = d1.AddDays(i).ToString("dddd dd MMMM yyyy");
                Byte[] value  = Encoding.UTF8.GetBytes(svalue);
                cursor.AddWrite(key, value);

                data.Add(new KeyValuePair <int, DateTime>(keyIndex, d1.AddDays(i)));
            }

            var error = cursor.WriteAsync(BerkeleyDbWriteMode.DB_OVERWRITE_DUP).Result;

            error.ThrowIfError();

            blobExists = true;
            return(data);
        }
        private static HashSet <KeyValuePair <int, DateTime> > BulkDuplicateDelete(BerkeleyBulkDuplicateCursor cursor, HashSet <KeyValuePair <int, DateTime> > data, ref bool blobExists)
        {
            var checkData = new HashSet <KeyValuePair <int, DateTime> >();

            Byte[] key, value;
            foreach (KeyValuePair <int, DateTime> keyValue in data)
            {
                if ((keyValue.Value.Day % 3) == 0)
                {
                    key   = Encoding.UTF8.GetBytes(keyValue.Key.ToString());
                    value = Encoding.UTF8.GetBytes(keyValue.Value.ToString("dddd dd MMMM yyyy"));
                    cursor.AddDelete(key, value);
                }
                else
                {
                    checkData.Add(keyValue);
                }
            }

            key   = Encoding.UTF8.GetBytes((500 / 100 + 1).ToString());
            value = GenerateByteArray(34123);
            cursor.AddDelete(key, value);

            BerkeleyError error = cursor.DeleteAsync().Result;

            error.ThrowIfError();
            blobExists = false;
            return(checkData);
        }
 public void BulkDiplicateTest()
 {
     using (var bdb = CreateDbDup())
         using (var cursor = new BerkeleyBulkDuplicateCursor(bdb, GetPageSize(bdb)))
         {
             bool blobExists;
             HashSet <KeyValuePair <int, DateTime> > data = BulkDuplicateWrite(cursor, out blobExists);
             BulkDuplicateRead(cursor, data, blobExists);
             data = BulkDuplicateDelete(cursor, data, ref blobExists);
             BulkDuplicateRead(cursor, data, blobExists);
         }
 }