[MSSQL] Хранение ip в базе
От: Smilless Россия Хороший укроп — мертвый укроп!
Дата: 09.10.10 09:02
Оценка:
Собственно сабж, решил погуглить, для интереса

Нашел такой код:

using System;
using System.Data.SqlTypes;
using System.Net;
using System.Text;

/// <summary>
/// INet_NtoA and INet_AtoN MSSQL CLR.
/// This code will allow you to store IPv4 Addresses as INT64 values in the database, rather than a text string.
/// This allows you to sort the IP Address, where as it is difficult to do this if IP Addresses are stored as strings.
/// The INT 64 will allow you to sort it in proper subnet order.
/// </summary>

public partial class UserDefinedFunctions
{
    /// <summary>
    /// This function will take in an Int64 value, and convert it into a well formed IP Address.
    /// </summary>
    /// <param name="IP">Int64 Value that is the IP Address that wants converting.</param>
    /// <returns>Well formatted IP Address in string format. i.e. 10.10.10.254</returns>
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString INET_NTOA(long IP)
    {
        try
        {
            IPAddress ip = new IPAddress(IP);
            string szIpAddress = ip.ToString();
            string[] octets = szIpAddress.Split('.');
            int iCnt = octets.GetUpperBound(0);
            StringBuilder ipReversed = new StringBuilder();
            while (iCnt >= 0)
            {
                ipReversed.Append(octets[iCnt]);
                if (iCnt >= 1)
                {
                    ipReversed.Append(".");
                }
                iCnt--;
            }
            IPAddress address;
            if (!IPAddress.TryParse(ipReversed.ToString(), out address))
            {
                throw new ApplicationException("The IP provided to INET_AtoN is not valid.");
            }
            return ipReversed.ToString();
        }
        catch (Exception ex)
        {
            throw new ApplicationException("Unhandled exception occured converting, the following value '" + IP.ToString() + "' into a well formed IP Address. See inner exception for details", ex);
        }
    }
    /// <summary>
    /// Convert a well formed IP address back into its Int64, value for storing or sorting.
    /// </summary>
    /// <param name="IP">Well formed valid IP Address i.e. 10.10.10.10</param>
    /// <returns>SQLInt64 value of the converted IP Address string.</returns>
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlInt64 INET_ATON(string IP)
    {
        try
        {
            IPAddress address;
            if (!IPAddress.TryParse(IP, out address))
            {
                throw new ApplicationException("The IP provided to INet_AtoN is not valid.");
            }
            string[] szIpReverse = IP.Split('.');
            StringBuilder sbIPReversed = new StringBuilder();
            int iCntRv = szIpReverse.GetUpperBound(0);
            while (iCntRv >= 0)
            {
                sbIPReversed.Append(szIpReverse[iCntRv]);
                if (iCntRv >= 1)
                {
                    sbIPReversed.Append(".");
                }
                iCntRv--;
            }
            IPAddress oIP = IPAddress.Parse(sbIPReversed.ToString());
            byte[] byteIP = oIP.GetAddressBytes();
            uint uip = (uint)byteIP[3] << 24;
            uip += (uint)byteIP[2] << 16;
            uip += (uint)byteIP[1] << 8;
            uip += (uint)byteIP[0];
            return (SqlInt64)Convert.ToInt64(uip);
        }
        catch (Exception ex)
        {
            throw new ApplicationException("Unhandled exception whilst converting INet_AtoN address into a valid Int64 representation. Please see inner exception for details", ex);
        }
    }

};


И вот никак не могу понять, зачем он риверсирует IP? Т.е. можно же просто строку парсим и число сохраняем. И при обратном число достали в конструктор и на выход строку.
There are 10 types of people in the world: Those who understand binary, and those who don't.
Re: [MSSQL] Хранение ip в базе
От: Sinix  
Дата: 09.10.10 09:36
Оценка:
Здравствуйте, Smilless, Вы писали:

S>И вот никак не могу понять, зачем он риверсирует IP? Т.е. можно же просто строку парсим и число сохраняем. И при обратном число достали в конструктор и на выход строку.


Очевидно, для совместимости с inet_ntoa Function

P.S. А как вы будете хранить IPv6 адреса/машины с динамическим IP?
Re[2]: [MSSQL] Хранение ip в базе
От: Smilless Россия Хороший укроп — мертвый укроп!
Дата: 09.10.10 10:59
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, Smilless, Вы писали:


S>>И вот никак не могу понять, зачем он риверсирует IP? Т.е. можно же просто строку парсим и число сохраняем. И при обратном число достали в конструктор и на выход строку.


S>Очевидно, для совместимости с inet_ntoa Function


S>P.S. А как вы будете хранить IPv6 адреса/машины с динамическим IP?


Все равно не догоняю какой в этом сакраментальный смысл?

А этим куском кода
            byte[] byteIP = oIP.GetAddressBytes();
            uint uip = (uint)byteIP[3] << 24;
            uip += (uint)byteIP[2] << 16;
            uip += (uint)byteIP[1] << 8;
            uip += (uint)byteIP[0];

показано что ни о каких IPV6 мыслей не было и в помине.
There are 10 types of people in the world: Those who understand binary, and those who don't.
Re[3]: [MSSQL] Хранение ip в базе
От: Sinix  
Дата: 09.10.10 11:40
Оценка: 2 (1)
Здравствуйте, Smilless, Вы писали:

S>Все равно не догоняю какой в этом сакраментальный смысл?

Ну захотелось так человеку, нигде же не написано, что он делает правильно
Я бы использовал для конвертации IPAddress и хранил бы как varbinary(16).
А если делать по-хорошему — либо писать свой UDT, либо, не заморачиваясь, хранить строчкой (если адрес никак не будет обрабатываться и нужен только для отчётности).

S>показано что ни о каких IPV6 мыслей не было и в помине.

Никаких мыслей не было ещё на этапе преобразования IP в long

Я повторю свой вопрос — что вам требуется? Хранить IPv4/v6/имя машины?
й
Re[4]: [MSSQL] Хранение ip в базе
От: Smilless Россия Хороший укроп — мертвый укроп!
Дата: 09.10.10 18:25
Оценка: +1
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, Smilless, Вы писали:


S>>Все равно не догоняю какой в этом сакраментальный смысл?

S>Ну захотелось так человеку, нигде же не написано, что он делает правильно
S>Я бы использовал для конвертации IPAddress и хранил бы как varbinary(16).
S>А если делать по-хорошему — либо писать свой UDT, либо, не заморачиваясь, хранить строчкой (если адрес никак не будет обрабатываться и нужен только для отчётности).

S>>показано что ни о каких IPV6 мыслей не было и в помине.

S>Никаких мыслей не было ещё на этапе преобразования IP в long

S>Я повторю свой вопрос — что вам требуется? Хранить IPv4/v6/имя машины?


Угу именно так ip4 адрес и никаких ip6. Но из Ваших ответов думаю все уже понял, просто витиеватый ход мыслей того товарища ввел в ступор))))
There are 10 types of people in the world: Those who understand binary, and those who don't.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.