max jacob wrote:
avevo scritto un po' di tempo fa un'estensione in c per fare sta roba... se vuoi la rispolvero e te la passo. però ora sull'8 credo credo che abbiano risolto dei problemi di isolazione delle funzioni plpgsql per cui probabilmente puoi semplicemente scrivere una funzione che fa la stessa cosa. il principio è banale:
create table contatori ( id text not null primary key, value int );
create function contatore_next( text ) returns int as '
declare
v int;
begin
select into v value from contatori where id = $1 for update; -- for update e' necessario per lockare la riga
if not found
-- inserisce la riga
lock table contatori; -- cosi' nessuno rischia di inserire un contatore con id uguale causando errore.
insert into contatori ( id, value ) values ( $1, 1 );
return 1
else
-- incrementa e ritorna
v:=v+1;
update contatori set value = v where id = $1;
return v;
end;
end;
' language plpgsql;
(l'ho scritta a braccio direttamente nella mail, magari c'è qualche errorino...)