代码之家  ›  专栏  ›  技术社区  ›  chrispytoes

PL/pgSQL中的IP增量函数

  •  2
  • chrispytoes  · 技术社区  · 2 年前

    我需要一个PL/pgSQL函数,它将IP地址作为文本,并向其添加给定的整数值,根据需要携带八位字节。

    我已经有了一个用JavaScript编写的工作版本:

    export const incrementIpAddress = (ipAddress: string, amount: number) => {
        const octets = ipAddress.split('.');
        const numbers = octets.map(octet => parseInt(octet));
    
        let carry = amount;
        for(let i = numbers.length - 1; i >= 0 && carry > 0; i--) {
            const sum = numbers[i] + carry;
            numbers[i] = sum % 256;
            carry = Math.floor(sum / 256);
        }
    
        return numbers.join('.');
    }
    

    我试着让ChatGPT将其转换为PL/pgSQL(我知道,很抱歉),结果如下:

    CREATE OR REPLACE FUNCTION increment_ip_address(ip_address text, amount integer) RETURNS text AS $$
    DECLARE
        octets text[];
        numbers integer[];
        carry integer;
        i integer;
    BEGIN
        octets := string_to_array(ip_address, '.');
        FOREACH i IN ARRAY octets LOOP
            numbers := numbers || i::integer;
        END LOOP;
    
        carry := amount;
        FOR i IN REVERSE 1 .. array_upper(numbers, 1) LOOP
            numbers[i] := numbers[i] + carry;
            carry := FLOOR(numbers[i] / 256);
            numbers[i] := numbers[i] % 256;
        END LOOP;
    
        RETURN array_to_string(numbers, '.')::text;
    END;
    $$ LANGUAGE plpgsql;
    

    然而,这不起作用,并且总是输出与给定IP相同的IP,而不是递增。我能得到一些帮助使这个功能正常工作吗?

    1 回复  |  直到 2 年前
        1
  •  5
  •   Zegarek    2 年前

    PostgreSQL有一个 built-in inet type 你可以用它来达到这个目的。它与 + operator 正如您所期望的,添加适当的结转行为: demo

    select '127.0.0.255'::inet+23;
    --127.0.1.22