1.23.  addpartiallogindices( )

Propriétés de la fonction
Langage: PLPGSQL
Type du code retour: integer

Ajoute des index partiels, si possible, dans les tables sl_log_? inutilisées pour tous les nœuds origines, et supprime tous ceux qui ne sont plus nécessaires. Cette fonction est exécuté à chaque fois que les origines d'ensemble sont utilisées (FAILOVER, STORE SET, MOVE SET, DROP SET), ainsi qu'à chaque fois que le système bascule entre sl_log_1 et sl_log_2.

DECLARE
        v_current_status        int4;
        v_log                   int4;
        v_dummy         record;
        v_dummy2        record;
        idef            text;
        v_count         int4;
        v_iname         text;
BEGIN
        v_count := 0;
        select last_value into v_current_status from sl_log_status;

        -- If status is 2 or 3 --> in process of cleanup --> unsafe to create indices
        if v_current_status in (2, 3) then
                return 0;
        end if;

        if v_current_status = 0 then   -- Which log should get indices?
                v_log := 2;
        else
                v_log := 1;
        end if;
--                                       PartInd_test_db_sl_log_2-node-1
        -- Add missing indices...
        for v_dummy in select distinct set_origin from sl_set loop
            v_iname := 'PartInd_schemadoc_sl_log_' || v_log || '-node-' || v_dummy.set_origin;
            -- raise notice 'Consider adding partial index % on sl_log_%', v_iname, v_log;
            -- raise notice 'schema: [_schemadoc] tablename:[sl_log_%]', v_log;
            select * into v_dummy2 from pg_catalog.pg_indexes where tablename = 'sl_log_' || v_log and  indexname = v_iname;
            if not found then
                -- raise notice 'index was not found - add it!';
                idef := 'create index "PartInd_schemadoc_sl_log_' || v_log || '-node-' || v_dummy.set_origin ||
                        '" on sl_log_' || v_log || ' USING btree(log_xid xxid_ops) where (log_origin = ' || v_dummy.set_origin || ');';
                execute idef;
                v_count := v_count + 1;
            else
                -- raise notice 'Index % already present - skipping', v_iname;
            end if;
        end loop;

        -- Remove unneeded indices...
        for v_dummy in select indexname from pg_catalog.pg_indexes i where i.tablename = 'sl_log_' || v_log and
                       i.indexname like ('PartInd_schemadoc_sl_log_' || v_log || '-node-%') and
                       not exists (select 1 from sl_set where
                                i.indexname = 'PartInd_schemadoc_sl_log_' || v_log || '-node-' || set_origin)
        loop
                -- raise notice 'Dropping obsolete index %d', v_dummy.indexname;
                idef := 'drop index "' || v_dummy.indexname || '";';
                execute idef;
                v_count := v_count - 1;
        end loop;
        return v_count;
END