Class: EventSystem::Storage::FileStore

Inherits:
Base
  • Object
show all
Defined in:
lib/event_system/storage/file_store.rb

Overview

File-based event storage implementation Events are stored in JSONL (JSON Lines) format, one event per line

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Base

#available?

Constructor Details

#initialize(directory = "event_logs", session_id = nil) ⇒ FileStore

Initialize a new file-based event store

Parameters:

  • directory (String) (defaults to: "event_logs")

    The directory to store event files in

  • session_id (String, nil) (defaults to: nil)

    Optional session ID, defaults to timestamp



17
18
19
20
21
22
23
24
# File 'lib/event_system/storage/file_store.rb', line 17

def initialize(directory = "event_logs", session_id = nil)
  @directory = directory
  @storage_path = directory
  @current_session = session_id || Time.now.strftime("%Y%m%d_%H%M%S")
  @current_file = nil

  FileUtils.mkdir_p(@directory) unless Dir.exist?(@directory)
end

Instance Attribute Details

#current_sessionString (readonly)

Get the current session ID

Returns:

  • (String)

    Current session ID



111
112
113
# File 'lib/event_system/storage/file_store.rb', line 111

def current_session
  @current_session
end

#storage_pathObject (readonly)

Returns the value of attribute storage_path.



12
13
14
# File 'lib/event_system/storage/file_store.rb', line 12

def storage_path
  @storage_path
end

Instance Method Details

#closevoid

This method returns an undefined value.

Close the file handle



134
135
136
# File 'lib/event_system/storage/file_store.rb', line 134

def close
  close_current_file
end

#create_session(session_id = nil) ⇒ String

Create a new session

Parameters:

  • session_id (String, nil) (defaults to: nil)

    Optional session ID, defaults to timestamp

Returns:

  • (String)

    The new session ID



126
127
128
129
130
# File 'lib/event_system/storage/file_store.rb', line 126

def create_session(session_id = nil)
  close_current_file
  @current_session = session_id || Time.now.strftime("%Y%m%d_%H%M%S")
  @current_session
end

#list_sessionsArray<String>

List available sessions

Returns:

  • (Array<String>)

    List of session IDs



103
104
105
106
107
# File 'lib/event_system/storage/file_store.rb', line 103

def list_sessions
  Dir.glob(File.join(@directory, "events_*.jsonl")).map do |file|
    File.basename(file).gsub(/^events_/, "").gsub(/\.jsonl$/, "")
  end.sort
end

#load_session(session_id = nil) ⇒ Array<EventSystem::Event>

Load all events from a session

Parameters:

  • session_id (String, nil) (defaults to: nil)

    Session ID to load, or current session if nil

Returns:



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/event_system/storage/file_store.rb', line 77

def load_session(session_id = nil)
  session_id ||= @current_session
  events = []

  # Try different filename patterns for backward compatibility
  filename = find_session_file(session_id)
  return [] unless filename && File.exist?(filename)

  File.open(filename, "r") do |file|
    file.each_line do |line|
      next if line.strip.empty?

      begin
        events << EventSystem::Event.from_json(line)
      rescue JSON::ParserError => e
        # Skip malformed lines but log the error
        warn "Skipping malformed event line: #{e.message}"
      end
    end
  end

  events
end

#query(options = {}) ⇒ Array<EventSystem::Event>

Query for events based on options This implementation loads the session and filters in memory For more advanced querying needs, consider using a database

Parameters:

  • options (Hash) (defaults to: {})

    Query options

    • type: [String] Filter by event type

    • start_time: [Time] Filter events after this time

    • end_time: [Time] Filter events before this time

    • session_id: [String] Filter by session ID

    • limit: [Integer] Limit number of results

Returns:



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/event_system/storage/file_store.rb', line 45

def query(options = {})
  session_id = options[:session_id] || @current_session
  events = load_session(session_id)

  # Filter by type
  if options[:type]
    events = events.select { |e| e.type == options[:type] }
  end

  # Filter by time range
  if options[:start_time]
    events = events.select { |e| e.timestamp >= options[:start_time] }
  end

  if options[:end_time]
    events = events.select { |e| e.timestamp <= options[:end_time] }
  end

  # Sort by timestamp (oldest first)
  events = events.sort_by(&:timestamp)

  # Limit results
  if options[:limit]
    events = events.last(options[:limit])
  end

  events
end

#statsHash

Get storage statistics

Returns:

  • (Hash)

    Storage statistics



140
141
142
143
144
145
146
# File 'lib/event_system/storage/file_store.rb', line 140

def stats
  super.merge(
    directory: @directory,
    current_session_file: current_session_file,
    total_sessions: list_sessions.length
  )
end

#store(event) ⇒ void

This method returns an undefined value.

Store an event to disk

Parameters:



29
30
31
32
33
# File 'lib/event_system/storage/file_store.rb', line 29

def store(event)
  ensure_file_open
  @current_file.puts(event.to_json)
  @current_file.flush # Ensure data is written immediately
end

#switch_session(session_id) ⇒ void

This method returns an undefined value.

Switch to a different session

Parameters:

  • session_id (String)

    The session ID to switch to



118
119
120
121
# File 'lib/event_system/storage/file_store.rb', line 118

def switch_session(session_id)
  close_current_file
  @current_session = session_id
end