Class: Factbase::Logged

Inherits:
Object
  • Object
show all
Defined in:
lib/factbase/logged.rb

Overview

A decorator of a Factbase, that logs all operations.

Author

Yegor Bugayenko (yegor256@gmail.com)

Copyright

Copyright © 2024-2025 Yegor Bugayenko

License

MIT

Defined Under Namespace

Classes: Fact, Query, Tube

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(fb, log = nil, time_tolerate: 1, tube: nil) ⇒ Logged

Ctor.

Parameters:

  • fb (Factbase)

    The factbase to decorate

  • log (Object) (defaults to: nil)

    The logging facility

  • time_tolerate (Integer) (defaults to: 1)

    How many seconds are OK per request

  • tube (Print) (defaults to: nil)

    The tube to use, if log is NIL


23
24
25
26
27
28
29
30
31
32
# File 'lib/factbase/logged.rb', line 23

def initialize(fb, log = nil, time_tolerate: 1, tube: nil)
  raise 'The "fb" is nil' if fb.nil?
  @origin = fb
  if log.nil?
    raise 'Either "log" or "tube" must be non-NIL' if tube.nil?
    @tube = tube
  else
    @tube = Tube.new(log, time_tolerate:)
  end
end

Class Method Details

.elapsedObject


204
205
206
207
208
# File 'lib/factbase/logged.rb', line 204

def self.elapsed
  start = Time.now
  yield
  "in #{start.ago}"
end

Instance Method Details

#insertObject


36
37
38
39
40
41
# File 'lib/factbase/logged.rb', line 36

def insert
  start = Time.now
  f = @origin.insert
  @tube.say(start, "Inserted new fact ##{@origin.size} in #{start.ago}")
  Fact.new(f, tube: @tube)
end

#query(term, maps = nil) ⇒ Object


43
44
45
46
# File 'lib/factbase/logged.rb', line 43

def query(term, maps = nil)
  term = to_term(term) if term.is_a?(String)
  Query.new(term, maps, @tube, @origin)
end

#txnObject


48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/factbase/logged.rb', line 48

def txn
  start = Time.now
  id = nil
  rollback = false
  r =
    @origin.txn do |fbt|
      id = fbt.object_id
      yield Factbase::Logged.new(fbt, tube: @tube)
    rescue Factbase::Rollback => e
      rollback = true
      raise e
    end
  if rollback
    @tube.say(start, "Txn ##{id} rolled back in #{start.ago}")
  else
    @tube.say(start, "Txn ##{id} touched #{r} in #{start.ago}")
  end
  r
end