Class: Codebeacon::Tracer::PersistenceManager

Inherits:
Object
  • Object
show all
Defined in:
lib/codebeacon/tracer/src/data/persistence_manager.rb

Instance Method Summary collapse

Constructor Details

#initialize(database) ⇒ PersistenceManager

Returns a new instance of PersistenceManager.



11
12
13
14
15
16
17
# File 'lib/codebeacon/tracer/src/data/persistence_manager.rb', line 11

def initialize(database)
  @database = database
  @tree_node_mapper = TreeNodeMapper.new(database)
  @node_source_mapper = NodeSourceMapper.new(database)
  @metadata_mapper = MetadataMapper.new(database)
  @progress_logger = Codebeacon::Tracer.logger.newProgressLogger("nodes persisted")
end

Instance Method Details

#_save_tree(tree_node, parent_id = nil) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/codebeacon/tracer/src/data/persistence_manager.rb', line 50

def _save_tree(tree_node, parent_id = nil)
  @progress_logger.increment
  return if tree_node.nil?

  begin
    node_id = @tree_node_mapper.insert(
      tree_node.file,
      tree_node.line,
      tree_node.called_method&.to_s, # Convert symbols to strings, keep nil as nil
      tree_node.method.to_s,
      tree_node.tp_class.to_s,
      tree_node.tp_defined_class.to_s,
      tree_node.tp_class_name.to_s,
      tree_node.self_type.to_s,
      tree_node.depth,
      tree_node.caller,
      tree_node.gem_entry,
      parent_id,
      tree_node.block,
      tree_node.node_source&.id,
      return_type(tree_node),
      return_value(tree_node)
    )

    unless tree_node.depth_truncated?
      tree_node.children.each do |child|
        _save_tree(child, node_id)
      end
    end
  rescue => e
    Codebeacon::Tracer.logger.error("Error saving tree node: #{e.message}")
    Codebeacon::Tracer.logger.error("Node details: file=#{tree_node.file}, line=#{tree_node.line}, method=#{tree_node.method}") if Codebeacon::Tracer.config.debug?
    # Continue with siblings and other nodes without crashing
  end
end

#save_metadata(metadata) ⇒ Object



19
20
21
# File 'lib/codebeacon/tracer/src/data/persistence_manager.rb', line 19

def ()
  @metadata_mapper.insert()
end

#save_node_sources(node_sources) ⇒ Object



23
24
25
26
27
28
# File 'lib/codebeacon/tracer/src/data/persistence_manager.rb', line 23

def save_node_sources(node_sources)
  node_sources.each do |node_source|
    next if node_source.nil?
    node_source.id = @node_source_mapper.insert(node_source.name, node_source.root_path)
  end
end

#save_tree(tree_node, parent_id = nil) ⇒ Object



46
47
48
# File 'lib/codebeacon/tracer/src/data/persistence_manager.rb', line 46

def save_tree(tree_node, parent_id = nil)
  _save_tree(tree_node, parent_id)
end

#save_trees(trees) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/codebeacon/tracer/src/data/persistence_manager.rb', line 30

def save_trees(trees)
  Codebeacon::Tracer.logger.info("BEGIN db persistence")
  begin
    trees.each do |tree|
      save_tree(tree.root)
    end
  rescue => e
    Codebeacon::Tracer.logger.error("Error during tree persistence: #{e.message}")
    Codebeacon::Tracer.logger.error(e.backtrace.join("\n")) if Codebeacon::Tracer.config.debug?
    # Continue execution without crashing the application
  ensure
    @progress_logger.finish()
    Codebeacon::Tracer.logger.info("END db persistence")
  end
end