Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Function ip2num :: codereview / 6 сообщений из 6, страница 1 из 1
02.11.2018, 23:39
    #39727475
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function ip2num :: codereview
Привет коллеги.

Прошу сделать code-review фунеции и сказать что в ней не красиво и что
можно улучшить. Особо интересуют performance-issues и работа со строками.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
-- in - IP address in decimal format with dots. Ex: '127.0.0.1'
-- out - biginteger, that represents IP address.
create function ip2num(ip varchar) returns bigint as $$
declare 
  w text; 
  x text;
  y text;
  z text; 
  l   integer;
  cp  integer;
  cp2 integer; 
begin

  l := char_length(ip);
  if l > 15 then 
    return null;
  end if;  
  if l < 7 then 
    return null;
  end if;
  
  -- 192.168.1.1

  cp  := 1; 
  cp2 := position('.' in ip); -- 4
  l   := cp2 - cp; -- 3
  w   := substring(ip from cp for l); -- '192'

  cp  := cp2 + 1; -- 5
  cp2 := cp  + position('.' in substring(ip from cp)) - 1; -- 8
  l   := cp2 - cp; -- 8-5=3
  x   := substring(ip from cp for l); -- 168
  
  cp  := cp2 + 1; 
  cp2 := cp  + position('.' in substring(ip from cp)) - 1; 
  l   := cp2 - cp; 
  y   := substring(ip from cp for l); 

  z   := substring(ip from cp2 + 1);

  return 16777216 * cast(w as bigint) + 
            65536 * cast(x as bigint) + 
              256 * cast(y as bigint) + 
                    cast(z as bigint);
end;
$$ language plpgsql immutable;





Некоторое время назад я был озабочен IP-адресами и географией 17380387 и написал на Oracle несколько
PL/SQL функций для преобразования IP в целое число и обратно.

Понадобилось сделать этот-же функционал для PG-PLSQL.
...
Рейтинг: 0 / 0
03.11.2018, 00:34
    #39727481
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function ip2num :: codereview
mayton,

Код: sql
1.
SELECT ('127.0.0.1'::inet - '0.0.0.0'::inet) as ip_integer;
...
Рейтинг: 0 / 0
03.11.2018, 00:47
    #39727483
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function ip2num :: codereview
Хм... красиво. Но в моем варианте виден интерфейс функции.

Как быть с вашим решением если я захочу построить функциональный индекс по IP адресу?
...
Рейтинг: 0 / 0
03.11.2018, 01:10
    #39727485
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function ip2num :: codereview
mayton,

Код: sql
1.
2.
3.
4.
5.
6.
7.
create table i (id int, addr inet);
insert into i select g, 
((random()*254+1)::int||'.'||(random()*254+1)::int||'.'||(random()*254+1)::int||'.'||(random()*254+1)::int)::inet
 from generate_series(1,1000000) g;
create index i_addr on i((addr-'0.0.0.0'::inet));
analyze i;
explain select * from i where addr-'0.0.0.0'::inet < 10;
...
Рейтинг: 0 / 0
03.11.2018, 14:44
    #39727578
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function ip2num :: codereview
maytonОсобо интересуют performance-issues и работа со строками.
Ты в курсе, что числа в IP адресе, начинающиеся с нуля, считаются восьмеричными?
...
Рейтинг: 0 / 0
03.11.2018, 18:35
    #39727641
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function ip2num :: codereview
Dimitry SibiryakovmaytonОсобо интересуют performance-issues и работа со строками.
Ты в курсе, что числа в IP адресе, начинающиеся с нуля, считаются восьмеричными?
Да. Но это не полноценный парсер адресов. Я брал только формат MaxMind овской базы. Если копать так глубоко как вы предлагаете то я должен поддержать и hex и нотацию без разделителей.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Function ip2num :: codereview / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]