Facebook
From Fiery Porcupine, 2 Months ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 21
  1. BEGIN;
  2.  
  3. CREATE TABLE osoba (
  4. email TEXT PRIMARY KEY,
  5. ime TEXT NOT NULL,
  6. prezime TEXT NOT NULL,
  7. drzava TEXT,
  8. grad TEXT,
  9. spol VARCHAR( 6 ) CHECK( spol = 'zensko'
  10.  OR spol = 'musko' ) );
  11.  
  12. INSERT INTO osoba VALUES ('lbarberic@foi.hr','Luka','Barb','hrv','zg','musko');
  13. INSERT INTO osoba VALUES ('ihribljan@foi.hr','ime2','Hrib','hrv','zg','zensko');
  14. INSERT INTO osoba VALUES ('kilicic@foi.hr','ime3','Ilic','hrv','zg','musko');
  15. INSERT INTO osoba VALUES ('tmitrovic@foi.hr','ime4','Mitrovic','hrv','zg','musko');
  16. INSERT INTO osoba VALUES ('tkeskic@foi.hr','ime5','Keskic','hrv','zg','musko');
  17.  
  18. CREATE TABLE poruka (
  19. sifra SERIAL PRIMARY KEY,
  20. posiljatelj TEXT REFERENCES osoba( email )
  21. ON UPDATE CASCADE ON DELETE RESTRICT,
  22. primatelj TEXT REFERENCES osoba( email )
  23. ON UPDATE CASCADE ON DELETE RESTRICT,
  24. naslov TEXT,
  25. sadrzaj TEXT,
  26. vrijeme TIMESTAMP DEFAULT now() );
  27.  
  28. INSERT INTO poruka VALUES (DEFAULT,'lbarberic@foi.hr','ihribljan@foi.hr','naslov1','sadrzaj1',DEFAULT);
  29. INSERT INTO poruka VALUES (DEFAULT,'ihribljan@foi.hr','kilicic@foi.hr','naslov2','sadrzaj2',DEFAULT);
  30. INSERT INTO poruka VALUES (DEFAULT,'kilicic@foi.hr','tmitrovic@foi.hr','naslov3','sadrzaj3',DEFAULT);
  31. INSERT INTO poruka VALUES (DEFAULT,'tmitrovic@foi.hr','tkeskic@foi.hr','naslov4','sadrzaj4',DEFAULT);
  32. INSERT INTO poruka VALUES (DEFAULT,'tkeskic@foi.hr','lbarberic@foi.hr','naslov5','sadrzaj5',DEFAULT);
  33.  
  34. CREATE TABLE grupa (
  35. sifra SERIAL PRIMARY KEY,
  36. naziv VARCHAR(40) NOT NULL UNIQUE
  37. );
  38.  
  39. INSERT INTO grupa VALUES (DEFAULT, 'naziv1');
  40. INSERT INTO grupa VALUES (DEFAULT, 'naziv2');
  41. INSERT INTO grupa VALUES (DEFAULT, 'naziv3');
  42. INSERT INTO grupa VALUES (DEFAULT, 'naziv4');
  43. INSERT INTO grupa VALUES (DEFAULT, 'naziv5');
  44.  
  45. CREATE TABLE clanstvo (
  46. clan TEXT REFERENCES osoba( email )
  47. ON UPDATE CASCADE ON DELETE RESTRICT,
  48. grupa INT REFERENCES grupa( sifra ),
  49. PRIMARY KEY( clan, grupa )
  50. );
  51.  
  52. INSERT INTO clanstvo VALUES ('lbarberic@foi.hr', 1);
  53. INSERT INTO clanstvo VALUES ('ihribljan@foi.hr', 2);
  54. INSERT INTO clanstvo VALUES ('kilicic@foi.hr', 3);
  55. INSERT INTO clanstvo VALUES ('tmitrovic@foi.hr', 4);
  56. INSERT INTO clanstvo VALUES ('tkeskic@foi.hr', 5);
  57.  
  58. CREATE TABLE vrsta_veze (
  59. sifra SERIAL PRIMARY KEY,
  60. naziv VARCHAR NOT NULL UNIQUE
  61. );
  62.  
  63. INSERT INTO vrsta_veze VALUES (DEFAULT, 'naziv1');
  64. INSERT INTO vrsta_veze VALUES (DEFAULT, 'naziv2');
  65. INSERT INTO vrsta_veze VALUES (DEFAULT, 'naziv3');
  66. INSERT INTO vrsta_veze VALUES (DEFAULT, 'naziv4');
  67. INSERT INTO vrsta_veze VALUES (DEFAULT, 'naziv5');
  68.  
  69. CREATE TABLE veza (
  70. poslao TEXT REFERENCES osoba( email )
  71. ON UPDATE CASCADE ON DELETE RESTRICT,
  72. prihvatio TEXT REFERENCES osoba( email )
  73. ON UPDATE CASCADE ON DELETE RESTRICT,
  74. vrsta INT REFERENCES vrsta_veze( sifra ),
  75. status VARCHAR( 10 ) CHECK( status =
  76. 'poslano' OR status = 'prihvaceno' ),
  77. PRIMARY KEY( poslao, prihvatio, vrsta )
  78.  );
  79.  
  80. INSERT INTO veza VALUES ('lbarberic@foi.hr', 'ihribljan@foi.hr', 1, 'poslano');
  81. INSERT INTO veza VALUES ('ihribljan@foi.hr', 'kilicic@foi.hr', 2, 'poslano');
  82. INSERT INTO veza VALUES ('kilicic@foi.hr', 'tmitrovic@foi.hr', 3, 'poslano');
  83. INSERT INTO veza VALUES ('tmitrovic@foi.hr', 'tkeskic@foi.hr', 4, 'prihvaceno');
  84. INSERT INTO veza VALUES ('tkeskic@foi.hr', 'lbarberic@foi.hr', 5, 'prihvaceno');
  85.  
  86. CREATE OR REPLACE FUNCTION upisi_u_grupu(email TEXT, naziv_grupe TEXT)
  87. RETURNS VOID
  88. AS 'INSERT INTO clanstvo SELECT $1, sifra FROM grupa WHERE naziv = $2'
  89. LANGUAGE SQL;
  90.  
  91. CREATE OR REPLACE FUNCTION ispisi_iz_grupe(email TEXT, naziv_grupe TEXT)
  92. RETURNS VOID
  93. AS 'DELETE FROM clanstvo WHERE clan = $1 AND grupa = (SELECT sifra FROM grupa WHERE naziv = $2)'
  94. LANGUAGE SQL;
  95.  
  96. CREATE OR REPLACE FUNCTION posalji_poruku(email_posiljatelja TEXT, email_primatelja TEXT, naslov TEXT, sadrzaj TEXT)
  97. RETURNS VOID
  98. AS 'INSERT INTO poruka values (default,$1,$2,$3,$4,default)'
  99. LANGUAGE SQL;
  100.  
  101. CREATE OR REPLACE FUNCTION moje_grupe(email TEXT)
  102. RETURNS SETOF TEXT
  103. AS 'SELECT naziv FROM grupa WHERE sifra IN (SELECT grupa FROM clanstvo WHERE clan = $1)'
  104. LANGUAGE SQL;
  105.  
  106. CREATE OR REPLACE FUNCTION moje_grupe_2(email TEXT)
  107. RETURNS SETOF grupa
  108. AS 'SELECT * FROM grupa WHERE sifra IN (SELECT grupa FROM clanstvo WHERE clan = $1)'
  109. LANGUAGE SQL;
  110.  
  111. CREATE TYPE inbox_popis AS (ime TEXT, prezime TEXT, sifra INT, naslov TEXT, vrijeme TIMESTAMP);
  112.  
  113. CREATE OR REPLACE FUNCTION inbox( email TEXT )
  114. RETURNS  SETOF inbox_popis
  115. AS 'SELECT o.ime, o.prezime, p.sifra, p.naslov, p.vrijeme
  116. FROM osoba o, poruka p
  117. WHERE o.email = p.posiljatelj
  118. AND p.primatelj = $1
  119. ORDER BY p.vrijeme'
  120. LANGUAGE SQL;
  121.  
  122. CREATE OR REPLACE FUNCTION zamolba( posiljatelj TEXT, primatelj TEXT, naziv_vrste TEXT )
  123. RETURNS VOID
  124. AS $$
  125. DECLARE
  126.  postoji BOOLEAN;
  127. DECLARE
  128.  sifra_vrste INT;
  129. BEGIN
  130. sifra_vrste := (
  131. SELECT sifra
  132. FROM vrsta_veze
  133. WHERE naziv =
  134. naziv_vrste);
  135. postoji := EXISTS(
  136. SELECT veza
  137. FROM veza
  138. WHERE poslao = posiljatelj
  139. AND prihvatio = primatelj
  140. AND vrsta = sifra_vrste);
  141. IF NOT postoji
  142. THEN
  143. INSERT INTO veza VALUES ( posiljatelj, primatelj, sifra_vrste, 'poslano' );
  144. ELSE
  145. RAISE EXCEPTION '%','Vec postoji takva veza';
  146. END IF;
  147. END;
  148. $$
  149. LANGUAGE plpgsql;
  150.  
  151. CREATE OR REPLACE FUNCTION
  152. nova_grupa( kreator TEXT, naziv_grupe TEXT )
  153. RETURNS VOID
  154. AS $$
  155. DECLARE postoji BOOLEAN;
  156. BEGIN
  157. postoji := EXISTS(SELECT naziv FROM grupa WHERE naziv = naziv_grupe);
  158. IF NOT postoji THEN
  159. INSERT INTO grupa( naziv ) VALUES ( naziv_grupe );
  160. PERFORM upisi_u_grupu(kreator, naziv_grupe );
  161. ELSE
  162. RAISE EXCEPTION '%', 'Vec postoji grupa pod nazivom ' || naziv_grupe;
  163. END IF;
  164. END;
  165. $$
  166. LANGUAGE plpgsql;
  167.  
  168. CREATE OR REPLACE FUNCTION registracija(email_novi TEXT, ime TEXT, prezime TEXT,grad TEXT,spol TEXT)
  169. RETURNS VOID AS $$
  170. DECLARE Postoji BOOLEAN;
  171. BEGIN
  172. Postoji:= EXISTS (Select email as broj from osoba where email=email_novi);
  173. IF NOT Postoji then
  174. insert into osoba values(email_novi,ime,prezime,grad,spol);
  175. ELSE
  176. RAISE EXCEPTION '%', 'Vec postoji korisnik sa emailom ' || email1;
  177. END IF;
  178. END;
  179. $$
  180. LANGUAGE plpgsql;
  181.  
  182. CREATE OR REPLACE FUNCTION provjeri_email()
  183. RETURNS TRIGGER
  184. AS $$
  185. BEGIN
  186. IF NEW.email LIKE '%@%' THEN
  187. RETURN NEW;
  188. ELSE
  189. RAISE EXCEPTION '%', 'E-mail adresa ne sadrzi znak ''@''';
  190. END IF;
  191. END;
  192. $$
  193. LANGUAGE plpgsql;
  194.  
  195. CREATE TRIGGER email_provjera
  196.  BEFORE INSERT OR UPDATE
  197.  ON osoba
  198.  FOR EACH ROW
  199.  EXECUTE PROCEDURE provjeri_email();
  200.  
  201. CREATE OR REPLACE FUNCTION nova_zamolba()
  202. RETURNS TRIGGER
  203. AS $$
  204.  DECLARE molitelj osoba;
  205.  DECLARE sadrzaj_poruke TEXT;
  206.  BEGIN
  207.  IF NEW.status = 'poslano' THEN
  208.  molitelj := (
  209.  SELECT osoba
  210.  FROM osoba
  211.  WHERE email = NEW.poslao
  212.  );
  213. sadrzaj_poruke := molitelj.ime || ' ' ||
  214.  molitelj.prezime || ' ti je poslao
  215.  zamolbu za prijateljstvom!';
  216.  INSERT INTO poruka(
  217.  posiljatelj, primatelj, naslov, sadrzaj )
  218.  VALUES( NEW.poslao, NEW.prihvatio, 'Nova
  219.  zamolba', sadrzaj_poruke );
  220. END IF;
  221. RETURN NEW;
  222. END;
  223. $$ LANGUAGE plpgsql;
  224.  
  225. CREATE TRIGGER poruka_uz_zamolbu
  226. BEFORE INSERT
  227. ON veza
  228. FOR EACH ROW
  229.  EXECUTE PROCEDURE nova_zamolba();
  230.  
  231. CREATE OR REPLACE FUNCTION veza_prihvacena()
  232. RETURNS TRIGGER
  233. AS $$
  234. DECLARE postoji BOOLEAN;
  235. BEGIN
  236. IF NEW.status = 'prihvaceno' THEN
  237. postoji := EXISTS(
  238. SELECT veza
  239. FROM veza
  240. WHERE poslao = NEW.prihvatio
  241. AND prihvatio = NEW.poslao
  242. AND vrsta = NEW.vrsta
  243. );
  244. IF NOT postoji THEN
  245. INSERT INTO veza
  246. VALUES ( NEW.prihvatio, NEW.poslao,
  247.  NEW.vrsta, 'prihvaceno' );
  248. END IF;
  249. END IF;
  250. RETURN NEW;
  251. END;
  252. $$
  253. LANGUAGE plpgsql;
  254.  
  255. CREATE TRIGGER prihvat_veze
  256. AFTER INSERT OR UPDATE
  257. ON veza
  258. FOR EACH ROW
  259.  EXECUTE PROCEDURE veza_prihvacena();
  260.  
  261. CREATE OR REPLACE FUNCTION jel_veza_prihvacena()
  262. RETURNS TRIGGER
  263. AS $$
  264. DECLARE Postojiveza BOOLEAN;
  265. BEGIN
  266. Postojiveza:= EXISTS (SELECT * FROM veza WHERE new.posiljatelj = poslao AND new.primatelj = prihvatio AND status = 'prihvaceno');
  267. IF NOT Postojiveza then
  268. INSERT INTO poruka VALUES (default, 'admin@mail.com', new.posiljatelj, 'Obavijest', 'Ne mozes poslati poruku korisniku ' || new.primatelj || ' jer nisi s njime povezan!!', default);
  269. RETURN OLD;
  270. ELSE
  271. RETURN NEW;
  272. END IF;
  273. END;
  274. $$
  275. LANGUAGE plpgsql;
  276.  
  277. CREATE TRIGGER provjera_veze
  278. BEFORE INSERT OR UPDATE
  279. ON poruka
  280. FOR EACH ROW
  281. EXECUTE PROCEDURE jel_veza_prihvacena();
  282.  
  283. CREATE OR REPLACE FUNCTION novo_clanstvo()
  284. RETURNS TRIGGER
  285. AS $$
  286. DECLARE prijatelj TEXT;
  287. DECLARE naziv_grupe TEXT;
  288. DECLARE sadrzaj_poruke TEXT;
  289. DECLARE novi_clan osoba;
  290. BEGIN
  291. naziv_grupe := (
  292. SELECT naziv
  293. FROM grupa
  294. WHERE sifra = NEW.grupa
  295. );
  296. novi_clan := (
  297. SELECT osoba
  298. FROM osoba
  299. WHERE email = NEW.clan
  300. );
  301. sadrzaj_poruke := novi_clan.ime || ' '
  302.  || novi_clan.prezime || ' je postao clan grupe '
  303.  || naziv_grupe || '!';
  304. FOR prijatelj IN SELECT DISTINCT prihvatio FROM
  305.  veza WHERE poslao = NEW.clan LOOP
  306. PERFORM posalji_poruku( NEW.clan,
  307. prijatelj,
  308.  'Novo clanstvo', sadrzaj_poruke );
  309. END LOOP;
  310. RETURN NEW;
  311. END;
  312.  $$ LANGUAGE plpgsql;
  313.  
  314. CREATE TRIGGER novi_clan_grupe
  315. AFTER INSERT
  316. ON clanstvo
  317. FOR EACH ROW
  318.  EXECUTE PROCEDURE novo_clanstvo();
  319.  
  320. CREATE OR REPLACE FUNCTION provjera_teme()
  321. RETURNS TRIGGER AS $$
  322. DECLARE Postojiporuka BOOLEAN;
  323. BEGIN
  324. Postojiporuka:= EXISTS (SELECT * FROM poruka WHERE (new.posiljatelj = posiljatelj AND new.primatelj = primatelj AND new.naslov = naslov) OR (new.posiljatelj = primatelj AND new.primatelj = posiljatelj AND new.naslov = naslov));
  325. IF Postojiporuka THEN
  326. INSERT INTO poruka VALUES (default, new.posiljatelj, new.primatelj, 'Re: ' || new.naslov, new.sadrzaj, default);
  327. RETURN OLD;
  328. ELSE
  329. RETURN NEW;
  330. END IF;
  331. END;
  332. $$
  333. LANGUAGE plpgsql;
  334.  
  335. CREATE TRIGGER provjera_teme_okidac
  336. BEFORE INSERT OR UPDATE
  337. ON poruka
  338. FOR EACH ROW
  339. EXECUTE PROCEDURE provjera_teme();
  340.  
  341. CREATE TABLE fotoalbum(
  342. sifra SERIAL PRIMARY KEY,
  343. opis TEXT,
  344. tip VARCHAR(3),
  345. slika OID,
  346. kljucne_rijeci VARCHAR(50)[5]
  347. );
  348.  
  349. CREATE TEMP TABLE
  350. evidencija_nastave(
  351. student VARCHAR( 20 ),
  352. dolasci BOOLEAN[]
  353. );
  354.  
  355. CREATE OR REPLACE FUNCTION ima_kljucnu_rijec(kr VARCHAR)
  356. RETURNS SETOF OID
  357. AS
  358. 'SELECT slika FROM fotoalbum WHERE $1 = ANY(kljucne_rijeci)'
  359. LANGUAGE SQL;
  360.  
  361. CREATE TYPE status AS ENUM (
  362. 'na vezi',
  363. 'nije na vezi',
  364. 'nepoznat'
  365. );
  366.  
  367. CREATE TEMP TABLE korisnik(
  368. kor_ime VARCHAR( 20 ),
  369. stanje STATUS DEFAULT 'nepoznat'
  370. );
  371.  
  372. INSERT INTO korisnik
  373. VALUES ( 'Ivan', 'na vezi' );
  374. INSERT INTO korisnik
  375. VALUES ( 'Luka', 'nije na vezi' );
  376. INSERT INTO korisnik
  377. VALUES ( 'Luka' );
  378.  
  379.  
  380. CREATE TYPE tip_adresa AS (
  381. ulica TEXT,
  382. broj INTEGER,
  383. post_broj INTEGER,
  384. grad TEXT,
  385. drzava TEXT
  386. );
  387.  
  388. CREATE TEMP TABLE kupac(
  389. sifra SERIAL PRIMARY KEY,
  390. ime TEXT,
  391. prezime TEXT,
  392. adresa tip_adresa
  393. );
  394.  
  395. CREATE TABLE admin(
  396. tel_br VARCHAR(10)
  397. ) INHERITS (osoba);
  398.  
  399. INSERT INTO admin( email, ime, prezime,
  400. tel_br ) VALUES ( 'zkovac@foi.hr',
  401. 'Zovko', 'Kovac', '0984345561' );
  402.  
  403. CREATE TABLE moderator(
  404. stanje STATUS DEFAULT 'nepoznat'
  405. ) INHERITS (osoba);
  406.  
  407. ALTER TABLE clanstvo
  408. ADD COLUMN vrijedece_vrijeme TSRANGE
  409.  DEFAULT tsrange( NOW()::TIMESTAMP, 'infinity'::TIMESTAMP );
  410.  
  411. ALTER TABLE clanstvo
  412. DROP CONSTRAINT clanstvo_pkey;
  413.  
  414. ALTER TABLE clanstvo
  415. ADD CONSTRAINT clanstvo_pkey
  416.  PRIMARY KEY( clan, grupa, vrijedece_vrijeme );
  417.  
  418. CREATE OR REPLACE FUNCTION promjena_clanstva()
  419. RETURNS TRIGGER
  420. AS $$
  421.  BEGIN
  422.  UPDATE clanstvo
  423.  SET vrijedece_vrijeme = tsrange(
  424.  LOWER( vrijedece_vrijeme )::TIMESTAMP,
  425.  NOW()::TIMESTAMP )
  426.  WHERE OLD.clan = clan
  427.  AND OLD.grupa = grupa
  428.  AND UPPER( vrijedece_vrijeme ) = 'infinity'::TIMESTAMP;
  429.  RETURN NULL;
  430.  END;
  431.  $$
  432.  LANGUAGE plpgsql;
  433.  
  434. CREATE TRIGGER temp_clanstvo
  435. BEFORE DELETE
  436. ON clanstvo
  437. FOR EACH ROW
  438. EXECUTE PROCEDURE promjena_clanstva();
  439.  
  440. ALTER TABLE poruka
  441. ADD COLUMN vrijedece_vrijeme TSRANGE
  442.  DEFAULT tsrange( NOW()::TIMESTAMP, 'infinity'::TIMESTAMP );
  443.  
  444. ALTER TABLE poruka
  445. DROP CONSTRAINT poruka_pkey;
  446.  
  447. ALTER TABLE poruka
  448. ADD CONSTRAINT poruka_pkey
  449.  PRIMARY KEY( sifra, vrijedece_vrijeme );
  450.  
  451. CREATE OR REPLACE FUNCTION promjena_poruke()
  452. RETURNS TRIGGER
  453. AS $$
  454.  BEGIN
  455.  UPDATE poruka
  456.  SET naslov = old.naslov || ' (obrisana poruka)',
  457.  vrijedece_vrijeme = tsrange(
  458.  LOWER( vrijedece_vrijeme )::TIMESTAMP,
  459.  NOW()::TIMESTAMP )
  460.  WHERE OLD.sifra = sifra
  461.  AND UPPER( vrijedece_vrijeme ) = 'infinity'::TIMESTAMP;
  462.  RETURN NULL;
  463.  END;
  464.  $$
  465.  LANGUAGE plpgsql;
  466.  
  467. CREATE TRIGGER temp_poruka
  468. BEFORE DELETE
  469. ON poruka
  470. FOR EACH ROW
  471. EXECUTE PROCEDURE promjena_poruke();
  472.  
  473. ALTER TABLE veza
  474. ADD COLUMN vrijedece_vrijeme TSRANGE
  475.  DEFAULT tsrange( NOW()::TIMESTAMP, 'infinity'::TIMESTAMP );
  476.  
  477. ALTER TABLE veza
  478. DROP CONSTRAINT veza_pkey;
  479.  
  480. ALTER TABLE veza
  481. ADD CONSTRAINT veza_pkey
  482.  PRIMARY KEY( poslao, prihvatio, vrsta, vrijedece_vrijeme );
  483.  
  484. CREATE OR REPLACE FUNCTION promjena_veze()
  485. RETURNS TRIGGER
  486. AS $$
  487.  BEGIN
  488.  UPDATE veza
  489.  SET vrijedece_vrijeme = tsrange(
  490.  LOWER( vrijedece_vrijeme )::TIMESTAMP,
  491.  NOW()::TIMESTAMP )
  492.  WHERE OLD.poslao = poslao
  493.  AND OLD.prihvatio = prihvatio
  494.  AND OLD.vrsta = vrsta
  495.  AND UPPER( vrijedece_vrijeme ) = 'infinity'::TIMESTAMP;
  496.  RETURN NULL;
  497.  END;
  498.  $$
  499.  LANGUAGE plpgsql;
  500.  
  501. CREATE TRIGGER temp_veza
  502. BEFORE DELETE
  503. ON veza
  504. FOR EACH ROW
  505. EXECUTE PROCEDURE promjena_veze();
  506.  
  507. COMMIT;