Advertisement
imcrazytwkr

Asagi SQL functions and triggers

Feb 25th, 2015
303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 8.65 KB | None | 0 0
  1. #thread updating PROCEDURE
  2. DROP PROCEDURE IF EXISTS "update_thread_%%BOARD%%";
  3. CREATE PROCEDURE "update_thread_%%BOARD%%" (tnum INT)
  4. BEGIN
  5.     UPDATE
  6.         "%%BOARD%%_threads" op
  7.     SET
  8.         op.time_last = (
  9.             COALESCE(GREATEST(
  10.                 op.time_op,
  11.                 (SELECT MAX(TIMESTAMP) FROM "%%BOARD%%" re FORCE INDEX(thread_num_subnum_index) WHERE
  12.                     re.thread_num = tnum
  13.                 AND
  14.                     re.subnum = 0)
  15.             ), op.time_op)
  16.         ),
  17.         op.time_bump = (
  18.             COALESCE(GREATEST(
  19.                 op.time_op,
  20.                 (SELECT MAX(TIMESTAMP) FROM "%%BOARD%%" re FORCE INDEX(thread_num_subnum_index) WHERE
  21.                     re.thread_num = tnum
  22.                 AND
  23.                     (re.email <> 'sage' OR re.email IS NULL) AND re.subnum = 0)
  24.             ), op.time_op)
  25.         ),
  26.         op.time_ghost = (
  27.             SELECT MAX(TIMESTAMP) FROM "%%BOARD%%" re FORCE INDEX(thread_num_subnum_index) WHERE
  28.                 re.thread_num = tnum
  29.             AND
  30.                 re.subnum <> 0
  31.         ),
  32.         op.time_ghost_bump = (
  33.             SELECT MAX(TIMESTAMP) FROM "%%BOARD%%" re FORCE INDEX(thread_num_subnum_index) WHERE
  34.                 re.thread_num = tnum
  35.             AND
  36.                 re.subnum <> 0 AND (re.email <> 'sage' OR re.email IS NULL)
  37.         ),
  38.         op.time_last_modified = (
  39.             COALESCE(GREATEST(
  40.                 op.time_op,
  41.                 (SELECT GREATEST(MAX(TIMESTAMP), MAX(timestamp_expired)) FROM "%%BOARD%%" re FORCE INDEX(thread_num_subnum_index) WHERE re.thread_num = tnum)
  42.             ), op.time_op)
  43.         ),
  44.         op.nreplies = (
  45.             SELECT COUNT(*) FROM "%%BOARD%%" re FORCE INDEX(thread_num_subnum_index) WHERE re.thread_num = tnum
  46.         ),
  47.         op.nimages = (
  48.             SELECT COUNT(media_hash) FROM "%%BOARD%%" re FORCE INDEX(thread_num_subnum_index) WHERE re.thread_num = tnum
  49.         )
  50.     WHERE op.thread_num = tnum;
  51. END;
  52.  
  53. #Thread creating PROCEDURE
  54. DROP PROCEDURE IF EXISTS "create_thread_%%BOARD%%";
  55. CREATE PROCEDURE "create_thread_%%BOARD%%" (num INT, TIMESTAMP INT)
  56. BEGIN
  57.     INSERT IGNORE INTO "%%BOARD%%_threads" VALUES (
  58.         num,
  59.         TIMESTAMP,
  60.         TIMESTAMP,
  61.         TIMESTAMP,
  62.         NULL,
  63.         NULL,
  64.         TIMESTAMP,
  65.         0,
  66.         0,
  67.         0,
  68.         0
  69.     );
  70. END;
  71.  
  72. #thread deletion PROCEDURE <= MAY DEPRECATE
  73. DROP PROCEDURE IF EXISTS "delete_thread_%%BOARD%%";
  74. CREATE PROCEDURE "delete_thread_%%BOARD%%" (tnum INT)
  75. BEGIN
  76.     DELETE FROM "%%BOARD%%_threads" WHERE thread_num = tnum;
  77. END;
  78.  
  79. #attahment insertion PROCEDURE <= needs TO be rewritten FOR multi-attachment support
  80. DROP PROCEDURE IF EXISTS "insert_image_%%BOARD%%";
  81. CREATE PROCEDURE "insert_image_%%BOARD%%" (n_media_hash VARCHAR(25), n_media VARCHAR(20), n_preview VARCHAR(20), n_op INT)
  82. BEGIN
  83.     IF n_op = 1 THEN
  84.         INSERT INTO "%%BOARD%%_images" (
  85.             media_hash,
  86.             media,
  87.             preview_op,
  88.             total
  89.         ) VALUES (
  90.             n_media_hash,
  91.             n_media,
  92.             n_preview,
  93.             1
  94.         )
  95.         ON DUPLICATE KEY UPDATE
  96.             media_id = LAST_INSERT_ID(media_id),
  97.             total = (total + 1),
  98.             preview_op = COALESCE(preview_op, VALUES(preview_op)),
  99.             media = COALESCE(media, VALUES(media));
  100.     ELSE
  101.         INSERT INTO "%%BOARD%%_images" (
  102.             media_hash,
  103.             media,
  104.             preview_reply,
  105.             total
  106.         ) VALUES (
  107.             n_media_hash,
  108.             n_media,
  109.             n_preview,
  110.             1
  111.         )
  112.         ON DUPLICATE KEY UPDATE
  113.             media_id = LAST_INSERT_ID(media_id),
  114.             total = (total + 1),
  115.             preview_reply = COALESCE(preview_reply, VALUES(preview_reply)),
  116.             media = COALESCE(media, VALUES(media));
  117.     END IF;
  118. END;
  119.  
  120. #attachment deletion PROCEDURE
  121. DROP PROCEDURE IF EXISTS "delete_image_%%BOARD%%";
  122. CREATE PROCEDURE "delete_image_%%BOARD%%" (n_media_id INT)
  123. BEGIN
  124.     UPDATE "%%BOARD%%_images" SET total = (total - 1) WHERE media_id = n_media_id;
  125. END;
  126.  
  127. #post insertion PROCEDURE
  128. DROP PROCEDURE IF EXISTS "insert_post_%%BOARD%%";
  129. CREATE PROCEDURE "insert_post_%%BOARD%%" (p_timestamp INT, p_media_hash VARCHAR(25), p_email VARCHAR(100), p_name VARCHAR(100), p_trip VARCHAR(25))
  130. BEGIN
  131.     DECLARE d_day INT;
  132.     DECLARE d_image INT;
  133.     DECLARE d_sage INT;
  134.     DECLARE d_anon INT;
  135.     DECLARE d_trip INT;
  136.     DECLARE d_name INT;
  137.     SET d_day = FLOOR(p_timestamp/86400)*86400;
  138.     SET d_image = p_media_hash IS NOT NULL;
  139.     SET d_sage = COALESCE(p_email = 'sage', 0);
  140.     SET d_anon = COALESCE(p_name = 'Anonymous' AND p_trip IS NULL, 0);
  141.     SET d_trip = p_trip IS NOT NULL;
  142.     SET d_name = COALESCE(p_name <> 'Anonymous' AND p_trip IS NULL, 1);
  143.     INSERT INTO "%%BOARD%%_daily" VALUES(
  144.         d_day,
  145.         1,
  146.         d_image,
  147.         d_sage,
  148.         d_anon,
  149.         d_trip,
  150.         d_name
  151.     )
  152.     ON DUPLICATE KEY UPDATE
  153.         posts=posts+1,
  154.         images=images+d_image,
  155.         sage=sage+d_sage,
  156.         anons=anons+d_anon,
  157.         trips=trips+d_trip,
  158.         names=names+d_name;
  159.     IF (SELECT trip FROM "%%BOARD%%_users" WHERE trip = p_trip) IS NOT NULL THEN
  160.         UPDATE "%%BOARD%%_users" SET
  161.             postcount=postcount+1,
  162.             firstseen = LEAST(p_timestamp, firstseen),
  163.             name = COALESCE(p_name, '')
  164.         WHERE trip = p_trip;
  165.     ELSE
  166.         INSERT INTO "%%BOARD%%_users" VALUES(
  167.             NULL,
  168.             COALESCE(p_name,''),
  169.             COALESCE(p_trip,''),
  170.             p_timestamp,
  171.             1
  172.         )
  173.         ON DUPLICATE KEY UPDATE
  174.             postcount=postcount+1,
  175.             firstseen = LEAST(VALUES(firstseen), firstseen),
  176.             name = COALESCE(p_name, '');
  177.     END IF;
  178. END;
  179.  
  180. #post deletion PROCEDURE
  181. DROP PROCEDURE IF EXISTS "delete_post_%%BOARD%%";
  182. CREATE PROCEDURE "delete_post_%%BOARD%%" (p_timestamp INT, p_media_hash VARCHAR(25), p_email VARCHAR(100), p_name VARCHAR(100), p_trip VARCHAR(25))
  183. BEGIN
  184.     DECLARE d_day INT;
  185.     DECLARE d_image INT;
  186.     DECLARE d_sage INT;
  187.     DECLARE d_anon INT;
  188.     DECLARE d_trip INT;
  189.     DECLARE d_name INT;
  190.     SET d_day = FLOOR(p_timestamp/86400)*86400;
  191.     SET d_image = p_media_hash IS NOT NULL;
  192.     SET d_sage = COALESCE(p_email = 'sage', 0);
  193.     SET d_anon = COALESCE(p_name = 'Anonymous' AND p_trip IS NULL, 0);
  194.     SET d_trip = p_trip IS NOT NULL;
  195.     SET d_name = COALESCE(p_name <> 'Anonymous' AND p_trip IS NULL, 1);
  196.     UPDATE "%%BOARD%%_daily" SET
  197.         posts=posts-1,
  198.         images=images-d_image,
  199.         sage=sage-d_sage,
  200.         anons=anons-d_anon,
  201.         trips=trips-d_trip,
  202.         names=names-d_name
  203.     WHERE DAY = d_day;
  204.     IF (SELECT trip FROM "%%BOARD%%_users" WHERE trip = p_trip) IS NOT NULL THEN
  205.         UPDATE "%%BOARD%%_users" SET postcount = postcount-1 WHERE trip = p_trip;
  206.     ELSE
  207.         UPDATE "%%BOARD%%_users" SET postcount = postcount-1 WHERE name = COALESCE(p_name, '') AND trip = COALESCE(p_trip, '');
  208.     END IF;
  209. END;
  210.  
  211. #pre-insertion CHECK?
  212. DROP TRIGGER IF EXISTS "before_ins_%%BOARD%%";
  213. CREATE TRIGGER "before_ins_%%BOARD%%" BEFORE INSERT ON "%%BOARD%%"
  214.     FOR EACH ROW BEGIN
  215.         IF NEW.media_hash IS NOT NULL THEN
  216.             CALL insert_image_%%BOARD%%(
  217.                 NEW.media_hash,
  218.                 NEW.media_orig,
  219.                 NEW.preview_orig,
  220.                 NEW.op
  221.             );
  222.             SET NEW.media_id = LAST_INSERT_ID();
  223.         END IF;
  224. END;
  225.  
  226. #post-insertion CHECK?
  227. DROP TRIGGER IF EXISTS "after_ins_%%BOARD%%";
  228. CREATE TRIGGER "after_ins_%%BOARD%%" AFTER INSERT ON "%%BOARD%%"
  229.     FOR EACH ROW BEGIN
  230.         IF NEW.op = 1 THEN
  231.             CALL create_thread_%%BOARD%%(
  232.                 NEW.num,
  233.                 NEW.TIMESTAMP
  234.             );
  235.         END IF;
  236.         CALL update_thread_%%BOARD%%(NEW.thread_num);
  237.         CALL insert_post_%%BOARD%%(
  238.             NEW.TIMESTAMP,
  239.             NEW.media_hash,
  240.             NEW.email,
  241.             NEW.name,
  242.             NEW.trip
  243.         );
  244. END;
  245.  
  246. #after deletion
  247. DROP TRIGGER IF EXISTS "after_del_%%BOARD%%";
  248. CREATE TRIGGER "after_del_%%BOARD%%" AFTER DELETE ON "%%BOARD%%"
  249.     FOR EACH ROW BEGIN
  250.         CALL update_thread_%%BOARD%%(OLD.thread_num);
  251.         IF OLD.op = 1 THEN
  252.             CALL delete_thread_%%BOARD%%(OLD.num);
  253.         END IF;
  254.         CALL delete_post_%%BOARD%%(
  255.             OLD.TIMESTAMP,
  256.             OLD.media_hash,
  257.             OLD.email,
  258.             OLD.name,
  259.             OLD.trip
  260.         );
  261.         IF OLD.media_hash IS NOT NULL THEN
  262.             CALL delete_image_%%BOARD%%(OLD.media_id);
  263.         END IF;
  264. END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement