Как сохранить 128-битное целое число с помощью nHibernate? - PullRequest
3 голосов
/ 02 сентября 2011

Вопрос:

Как мне сохранить 128-битное целое число (IPv6) с помощью nHibernate?

Особенно в Firebird, где размер BigInteger MAX равен 2 ^ 64.

Я хочу сделать расчеты как:

SELECT * FROM T_Country_IP_Range 
WHERE 
(block_from <= @in_IP) 
AND (block_to >= @in_ip)

Так что хранить его как text / varchar / char не вариант.

1 Ответ

2 голосов
/ 03 сентября 2011

Кажется, действительно, что нет поддержки firebird для INT128.

Что вы можете сделать, это представить 128 битов как два 64-битных поля, верхние 64 бита в одном поле (IP_upper) и младшие 64 бита в другом (IP_Lower).

Все операции сравнения должны сравнивать оба поля. Если верхнее поле меньше / больше или оно равно, а затем проверьте нижнее поле:

SELECT * FROM T_Country_IP_Range 
WHERE 
(
    block_from_upper < @in_IP_upper 
    OR 
    (block_from_upper = @in_IP_upper AND block_from_lower <= @in_IP_lower)
) 
AND 
(
    block_to_upper > @in_IP_upper 
    OR 
    (block_to_upper = @in_IP_upper AND block_to_lower >= @in_IP_lower)
)

Вроде неловко, без сомнения

...