Class: Aggro::FileStore

Inherits:
Object
  • Object
show all
Defined in:
lib/aggro/file_store.rb,
lib/aggro/file_store/reader.rb,
lib/aggro/file_store/writer.rb

Overview

Public: Stores and retrieves events by serializing them to flat files.

Defined Under Namespace

Classes: Reader, Writer

Constant Summary collapse

INDEX_DIRECTORY =
'indexes'.freeze
EVENT_DIRECTORY =
'events'.freeze
REGISTRY_FILE =
'registry'.freeze

Instance Method Summary collapse

Constructor Details

#initialize(directory) ⇒ FileStore

Returns a new instance of FileStore.



11
12
13
14
15
16
17
18
19
20
# File 'lib/aggro/file_store.rb', line 11

def initialize(directory)
  @event_directory = [directory, EVENT_DIRECTORY].join('/')
  @index_directory = [directory, INDEX_DIRECTORY].join('/')

  FileUtils.mkdir_p @event_directory
  FileUtils.mkdir_p @index_directory

  @registry_file = [directory, REGISTRY_FILE].join('/')
  initialize_registry if File.exist? @registry_file
end

Instance Method Details

#allObject



22
23
24
# File 'lib/aggro/file_store.rb', line 22

def all
  read registry.keys
end

#create(id, type) ⇒ Object



26
27
28
29
30
31
32
33
# File 'lib/aggro/file_store.rb', line 26

def create(id, type)
  File.open(@registry_file, 'ab') do |registry_file|
    registry_file.write Marshal.dump [id, type]
    registry[id] = type
  end

  self
end

#exists?(id) ⇒ Boolean

Returns:

  • (Boolean)


35
36
37
# File 'lib/aggro/file_store.rb', line 35

def exists?(id)
  registry[id] == true
end

#read(ids) ⇒ Object



39
40
41
# File 'lib/aggro/file_store.rb', line 39

def read(ids)
  ids.map { |id| id_to_event_stream id }
end

#registryObject



43
44
45
# File 'lib/aggro/file_store.rb', line 43

def registry
  @registry ||= {}
end

#write(event_streams) ⇒ Object



47
48
49
50
51
52
53
54
55
56
# File 'lib/aggro/file_store.rb', line 47

def write(event_streams)
  event_streams.each do |stream|
    FileStore::Writer.new(
      event_file(stream.id, 'ab'),
      index_file(stream.id, 'ab')
    ).write stream.events
  end

  self
end

#write_single(id, event) ⇒ Object



58
59
60
61
62
63
# File 'lib/aggro/file_store.rb', line 58

def write_single(id, event)
  FileStore::Writer.new(
    event_file(id, 'ab'),
    index_file(id, 'ab')
  ).write [event]
end