diff options
Diffstat (limited to 'lib/LXRng/Index/Generic.pm')
-rw-r--r-- | lib/LXRng/Index/Generic.pm | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/lib/LXRng/Index/Generic.pm b/lib/LXRng/Index/Generic.pm new file mode 100644 index 0000000..cab2513 --- /dev/null +++ b/lib/LXRng/Index/Generic.pm @@ -0,0 +1,172 @@ +package LXRng::Index::Generic; + +use strict; +use Memoize; + + +sub new { + my ($class, %args) = @_; + + memoize('tree_id'); + memoize('release_id'); + memoize('file_id'); + memoize('symbol_id'); + + return bless(\%args, $class); +} + +sub prefix { + my ($self) = @_; + if (exists $$self{'table_prefix'}) { + return $$self{'table_prefix'}.'_'; + } + else { + return ''; + } +} + +sub tree_id { + my ($self, $tree, $update) = @_; + + return $self->_get_tree($tree) || + ($update ? $self->_add_tree($tree) : undef); +} + +sub release_id { + my ($self, $tree, $release, $update) = @_; + + my $tree_id = $self->tree_id($tree, $update); + + return $self->_get_release($tree_id, $release) || + ($update ? $self->_add_release($tree_id, $release) : undef); +} + +sub file_id { + my ($self, $path, $update) = @_; + + return $self->_get_file($path) || + ($update ? $self->_add_file($path) : undef); +} + +sub rfile_id { + my ($self, $node, $update) = @_; + + my $path = $node->name; + my $revision = $node->revision; + + my $file_id = $self->file_id($path, $update); + return undef unless $file_id; + + my ($id, $old_stamp) = $self->_get_rfile($file_id, $revision); + return $id unless $update; + + if ($id) { + my ($new_stamp) = $node->time =~ /^(\d+)/; + if ($update and $old_stamp > $new_stamp) { + $self->_update_rfile_timestamp($id, $node->time); + } + } + else { + $id = $self->_add_rfile($file_id, $revision, $node->time); + } + return $id; +} + +sub symbol_id { + my ($self, $symbol, $update) = @_; + + return $self->_get_symbol($symbol) || + ($update ? $self->_add_symbol($symbol) : undef); +} + +sub add_filerelease { + my ($self, $tree, $release, $rfile_id) = @_; + + my $rel_id = $self->release_id($tree, $release, 1); + + $self->_add_filerelease($rfile_id, $rel_id); +} + +sub add_include { + my ($self, $file_id, $include_path) = @_; + + my $inc_id = $self->_get_file($include_path); + + return 0 unless $inc_id; + return $self->_add_include($file_id, $inc_id); +} + +sub includes_by_file { + my ($self, $tree, $release, $path) = @_; + + my $file_id = $self->file_id($tree, $release, $path); + + return $self->_includes_by_id($file_id); +} + +#sub add_symbol { +# my ($self, $file_id, $line, $symbol, $type, $ctx_id) = @_; +# return $self->_add_symbol($file_id, $line, $symbol, $type, $ctx_id); +#} + +sub add_ident { + my ($self, $rfile_id, $line, $symbol, $type, $ctx_id) = @_; + + my $sym_id = $self->symbol_id($symbol, 1); + + return $self->_add_ident($rfile_id, $line, $sym_id, $type, $ctx_id); +} + +sub symbol_by_id { + my ($self, $id) = @_; + + return $self->_symbol_by_id($id); +} + +sub symbols_by_name { + my ($self, $tree, $release, $symbol) = @_; + + my $rel_id = $self->release_id($tree, $release); +# return $cache_sym{$rel_id}{$symbol} if +# exists $cache_sym{$rel_id} and exists $cache_sym{$rel_id}{$symbol}; + return $self->_identifiers_by_name($rel_id, $symbol); +# $cache_sym{$rel_id}{$symbol} = $id; +} + +sub symbols_by_file { + my ($self, $tree, $release, $path) = @_; + + $path =~ s!^/!!; + my $rel_id = $self->_get_release($self->_get_tree($tree), $release); + my $rfile_id = $self->_get_rfile_by_release($rel_id, $path); + + return $self->_symbols_by_file($rfile_id); +} + +sub add_usage { + my ($self, $file_id, $line, $symbol) = @_; + + my $sym_id = $self->symbol_id($symbol, 1); + + return $self->_add_usage($file_id, $line, $sym_id); +} + +sub usage_by_file { + my ($self, $tree, $release, $path) = @_; + + my $rel_id = $self->_get_release($self->_get_tree($tree), $release); + my $rfile_id = $self->_get_rfile_by_release($rel_id, $path); + + return $self->_usage_by_file($rfile_id); +} + +sub get_referring_files { + my ($self, $rel_id, $rfile_id, $res) = @_; + + $res ||= {}; + $self->_get_includes_by_file($res, $rel_id, $rfile_id); + + return keys %$res; +} + +1; |