089.sql
-- SWH DB schema upgrade
-- from_version: 88
-- to_version: 89
-- description: indexer: Add content_ctags
insert into dbversion(version, release, description)
values(89, now(), 'Work In Progress');
create type ctags_languages as enum (
'Ada',
'AnsiblePlaybook',
'Ant',
'Asm',
'Asp',
'Autoconf',
'Automake',
'Awk',
'Basic',
'BETA',
'C',
'C#',
'C++',
'Clojure',
'Cobol',
'CoffeeScript',
'CSS',
'ctags',
'D',
'DBusIntrospect',
'Diff',
'DosBatch',
'DTS',
'Eiffel',
'Erlang',
'Falcon',
'Flex',
'Fortran',
'gdbinit',
'Glade',
'Go',
'HTML',
'Iniconf',
'Java',
'JavaProperties',
'JavaScript',
'JSON',
'Lisp',
'Lua',
'M4',
'Make',
'man',
'MatLab',
'Maven2',
'Myrddin',
'ObjectiveC',
'OCaml',
'OldC',
'OldC++',
'Pascal',
'Perl',
'Perl6',
'PHP',
'PlistXML',
'pod',
'Protobuf',
'Python',
'PythonLoggingConfig',
'R',
'RelaxNG',
'reStructuredText',
'REXX',
'RpmSpec',
'Ruby',
'Rust',
'Scheme',
'Sh',
'SLang',
'SML',
'SQL',
'SVG',
'SystemdUnit',
'SystemVerilog',
'Tcl',
'Tex',
'TTCN',
'Vera',
'Verilog',
'VHDL',
'Vim',
'WindRes',
'XSLT',
'YACC',
'Yaml',
'YumRepo',
'Zephir'
);
-- ctags information per content
create table content_ctags (
id sha1 references content(sha1) not null,
name text not null,
kind text not null,
line bigint not null,
lang ctags_languages not null
);
comment on table content_ctags is 'Ctags information on a raw content';
comment on column content_ctags.id is 'Content identifier';
comment on column content_ctags.name is 'Symbol name';
comment on column content_ctags.kind is 'Symbol kind (function, class, variable, const...)';
comment on column content_ctags.line is 'Symbol line';
comment on column content_ctags.lang is 'Language information for that content';
create index on content_ctags(id);
create unique index on content_ctags(id, md5(name), kind, line, lang);
-- add tmp_content_ctags entries to content_ctags, overwriting
-- duplicates if conflict_update is true, skipping duplicates otherwise.
--
-- If filtering duplicates is in order, the call to
-- swh_ctags_missing must take place before calling this function.
--
--
-- operates in bulk: 0. swh_mktemp(content_ctags), 1. COPY to tmp_content_ctags,
-- 2. call this function
create or replace function swh_content_ctags_add()
returns void
language plpgsql
as $$
begin
insert into content_ctags (id, name, kind, line, lang)
select id, name, kind, line, lang
from tmp_content_ctags
on conflict(id, md5(name), kind, line, lang)
do nothing;
return;
end
$$;
comment on function swh_content_ctags_add() IS 'Add new ctags symbols per content';
-- check which entries of tmp_bytea are missing from content_ctags
--
-- operates in bulk: 0. swh_mktemp_bytea(), 1. COPY to tmp_bytea,
-- 2. call this function
create or replace function swh_content_ctags_missing()
returns setof sha1
language plpgsql
as $$
begin
return query
(select id::sha1 from tmp_bytea as tmp
where not exists
(select 1 from content_ctags as c where c.id = tmp.id limit 1));
return;
end
$$;
comment on function swh_content_ctags_missing() IS 'Filter missing content ctags';
-- Retrieve list of content ctags from the temporary table.
--
-- operates in bulk: 0. mktemp(tmp_bytea), 1. COPY to tmp_bytea, 2. call this function
create or replace function swh_content_ctags_get()
returns setof content_ctags
language plpgsql
as $$
begin
return query
select id::sha1, name, kind, line, lang
from tmp_bytea t
inner join content_ctags using(id)
order by line;
return;
end
$$;
comment on function swh_content_ctags_get() IS 'List content ctags';