PostgreSQL. Функции. Шифрование…

На предыдущую страницу…

Важно!
1. При копировании текстов функций этого раздела, следует «крупно иметь в виду», что существенная часть функций вызывает другие функции (размещенные в этом разделе, а также и в других разделах тоже).
2. Чтобы компенсировать этот момент — в конце страницы можно скачать исходные тексты всех функций в формате PG-backup (SQL-текст).


Иной раз возникает необходимость простого шифрования текста при хранении его в БД.
Ниже приведена пара предназначенных для этого функций:

  • str_ultrasimple_code — ультра простой (и ультра «неэкономичный») алгоритм шифрования текста;
  • str_ultrasimple_decode — алгоритм расшифровки текста, зашифрованного функцией str_ultrasimple_code().

CREATE OR REPLACE FUNCTION public.str_ultrasimple_code(sx text)
  RETURNS text AS
$BODY$
DECLARE
  res text;
  sn character varying;
  i integer;
  m integer;
  n integer;
  ch char(1);
BEGIN
  /*
    Ультра простой (и ультра "неэкономичный") алгоритм шифрования текста
    Пример вызова:
      select str_ultrasimple_code ('Как дела?'); -- "813 7231 8331 2331 1331 99- 7331 7231 5031"
      select str_ultrasimple_code ('Привет, как дела? Нормально...'); -- 103 103 103 1431 0431 5531 8331 7231 9331 3431 1431 8031 99- 813 7231 8331 2331 1331 99- 7331 7231 7331 99- 992 5431 2331 9231 5331 3431 0131
  */
  res = '';
  IF (sx is not null) THEN
     IF (sx <> '') THEN
        sx = reverse(sx);
        m = char_length(sx);
        i = 0;
        WHILE i<m LOOP
          i = i + 1;
          ch = substring(sx,i,1);
          IF (ch <> ' ') THEN
             n = ascii(ch);
             n = n + 255;
          ELSE
             n = -99;
          END IF;
          sn = int_as_str(n);
          sn = reverse(sn);
          res = res || sn || ' ';
        END LOOP;
        res = str_is_null(res);
     END IF;
  END IF;
  RETURN res;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
COMMENT ON FUNCTION public.str_ultrasimple_code(text) IS 'УльтраУльтра простой (и ультра "неэкономичный") алгоритм шифрования текста';

CREATE OR REPLACE FUNCTION public.str_ultrasimple_decode(sx text)
  RETURNS text AS
$BODY$
DECLARE
  res text;
  sn character varying;
  n1 integer;
  n2 integer;
  ch char(1);
BEGIN
  /*
    Алгоритм расшифровки текста, зашифрованного функцией str_ultrasimple_code()
    Пример вызова:
      select str_ultrasimple_decode ('813 7231 8331 2331 1331 99- 7331 7231 5031'); -- "Как дела?"
      select str_ultrasimple_decode ('103 103 103 1431 0431 5531 8331 7231 9331 3431 1431 8031 99- 813 7231 8331 2331 1331 99- 7331 7231 7331 99- 992 5431 2331 9231 5331 3431 0131'); -- "Привет, как дела? Нормально..."
      select str_ultrasimple_decode(str_ultrasimple_code('Привет, как дела? Нормально...')); -- "Привет, как дела? Нормально..." ;
select
str_ultrasimple_decode
(
str_ultrasimple_code
(
'Прошло немало лет с тех пор как компьютеры появились в школе и дома.
В школе вы изучаете с их помощью информатику (что полезно), а дома он служит вам партнёром для игр (что приятно).
А цель этой книги - показать, как можно сочетать приятное с полезным, то есть использовать компьютер при изучении школьной программы.
В этой книге вы найдёте несколько десятков уроков по разным школьным предметам. И уроки эти не простые, а занимательные!
Поэтому на каждом уроке мы будем пи-сать интересные компьютерные программы.
'
)
);
  */
  res = '';
  sx = str_is_null(sx);
  IF (sx <> '') THEN
     IF (sx <> '') THEN
        sx = sx || chr(32);
        sn = '';
        n1 = 1;
        WHILE (n1>0) LOOP
          n1 = strpos(sx, chr(32));
          IF (n1>0) THEN
             sn = str_is_null(substr(sx, 1, n1));
             sn = reverse(sn);
             n2 = str_as_int(sn);
             IF (n2>0) THEN
                n2 = n2 - 255;
                ch = chr(n2);
                res = res || ch;
             ELSE
                res = res || chr(32);
             END IF;
             sx = str_is_null(substr(sx, n1,  char_length(sx)));
          END IF;
        END LOOP;
        sx = str_is_null(sx);
        IF (sx <> '') THEN
           sn = sx;
           sn = reverse(sn);
           n2 = str_as_int(sn);
           IF (n2>0) THEN
              n2 = n2 - 255;
              ch = chr(n2);
              res = res || ch;
           ELSE
              res = res || chr(32);
           END IF;
        END IF;
        res = str_is_null(res);
        res = reverse(res);
     END IF;
  END IF;
  RETURN res;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
COMMENT ON FUNCTION public.str_ultrasimple_decode(text) IS 'Алгоритм расшифровки текста, зашифрованного функцией str_ultrasimple_code()';


Скачать PG-backup (SQL-текст функций)


На предыдущую страницу…

Дата: 10.12.2021