Fact.Genesis.TheCreator (Fact v0.4.0)

View Source

The divine module that brings a Fact database into existence.

Fact.Genesis.TheCreator is responsible for taking a DatabaseCreated.V1 event and actually creating the on-disk database via let_there_be_light/1.

Responsibilities:

  • Initialize the storage paths for records and indices
  • Create necessary directories and a .gitignore file
  • Write the genesis event to the record file
  • Append the genesis event to the ledger file
  • Generate event IDs and populate the event schema

Summary

Functions

let_there_be_light(event, encryption_meta \\ nil)

(since 0.4.0)
@spec let_there_be_light(
  %Fact.Genesis.Event.DatabaseCreated.V1{
    database_id: term(),
    database_name: term(),
    elixir_version: term(),
    erts_version: term(),
    event_id: term(),
    event_schema: term(),
    fact_version: term(),
    index_checkpoint_file_decoder: term(),
    index_checkpoint_file_encoder: term(),
    index_checkpoint_file_name: term(),
    index_checkpoint_file_reader: term(),
    index_checkpoint_file_writer: term(),
    index_file_decoder: term(),
    index_file_encoder: term(),
    index_file_name: term(),
    index_file_reader: term(),
    index_file_writer: term(),
    ledger_file_decoder: term(),
    ledger_file_encoder: term(),
    ledger_file_name: term(),
    ledger_file_reader: term(),
    ledger_file_writer: term(),
    lock_file_decoder: term(),
    lock_file_encoder: term(),
    lock_file_name: term(),
    lock_file_reader: term(),
    lock_file_writer: term(),
    os_version: term(),
    otp_version: term(),
    record_file_decoder: term(),
    record_file_encoder: term(),
    record_file_name: term(),
    record_file_reader: term(),
    record_file_writer: term(),
    storage: term()
  },
  map() | nil
) :: :ok

Creates a Fact database from the Fact.Genesis.Event.DatabaseCreated.V1 event.

It initializes storage, and appends the event as the first record of every database.

When encryption_meta is provided, the genesis record is encrypted manually (since the KeyRing process is not yet running) and the bootstrap file includes the wrapped DEK for later decryption.