Advertisement
pveselov

agrio lock

Jan 7th, 2015
558
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.38 KB | None | 0 0
  1. db=> \d r_locks
  2.                  Table "public.r_locks"
  3.  Column  |          Type           |     Modifiers      
  4. ---------+-------------------------+--------------------
  5.  code    | character varying(1024) | not null
  6.  version | numeric(38,0)           | not null default 1
  7. Indexes:
  8.     "r_locks_pkey" PRIMARY KEY, btree (code)
  9.  
  10.  
  11. CREATE OR REPLACE FUNCTION public.get_r_lock(codein CHARACTER VARYING,
  12. exclusive BOOLEAN)
  13. RETURNS NUMERIC
  14. LANGUAGE plpgsql
  15. AS $function$
  16. DECLARE
  17. ver NUMERIC;
  18. BEGIN
  19. IF exclusive
  20. THEN
  21. SELECT
  22. version
  23. FROM r_locks
  24. WHERE code = codeIn
  25. INTO ver
  26. FOR UPDATE;
  27. IF found
  28. THEN
  29. ver := ver + 1;
  30. UPDATE r_locks
  31. SET version = ver
  32. WHERE code = codeIn;
  33. END IF;
  34. ELSE
  35. BEGIN
  36. SELECT
  37. version
  38. FROM r_locks
  39. WHERE code = codeIn
  40. INTO ver
  41. FOR SHARE NOWAIT;
  42. EXCEPTION WHEN lock_not_available
  43. THEN
  44. RETURN -2;
  45. END;
  46. END IF;
  47. IF NOT found
  48. THEN
  49. RETURN -1;
  50. END IF;
  51. RETURN ver;
  52. END;
  53. $function$
  54.  
  55. create or replace function
  56. make_r_code(tagIn numeric, blockId numeric)
  57. returns varchar immutable as $$
  58. begin
  59. if tagIn = 0 then
  60. return '-' || blockId;
  61. else
  62. return blockId || '-';
  63. end if;
  64. end;
  65. $$ LANGUAGE plpgsql;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement