Plugins: Codecs

The AbstractDocumentCodec and AbstractIndexCodec classes have been introduced as an entry point to custom compression methods.

public abstract class AbstractDocumentCodec
{
	public DocumentDatabase Database { get; set; }

	public virtual void Initialize(DocumentDatabase database) { }

	public virtual void Initialize() { }

	public virtual void SecondStageInit() { }

	public abstract Stream Encode(string key, RavenJObject data, RavenJObject metadata, Stream dataStream);

	public abstract Stream Decode(string key, RavenJObject metadata, Stream dataStream);
}

public abstract class AbstractIndexCodec
{
	public virtual void Initialize(DocumentDatabase database) { }

	public virtual void SecondStageInit() { }

	public abstract Stream Encode(string key, Stream dataStream);

	public abstract Stream Decode(string key, Stream dataStream);
}

where:
* Encode is executed when the given document/index is written.
* Decode is executed when the provided document/index is read.
* Initialize and SecondStageInit are used to trigger initialization process.

Example - Compression

public class SimpleCompressionCodec : AbstractDocumentCodec
{
	private readonly SimpleCompressor compressor = new SimpleCompressor();

	public override Stream Encode(string key, RavenJObject data, RavenJObject metadata, Stream dataStream)
	{
		return compressor.Compress(key, data, metadata, dataStream);
	}

	public override Stream Decode(string key, RavenJObject metadata, Stream dataStream)
	{
		return compressor.Decompress(key, metadata, dataStream);
	}
}

Example - Encryption

public class SimpleEncryptionCodec : AbstractDocumentCodec
{
	private readonly SimpleEncryptor encryptor = new SimpleEncryptor();

	public override Stream Encode(string key, RavenJObject data, RavenJObject metadata, Stream dataStream)
	{
		return encryptor.Encrypt(key, data, metadata, dataStream);
	}

	public override Stream Decode(string key, RavenJObject metadata, Stream dataStream)
	{
		return encryptor.Decrypt(key, metadata, dataStream);
	}
}