Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2. Not the best of my code, but something I can share
  3. */
  4.  
  5. --filling data for testing, "time" column is filled with present data minus 2 days:
  6. BEGIN
  7. INSERT INTO "security"."COMPANY_OTP" ("sessionId", "password", "time")
  8. SELECT '523' AS "sessionId", 'wer' AS "password", SYSDATE - 2 AS "time" FROM dual;
  9. COMMIT;
  10. END;
  11.  
  12. --display all records that are older than 10 min (deleting them as well)
  13. SELECT t."SESSIONID", t."TIME", t."TRIES", t."PASSWORD", t."LIFETIME_MINUTES", t."RESULT"
  14. FROM TABLE("security"."pkg_company_otp".fn_tshow_10min) t
  15.  
  16. --ensure that old record is already absent:
  17. SELECT t.* FROM "security"."COMPANY_OTP" t
  18.  
  19. /*
  20.   b. Number "3" - if record age is more than 10 min (after creating - "time" column) for sessionId and password pair, then the record is deleted
  21. */
  22.  
  23. --filling data for testing, "time" column is filled with present data minus 2 days:
  24. BEGIN
  25. INSERT INTO "security"."COMPANY_OTP" ("sessionId", "password", "time")
  26. SELECT '523' AS "sessionId", 'wer' AS "password", SYSDATE - 2 AS "time" FROM dual;
  27. COMMIT;
  28. END;
  29.  
  30. --display the record just entered, column RESULT should return number 3, record is deleted
  31. SELECT t."SESSIONID", t."TIME", t."TRIES", t."PASSWORD", t."LIFETIME_MINUTES", t."RESULT", t."ACOMMENT"
  32. FROM TABLE("security"."pkg_company_otp".fn_tshow(
  33.                                                parSESSIONID => '523',
  34.                                                parPASSWORD  => 'khv'  
  35.                                              )                        
  36.           ) t
  37.  
  38. --insert test data ("time" is autofilled with present date and time)
  39. BEGIN
  40. INSERT INTO "security"."COMPANY_OTP" ("sessionId", "password")
  41. SELECT '423' AS "sessionId", 'ver' AS "password" FROM dual;
  42. COMMIT;
  43. END;
  44.  
  45.  
  46. ---------------------------------------------------------------
  47.  
  48. --create result table
  49. --------------------------------------------------------
  50. --  DDL for Table COMPANY_OTP
  51. --------------------------------------------------------
  52.  
  53. BEGIN
  54.   EXECUTE IMMEDIATE 'DROP TABLE security.COMPANY_OTP';
  55. EXCEPTION
  56.   WHEN OTHERS THEN
  57.     NULL;
  58. END;
  59. /
  60.  
  61.   CREATE TABLE "security"."COMPANY_OTP"
  62.    (   
  63.   "ID"              VARCHAR2(36 BYTE)                      DEFAULT SYS_GUID(),
  64.   "sessionId"       VARCHAR2(100 BYTE)                     NOT NULL,
  65.   "tries"           NUMBER(1,0)                            DEFAULT 0,
  66.   "password"        VARCHAR2(99 BYTE)                      NOT NULL,
  67.   "time"            DATE                                   DEFAULT SYSDATE,
  68.   "auser"           VARCHAR2(99 BYTE)                      DEFAULT USER
  69.    );
  70.  
  71.    CREATE UNIQUE INDEX "security"."COMPANY_OTP_ID2" ON "security"."COMPANY_OTP" ("sessionId");
  72.    CREATE INDEX "security"."COMPANY_OTP_ID1" ON "security"."COMPANY_OTP" ("sessionId", "tries", "password", "time");
  73.  
  74.    COMMENT ON TABLE "security"."COMPANY_OTP" IS 'check entered temporary password OTP';
  75.    COMMENT ON COLUMN "security"."COMPANY_OTP"."sessionId" IS 'record ID';
  76.    COMMENT ON COLUMN "security"."COMPANY_OTP"."sessionId" IS 'session ID';
  77.    COMMENT ON COLUMN "security"."COMPANY_OTP"."tries" IS 'tries';
  78.    COMMENT ON COLUMN "security"."COMPANY_OTP"."password" IS 'password';
  79.    COMMENT ON COLUMN "security"."COMPANY_OTP"."time" IS 'Record date and time';
  80.    COMMENT ON COLUMN "security"."COMPANY_OTP"."auser" IS 'Oracle user that entered record';
  81.    
  82.    
  83. --------------------------------------------------------
  84. --  DDL for Package pkg_company_otp
  85. --------------------------------------------------------
  86.  
  87. CREATE OR REPLACE PACKAGE "security"."pkg_company_otp" IS
  88.  
  89. TYPE tshow_type IS RECORD
  90. (
  91.   "ID"                      VARCHAR2(36 BYTE)                    ,
  92.   "sessionId"               VARCHAR2(100 BYTE)                   ,
  93.   "tries"                   NUMBER  (1,0    )                    ,
  94.   "password"                VARCHAR2(99 BYTE)                    ,
  95.   "time"                    VARCHAR2(99 BYTE)                    ,
  96.   "lifetime_minutes"        NUMBER                               ,
  97.   "result"                  NUMBER  (1,0    )                    ,
  98.   "acomment"                VARCHAR2(99 BYTE)                    ,
  99.   "auser"                   VARCHAR2(99 BYTE)                    
  100. );
  101.  
  102. TYPE tshow IS TABLE OF tshow_type;
  103.  
  104. FUNCTION fn_tshow_10min RETURN tshow pipelined;
  105.  
  106. FUNCTION fn_tshow(parSESSIONID VARCHAR2, parPASSWORD VARCHAR2) RETURN tshow pipelined;
  107.  
  108. PROCEDURE pr_del_2b(parSESSIONID VARCHAR2);
  109.  
  110. PROCEDURE pr_del_2c(parSESSIONIDpr VARCHAR2, parPASSWORDpr VARCHAR2);
  111.  
  112. PROCEDURE pr_del_2d(parSESSIONIDpr VARCHAR2, parPASSWORDpr VARCHAR2);
  113.  
  114. PROCEDURE pr_upd_2e(parSESSIONIDpr VARCHAR2, parPASSWORDpr VARCHAR2);
  115.  
  116. END;
  117.  
  118. /
  119.  
  120.  
  121.  
  122.  
  123. --------------------------------------------------------
  124. --  DDL for Package Body pkg_company_otp
  125. --------------------------------------------------------
  126.  
  127. CREATE OR REPLACE PACKAGE BODY "security"."pkg_company_otp" IS
  128.  
  129. FUNCTION fn_tshow_10min RETURN tshow pipelined IS
  130. v_obj tshow_type;
  131.  
  132. BEGIN
  133.  
  134. FOR e IN (
  135.  
  136.     SELECT
  137.            t."ID",
  138.            t."sessionId",
  139.            t."tries",
  140.            t."password",
  141.            TO_CHAR(SYSDATE, 'DD.MM.YYYY HH24:MI:SS') AS asysdate,
  142.            TO_CHAR(t."time", 'DD.MM.YYYY HH24:MI:SS') AS "time",
  143.            ROUND((SYSDATE - t."time")*24*60,1) AS "lifetime_minutes",
  144.            CASE WHEN SYSDATE - t."time" >= 10/(24*60)
  145.                 THEN 3
  146.                 ELSE 1
  147.            END AS "result",
  148.            'all found values (previously inserted)' AS "acomment",
  149.            t."auser"
  150.     FROM "security"."COMPANY_OTP" t
  151.     WHERE SYSDATE - t."time" >= 10/(24*60)
  152.  
  153.          )
  154. LOOP
  155.  
  156.   v_obj."ID"                              := e."ID";
  157.   v_obj."sessionId"                       := e."sessionId";
  158.   v_obj."time"                            := e."time";
  159.   v_obj."tries"                           := e."tries";
  160.   v_obj."password"                        := e."password";
  161.   v_obj."lifetime_minutes"                := e."lifetime_minutes";
  162.   v_obj."result"                          := e."result";
  163.   v_obj."acomment"                        := e."acomment";
  164.   v_obj."auser"                           := e."auser";
  165.  
  166.  
  167. PIPE ROW (v_obj);
  168. IF e."result" = 3 THEN pr_del_2b(
  169.                                  parSESSIONID => e."sessionId"
  170.                                 );
  171. END IF;
  172. END LOOP;
  173.  
  174. RETURN;
  175.  
  176. END;
  177.  
  178. FUNCTION fn_tshow(parSESSIONID VARCHAR2, parPASSWORD VARCHAR2) RETURN tshow pipelined IS
  179.  
  180. v_obj tshow_type;
  181.  
  182. BEGIN
  183.     BEGIN
  184.     pr_upd_2e(
  185.                parSESSIONIDpr => parSESSIONID,
  186.                parPASSWORDpr  => parPASSWORD
  187.              );
  188.     END;
  189. FOR e IN (
  190.  
  191.     SELECT
  192.            t."ID",
  193.            t."sessionId",
  194.            t."tries",
  195.            t."password",
  196.            TO_CHAR(SYSDATE, 'DD.MM.YYYY HH24:MI:SS') AS asysdate,
  197.            TO_CHAR(t."time", 'DD.MM.YYYY HH24:MI:SS') AS "time",
  198.            ROUND((SYSDATE - t."time")*24*60,1) AS "lifetime_minutes",
  199.            CASE WHEN SYSDATE - t."time" >= 10/(24*60)
  200.                 THEN 3
  201.                 ELSE NULL
  202.            END AS "result",
  203.            'current sessionId' AS "acomment",
  204.            t."auser"
  205.     FROM "security"."COMPANY_OTP" t
  206.     WHERE t."sessionId" = parSESSIONID
  207.       AND SYSDATE - t."time" >= 10/(24*60)
  208.     UNION ALL
  209.     SELECT
  210.            t."ID",
  211.            t."sessionId",
  212.            t."tries",
  213.            t."password",
  214.            TO_CHAR(SYSDATE, 'DD.MM.YYYY HH24:MI:SS') AS asysdate,
  215.            TO_CHAR(t."time", 'DD.MM.YYYY HH24:MI:SS') AS "time",
  216.            ROUND((SYSDATE - t."time")*24*60,1) AS "lifetime_minutes",
  217.            CASE WHEN SYSDATE - t."time" >= 10/(24*60)
  218.                 THEN 3
  219.                 ELSE NULL
  220.            END AS "result",
  221.            'all found values (previously inserted)' AS "acomment",
  222.            t."auser"
  223.     FROM "security"."COMPANY_OTP" t
  224.     WHERE SYSDATE - t."time" >= 10/(24*60)
  225.       AND t."sessionId" <> parSESSIONID
  226.     UNION ALL
  227.     SELECT
  228.            t."ID",
  229.            t."sessionId",
  230.            t."tries",
  231.            t."password",
  232.            TO_CHAR(SYSDATE, 'DD.MM.YYYY HH24:MI:SS') AS asysdate,
  233.            TO_CHAR(t."time", 'DD.MM.YYYY HH24:MI:SS') AS "time",
  234.            ROUND((SYSDATE - t."time")*24*60,1) AS "lifetime_minutes",
  235.            CASE WHEN NOT ( SYSDATE - t."time" >= 10/(24*60) )
  236.                 THEN
  237.                      CASE WHEN T."tries" > 2
  238.                           THEN 2
  239.                           ELSE
  240.                                CASE WHEN T."tries" <= 2 AND t."sessionId" = parSESSIONID AND T."password" <> parPASSWORD
  241.                                     THEN 0
  242.                                     ELSE 1
  243.                                END
  244.                      END
  245.                 ELSE NULL
  246.            END AS "result",
  247.            'all found values (previously inserted)' AS "acomment",
  248.            t."auser"
  249.     FROM "security"."COMPANY_OTP" t
  250.     WHERE NOT ( SYSDATE - t."time" >= 10/(24*60) )
  251.       AND t."sessionId" = parSESSIONID
  252.  
  253.          )
  254. LOOP
  255.  
  256.   v_obj."ID"                              := e."ID";
  257.   v_obj."sessionId"                       := e."sessionId";
  258.   v_obj."time"                            := e."time";
  259.   v_obj."tries"                           := e."tries";
  260.   v_obj."password"                        := e."password";
  261.   v_obj."acomment"                        := e."acomment";
  262.   v_obj."lifetime_minutes"                := e."lifetime_minutes";
  263.   v_obj."result"                          := e."result";
  264.   v_obj."auser"                           := e."auser";
  265.  
  266.  
  267. PIPE ROW (v_obj);
  268. IF e."result" = 3 THEN pr_del_2b(
  269.                                  parSESSIONID => e."sessionId"
  270.                                 );
  271. END IF;
  272. IF e."result" = 1 THEN pr_del_2c(
  273.                                  parSESSIONIDpr => parSESSIONID,
  274.                                  parPASSWORDpr  => parPASSWORD
  275.                                 );
  276. END IF;
  277. IF e."result" = 2 THEN pr_del_2d(
  278.                                  parSESSIONIDpr => parSESSIONID,
  279.                                  parPASSWORDpr  => parPASSWORD
  280.                                 );
  281. END IF;
  282. /*IF e."result" = 0 THEN pr_upd_2e(
  283.                                  parSESSIONIDpr => parSESSIONID,
  284.                                  parPASSWORDpr  => parPASSWORD
  285.                                 );
  286. END IF;*/
  287. END LOOP;
  288.  
  289. RETURN;
  290.  
  291. END;
  292.  
  293. PROCEDURE pr_del_2b(parSESSIONID VARCHAR2) IS
  294. PRAGMA AUTONOMOUS_TRANSACTION;
  295. BEGIN
  296.   DELETE FROM "security"."COMPANY_OTP" T WHERE T."sessionId" = parSESSIONID;
  297.   COMMIT;
  298. END;
  299.  
  300. PROCEDURE pr_del_2c(parSESSIONIDpr VARCHAR2, parPASSWORDpr VARCHAR2) IS
  301. PRAGMA AUTONOMOUS_TRANSACTION;
  302. BEGIN
  303.   DELETE FROM "security"."COMPANY_OTP" T
  304.   WHERE T."sessionId" = parSESSIONIDpr
  305.     AND T."password"  = parPASSWORDpr
  306.     AND T."tries" <= 2;
  307.   COMMIT;
  308. END;
  309.  
  310. PROCEDURE pr_del_2d(parSESSIONIDpr VARCHAR2, parPASSWORDpr VARCHAR2) IS
  311. PRAGMA AUTONOMOUS_TRANSACTION;
  312. BEGIN
  313.   DELETE FROM "security"."COMPANY_OTP" T
  314.   WHERE T."sessionId" = parSESSIONIDpr
  315.     AND T."password" <> parPASSWORDpr
  316.     AND T."tries" > 2;
  317.   COMMIT;
  318. END;
  319.  
  320. PROCEDURE pr_upd_2e(parSESSIONIDpr VARCHAR2, parPASSWORDpr VARCHAR2) IS
  321. PRAGMA AUTONOMOUS_TRANSACTION;
  322. BEGIN
  323.   UPDATE "security"."COMPANY_OTP" T
  324.   SET T."tries" = T."tries" + 1
  325.   WHERE T."sessionId" = parSESSIONIDpr
  326.     AND T."password" <> parPASSWORDpr;
  327. COMMIT;
  328. END;
  329.  
  330. END;
  331.  
  332. /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement