Skip to content

Instantly share code, notes, and snippets.

@hermanocabral
Created January 28, 2012 16:45
Show Gist options
  • Save hermanocabral/1694980 to your computer and use it in GitHub Desktop.
Save hermanocabral/1694980 to your computer and use it in GitHub Desktop.
RavenDB embedded test
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition.Hosting;
using System.Diagnostics;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using Raven.Client;
using Raven.Client.Embedded;
using Raven.Database.Plugins;
using Raven.Database.Server;
using Raven.Json.Linq;
namespace TestBench
{
internal class Program
{
private static readonly string _DatabaseDirectory = Path.Combine(Environment.CurrentDirectory, "Database");
private class TestDummy
{
public Guid Id { get; set; }
public Guid Data1 { get; set; }
public Guid Data2 { get; set; }
public string Data3 { get; set; }
public string Data4 { get; set; }
public string Data5 { get; set; }
public string Data6 { get; set; }
public Guid Data7 { get; set; }
public Guid Data8 { get; set; }
public DateTime Data9 { get; set; }
public Guid Data10 { get; set; }
public Guid Data11 { get; set; }
public string Data12 { get; set; }
public int Data13 { get; set; }
public int Data14 { get; set; }
public string Data15 { get; set; }
public string Data16 { get; set; }
public Guid Data17 { get; set; }
public string Data18 { get; set; }
public Guid Data19 { get; set; }
public Guid Data20 { get; set; }
public Guid Data21 { get; set; }
public string Data22 { get; set; }
public string Data23 { get; set; }
public DateTime Data24 { get; set; }
public float Data25 { get; set; }
public float Data26 { get; set; }
public float Data27 { get; set; }
public float Data28 { get; set; }
public float Data29 { get; set; }
public float Data30 { get; set; }
public double Data31 { get; set; }
public double Data32 { get; set; }
public double Data33 { get; set; }
public TestDummy()
{
var random = new Random(DateTime.Now.Millisecond);
Data1 = Guid.NewGuid();
Data2 = Guid.NewGuid();
Data3 = Guid.NewGuid().ToString() + Guid.NewGuid().ToString() + Guid.NewGuid().ToString() + Guid.NewGuid().ToString() + Guid.NewGuid().ToString() + Guid.NewGuid().ToString();
Data4 = Guid.NewGuid().ToString() + Guid.NewGuid().ToString() + Guid.NewGuid().ToString() + Guid.NewGuid().ToString() + Guid.NewGuid().ToString() + Guid.NewGuid().ToString();
Data5 = Guid.NewGuid().ToString() + Guid.NewGuid().ToString() + Guid.NewGuid().ToString() + Guid.NewGuid().ToString() + Guid.NewGuid().ToString() + Guid.NewGuid().ToString();
Data6 = Guid.NewGuid().ToString();
Data7 = Guid.NewGuid();
Data8 = Guid.NewGuid();
Data9 = DateTime.Now.AddDays(random.Next(100));
Data10 = Guid.NewGuid();
Data11 = Guid.NewGuid();
Data12 = Guid.NewGuid().ToString();
Data13 = random.Next(12345);
Data14 = random.Next(12345);
Data15 = Guid.NewGuid().ToString() + Guid.NewGuid().ToString() + Guid.NewGuid().ToString();
Data16 = Guid.NewGuid().ToString();
Data17 = Guid.NewGuid();
Data18 = Guid.NewGuid().ToString() + Guid.NewGuid().ToString();
Data19 = Guid.NewGuid();
Data20 = Guid.NewGuid();
Data21 = Guid.NewGuid();
Data22 = Guid.NewGuid().ToString() + Guid.NewGuid().ToString() + Guid.NewGuid().ToString() + Guid.NewGuid().ToString() + Guid.NewGuid().ToString() + Guid.NewGuid().ToString();
Data23 = Guid.NewGuid().ToString() + Guid.NewGuid().ToString() + Guid.NewGuid().ToString() + Guid.NewGuid().ToString();
Data24 = DateTime.Now.AddHours(random.Next(100));
Data25 = (float) random.NextDouble()*random.Next(12345);
Data26 = (float) random.NextDouble()*random.Next(12345);
Data27 = (float) random.NextDouble()*random.Next(12345);
Data28 = (float) random.NextDouble()*random.Next(12345);
Data29 = (float) random.NextDouble()*random.Next(12345);
Data30 = (float) random.NextDouble()*random.Next(12345);
Data31 = random.NextDouble()*random.Next(12345);
Data32 = random.NextDouble()*random.Next(12345);
Data33 = random.NextDouble()*random.Next(12345);
}
}
private static void Main()
{
//always start fresh
if (Directory.Exists(_DatabaseDirectory))
Directory.Delete(_DatabaseDirectory, true);
var crono = new Stopwatch();
//Console.Write("Creating test data... ");
//crono.Start();
var testData = new List<TestDummy>(1000);
for (var i = 0; i < testData.Capacity; i++)
testData.Add(new TestDummy());
//crono.Stop();
//Console.WriteLine("Done! Test data created in {0} seconds", crono.Elapsed.TotalSeconds);
//crono.Reset();
using (var db = GetRavenDB())
{
using (var session = db.OpenSession())
{
Console.Write("Inserting test data... ");
crono.Start();
testData.ForEach(session.Store);
session.SaveChanges();
crono.Stop();
Console.WriteLine("Done! {0} entries inserted in {1} seconds", testData.Count, crono.Elapsed.TotalSeconds);
}
Console.Read();
}
//crono.Reset();
////let's try now running in memory...
//using (var db = GetDatabase(false))
//{
// using (var session = db.OpenSession())
// {
// Console.Write("Inserting test data into the database (RunInMemory = true)...");
// crono.Start();
// testData.ForEach(session.Store);
// session.SaveChanges();
// crono.Stop();
// Console.WriteLine("Done! Entries inserted in {0} minutes", crono.Elapsed.TotalMinutes);
// }
//}
Console.Read();
}
public static IDocumentStore GetRavenDB(bool useDisk = true)
{
var db = new EmbeddableDocumentStore
{
DataDirectory = _DatabaseDirectory,
UseEmbeddedHttpServer = true,
RunInMemory = !useDisk,
Configuration =
{
Port = 8888,
//HostName = "localhost",
AnonymousUserAccessMode = AnonymousUserAccessMode.All,
Catalog = new AggregateCatalog
{
Catalogs =
{
new AssemblyCatalog(typeof (DocumentCodec).Assembly)
}
}
},
};
NonAdminHttp.EnsureCanListenToWhenInNonAdminContext(8888);
db.Initialize();
return db;
}
}
internal class DocumentCodec : AbstractDocumentCodec
{
private const string YOUR_PASSWORD = "1234567890";
public override Stream Encode(string key, RavenJObject data, RavenJObject metadata, Stream dataStream)
{
return new CryptoStream(dataStream, GetCryptoProvider(key).CreateEncryptor(), CryptoStreamMode.Write);
}
public override Stream Decode(string key, RavenJObject metadata, Stream dataStream)
{
return new CryptoStream(dataStream, GetCryptoProvider(key).CreateDecryptor(), CryptoStreamMode.Read);
}
private static SymmetricAlgorithm GetCryptoProvider(string key)
{
var passwordBytes = new Rfc2898DeriveBytes(YOUR_PASSWORD, GetSaltFromDocumentKey(key));
var csp = new AesCryptoServiceProvider();
csp.Key = passwordBytes.GetBytes(csp.KeySize/8);
csp.IV = passwordBytes.GetBytes(csp.BlockSize/8);
return csp;
}
private static byte [] GetSaltFromDocumentKey(string key)
{
return MD5.Create().ComputeHash(Encoding.ASCII.GetBytes(key));
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment